import { test } from "node:test";
import assert from "node:assert/strict";
import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { dirname, join } from "node:path";
import { tmpdir } from "node:os";
import { spawnSync } from "node:child_process";
const skillDir = join(dirname(fileURLToPath(import.meta.url)), "..");
test("frame worker documents the approved video-hoist contract", () => {
const instructions = readFileSync(join(skillDir, "sub-agents", "frame-worker.md"), "utf8");
assert.match(instructions, /data-frame-video="approved"/);
assert.match(instructions, /assemble-index\.mjs.*hoists it to the host root/i);
assert.match(instructions, /Audio remains orchestrator-owned/i);
});
test("assemble hoists an approved timed frame video to the host root", () => {
const project = mkdtempSync(join(tmpdir(), "hf-frame-video-"));
mkdirSync(join(project, "compositions"));
const framePath = join(project, "compositions", "frame-1.html");
writeFileSync(
join(project, "STORYBOARD.md"),
"---\nformat: 16:9\n---\n\n## Frame 1 — Demo\n- status: built\n- duration: 2s\n- src: compositions/frame-1.html\n",
);
writeFileSync(
framePath,
`
`,
);
const result = spawnSync(
process.execPath,
[join(skillDir, "scripts", "assemble-index.mjs"), "--hyperframes", project],
{ encoding: "utf8" },
);
assert.equal(result.status, 0, result.stderr);
const index = readFileSync(join(project, "index.html"), "utf8");
const frame = readFileSync(framePath, "utf8");
assert.match(index, /data-start="0\.25"/);
assert.match(index, /data-duration="1\.5"/);
assert.match(index, /data-media-start="12\.75"/);
assert.match(index, /data-track-index="1007"/);
assert.match(index, /src="https:\/\/cdn\.example\/clip\.mp4"/);
assert.match(index, /poster="poster\.png"/);
assert.match(index, /preload="auto"/);
assert.match(index, /\smuted(?:\s|>)/);
assert.match(index, /\splaysinline(?:\s|>)/);
assert.match(index, /\sloop(?:\s|>)/);
assert.doesNotMatch(index, /onerror=/i);
assert.doesNotMatch(index, /srcdoc=/i);
assert.doesNotMatch(index, /nonce=/i);
assert.match(
index,
/style="position:absolute;left:0px;top:0px;width:1920px;height:1080px;object-fit:cover"/,
);
assert.doesNotMatch(frame, /