diff --git a/docs/packages/cli.mdx b/docs/packages/cli.mdx index 57f8a0811..9e6199f9d 100644 --- a/docs/packages/cli.mdx +++ b/docs/packages/cli.mdx @@ -129,6 +129,10 @@ This is suppressed in CI environments, non-TTY shells, and when `HYPERFRAMES_NO_ ```bash npx hyperframes render --output output.mp4 ``` + Render a specific composition instead of `index.html`: + ```bash + npx hyperframes render -c compositions/intro.html -o intro.mp4 + ``` For deterministic output, add `--docker`: ```bash npx hyperframes render --docker --output output.mp4 diff --git a/packages/cli/src/commands/render.test.ts b/packages/cli/src/commands/render.test.ts index fbf4c2c12..22bdb9867 100644 --- a/packages/cli/src/commands/render.test.ts +++ b/packages/cli/src/commands/render.test.ts @@ -133,6 +133,37 @@ describe("renderLocal browser GPU config", () => { expect(producerState.createdJobs[0]?.variables).toBeUndefined(); }); + it("forwards entryFile to createRenderJob when --composition is set", async () => { + const { renderLocal } = await import("./render.js"); + await renderLocal("/tmp/project", "/tmp/out.mp4", { + fps: 30, + quality: "standard", + format: "mp4", + gpu: false, + browserGpu: false, + hdrMode: "auto", + quiet: true, + entryFile: "compositions/intro.html", + }); + + expect(producerState.createdJobs[0]?.entryFile).toBe("compositions/intro.html"); + }); + + it("omits entryFile from createRenderJob when --composition is not set", async () => { + const { renderLocal } = await import("./render.js"); + await renderLocal("/tmp/project", "/tmp/out.mp4", { + fps: 30, + quality: "standard", + format: "mp4", + gpu: false, + browserGpu: false, + hdrMode: "auto", + quiet: true, + }); + + expect(producerState.createdJobs[0]?.entryFile).toBeUndefined(); + }); + it("can force the CLI process to exit after a successful local render", async () => { vi.useFakeTimers(); const exit = vi diff --git a/packages/cli/src/commands/render.ts b/packages/cli/src/commands/render.ts index 009da0b7b..c0c96d631 100644 --- a/packages/cli/src/commands/render.ts +++ b/packages/cli/src/commands/render.ts @@ -4,6 +4,7 @@ import { mkdirSync, readFileSync, statSync, writeFileSync, rmSync } from "node:f export const examples: Example[] = [ ["Render to MP4", "hyperframes render --output output.mp4"], + ["Render a specific composition", "hyperframes render -c compositions/intro.html -o intro.mp4"], ["Render transparent overlay (ProRes)", "hyperframes render --format mov --output overlay.mov"], ["Render transparent WebM overlay", "hyperframes render --format webm --output overlay.webm"], ["High quality at 60fps", "hyperframes render --fps 60 --quality high --output hd.mp4"], @@ -62,6 +63,13 @@ export default defineCommand({ description: "Project directory", required: false, }, + composition: { + type: "string", + alias: "c", + description: + "Render a specific composition file instead of index.html (e.g. compositions/intro.html). " + + "Sub-compositions using