CLI

从命令行创建、预览和渲染 HTML 视频合成。

hyperframes CLI 是使用 Hyperframes 的主要方式。它处理项目创建、实时预览、渲染、检查和诊断 — 全部通过终端完成。

npm install -g hyperframes
# 或直接使用 npx
npx hyperframes <command>

何时使用

在以下场景使用 CLI:

  • 捕获网站用于视频制作(capture
  • 从示例创建新的合成项目(init
  • 带热重载预览合成(preview
  • 在本地或 Docker 中将合渲染为 MP4(render
  • 检查合成的结构问题(lint
  • 检查渲染后的视觉布局中的文本溢出和裁剪容器(inspect
  • 将关键帧捕获为 PNG 截图(snapshot
  • 检查环境中缺失的依赖项(doctor

如果需要以下功能,请使用其他包:

  • 从 Node.js 代码以编程方式渲染 — 使用 producer
  • 构建自定义帧捕获管道 — 使用 engine
  • 在自己的 Web 应用中嵌入合成编辑器 — 使用 studio
  • 在代码中解析或生成合成 HTML — 使用 core

💡 Tip

CLI 是所有 Hyperframes 用户的推荐起点。它封装了 producer、engine 和 studio 包,因此你不需要单独安装它们。

默认支持 Agent

CLI 默认支持 Agent:命令支持显式标志和可解析的输出,使自动化能够可靠运行。

  • 输入可以通过标志传递(例如 --example--video--output
  • 缺少必需标志时会快速失败,并给出清晰的错误信息和使用示例
  • 输出为纯文本,适合解析

交互性因命令而异。例如,init 默认在 TTY 上使用提示符;传入 --non-interactive 可强制使用非交互模式。

--human-friendly 也是命令特定的(例如 catalog)。它不是每个命令的全局标志。

Agent 模式(默认)

# 完全非交互 — 所有输入来自标志
npx hyperframes init my-video --example blank --video video.mp4
npx hyperframes render --output output.mp4 --fps 30 --quality standard
npx hyperframes upgrade --check --json

人工模式

# 命令特定的交互流程
npx hyperframes init my-video

# catalog 支持的交互式选择器
npx hyperframes catalog --human-friendly

JSON 输出和 _meta 信封

所有支持 --json 的命令都会用包含版本检查信息的 _meta 字段包装输出:

{
"name": "my-video",
"duration": 10.5,
"_meta": {
"version": "0.1.4",
"latestVersion": "0.1.5",
"updateAvailable": true
}
}

这允许 Agent 从任何命令的输出中检测过时的版本,而无需运行单独的升级检查。版本数据来自 24 小时缓存 — --json 输出期间不会发起网络请求。

被动更新通知

CLI 在后台检查 npm 上的新版本(缓存 24 小时)。如果有更新可用,命令完成后会在 stderr 上显示通知:

Update available: 0.1.4 → 0.1.5
Run: npx hyperframes@latest

在 CI 环境、非 TTY shell 以及设置了 HYPERFRAMES_NO_UPDATE_CHECK=1 时,此通知会被抑制。

快速入门

创建项目

从示例创建新的合成项目:

npx hyperframes init --example warm-grain

系统会提示输入项目名称,或作为参数传递:

npx hyperframes init my-video --example warm-grain

参见示例了解所有可用示例。

在浏览器中预览

启动带有热重载的开发服务器:

cd my-video
npx hyperframes preview

Hyperframes Studio 会在你的浏览器中打开。编辑 index.html,预览会即时更新。

检查你的合成

在渲染前检查结构问题:

npx hyperframes lint
◆  Linting my-project/index.html

◇  0 errors, 0 warnings

渲染为 MP4

生成最终视频:

npx hyperframes render --output output.mp4

渲染特定合成而非 index.html

npx hyperframes render -c compositions/intro.html -o intro.mp4

要获得确定性输出,添加 --docker

npx hyperframes render --docker --output output.mp4

命令

创建

init

从示例创建新的合成项目:

# Agent 模式(默认)— --example 是必需的
npx hyperframes init my-video --example blank --video video.mp4

# 包含 Tailwind CSS 浏览器运行时支持
npx hyperframes init my-video --example blank --tailwind

# 人工模式 — 默认在 TTY 上使用交互式提示
npx hyperframes init my-video
标志描述
--example, -e要脚手架化的示例(默认模式下必需,在 --human-friendly 下交互式选择)
--resolution画布预设:landscape (1920×1080)、portrait (1080×1920)、landscape-4k (3840×2160)、portrait-4k (2160×3840)、square (1080×1080)、square-4k (2160×2160)。别名:1080p4kuhd1080p-squaresquare-1080p4k-square。默认:保持模板尺寸。
--video, -V视频文件路径(MP4、WebM、MOV)
--audio, -a音频文件路径(MP3、WAV、M4A)
--tailwind为脚手架化的 HTML 添加 Tailwind CSS 浏览器运行时支持
--skip-skills跳过 AI 编程技能安装
--skip-transcribe跳过自动 whisper 转录
--model用于转录的 Whisper 模型(例如 small.enmedium.enlarge-v3
--language转录的语言代码(例如 enesja)。过滤非目标语言语音。
示例描述
blank空合成 — 仅脚手架
warm-grain奶油美学配合颗粒纹理
play-mode俏皮的弹性动画
swiss-grid结构化网格布局
vignelli大胆的排版配合红色强调

在非交互模式下,--example 是必需的 — 如果缺少,CLI 会报错并给出使用示例。在交互模式下(TTY 默认),你可以交互式选择示例。传入 --non-interactive 可通过标志要求 --example。当提供 --video--audio 时,CLI 会自动使用 Whisper 转录音频并将字幕补丁到合成中(使用 --skip-transcribe 禁用)。

--tailwind 将固定的 Tailwind v4 浏览器运行时注入脚手架化的 HTML,并暴露一个 window.__tailwindReady promise,渲染在捕获第 0 帧之前会等待它。编辑这些项目时使用 /tailwind 技能,这样 Agent 会遵循 v4 CSS 优先的模式,而非 v3 的 tailwind.config.js@tailwind 指令模式。浏览器运行时仍适用于脚手架化项目和快速迭代;对于完全离线或锁定的生产渲染,请将 Tailwind 编译为 CSS 并直接包含样式表。

脚手架化后,CLI 会为 Claude Code、Gemini CLI 和 Codex CLI 安装 AI 编程技能(使用 --skip-skills 禁用)。参见 skills 命令。

参见示例了解完整详情。

add

从注册表安装组件到现有项目中。示例(完整项目)通过 init 脚手架化;块和组件是你可以添加到已有合成中的较小单元。

# 添加块(子合成场景)
npx hyperframes add claude-code-window

# 添加组件(效果/代码片段)
npx hyperframes add shader-wipe

# 指定不同的项目目录
npx hyperframes add shader-wipe --dir ./my-video

# 无头/CI(跳过剪贴板;同样:--json 获取机器可读结果)
npx hyperframes add shader-wipe --no-clipboard --json
标志描述
<name>(位置参数)注册表项名称(例如 claude-code-windowshader-wipe
--dir项目目录(默认为当前工作目录)
--no-clipboard跳过将包含代码片段复制到剪贴板
--json将机器可读的摘要(写入的文件 + 代码片段)输出到 stdout

add 读取项目根目录的 hyperframes.json 以知道从哪个注册表拉取以及将文件放到哪里。如果文件不存在但目录看起来像 Hyperframes 项目(有 index.html),首次运行 add 时会写入默认的 hyperframes.json

块或组件的输出是一组文件加上一个粘贴代码片段 — 要包含在宿主合成中的 <iframe> 标签(对于块)或片段路径(对于组件)。代码片段默认复制到剪贴板;在 CI 或无头环境中添加 --no-clipboard

尝试使用示例名称运行 add(例如 hyperframes add warm-grain)会发出明确的错误,指向 init --example

catalog

浏览注册表 — 列出可用的块和组件,支持可选筛选:

# 列出所有内容(默认:表格输出)
npx hyperframes catalog

# 按类型或标签筛选
npx hyperframes catalog --type block
npx hyperframes catalog --type block --tag social

# 机器可读的 JSON
npx hyperframes catalog --json

# 交互式选择器 — 选择以安装
npx hyperframes catalog --human-friendly
标志描述
--typeblockcomponent 筛选
--tag按标签筛选(例如 socialtransitiontext
--json将匹配项以 JSON 格式输出(非交互式)
--human-friendly交互式选择器 — 选择一项进行安装

默认输出是一个表格,列出名称、类型、描述和标签 — 专为 Agent 解析设计。--json 产生结构化输出。--human-friendly 打开一个交互式选择器,选择后执行 add

compositions

列出当前项目中的所有合成:

npx hyperframes compositions
标志描述
--json以 JSON 格式输出

显示每个合成的 ID、时长、分辨率和元素数量。

transcribe

将音频/视频转录为单词级时间戳,或导入现有转录:

# 使用本地 whisper.cpp 转录音频/视频
npx hyperframes transcribe audio.mp3
npx hyperframes transcribe video.mp4 --model medium.en --language en

# 从其他工具导入现有转录
npx hyperframes transcribe subtitles.srt
npx hyperframes transcribe captions.vtt
npx hyperframes transcribe openai-response.json
标志描述
--dir, -d项目目录(默认:当前目录)
--model, -mWhisper 模型(默认:small.en)。选项:tiny.enbase.ensmall.enmedium.enlarge-v3
--language, -l语言代码(例如 enesja)。过滤非目标语言语音。
--json以 JSON 格式输出结果

命令自动检测输入类型。音频/视频文件使用 whisper.cpp 转录。转录文件(.json.srt.vtt)会被规范化并导入。

支持的转录格式:

格式来源
whisper.cpp JSONhyperframes init --videohyperframes transcribe
OpenAI Whisper API JSONopenai.audio.transcriptions.create() 带有单词时间戳
SRT 字幕视频编辑器、YouTube、字幕工具
VTT 字幕Web 播放器、YouTube、转录服务

所有格式都被规范化为标准的 [{text, start, end}] 单词数组,并保存为 transcript.json。如果项目有字幕 HTML 文件,它们会自动用转录数据补丁。

💡 Tip

对于音乐或嘈杂的音频,使用 --model medium.en 以获得更好的准确性。对于生产内容的最佳效果,通过 OpenAI 或 Groq Whisper API 转录并导入 JSON。

tts

使用本地 AI 模型(Kokoro-82M)从文本生成语音音频。无需 API 密钥 — 完全在设备上运行。

# 从文本生成语音
npx hyperframes tts "Welcome to HyperFrames"

# 选择声音
npx hyperframes tts "Hello world" --voice am_adam

# 保存到指定文件
npx hyperframes tts "Intro" --voice bf_emma --output narration.wav

# 调整语速
npx hyperframes tts "Slow and clear" --speed 0.8

# 生成西班牙语语音(语言从声音 ID 前缀自动检测)
npx hyperframes tts "La reunión empieza a las nueve" --voice ef_dora --output es.wav

# 覆盖音素器(用法语声音朗读英文文本)
npx hyperframes tts "Bonjour le monde" --voice af_heart --lang fr-fr

# 从文件读取文本
npx hyperframes tts script.txt

# 列出可用声音
npx hyperframes tts --list
标志描述
--output, -o输出文件路径(默认:当前目录下的 speech.wav
--voice, -v声音 ID(运行 --list 查看选项)
--speed, -s语速倍率(默认:1.0)
--lang, -l音素器区域设置(en-usen-gbesfr-frhiitpt-brjazh)。省略时从声音 ID 前缀推断。
--list列出可用声音并退出
--json以 JSON 格式输出结果

💡 Tip

声音 ID 的首字母编码了音素器语言(a=美式、b=英式、e=西班牙语、f=法语、h=印地语、i=意大利语、j=日语、p=巴西葡萄牙语、z=普通话)。--lang 仅在你想覆盖此推断时需要 — 例如,为英文文本提供法语音素器以实现风格化的口音。

💡 Tip

ttstranscribe 结合使用,在单一工作流中生成旁白和字幕的单词级时间戳:使用 tts 生成音频,然后使用 transcribe 转录输出以获取单词级时间。

remove-background

使用本地 AI 模型从视频或图像中移除背景。输出是透明媒体,你可以放入任何合成的 <video><img> 元素中 — 无需绿幕。

# 默认:带 alpha 的 VP9 WebM(HTML5 原生,约 1 MB / 4s @ 1080p)
npx hyperframes remove-background avatar.mp4 -o transparent.webm

# ProRes 4444 .mov 用于编辑往返
npx hyperframes remove-background avatar.mp4 -o transparent.mov

# 单张图像 → 透明 PNG
npx hyperframes remove-background portrait.jpg -o cutout.png

# 图层分离:一次通过同时获取剪影和反向 alpha 背景板
npx hyperframes remove-background avatar.mp4 \
-o subject.webm --background-output plate.webm

# 在有 CoreML 或 CUDA 的机器上强制使用 CPU
npx hyperframes remove-background avatar.mp4 -o transparent.webm --device cpu

# 检查检测到的提供者而不渲染
npx hyperframes remove-background --info
标志描述
--output, -o输出路径。格式从扩展名推断:.webm(默认)、.mov.png
--background-output, -b可选的第二输出:反向 alpha 背景板(主体区域透明,周围不透明)。相同的源 RGB,互补遮罩。必须为 .webm.mov。挖孔裁切,非修补 — 在下方合成其他内容以填充孔洞。
--device执行提供者:auto(默认)、cpucoremlcuda
--qualityWebM 编码器预设:fast(crf 30,最小)、balanced(crf 18,默认)、best(crf 12,接近无损)。更高质量使剪影的 RGB 更接近源 mp4 — 在将剪影叠加到其自身源上以实现主体后方文字效果时很重要。适用于 --output--background-output。对 .mov / .png 忽略。
--info打印检测到的执行提供者并退出(不渲染)
--json以 JSON 格式输出结果

模型为 u2net_human_seg(MIT,约 168 MB ONNX)。权重在首次运行时下载到 ~/.cache/hyperframes/background-removal/models/ 并在此后复用。峰值推理 RAM 约 1.5 GB。

--device auto 在 Apple Silicon 上选择 CoreML,有 CUDA 时选择 CUDA,否则选择 CPU。CLI 捆绑了 onnxruntime-node 的 CPU 构建版本;对于 CUDA,设置 HYPERFRAMES_CUDA=1 并提供启用 GPU 的 onnxruntime-node 构建版本。

输出格式:

格式使用场景大小(4s @ 1080p)
.webm(VP9 alpha)放入 <video> 实现 HTML5 原生透明播放约 1 MB
.mov(ProRes 4444)在 Premiere / Resolve / DaVinci 中编辑往返约 50 MB
.png单张图像剪影不定

💡 Tip

Chrome 中的 <video> 元素仅在 WebM 以 yuva420p 编码并带有 alpha_mode=1 元数据标签时才识别 alpha 平面。CLI 会自动设置这两者 — 如果你自己重新编码输出,请保留这些标志。

参见移除背景指南了解完整工作流 — 在合成中使用透明视频、各平台的性能、u2net_human_seg 的限制,以及此模型不适合时的免费替代工具。

capture

捕获网站 — 提取截图、设计令牌、字体、资源和动画用于视频制作:

npx hyperframes capture https://stripe.com
npx hyperframes capture https://linear.app -o captures/linear
npx hyperframes capture https://example.com --json
◇  Captured Stripe | Financial Infrastructure → captures/stripe-com

Screenshots: 12
Assets: 45
Sections: 15
Fonts: sohne-var
标志描述
-o, --output输出目录(默认:captures/<hostname>
--timeout页面加载超时(毫秒)(默认:120000)
--skip-assets跳过下载图片和字体
--max-screenshots最大截图数量(默认:24)
--json输出结构化 JSON 用于编程使用

capture 命令提取 AI Agent 理解网站视觉标识所需的一切:每个滚动深度的视口截图、调色板(像素采样 + DOM 计算)、字体文件、带语义名称的图片、SVG、Lottie 动画、视频预览、WebGL 着色器、可见文本和页面结构。

输出是一个自包含的目录,包含一个 CLAUDE.md 文件,任何 AI Agent 都可以读取以了解被捕获的站点。被 /website-to-hyperframes 技能用作视频制作管道的第一步。

.env 文件中设置 GEMINI_API_KEY 以通过 Gemini 视觉获取 AI 驱动的图片描述(约 $0.001/张)。详情请参阅 Website to Video 指南。

预览

preview

启动带热重载的实时预览服务器:

npx hyperframes preview [dir]
npx hyperframes preview --port 4567
标志描述
--port预览服务器运行端口(默认:3002)

在 Hyperframes Studio 中打开你的合成并提供实时预览。对 index.html 和所有引用的子合成的编辑会自动反映。预览使用与生产渲染相同的 Hyperframes 运行时,因此所见即所得。

ℹ️ Note

视觉输出与渲染完全匹配。播放性能则不同:预览在你的浏览器中实时播放,因此绘制密集的合成(大图片、叠加的 backdrop-filter 层、许多带阴影的元素)可能会根据你的硬件出现卡顿。渲染的 mp4 始终是准确的 — 渲染逐帧捕获,因此每帧的开销表现为更长的渲染时间,而非丢帧。详情请参阅性能

预览服务器以三种模式运行,自动检测:

  1. 嵌入模式npx 的默认模式)— 运行独立服务器,将 studio 捆绑在 CLI 中。零额外依赖。
  2. 本地 studio 模式 — 如果项目 node_modules 中安装了 @hyperframes/studio,会启动带完整 HMR 的 Vite 以加快迭代。
  3. Monorepo 模式 — 如果从 Hyperframes 源码仓库运行,直接启动 studio 开发服务器。

publish

上传项目并获得一个稳定的 hyperframes.dev URL:

npx hyperframes publish [dir]
npx hyperframes publish --yes
标志描述
--yes跳过确认提示

publish 压缩当前项目,上传到 Hyperframes 发布后端,并打印一个用于该存储项目的稳定 hyperframes.dev URL。

打印的 URL 已经包含认领令牌,因此在 hyperframes.dev 上打开它可以让目标用户认领上传的项目并在 Web 应用中继续编辑。

此流程不保持本地预览服务器运行,也不打开隧道。发布的 URL 解析到 HeyGen 存储的持久化项目,因此在 CLI 进程退出后仍可继续工作。

lint

检查合成的常见问题:

npx hyperframes lint [dir]
npx hyperframes lint [dir] --verbose   # 包含 info 级别发现
npx hyperframes lint [dir] --json      # 机器可读的 JSON 输出
◆  Linting my-project/index.html

✗ missing_gsap_script: Composition uses GSAP but no GSAP script is loaded.
⚠ unmuted-video [clip-1]: Video should have the 'muted' attribute for reliable autoplay.

◇  1 error(s), 1 warning(s)

默认只打印错误警告。Info 级别的发现(例如外部脚本依赖通知)被隐藏以保持 Agent 和 CI 的输出整洁。使用 --verbose 包含它们。

标志描述
--json以 JSON 格式输出发现(包含 errorCountwarningCountinfoCountfindings 数组)
--verbose在输出中包含 info 级别发现(默认隐藏)

严重级别:

  • Error () — 渲染前必须修复(例如缺少适配器库、无效属性)
  • Warning () — 可能导致异常行为的潜在问题
  • Info () — 信息性通知,仅在使用 --verbose 时显示

Linter 会检测缺少的属性、缺少的适配器库(GSAP、Lottie、Three.js)、结构问题等。详情请参阅常见错误

inspect

检查合成时间轴上的渲染视觉布局:

npx hyperframes inspect [dir]
npx hyperframes inspect [dir] --json
npx hyperframes inspect [dir] --samples 15
npx hyperframes inspect [dir] --at 1.5,4,7.25
◆  Inspecting layout for my-project (9 timeline samples)

✗ text_box_overflow t=3.25s #headline inside .bubble overflowed right 18px — "Quarterly plan"
Fix: Text is 418px x 42px inside 400px x 120px and overflows by up to 18px; widen the container to at least ~418px, or allow wrapping with max-width/fitTextFontSize.

◇  1 error(s), 0 warning(s), 0 info(s)

inspect 打包项目,在本地提供服务,打开无头 Chrome,跳转合成,并报告逃出其预期框的文本或元素。它专为 Agent 工作流设计:每个发现包含 schema 版本、时间戳或折叠的时间戳范围、选择器、最近容器选择器、测量的边界框、溢出边和修复提示。

标志描述
--json输出 Agent 可读的发现,包含 schemaVersionsamplesissues、边界框和摘要计数
--samples合成持续时间内的中点采样数量(默认:9)
--at以逗号分隔的秒数时间戳,用于显式的主帧检查
--tolerance报告问题前允许的像素溢出量(默认:2)
--timeout等待运行时初始化的毫秒数(默认:5000)
--collapse-static在采样间折叠重复的静态问题(默认:true)
--max-issues静态折叠后打印或返回的最大发现数(默认:80)
--strict在警告和错误时都以非零退出

当溢出是有意的时候(例如计划的画布外入场),在元素或祖先上使用 data-layout-allow-overflow。对于不应被审计的装饰元素使用 data-layout-ignore

layout 仍作为同一视觉检查的兼容别名可用:

npx hyperframes layout [dir] --json

snapshot

将合成中的关键帧捕获为 PNG 截图 — 无需完整渲染即可验证视觉输出:

npx hyperframes snapshot my-project --at 2.9,10.4,18.7
npx hyperframes snapshot my-project --frames 10
◆  Capturing 3 frames at [2.9s, 10.4s, 18.7s] from my-project

◇  3 snapshots saved to snapshots/
snapshots/frame-00-at-2.9s.png
snapshots/frame-01-at-10.4s.png
snapshots/frame-02-at-18.7s.png
标志描述
--frames要捕获的均匀间隔帧数(默认:5)
--at以逗号分隔的秒数时间戳(例如 3.0,10.5,18.0
--timeout等待运行时初始化的毫秒数(默认:5000)

snapshot 命令打包项目,在本地提供服务,启动无头 Chrome,跳转到每个时间戳,并捕获 1920×1080 的 PNG。在 website-to-video 工作流的构建步骤中用于视觉验证。

构建

render

将合渲染为 MP4 或 WebM:

# 本地模式(快速迭代)
npx hyperframes render --output output.mp4

# Docker 模式(确定性输出)
npx hyperframes render --docker --output output.mp4

# 带透明度的 WebM(用于覆盖层、字幕、下方三分之一标题)
npx hyperframes render --format webm --output overlay.webm

# 使用选项
npx hyperframes render --output output.mp4 --fps 60 --quality high

# 退出本地浏览器 GPU 捕获
npx hyperframes render --no-browser-gpu --output cpu-browser.mp4

# 添加硬件 FFmpeg 编码
npx hyperframes render --gpu --output gpu.mp4
标志默认值描述
--output路径renders/<name>.mp4输出文件路径
--formatmp4、webm、mov、png-sequencemp4输出格式(WebM/MOV 带透明度渲染;png-sequence 写入 RGBA PNG 目录)
--fps24、30、6030每秒帧数
--qualitydraft、standard、highstandard编码质量预设(驱动 CRF/比特率)
--crf0-51覆盖编码器 CRF(值越低 = 质量越高)。与 --video-bitrate 互斥
--video-bitrate例如 10M5000k目标视频比特率。与 --crf 互斥
--resolutionlandscape、portrait、landscape-4k、portrait-4k、square、square-4k(别名:1080p4kuhd1080p-squaresquare-1080p4k-square输出分辨率预设。通过 Chrome deviceScaleFactor 对较小的合成进行超采样,使截图达到请求的尺寸。宽高比必须匹配合成;缩放必须是整数倍。不支持 --hdr。参见 4K 渲染
--hdroff即使未检测到 HDR 源也强制 HDR 输出。仅限 MP4。参见 HDR 渲染
--sdroff即使检测到 HDR 源也强制 SDR 输出
--workers1-84并行渲染 worker 数量
--gpuoffGPU 编码(NVENC、VideoToolbox、AMF、VAAPI、QSV)
--browser-gpu / --no-browser-gpu本地 on,Docker off使用或退出本地 Chrome/WebGL 捕获的主机 GPU 加速
--dockeroff使用 Docker 进行确定性渲染
--quietoff抑制详细输出
--variablesJSON 对象变量覆盖,合并到 data-composition-variables 默认值之上。通过 window.__hyperframes.getVariables() 读取
--variables-file路径包含变量覆盖的 JSON 文件路径(--variables 的替代方式)
--strict-variablesoff如果任何 --variables 键未声明或与合成的 data-composition-variables 类型不匹配则渲染失败。不使用此标志时,不匹配会打印警告且渲染继续。

CRF 和目标比特率默认为 --quality 预设。使用 --crf--video-bitrate 进行细粒度覆盖;RenderConfig.crfRenderConfig.videoBitrate 在编程方式中接受相同的覆盖。

参数化渲染

通过在合成根上声明变量并在渲染时覆盖它们,使用不同的内容渲染相同的合成:

<html
data-composition-id="root"
data-composition-variables='[
{"id":"title","label":"Title","type":"string","default":"Hello"},
{"id":"theme","label":"Theme","type":"enum","options":[
{"value":"light","label":"Light"},
{"value":"dark","label":"Dark"}
],"default":"light"}
]'>
<body>
<h1 id="hero" class="clip" data-start="0" data-duration="3"></h1>
<script>
const vars = window.__hyperframes.getVariables();
document.getElementById("hero").textContent = vars.title;
document.body.dataset.theme = vars.theme;
</script>
</body>
</html>
# 使用声明的默认值渲染(预览也使用默认值)
npx hyperframes render --output default.mp4

# 在渲染时覆盖 — 缺失的键回退到声明的默认值
npx hyperframes render --variables '{"title":"Q4 Report","theme":"dark"}' --output q4.mp4

# 从 JSON 文件传递值
npx hyperframes render --variables-file ./vars.json --output out.mp4

getVariables() 返回声明的默认值与任何 --variables 覆盖的合并结果,因此相同的合在开发预览和生产渲染中无需更改即可运行。

WebM 透明度

使用 --format webm 渲染带透明背景的合成。这会产生带有 alpha 通道的 VP9 视频,封装在 WebM 容器中 — 这是可叠加视频的标准格式。

# 渲染带透明背景的字幕覆盖层
npx hyperframes render --format webm --output captions.webm

# 使用 FFmpeg 叠加到另一个视频上
ffmpeg -c:v libvpx-vp9 -i captions.webm -i background.mp4 \
-filter_complex "[1:v][0:v]overlay=0:0" -y composited.mp4

💡 Tip

要使透明度生效,你的合成 HTML 应在根元素上使用 background: transparent。WebM 渲染使用 PNG 帧捕获(而非 JPEG)以保留 alpha 通道。

参见渲染了解所有选项和模式。

benchmark

为你的系统找到最优的渲染设置:

npx hyperframes benchmark [dir]
标志默认值描述
--runs1-203每个配置的运行次数
--jsonoff以 JSON 格式输出结果

运行多个渲染配置(变化的 fps、质量和 worker 数量),并比较每种组合的耗时和文件大小。

工具

doctor

检查你的环境中所需的依赖项:

npx hyperframes doctor
hyperframes doctor

✓ Version          0.1.4 (latest)
✓ Node.js          v22.x (linux x64)
✓ FFmpeg            7.x
✓ FFprobe           7.x
✓ Chrome            (system or cached)
✓ Docker            24.x
✓ Docker running    Running

◇  All checks passed
标志描述
--json以 JSON 格式输出(包含 _meta 信封)

验证 CLI 版本、Node.js、FFmpeg、FFprobe、Chrome 和 Docker 可用性。如果有更新的 CLI 版本可用,版本行会显示升级提示。

CI 门控。 hyperframes doctor --json 在成功执行时始终以 0 退出 — 如果命令产生了有效输出就表示成功。环境是否健康承载在有效载荷的 ok 字段中,因此新的 CLI 版本(将 Version.ok 翻转为 false)永远不会破坏你的流水线。通过 jq 管道处理以基于有效载荷进行门控:

hyperframes doctor --json | jq -e '.ok' > /dev/null || handle_failure

JSON 模式下 detailhint 中的路径被脱敏 — 用户的主目录替换为字面量 $HOME,因此输出可以安全地粘贴到 bug 报告和 Agent 上下文中。

info

显示项目元数据:

npx hyperframes info [dir]
标志描述
--json以 JSON 格式输出

显示项目名称、分辨率、时长、按类型统计的元素数量、轨道数量和项目总大小。

upgrade

检查更新并显示升级说明:

npx hyperframes upgrade
npx hyperframes upgrade --check         # 检查并退出(无提示)
npx hyperframes upgrade --check --json  # 机器可读的 Agent 友好格式
npx hyperframes upgrade --yes           # 显示升级命令而不提示
标志描述
--check检查更新并退出(无提示,Agent 友好)
--json以 JSON 格式输出(包含 _meta 信封)
--yes, -y显示升级命令而不提示

将你安装的版本与 npm 上的最新版本进行比较。使用 --check --json 返回:

{
"current": "0.1.4",
"latest": "0.1.5",
"updateAvailable": true,
"_meta": { "version": "0.1.4", "latestVersion": "0.1.5", "updateAvailable": true }
}

browser

管理用于渲染的 Chrome 浏览器:

# 查找或下载 Chrome 用于渲染
npx hyperframes browser ensure

# 打印浏览器可执行文件路径(用于脚本)
npx hyperframes browser path

# 移除缓存的 Chrome 下载
npx hyperframes browser clear

path 子命令仅输出路径,在脚本中很有用:$(npx hyperframes browser path)

docs

在终端中查看内联文档:

npx hyperframes docs [topic]

可用主题:data-attributesexamplesrenderinggsaptroubleshootingcompositions。不带主题运行可查看完整列表。

feedback

提交关于你体验的匿名满意度反馈:

# 快速评分(1 = 差,5 = 好)
npx hyperframes feedback --rating 5

# 评分附带可选详情
npx hyperframes feedback --rating 3 --comment "render succeeded but GSAP timeline didn't animate"
标志描述
--rating满意度分数,1-5(必需)
--comment可选的自由文本详情

此命令在渲染后也对 AI Agent 可用 — 参见反馈收集了解 Agent 检测和自动渲染后提示的工作原理。

当遥测被禁用时不执行任何操作 — 打印 Telemetry is disabled. Feedback not sent. 并正常退出。

telemetry

管理匿名使用遥测:

npx hyperframes telemetry enable
npx hyperframes telemetry disable
npx hyperframes telemetry status

遥测收集命令名称、渲染性能、示例选择和系统信息 — 包括粗略的环境指纹(操作系统、内核字符串、CPU/内存规格、沙箱运行时如 gVisor 或 Docker,以及驱动 CLI 的编码 Agent 的名称,例如 claude_code / codex / cursor)。Agent 名称从知名环境变量的存在性推导;它们的值从不被读取。遥测收集文件路径、项目名称、视频内容、环境变量值或个人身份信息。使用 HYPERFRAMES_NO_TELEMETRY=1 或上述命令禁用。

参见反馈收集了解周期性渲染后提示和 Studio 反馈栏的工作原理、它们收集的数据以及如何选择退出。

skills

为 AI 编程工具安装 HyperFrames 技能,包括一方运行时适配器技能:

# 安装到所有默认目标(Claude Code、Gemini CLI、Codex CLI)
npx hyperframes skills

# 安装到特定工具
npx hyperframes skills --claude
npx hyperframes skills --cursor
npx hyperframes skills --claude --gemini
标志描述
--claude安装到 Claude Code(~/.claude/skills/
--gemini安装到 Gemini CLI(~/.gemini/skills/
--codex安装到 Codex CLI(~/.codex/skills/
--cursor安装到 Cursor(当前项目中的 .cursor/skills/

技能从 GitHub 获取,包括合成编写、Tailwind v4 浏览器运行时指导、GSAP 动画模式、Anime.js、CSS 动画、Lottie、Three.js 和 WAAPI 适配器模式、注册表块/组件接线以及其他领域特定知识。init 命令在脚手架化项目后也会提供自动安装技能的选项。

故障排查:fatal: active post-checkout hook found during git clone

如果你全局安装了 Git LFS(git lfs install),Git 2.45+ 会在任何 git clone 期间拒绝运行 LFS post-checkout hook — 包括上游 skills CLI 底层执行的克隆。错误如下:

■  Failed to clone repository
fatal: active `post-checkout` hook found during `git clone`
└  Installation failed

使用 hyperframes skills 已经没问题 — 从 v0.4.5 开始,CLI 在子环境上设置 GIT_CLONE_PROTECTION_ACTIVE=0,这是 Git 为此场景提供的选择启用选项。你不需要做任何事情。

如果你直接运行了 npx skills add heygen-com/hyperframes(绕过 HyperFrames CLI),请自行设置环境变量:

GIT_CLONE_PROTECTION_ACTIVE=0 npx skills add heygen-com/hyperframes

此问题在 GH #316 中跟踪。skills CLI 本身的上游修复才是正确的长期方案;在此之前,环境变量是正确的变通方法。

hyperframes auth

登录 HeyGen 并管理凭证。凭证存储在 ~/.heygen/credentials(模式 0600),并且heygen CLI 共享 — 用一个登录,另一个会获取会话。

解析顺序(首次匹配优先):

  1. HEYGEN_API_KEY 环境变量
  2. HYPERFRAMES_API_KEY 环境变量(hyperframes 别名)
  3. ~/.heygen/credentials

子命令

auth login --api-key

保存 HeyGen API 密钥。密钥会在命令报告成功前通过 GET /v3/users/me 验证;被拒绝的密钥不会留在磁盘上。

# 交互式隐藏输入提示
hyperframes auth login --api-key

# 从 stdin 管道传入密钥(CI 友好)
echo "$HEYGEN_API_KEY" | hyperframes auth login --api-key

auth status

显示活跃凭证的来源、类型和已验证身份(账户 + 计费快照)。未配置或 API 拒绝凭证时以非零退出,以便脚本可以检查登录状态。

hyperframes auth status
hyperframes auth status --json   # 机器可读

auth logout

移除存储的凭证。在 TTY 上提示确认。

hyperframes auth logout
hyperframes auth logout --keep-api-key   # 仅清除 OAuth 会话
hyperframes auth logout --yes            # 跳过确认提示

环境变量

变量描述
HEYGEN_API_KEY覆盖存储的凭证。
HYPERFRAMES_API_KEYHEYGEN_API_KEY 的别名。
HEYGEN_API_URLAPI 基础 URL(默认 https://api.heygen.com)。
HEYGEN_CONFIG_DIR凭证目录(默认 ~/.heygen)。

hyperframes cloud

在 HeyGen 托管云上渲染 HyperFrames 合成 — 无需本地 Chrome、无需本地 ffmpeg、无需管理 AWS。使用 hyperframes auth login 登录一次,相同的凭证驱动所有 cloud 子命令。

hyperframes auth login                          # 一次性
hyperframes cloud render ./my-video             # 压缩 + 上传 + 轮询 + 下载
hyperframes cloud render ./my-video --no-wait   # 提交并以 render_id 退出
hyperframes cloud list                          # 浏览最近的渲染

子命令

cloud render [<projectDir>]

端到端渲染:压缩项目(排除 .gitnode_modulesdist.nextcoverage、点文件),通过 POST /v3/assets 上传,提交 POST /v3/hyperframes/renders,轮询 GET /v3/hyperframes/renders/{id} 直到渲染完成或失败,并将结果视频流式传输到磁盘。

渲染参数与本地 hyperframes render 的 UX 在重叠处保持一致:

标志默认值含义
--fps30整数 1-240。
--qualitystandarddraftstandardhigh
--formatmp4mp4webmmov
--resolution合成默认值landscapeportraitlandscape-4kportrait-4ksquaresquare-4k
--composition / -cindex.htmlzip 内的入口 HTML 文件。
--variables内联 JSON 对象覆盖 data-composition-variables
--variables-fileJSON 文件路径(--variables 的替代方式)。
--strict-variablesoff当变量未声明或类型错误时失败。
--title自由文本标签,在详细响应中回显。
--output / -orenders/<render_id>.<ext>下载视频的本地目标路径。

生命周期/控制标志:

标志含义
--no-wait提交并立即退出;将 render_id 打印到 stdout。
--callback-url渲染终止时触发的 HTTPS webhook(与 --no-wait 组合使用)。
--callback-idwebhook 有效载荷中回显的不透明跟踪 ID。
--asset-id跳过压缩+上传;提交已上传的合成。与项目目录和 --url 互斥。
--url提交公共 HTTPS zip URL。与 --asset-id 的互斥关系相同。
--poll-interval轮询频率(秒)(默认 10)。
--max-wait最大轮询时长(分钟)(默认 60)。
--idempotency-key可选的 Idempotency-Key 用于安全重试(1-255 个字符,来自 [A-Za-z0-9_:.-])。
--json发出机器可读的 JSON 而非友好进度。
# 默认流程 — 渲染当前目录。
hyperframes cloud render

# 选择合成 + 输出路径。
hyperframes cloud render . \
--composition compositions/intro.html \
--output ./renders/intro.mp4

# 更高质量,60fps。
hyperframes cloud render --quality high --fps 60

# 使用 webhook 的即发即忘(无本地轮询)。
hyperframes cloud render --callback-url https://example.com/hf-hook --no-wait

# 重新渲染已上传的合成(跳过压缩 + 上传)。
hyperframes cloud render --asset-id asst_abc123

# 从公共 URL 渲染(无需上传)。
hyperframes cloud render --url https://cdn.example.com/site.zip
通过 --idempotency-key 实现安全重试

CLI 在遇到 401 Unauthorized 时会透明重试,通过强制刷新 OAuth 令牌并重放失败的请求。对于大多数读操作这是无害的,但 POST /v3/assets(zip 上传)本身不是幂等的 — 没有 Idempotency-Key 的重试会创建重复资产并为工作区收取两次费用。

当你希望 cloud render 安全重试时,传入 --idempotency-key <key>。该密钥会转发到上传和提交调用;服务器按端点划分幂等性,因此在两个步骤中复用相同的值是安全的,可以防止任一步骤的重复。每个逻辑渲染使用一个 UUID,或任何 [A-Za-z0-9_:.-] 中的不透明字符串(1-255 个字符)。

hyperframes cloud render . --idempotency-key "$(uuidgen)"

cloud list

分页浏览最近的渲染。基于游标:--limit 限制单页数量(1-100),--token 从之前的 next_token 继续,--all 遍历完整列表直到耗尽。

hyperframes cloud list
hyperframes cloud list --limit 50 --json
hyperframes cloud list --all

cloud get <render_id>

获取一个渲染的完整详细记录,包括短期签名的 video_urlthumbnail_url(预签名的 S3 URL — 按需获取而非缓存)。

hyperframes cloud get hfr_abc123
hyperframes cloud get hfr_abc123 --json

cloud delete <render_id>

软删除一个渲染。后续 GET 调用返回 404,签名的视频 URL 短暂后也会失效。交互式提示确认;脚本使用 --no-confirm 跳过。

hyperframes cloud delete hfr_abc123
hyperframes cloud delete hfr_abc123 --no-confirm --json

何时选择 cloud vs lambda vs 本地渲染

  • hyperframes render(本地):最快的迭代循环。合成编写期间使用。
  • hyperframes lambda render:自带 AWS 分布式渲染。当你已经投资 AWS 并希望在自己的账户上获得分块并行性时使用。
  • hyperframes cloud render:零基础设施选项。HeyGen 运行渲染;你按积分付费。当你不想在本地管理 Chrome/ffmpeg/AWS 时使用。

认证 + 基础 URL

cloud 复用 hyperframes auth status 解析的凭证。使用 HEYGEN_API_URL(默认 https://api.heygen.com)覆盖用于暂存测试的 API 基础 URL。

hyperframes lambda

将 HyperFrames 分布式渲染部署到 AWS Lambda,并从你的笔记本电脑或 CI 驱动渲染。

hyperframes lambda 命令组封装了 @hyperframes/aws-lambda SDK 加上 AWS SAM,因此端到端渲染只需要三个命令:

hyperframes lambda deploy
hyperframes lambda render ./my-project --width 1920 --height 1080 --wait
hyperframes lambda destroy   # 完成后

前提条件

  • 已配置 AWS 凭证(环境变量、~/.aws/credentials、SSO 或 IMDS)。
  • AWS SAM CLIPATH 上。
  • bunPATH 上(用于构建 Lambda handler ZIP)。

子命令

lambda deploy

构建 packages/aws-lambda/dist/handler.zip 并 SAM 部署 examples/aws-lambda/template.yaml 处的堆栈。成功后写入 <cwd>/.hyperframes/lambda-stack-<stackName>.json,这样其他子命令无需重新推导 bucket / 状态机 ARN。

hyperframes lambda deploy \
--stack-name=hyperframes-prod \
--region=us-east-1 \
--concurrency=8 \
--memory=10240

幂等 — 在相同 --stack-name 上重新运行时,如果没有变更则解析为空操作。

lambda sites create <projectDir>

压缩并上传 <projectDir> 到 S3,使用内容寻址键。返回一个 siteId,你可以在多次渲染中复用,这样相同树的重新渲染会跳过上传。

hyperframes lambda sites create ./my-project
# → siteId: abc1234deadbeef0  (相同树的重新运行稳定)

hyperframes lambda render ./my-project --site-id=abc1234deadbeef0 --width 1920 --height 1080

lambda render <projectDir>

启动一个 Step Functions 执行。立即返回 renderId(使用 lambda progress 轮询),除非设置了 --wait,在这种情况下 CLI 会阻塞直到渲染完成并流式传输每块的进度行。

hyperframes lambda render ./my-project \
--width=1920 --height=1080 --fps=30 --format=mp4 \
--chunk-size=240 --max-parallel-chunks=16 \
--wait

--json 将友好输出替换为机器可解析的 JSON 快照。

合成可以通过 --variables / --variables-file 进行参数化,镜像本地 hyperframes render 标志。变量流入 Step Functions 执行输入,并作为 window.__hfVariables 到达每个块 worker。与合成的 data-composition-variables 声明不匹配会打印为警告;传入 --strict-variables 可使命令失败。

hyperframes lambda render ./my-template --site-id=abc1234deadbeef0 \
--width=1920 --height=1080 \
--variables '{"title":"Hello Alice","accent":"#ff0000"}'
hyperframes lambda render ./my-template --site-id=abc1234deadbeef0 \
--width=1920 --height=1080 \
--variables-file ./alice.json --strict-variables

变量在 Step Functions Standard 执行输入中传输,AWS 将整个有效载荷限制为 256 KiB。通过变量传递类型化数据(字符串、数字、结构化记录);URL 引用媒体资源(图片、音频、视频),合成在渲染时解析而非内联字节。SDK 在客户端验证大小并在任何 AWS 调用运行之前以清晰的错误拒绝超大输入 — 参见 templates-on-lambda 指南了解 URL 化资源的约定。

lambda render-batch <projectDir>

从 JSONL 批处理文件分发 N 个个性化渲染 — 这是自动化模板渲染管道的核心人体工程学。部署站点一次(或使用 --site-id 跳过),然后为每批行调用 renderToLambda,每条带有 variablesoutputKey。并发 Step Functions 启动受 --max-concurrent(默认 50)限制,这样 10,000 条目的批处理不会尝试同时生成 10,000 个执行并触发 AWS 账户限制。

批处理文件格式(JSONL — 每行一个 JSON 对象):

{"outputKey": "renders/alice.mp4", "variables": {"name": "Alice", "accent": "#ff0000"}}
{"outputKey": "renders/bob.mp4",   "variables": {"name": "Bob",   "accent": "#0000ff"}}
{"outputKey": "renders/carol.mp4", "variables": {"name": "Carol"}, "executionName": "hf-carol-001"}
hyperframes lambda render-batch ./my-template \
--batch ./users.jsonl \
--width 1920 --height 1080 \
--max-concurrent 10

该命令打印一个清单 — 每行一个输入 — 带有 executionArn + 状态:

Batch dispatched: 3 started, 0 failed-to-start.

✓ line 1  renders/alice.mp4  arn:aws:states:us-east-1:1234:execution:hf:hf-render-...
✓ line 2  renders/bob.mp4    arn:aws:states:us-east-1:1234:execution:hf:hf-render-...
✓ line 3  renders/carol.mp4  arn:aws:states:us-east-1:1234:execution:hf:hf-carol-001

传入 --json 获取机器可读形式。通过 hyperframes lambda progress <renderId> 轮询每个执行(或使用返回的 executionArn)。

--dry-run 跳过 AWS 调用并打印清单,每条显示 status: "would-invoke" — 在提交 N 个计费执行之前用于检查批处理文件:

hyperframes lambda render-batch ./my-template --batch ./users.jsonl \
--width 1920 --height 1080 --dry-run --json

--max-concurrent 仅在编排器侧:它限制同时运行的 StartExecution 调用数量,而非账户可运行的 Lambda 调用数量。AWS 账户级 Lambda 并发限制位于更上层,render-batch 无法强制执行;根据你的账户的 concurrent-execution 配额和你通过 lambda deploy --concurrency=<N> 配置的 Lambda 保留并发来选择 --max-concurrent

lambda progress <renderId | executionArn>

打印一个进度快照 — 总体百分比、已渲染帧数、Lambda 调用次数、累计费用和任何错误。接受裸 renderId(解析到堆栈的状态机 ARN)或完整的 SFN 执行 ARN。

hyperframes lambda progress hf-render-abcd1234

lambda destroy

调用 sam delete --no-prompts 并删除本地状态文件。渲染 S3 bucket 使用 CloudFormation Retain 配置,因此在销毁时会保留 — 如果你想回收存储,可以通过 AWS 控制台/CLI 清空并删除它。

lambda policies role | user | validate

打印或验证 CLI 部署/调用/销毁堆栈所需的最小 IAM 策略。

# 打印可附加到运行 CLI 的 IAM 用户的内联策略文档。
hyperframes lambda policies user

# 打印 { TrustRelationship, InlinePolicy } 用于 IAM 角色(默认:cloudformation 主体)。
hyperframes lambda policies role --principal=cloudformation

# 验证已签入的策略仍覆盖 CLI 的需求。
hyperframes lambda policies validate ./infra/iam/hyperframes-deploy.json

validate 读取 JSON 文档并检查其 Effect: Allow 操作的并集是否覆盖 CLI 所需的操作集,展开 s3:* / s3:Get* / * 通配符。缺少的操作会打印到 stderr,命令以非零退出 — 将其集成到 CI 中以在下次部署失败之前捕获漂移。

操作列表故意很广(Resource: "*"),因为 CloudFormation 在每个采用者的首次部署上创建新的函数/状态机/bucket ARN。安全态势更严格的采用者应在首次成功运行后将 Resource 缩窄到已部署的 ARN。

状态文件

hyperframes lambda<cwd>/.hyperframes/lambda-stack-<name>.json 下保存每个堆栈的元数据,这样命令无需每次都调用 describe-stacks。根据你的工作流将文件签入仓库或 .gitignore — 它包含 bucket 名称、状态机 ARN 和区域,这些都不是密钥但都可识别 AWS 账户。

hyperframes.json

hyperframes init 在每个新项目的根目录写入 hyperframes.json 文件。hyperframes add 读取它以知道从哪个注册表拉取项以及将它们放到哪里。编辑文件(或删除它以回退到默认值)以重塑项目布局或指向自定义注册表。

{
"$schema": "https://hyperframes.heygen.com/schema/hyperframes.json",
"registry": "https://raw.githubusercontent.com/heygen-com/hyperframes/main/registry",
"paths": {
"blocks": "compositions",
"components": "compositions/components",
"assets": "assets"
}
}
字段描述
registryadd 拉取的注册表基础 URL。默认为公共 Hyperframes 注册表。
paths.blocks.html 文件的位置(相对于项目根目录)。
paths.components组件文件的位置(相对于项目根目录)。
paths.assets引用的资源文件(图片、字体)的位置。

缺失的字段用默认值填充 — 你只需要指定要覆盖的内容。

相关包

  • Producer CLI 底层调用的渲染管道。直接使用以进行编程渲染。
  • Studio 驱动 hyperframes preview 的编辑器 UI。直接使用以嵌入到你自己的应用中。
  • Core 类型、Linter 和运行时。直接使用以进行自定义工具和集成。
  • Engine 捕获引擎。直接使用以构建自定义帧捕获管道。