mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-08-31 02:41:44 +00:00
* fix: handle caption skin workflow * docs(skills): simplify the finalize step across video workflows - Drop --strict-layout; all skills use plain `hyperframes inspect` - Add the caption text_box_overflow false-positive note to faceless-explainer - On a failed check, the orchestrator makes the cheapest safe edit itself (no worker re-dispatch / Step 3 backtrack language) - Snapshot: glance at the stitched contact-sheet.jpg and move on Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(auth): onboarding-first `auth status` + shared TTS/BGM preflight When no HeyGen credential is configured, `hyperframes auth status` now prints registration-first guidance instead of a terse error: - Interactive / agent-driven sessions get sign-in guidance led by `hyperframes auth login` (the OAuth step that also creates an account and is shared with heygen-cli), and never steer users to a per-repo `.env`. CI / non-interactive runs get a terse note. Exit 1 is kept so the "am I logged in?" `$?` contract still holds. - It probes which local engine voice/music will fall back to (Kokoro / MusicGen, mirroring the skill resolution order) and whether their Python deps are installed, with a pip hint when missing. `--json` exposes `recommended_action` + `offline_engines` for skills to branch. - `doctor` gains matching "TTS (Kokoro)" / "BGM (MusicGen)" checks via the same shared probe (findPython/hasPythonModules extracted to tts/python.ts; provider resolution in audio/providers.ts). Every TTS/BGM workflow now relays this at Step 0 (setup) instead of improvising its own "missing key" prompt: pr-to-video, product-launch- video, faceless-explainer, website-to-video, music-to-video. The canonical behavior + key-priority table live once in hyperframes-media. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(pr-to-video): scale recommended video length to PR change size Step 0 led with a fixed ~60-90s length default. Now the recommended length is derived from the PR's diff stat (lines added+deleted, nudged by file count) on a tier scale (trivial ~20-40s → large ~110-180s, hard cap ~3 min), reusing the same PR peek already done to infer the angle. The agent states the basis when proposing it, and a huge PR with one headline change still stays tight. User can always override. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(captions): embed brand fonts whose files use separators brandFontFaces() matched font files by stripping only whitespace, so an underscore/hyphen-named file (TT_Norms_Pro_Bold.woff2) never matched the family key "ttnormspro" — captions shipped with no @font-face, the font_family_without_font_face bug. Now both family and filename normalize away all non-alphanumerics; families match longest-key-first so a parent family can't swallow a more specific one's files (TT Norms Pro vs Mono); each file is claimed once; "demibold" ranks before "bold"; and when nothing matches it warns loudly at build time instead of returning "". Also: parseFonts() falls back to h1/h2/title/hero display roles, and the frame-worker + caption authoring docs spell out that only shipped font files render — no system CJK/Devanagari families on the headless renderer. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(hyperframes-media): enforce sign-in preflight on standalone BGM/TTS A one-off "generate me a BGM" request went straight to local MusicGen without recommending sign-in: bgm.md/tts.md framed the no-credential path as an automatic fallback, so the generation path bypassed the Preflight stop, and the preflight used a bare `hyperframes auth status` that isn't on PATH in a fresh `npx skills` project. - Preflight now applies to one-off generation as well as workflows, uses `npx hyperframes auth status`, and says: if the CLI can't run, still recommend signing in and STOP — never treat "no credential" as a silent green light for local generation. - bgm.md and tts.md point at the Preflight before generating, reframing local generation as the fallback the user opts into, not a default. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(auth): add Authentication & API keys guide Document signing in, the keys each capability (voice, music, capture) uses, their resolution priority, and the fully local fallback. Add the guide to the nav and cross-link it from the cloud deploy note and the CLI env-var reference. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(lint): strip HTML comments in a fixpoint loop (CodeQL) Single-pass <!-- --> removal can re-form a complete comment from adjacent markers (e.g. `<<!-- -->!-- ... -->`), letting a decoy <template> survive and hijack the template-boundary match. Loop to a fixpoint, mirroring the captions.mjs precedent; add a regression test that fails on single-pass (2 root findings) and passes on the loop. Also wrap the build-frame.mjs node:fs imports to satisfy oxfmt — the new copyFileSync import pushed the line past the width limit, which was the sole cause of the Format / Preflight CI failures. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(lint): strip HTML comments with a linear scan (CodeQL ReDoS) The fixpoint loop still ran a /<!--[\s\S]*?-->/ regex per pass, which backtracks O(n^2) on inputs with many unterminated "<!--" — CodeQL js/polynomial-redos (high). Looping the same regex (the prescribed fix) never addressed this; only the regex itself does. Replace it with an indexOf-based linear strip in utils.ts (stripHtmlComments), kept in a fixpoint loop so markers that re-form when a comment is removed are still stripped. 200k unterminated "<!--" now strips in ~3ms instead of quadratic time; behavior is otherwise unchanged — unterminated comments are kept verbatim, as the old regex left them. The re-forming regression test still guards it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(auth): make TTS/BGM sign-in guidance accurate and runnable From team review of the not-signed-in onboarding: - OAuth is a `hyperframes auth login` feature only. The separate `heygen` CLI is API-key-only — `heygen auth login` stores a pasted key, it is not OAuth and does not create an account. Stop presenting the two CLIs as the same OAuth/sign-up step. - Use `npx hyperframes` in every imperative and runtime hint. Bare `hyperframes` is not on PATH on a fresh machine (command not found); only `npx hyperframes` is guaranteed. Also updates the JSON recommended_action. - Drop `heygen auth login` from the terminal/skill onboarding: it needs its own install and there is no `npx heygen`, so it was a command-not-found trap. The shared-credential fact stays in the reference docs. Covers the `auth status` guidance + tests, the Authentication docs, the shared hyperframes-media preflight (SKILL, requirements, tts, error hints), and the `npx hyperframes auth status` preflight in every TTS/BGM workflow (pr-to-video, product-launch-video, faceless-explainer, website-to-video, music-to-video). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
355 lines
12 KiB
JSON
355 lines
12 KiB
JSON
{
|
|
"$schema": "https://mintlify.com/docs.json",
|
|
"name": "HyperFrames",
|
|
"theme": "maple",
|
|
"colors": {
|
|
"primary": "#0a0a0a",
|
|
"light": "#f6f5f1",
|
|
"dark": "#0a0a0a"
|
|
},
|
|
"background": {
|
|
"color": {
|
|
"light": "#f6f5f1",
|
|
"dark": "#0a0a0a"
|
|
}
|
|
},
|
|
"fonts": {
|
|
"family": "Inter",
|
|
"heading": {
|
|
"family": "Inter"
|
|
}
|
|
},
|
|
"appearance": {
|
|
"default": "light"
|
|
},
|
|
"logo": {
|
|
"light": "/logo/light.svg",
|
|
"dark": "/logo/dark.svg"
|
|
},
|
|
"favicon": "/favicon.svg",
|
|
"contextual": {
|
|
"options": [
|
|
"copy",
|
|
"claude",
|
|
"cursor",
|
|
"vscode",
|
|
"windsurf",
|
|
"mcp",
|
|
{
|
|
"title": "Open an issue",
|
|
"description": "Report a bug or request a feature",
|
|
"icon": "github",
|
|
"iconType": "brands",
|
|
"href": "https://github.com/heygen-com/hyperframes/issues/new"
|
|
}
|
|
]
|
|
},
|
|
"navigation": {
|
|
"tabs": [
|
|
{
|
|
"tab": "Documentation",
|
|
"groups": [
|
|
{
|
|
"group": "Getting Started",
|
|
"pages": [
|
|
"introduction",
|
|
"changelog",
|
|
"weekly-updates",
|
|
"quickstart",
|
|
"showcase",
|
|
"examples",
|
|
"launch-videos"
|
|
]
|
|
},
|
|
{
|
|
"group": "Concepts",
|
|
"pages": [
|
|
"concepts/compositions",
|
|
"concepts/data-attributes",
|
|
"concepts/variables",
|
|
"concepts/frame-adapters",
|
|
"concepts/determinism"
|
|
]
|
|
},
|
|
{
|
|
"group": "Guides",
|
|
"pages": [
|
|
"guides/pipeline",
|
|
"guides/authentication",
|
|
"guides/video-components",
|
|
"guides/html-in-canvas",
|
|
"guides/website-to-video",
|
|
"guides/antigravity",
|
|
"guides/copilot-cli",
|
|
"guides/claude-design",
|
|
"guides/open-design",
|
|
"guides/prompting",
|
|
"guides/hyperframes-vs-remotion",
|
|
"guides/gsap-animation",
|
|
"guides/keyframes",
|
|
"guides/rendering",
|
|
"guides/remove-background",
|
|
"guides/hdr",
|
|
"guides/4k-rendering",
|
|
"guides/performance",
|
|
"guides/timeline-editing",
|
|
"guides/video-editor-cheatsheet",
|
|
"guides/common-mistakes",
|
|
"guides/troubleshooting",
|
|
"guides/feedback"
|
|
]
|
|
},
|
|
{
|
|
"group": "Deploy",
|
|
"pages": [
|
|
"deploy/cloud",
|
|
"guides/deploy",
|
|
"deploy/aws-lambda",
|
|
"deploy/gcp-cloud-run",
|
|
"deploy/templates-on-lambda",
|
|
"deploy/migrating-to-hyperframes-lambda"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Catalog",
|
|
"groups": [
|
|
{
|
|
"group": "Code Animations",
|
|
"pages": [
|
|
"catalog/blocks/code-3d-extrude",
|
|
"catalog/blocks/code-shader-dissolve",
|
|
"catalog/blocks/code-particle-assemble",
|
|
"catalog/blocks/code-morph",
|
|
"catalog/blocks/code-snippet-flight",
|
|
"catalog/blocks/code-typing",
|
|
"catalog/blocks/code-diff",
|
|
"catalog/blocks/code-highlight",
|
|
"catalog/blocks/code-scroll"
|
|
]
|
|
},
|
|
{
|
|
"group": "Captions",
|
|
"pages": [
|
|
"catalog/components/caption-clip-wipe",
|
|
"catalog/components/caption-editorial-emphasis",
|
|
"catalog/components/caption-emoji-pop",
|
|
"catalog/components/caption-glitch-rgb",
|
|
"catalog/components/caption-gradient-fill",
|
|
"catalog/components/caption-highlight",
|
|
"catalog/components/caption-kinetic-slam",
|
|
"catalog/components/caption-matrix-decode",
|
|
"catalog/components/caption-neon-accent",
|
|
"catalog/components/caption-neon-glow",
|
|
"catalog/components/caption-parallax-layers",
|
|
"catalog/components/caption-particle-burst",
|
|
"catalog/components/caption-pill-karaoke",
|
|
"catalog/components/caption-texture",
|
|
"catalog/components/caption-weight-shift"
|
|
]
|
|
},
|
|
{
|
|
"group": "HTML-in-Canvas",
|
|
"pages": [
|
|
"catalog/blocks/ios26-liquid-glass",
|
|
"catalog/blocks/liquid-glass-context-menu",
|
|
"catalog/blocks/liquid-glass-media-controls",
|
|
"catalog/blocks/liquid-glass-notification",
|
|
"catalog/blocks/liquid-glass-widgets",
|
|
"catalog/blocks/macos-tahoe-liquid-glass",
|
|
"catalog/blocks/vfx-iphone-device",
|
|
"catalog/blocks/vfx-liquid-background",
|
|
"catalog/blocks/vfx-magnetic",
|
|
"catalog/blocks/vfx-portal",
|
|
"catalog/blocks/vfx-shatter",
|
|
"catalog/blocks/vfx-text-cursor"
|
|
]
|
|
},
|
|
{
|
|
"group": "Social Overlays",
|
|
"pages": [
|
|
"catalog/blocks/instagram-follow",
|
|
"catalog/blocks/macos-notification",
|
|
"catalog/blocks/reddit-post",
|
|
"catalog/blocks/spotify-card",
|
|
"catalog/blocks/tiktok-follow",
|
|
"catalog/blocks/x-post",
|
|
"catalog/blocks/yt-lower-third"
|
|
]
|
|
},
|
|
{
|
|
"group": "Shader Transitions",
|
|
"pages": [
|
|
"catalog/blocks/chromatic-radial-split",
|
|
"catalog/blocks/cinematic-zoom",
|
|
"catalog/blocks/cross-warp-morph",
|
|
"catalog/blocks/domain-warp-dissolve",
|
|
"catalog/blocks/flash-through-white",
|
|
"catalog/blocks/glitch",
|
|
"catalog/blocks/gravitational-lens",
|
|
"catalog/blocks/light-leak",
|
|
"catalog/blocks/ridged-burn",
|
|
"catalog/blocks/ripple-waves",
|
|
"catalog/blocks/sdf-iris",
|
|
"catalog/blocks/swirl-vortex",
|
|
"catalog/blocks/thermal-distortion",
|
|
"catalog/blocks/whip-pan"
|
|
]
|
|
},
|
|
{
|
|
"group": "CSS Transitions",
|
|
"pages": [
|
|
"catalog/blocks/transitions-3d",
|
|
"catalog/blocks/transitions-blur",
|
|
"catalog/blocks/transitions-cover",
|
|
"catalog/blocks/transitions-destruction",
|
|
"catalog/blocks/transitions-dissolve",
|
|
"catalog/blocks/transitions-distortion",
|
|
"catalog/blocks/transitions-grid",
|
|
"catalog/blocks/transitions-light",
|
|
"catalog/blocks/transitions-mechanical",
|
|
"catalog/blocks/transitions-other",
|
|
"catalog/blocks/transitions-push",
|
|
"catalog/blocks/transitions-radial",
|
|
"catalog/blocks/transitions-scale"
|
|
]
|
|
},
|
|
{
|
|
"group": "Showcases",
|
|
"pages": [
|
|
"catalog/blocks/app-showcase",
|
|
"catalog/blocks/apple-money-count",
|
|
"catalog/blocks/blue-sweater-intro-video",
|
|
"catalog/blocks/north-korea-locked-down",
|
|
"catalog/blocks/nyc-paris-flight",
|
|
"catalog/blocks/ui-3d-reveal",
|
|
"catalog/blocks/vpn-youtube-spot"
|
|
]
|
|
},
|
|
{
|
|
"group": "Data",
|
|
"pages": [
|
|
"catalog/blocks/data-chart",
|
|
"catalog/blocks/spain-map",
|
|
"catalog/blocks/us-map",
|
|
"catalog/blocks/us-map-bubble",
|
|
"catalog/blocks/us-map-flow",
|
|
"catalog/blocks/us-map-hex",
|
|
"catalog/blocks/world-map"
|
|
]
|
|
},
|
|
{
|
|
"group": "Effects",
|
|
"pages": [
|
|
"catalog/components/grain-overlay",
|
|
"catalog/components/grid-pixelate-wipe",
|
|
"catalog/components/parallax-unzoom",
|
|
"catalog/components/parallax-zoom",
|
|
"catalog/components/shimmer-sweep",
|
|
"catalog/components/vignette"
|
|
]
|
|
},
|
|
{
|
|
"group": "Text Effects",
|
|
"pages": [
|
|
"catalog/components/caption-blend-difference",
|
|
"catalog/components/morph-text",
|
|
"catalog/components/texture-mask-text"
|
|
]
|
|
},
|
|
{
|
|
"group": "Blocks",
|
|
"pages": [
|
|
"catalog/blocks/flowchart",
|
|
"catalog/blocks/logo-outro"
|
|
]
|
|
},
|
|
{
|
|
"group": "Code Snippets",
|
|
"pages": [
|
|
"catalog/blocks/code-snippet-apple-terminal-basic",
|
|
"catalog/blocks/code-snippet-apple-terminal-clear-dark",
|
|
"catalog/blocks/code-snippet-apple-terminal-clear-light",
|
|
"catalog/blocks/code-snippet-apple-terminal-grass",
|
|
"catalog/blocks/code-snippet-apple-terminal-homebrew",
|
|
"catalog/blocks/code-snippet-apple-terminal-man-page",
|
|
"catalog/blocks/code-snippet-apple-terminal-novel",
|
|
"catalog/blocks/code-snippet-apple-terminal-ocean",
|
|
"catalog/blocks/code-snippet-apple-terminal-pro",
|
|
"catalog/blocks/code-snippet-apple-terminal-red-sands",
|
|
"catalog/blocks/code-snippet-apple-terminal-silver-aerogel",
|
|
"catalog/blocks/code-snippet-apple-terminal-solid-colors",
|
|
"catalog/blocks/code-snippet-dark-2026",
|
|
"catalog/blocks/code-snippet-dark-modern",
|
|
"catalog/blocks/code-snippet-dark-plus",
|
|
"catalog/blocks/code-snippet-high-contrast",
|
|
"catalog/blocks/code-snippet-high-contrast-light",
|
|
"catalog/blocks/code-snippet-light-2026",
|
|
"catalog/blocks/code-snippet-light-modern",
|
|
"catalog/blocks/code-snippet-light-plus",
|
|
"catalog/blocks/code-snippet-monokai",
|
|
"catalog/blocks/code-snippet-solarized-light",
|
|
"catalog/blocks/code-snippet-visual-studio-dark",
|
|
"catalog/blocks/code-snippet-visual-studio-light"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Packages",
|
|
"groups": [
|
|
{
|
|
"group": "Packages",
|
|
"pages": [
|
|
"packages/core",
|
|
"packages/sdk",
|
|
"packages/engine",
|
|
"packages/player",
|
|
"packages/producer",
|
|
"packages/shader-transitions",
|
|
"packages/aws-lambda",
|
|
"packages/gcp-cloud-run",
|
|
"packages/studio",
|
|
"packages/cli"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Reference",
|
|
"groups": [
|
|
{
|
|
"group": "Reference",
|
|
"pages": [
|
|
"reference/html-schema"
|
|
]
|
|
},
|
|
{
|
|
"group": "Contributing",
|
|
"pages": [
|
|
"contributing",
|
|
"contributing/catalog",
|
|
"contributing/release-channels",
|
|
"contributing/changelog-process",
|
|
"contributing/testing-local-changes",
|
|
"contributing/studio-manual-dom-editing"
|
|
]
|
|
},
|
|
{
|
|
"group": "Community",
|
|
"pages": [
|
|
"community/adopters"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"footer": {
|
|
"socials": {
|
|
"github": "https://github.com/heygen-com/hyperframes"
|
|
}
|
|
}
|
|
}
|