1实现原理 · 为什么它能做到
六步编排 + 逐 step 门禁:Setup → Capture → Design System → Storyboard/Script → Audio → Visual Design → Frames → Finalize,每步都有明确的「本步不许做什么」与通过条件,不许跳步继续。
You are the orchestrator. Work in `videos/<project>/`. Run steps in order and pass each gate before continuing. User-gated steps are Step 0, Step 3, and Step 6.
素材获取靠本仓 CLI 抓站:`npx hyperframes capture "<URL>" -o ./capture --json`,脚本自述是抓页面+资产;抓取失败是硬停,不许造假降级。
A non-zero exit, JSON `ok: false`, or `capture/BLOCKED.md` is a **hard stop** for the capture path: report the recorded reason and do not consume partial screenshots, DOM, tokens, or assets. Do not manufacture a synthetic no-capture fallback after a failed URL capture.
可选视觉能力由环境里的 key 决定:检测到 GEMINI_API_KEY / GOOGLE_API_KEY / OpenRouter key 时,抓取阶段会把资产自动描述写进 asset-descriptions.md;没有 key 就用 DOM 上下文继续。
If `GEMINI_API_KEY`, `GOOGLE_API_KEY`, or an OpenRouter key exists, capture auto-captions assets into `capture/extracted/asset-descriptions.md`. This is not a review gate. Without a vision key, use DOM context and continue.
设计系统不手改:只允许选定一个 shipped frame preset,然后由 build-frame.mjs 确定性地把 preset 的 FRAME.md 与 brand tokens 做「按角色的颜色重映射 + 字体替换」并自校验。
// Remix rule — ONLY `colors:` values and `typography:` fontFamily change; keys, // structure, geometry, and components are untouched: // colors — map brand tokens onto the preset's keys BY ROLE: the ink-role key takes // the brand ink (darkest/ink-named), the canvas-role key takes the brand // canvas (lightest), and every other color is repainted with the nearest // brand accent's hue+saturation while KEEPING its own lightness
配音/BGM 走 HeyGen(登录态)或本地引擎:`auth status` 的 exit 1 是「未登录」的正常语义,skill 明确要求不要当失败重试或 && 串联;凭证是 ~/.heygen。
Note the exit code contract: `auth status` **exits 1 when not signed in** (and when the stored credential is rejected) — that non-zero exit is the normal signed-out state, not a command failure, so don't treat it as an error, don't retry it, and don't chain it with `&&`/`set -e` in a way that would abort the workflow.
跨帧连续性用数值交接契约(handoff_out / handoff_in)而不是靠 worker 互相猜:每个字段都要写全,常量也要显式写出。
When an element visibly continues across a frame boundary, give both workers the same numerical handoff in `STORYBOARD.md`: add `handoff_out:` to the outgoing frame and a matching `handoff_in:` to the incoming frame. Name the element and its exact x/y position, scale, opacity, and motion direction/speed at the cut — state every field even when it does not change, because a constant is `opacity: 1`, not an omission.
验证与审批链收尾:inject/verify 转场 → lint → check → 接触表快照 → 人工/自动审批 → preview → render;渲染后不再重复跑检查。
Render only after user approval (autonomous mode: after the preview-or-render question): `npx hyperframes render --skill=product-launch-video --quality high --output renders/video.mp4` Do not rerun `lint`, `check`, or `snapshot` after rendering unless the user asks.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | hyperframes CLI:capture(抓站)/ init / lint / check / snapshot / preview / render / auth status / skills update |
| network | 被抓取的目标网站(任意用户给定 URL;含抓取期的页面导航与资产下载) |
| api | HeyGen Audio API(TTS 与音乐库检索)/ 凭证文件 ~/.heygen |
| api | 视觉模型 key(仅探测是否可用,用于抓取期资产描述) |
| cli | ffprobe / ffmpeg(BGM 时长探测与循环补齐,缺失时降级为警告) |
| network | GSAP CDN(写进装配后的 index.html / caption 皮肤,带 SRI 完整性校验) |
| cli | media-use 侧脚本(prefs.mjs 记录偏好、recipe.mjs 应用配方、audio/scripts/heygen-tts.mjs 列语音) |
| package | 兄弟 skill 依赖(/hyperframes 路由、/hyperframes-core、/hyperframes-creative、/hyperframes-animation、/media-use、/figma) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 涉及凭证:~/.heygen 会被音频步骤使用,视觉 key 会被探测 — 本流程会用使用者的 HeyGen 账号做 TTS/BGM 检索(可能计费);若环境里存在 GEMINI/GOOGLE/OpenRouter key,抓取到的页面资产会被送往该视觉模型做自动描述。使用前应确认账号额度、key 归属与数据出境预期。
- 抓取任意 URL 并把页面内容灌入模型上下文 — 用户给定 URL 后,DOM 文本/截图/资产成为故事与素材来源;恶意或含指令式文案的页面理论上可影响后续生成(提示注入面)。同时抓取本身会给目标站带来流量,需遵守目标站条款与 robots 约定。
- 抓取失败即停 → 流程可能空转 — 硬停纪律避免了造假,但对动态渲染/需登录的站点,capture 失败会成为常见终点;此时只能改走 no-capture 路径(要求用户自带素材),没有中间方案。
- 依赖树庞大:需要整套 HyperFrames 生态 + media-use + 可选 HeyGen 凭证 — 缺任一硬依赖时 skill 要求 STOP 询问用户;另外 auth status 的 exit 1 语义若宿主用 `set -e` 包裹会中断流程(SKILL.md 已警告,但仍属易踩的坑)。
- 产出 HTML 依赖外部 CDN([email protected]) — 装配结果在播放/渲染时需要联网加载 jsdelivr 上的 GSAP(虽有 SRI);离线渲染环境需自行内联,否则可能出现脚本未加载的静默退化。
5第二遍独立确认
- [ok] 『外部资源』逐条回查调用点是否真实存在 — hyperframes capture 命令原文在 Step 1;~/.heygen 与 HeyGen Audio API 在 Step 3.1 原文;GEMINI/GOOGLE/OpenRouter key 探测在 Step 1 原文;ffprobe/ffmpeg 在 assemble-index.mjs 的 ensureBgmCovers 内真实 spawnSync;gsap CDN 在 assemble-index.mjs:727 与 captions.mjs:480;media-use 的 prefs.mjs/recipe.mjs/heygen-tts.mjs 在 Step 0/3.1 原文。无一条属于推测。
- [ok] 凭证读取是否被夸大或漏报 — 脚本层(23 个 mjs)未发现任何读取 ~/.heygen 或 env key 的代码——凭证读取发生在 media-use / hyperframes CLI 侧,本 skill 只以文字指令调用它们。SKILL.md 同时明令不得把 key 写进 per-repo .env。判定为『授权链式凭证读取』而非本 skill 直读,橙色理由已按此措辞。
- [ok] 抓取失败是否真的硬停(有无隐藏的合成兜底) — Step 1 原文 'Do not manufacture a synthetic no-capture fallback after a failed URL capture.';no-capture 路径被限定为『原始 brief 自带素材』或『用户在失败后明确改用提供的截图/brief』两种情形。未发现绕过路径。
- [ok] 验证:抓取/装配脚本是否有未声明的网络调用 — 对 23 个 mjs 做 fetch/axios/http.request/urllib 扫描 → 0 命中;唯一的对外引用是 HTML 模板字符串里的 CDN URL(浏览器侧加载)。脚本自身不发起 HTTP 请求,网络行为全在 hyperframes CLI 与 media-use 侧。
- [ok] 与同批 skill 的组内一致性(默认 provider/voice 与静音标记) — 本 skill 与 faceless-explainer 都用 'Marcia (female) on HeyGen / am_michael on Kokoro' 作默认声线、都用 `music: none` 作静音标记;本 skill 额外要求传 `--provider <provider>`(因为它需要在 Step 0 就确定 provider 并在 Step 0 展示登录态语义)。差异有据,未见矛盾。
6结论
744e4c9d6dfc554d…b8328f9573