HyperFrames v0.6.110 修复版解析:Studio 渲染 503、CLI 捕获与 SDK 动画寻址的稳定性改进

发布时间:2026/9/10 20:28:15
HyperFrames v0.6.110 修复版解析:Studio 渲染 503、CLI 捕获与 SDK 动画寻址的稳定性改进 HyperFrames v0.6.110 修复版解析Studio 渲染 503、CLI 捕获与 SDK 动画寻址的稳定性改进【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes本篇文章基于官方发布说明 releases/v0.6.110.md深入拆解 HyperFrames 这一纯修复fixes-only补丁版本为什么 macOS 图形界面启动的 Studio 会在渲染时返回 503、CLI 的 capture 命令如何自动避让已存在的输出目录、Player 为何要拒绝非法画布尺寸以及 SDK 如何为 GSAP 动画统一生成规范的data-hf-id寻址。读完本文你将掌握这些修复背后的触发场景、底层实现机制以及相应的验证方法并能在升级到 v0.6.110 时对照自查。版本概览一次聚焦稳定性的补丁发布v0.6.110 发布于 2026-06-17属于 HyperFrames 0.6.x 稳定线的一次补丁版本。发布说明明确将其定性为fixes-only仅修复不包含新功能全部改动集中在四类问题上Studio 渲染修复 macOS 图形界面启动场景下 ffmpeg 不在服务进程 PATH 中时渲染返回 503 的问题修复时间线 razor 分割全部操作的边界 epsilon为 GSAP 3D 检视器补充元数据。CLIinit命令在创建项目目录之前先校验命令行标志capture命令默认输出目录改为./capture/并支持自动后缀避让。Player拒绝来自 DOM 属性和 stage-size 消息的非有限non-finite合成尺寸。SDK解析以 composition-id 为目标的 GSAP tween并统一输出规范的data-hf-id寻址形式。每项修复在仓库源码中都有对应的实现与测试佐证下面逐项展开。Studio 渲染ffmpeg 不在 PATH 中时不再 503问题场景macOS 图形界面启动发布说明指出这是常见的 GUI 启动场景the common GUI-launch case on macOS当用户通过 Finder、Dock 或 Launchpad 双击启动 Studio 服务时macOS 图形界面进程不会继承终端 shell 的PATH环境变量。于是即便用户已经在终端里通过brew install ffmpeg安装了 ffmpegStudio 服务进程也找不到ffmpeg可执行文件渲染请求最终返回HTTP 503。修复PR #1536的核心思路是不再只依赖进程的PATH查找 ffmpeg而是走一条完整的解析链。源码实现findFfBinary 的解析链负责解析的是 parsers 包中的findFfBinary定义于 packages/parsers/src/ffBinaries.ts。其解析顺序如下环境变量覆盖最高优先级读取与二进制名对应的环境变量如HYPERFRAMES_FFMPEG_PATH、HYPERFRAMES_FFPROBE_PATH每次调用都会重新读取保证运行期修改环境变量即可生效当传入configuredMustExist: true时若配置的路径不存在则视为未找到否则原样返回配置路径便于调用方用 spawn 报错信息指出用户配置的路径。系统查找在 Unix 上通过which加PATH扫描在 Windows 上执行原生当前目录/PATH 扫描路径候选会经过可执行性校验。项目本地二进制目录查找项目内的.hyperframes/bin。常见 Unix 安装目录作为最后的兜底例如/opt/homebrew/bin等 macOS Homebrew 路径。系统查找结果会按二进制名缓存整个进程生命周期见 packages/parsers/src/ffBinaries.ts避免每次渲染都重复执行which环境变量覆盖则不参与缓存。对应的行为在 packages/parsers/src/ffBinaries.test.ts 中有系统化覆盖包括 macOS Homebrew 路径解析、Windows.exe后缀、项目本地二进制优先于系统等分支。修复落点代理转码与波形生成Studio 服务端在多个媒体处理路径中实际使用了该解析函数代理转码packages/studio-server/src/helpers/proxyTranscoder.ts 中以findFfBinary(ffmpeg, { configuredMustExist: true })解析 ffmpeg解析不到时抛出ffmpeg binary not found类型的可操作错误而不是直接 spawn 失败导致渲染 503。波形生成packages/studio-server/src/helpers/waveform.ts 解析 ffmpeg 用于提取音频采样生成波形。媒体元数据packages/studio-server/src/helpers/mediaMetadata.ts 解析 ffprobe 读取媒体信息。从代码结构可以推断这三条路径共享同一套解析逻辑因此 v0.6.110 的修复一次性覆盖了渲染代理视频生成音频波形读取媒体元数据等多个可能因 ffmpeg 缺失而失败的 Studio 功能。Studio 时间线razor 分割全部操作应用边界 epsilon问题切割点落在 epsilon 余量内产生退化切片时间线的 razor剃刀工具支持两种分割方式单片段分割single-clip与分割全部split-all一次沿时间线把该时刻所有可分割元素切开。修复前split-all 路径使用原始的start t end判定没有与单片段分割共享距片段边界至少保留 epsilon 距离的规则导致切割点可能落在边界余量之内产生几乎为零长度的退化切片degenerate slice。源码实现共享的最小距离规则修复PR #1404将两条路径统一到同一套边界判定上实现在 packages/studio/src/utils/timelineElementSplit.ts常量SPLIT_BOUNDARY_EPSILON_S 0.03切割点距离片段起止边界的最小距离为 0.03 秒。isSplitTimeWithinBounds要求splitTime clipStart ε且splitTime clipStart duration - ε在 epsilon 偏移处是闭区间——因为时间线画布会把边缘点击钳制到精确的start ± ε/end ± ε被钳制后的值必须能通过校验。canSplitElementAt在canSplitElement要求元素未被时间线锁定、时间来源非 implicit、拥有稳定身份hfId/domId/selector、播放速率合法且持续时间为有限正数基础上叠加边界校验。selectSplittableElementssplit-all 通过它批量选出该时刻所有可分割元素。正如文件头注释所写单片段与 split-all 两条 razor 路径现在遵循同一条最小距离规则。对应测试 packages/studio/src/utils/timelineElementSplit.test.ts 中明确记录了这条回归用例split-all 曾使用原始start t end导致过短的片段被切割出退化切片。分割的批量撤销行为则由 packages/studio/src/hooks/useRazorSplit.history.test.tsx 中的 split-all 批量历史用例覆盖。StudioGSAP 3D 检视器元数据v0.6.110 还为 Studio 的 GSAP 3D 检视器补充了元数据PR #1250。从发布说明看这是一项面向检视器inspector的元数据完善服务于在 Studio 中检查/编辑 GSAP 三维变换如rotationX、rotationY、rotationZ、z等相关属性时的展示与编辑体验。仓库中 GSAP 相关的时间线编辑回调、检视器组件集中在 packages/studio/src/components 与 packages/studio/src/hooks 目录下3D 属性检视依赖这些元数据来正确分类与渲染属性控件。CLIinit 在创建项目目录之前先校验标志问题无效标志先落盘再报错hyperframes init用于脚手架一个新视频项目。修复PR #1207前CLI 可能在尚未校验标志合法性的情况下就创建了项目目录随后再因参数不合法而失败留下半成品目录。修复先校验后落盘在 packages/cli/src/commands/init.ts 中init 支持交互式向导与若干非交互入口标志。其测试 packages/cli/src/commands/init.test.ts 明确断言了这条行为非交互式 init 必须提供--example、--video或--audio之一否则输出 Non-interactive init requires --example, --video, or --audio 并终止而不是先创建目录。也就是说v0.6.110 把参数校验前移到任何文件系统写入之前避免无效调用污染工作区。init 命令的常用非交互示例来自 packages/cli/src/commands/init.ts 的 examples如下# 交互式向导创建项目 hyperframes init my-video # 从示例模板创建 hyperframes init my-video --example warm-grain # 脚手架 4K / 竖屏项目 hyperframes init my-video --resolution 4k hyperframes init my-video --resolution portrait # 从已有视频 / 音频文件起步 hyperframes init my-video --video clip.mp4 hyperframes init my-video --audio track.mp3 # 搭配 Tailwind CSS hyperframes init my-video --example blank --tailwindCLIcapture 默认输出./capture/并自动后缀避让新默认行为hyperframes capture用于把网站捕获为可编辑的 HyperFrames 组件。v0.6.110 起未显式指定输出目录时默认写入./capture/若该目录已存在则自动依次使用./capture-2/、./capture-3/以此类推确保重复执行不会静默混入上一次捕获的产物。该逻辑位于 packages/cli/src/commands/capture.ts仅当用户未传-o/--output时才启用自动后缀显式指定目录则原样使用。后缀从 2 递增到 99若./capture-2/到./capture-99/全部被占用则报错并提示改用-o name显式指定目录。非 JSON 模式下若实际写入了带后缀的目录终端会打印提示如(./capture/ exists; writing to ./capture-2/)避免用户找不到产物。相关命令示例capture 命令的完整示例集见 packages/cli/src/commands/capture.ts# 捕获网站到 ./capture/ hyperframes capture https://stripe.com # 指定输出目录 hyperframes capture https://linear.app -o linear-video # 面向 AI Agent 的 JSON 输出 hyperframes capture https://example.com --json # 从已捕获项目的视频清单中按索引拉取视频 hyperframes capture --video ./linear-video --index 0 # 列出捕获项目清单中引用的视频 hyperframes capture --video ./linear-video --list其他常用选项还包括--skip-assets跳过图片/SVG 下载、--skip-vision跳过可选的 AI 图片打标、--max-screenshots默认 24 张截图上限、--timeout页面加载超时默认 120000ms以及--capture-budget导航后的协作式预算默认 120000ms不是硬墙钟超时无法打断已开始的本地/核心工作。Player拒绝非有限的合成尺寸问题NaN/Infinity 尺寸破坏布局Player 会从两个来源读取合成composition画布尺寸DOM 上的width/height属性以及运行时通过 stage-size 消息上报的尺寸。若这些值是非有限数NaN、Infinity会导致布局与渲染计算出错误结果。v0.6.110PR #1205在入口处统一拦截这类非法值。源码实现属性解析packages/player/src/composition-probe.ts 使用Number.isFinite(parsed) parsed 0判定非法值一律返回null即未知由上层走回退逻辑而不是把非有限数传播进布局计算。该函数被显式导出正是为了让width/height属性处理器复用同一套有限性校验。stage-size 消息packages/player/src/runtime-message-handler.ts 在处理运行时上报的 stage 尺寸时同样要求compositionWidth/compositionHeight及width/height为有限且大于 0 才应用对应测试见 packages/player/src/runtime-message-handler.test.tsapplies a finite positive stage size、reports a finite positive timeline duration。同一类有限性防护也存在于播放速率处理中例如 packages/player/src/hyperframes-player.ts 对非正或非有限的playbackRate一律回退为 1避免异常速度传播。SDKGSAP tween 的统一data-hf-id寻址问题composition-id 目标与规范选择器HyperFrames 的 SDK 让开发者直接用 GSAP 写动画例如tl.to([data-hf-id\hf-box\], { opacity: 1, duration: 0.5 }, 0.2);当元素位于子合成sub-composition中、或 tween 以data-composition-id为目标时修复前可能出现目标解析不一致、动画落到错误元素上的情况。v0.6.110PR #1526做了两件事解析以 composition-id 为目标的 tween同时为 GSAP tween 统一输出规范的data-hf-id。源码实现data-hf-id 优先级与规范形式解析优先级packages/sdk/src/engine/model.ts 中宿主元素同时携带data-hf-id其自身的叶子 id与data-composition-idStudio 针对子合成根传入的 id。data-hf-id优先data-composition-id仅在需要时作为补充寻址手段。规范输出packages/sdk/src/engine/mutate.ts 中动画归因attribution完全基于data-hf-idselectorMatchesId、cascadeRemoveAnimations、buildAnimationIdMap等因此始终输出规范形式[data-hf-id…]解析目标时若能从实时 DOM 取到元素的data-hf-id则用之否则回退到以 composition-id 寻址。对应的测试用例非常明确packages/sdk/src/session.subcomp.test.ts同名裸 id 与真实data-hf-id冲突时data-hf-id 必须优先于 contenteditable="false">【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考