product-launch-video
Turn a product or marketing URL, pasted script, or brief into a product launch / promo video — SaaS promos, feature reveals, product demos, app and company launches. Use when the user wants to market, launch, promote, or reveal a product; the default for any commercial URL. Site tours / showcases of a website route here too — the brief carries the show-it-as-is intent. Unclear → /hyperframes.
1How It Works & Mechanism
Six-step orchestration with step-by-step gating: Setup → Capture → Design System → Storyboard/Script → Audio → Visual Design → Frames → Finalize, where each step has explicit 'what not to do in this step' rules and pass criteria, strictly forbidding skipping steps.
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.
Asset acquisition relies on local repo CLI site scraping: `npx hyperframes capture "<URL>" -o ./capture --json`; the script self-describes as scraping the page and assets; scraping failure triggers a hard stop, with no synthetic degradation permitted.
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.
Optional visual capabilities are determined by keys in the environment: when GEMINI_API_KEY / GOOGLE_API_KEY / OpenRouter key is detected, the capture phase automatically writes asset descriptions into asset-descriptions.md; without a key, it proceeds using DOM context.
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.
No manual modification of the design system: only selecting a shipped frame preset is permitted, followed by build-frame.mjs deterministically performing role-based color remapping and font replacement between the preset's FRAME.md and brand tokens, complete with self-validation.
// 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
Voiceover/BGM uses HeyGen (logged-in state) or local engines: an exit code of 1 from `auth status` carries the normal semantic of 'not logged in'; the skill explicitly instructs not to treat this as a failure to retry or chain with &&; credentials reside in ~/.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.
Cross-frame continuity relies on numerical handoff contracts (handoff_out / handoff_in) rather than workers guessing each other's state: every field must be fully defined, and constants must also be explicitly written.
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.
Verification and approval chain wrap-up: inject/verify transitions → lint → check → contact sheet snapshot → human/automated approval → preview → render; checks are not rerun after rendering.
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.
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| 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) |
4Recommended Governance & Evidence
- scripts/: Local script or command execution: node scripts/build-frame.mjs --preset <name> --hyperframes . (copies preset FRAM
- 网络端点: Declared external network access: npx hyperframes capture "<URL>" (scrapes user-provided product websites: screenshots, DOM, tokens, assets)
- 本地工作目录: File I/O and artifact output: videos/<project>/BRIEF.md, hyperframes.json, STORYBOARD.md, SCRIPT.md, audio_me
5Second-Pass Verification
- [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 展示登录态语义)。差异有据,未见矛盾。
6Verdict & Scenarios
744e4c9d6dfc554d…