import { test } from "node:test"; import assert from "node:assert/strict"; import { 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-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.doesNotMatch(index, /style=/i); assert.doesNotMatch(frame, /