hyperframes 0.7.64 → 0.7.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cli.js +2456 -2102
  2. package/dist/hyperframe-runtime.js +1 -1
  3. package/dist/hyperframe.manifest.json +1 -1
  4. package/dist/hyperframe.runtime.iife.js +1 -1
  5. package/dist/hyperframes-player.global.js +2 -2
  6. package/dist/skills/hyperframes/SKILL.md +11 -75
  7. package/dist/skills/hyperframes/references/capability-menu.md +1 -1
  8. package/dist/skills/hyperframes/references/intent-interview.md +71 -0
  9. package/dist/skills/hyperframes/references/pitch-round.md +1 -1
  10. package/dist/skills/hyperframes/references/route-briefs.md +8 -82
  11. package/dist/skills/hyperframes/references/routes/embedded-captions.md +11 -0
  12. package/dist/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
  13. package/dist/skills/hyperframes/references/routes/general-video.md +12 -0
  14. package/dist/skills/hyperframes/references/routes/motion-graphics.md +11 -0
  15. package/dist/skills/hyperframes/references/routes/music-to-video.md +12 -0
  16. package/dist/skills/hyperframes/references/routes/pr-to-video.md +28 -0
  17. package/dist/skills/hyperframes/references/routes/product-launch-video.md +13 -0
  18. package/dist/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
  19. package/dist/skills/hyperframes/references/routes/slideshow.md +11 -0
  20. package/dist/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
  21. package/dist/skills/hyperframes/references/workflow-catalog.md +7 -67
  22. package/dist/skills/hyperframes-cli/references/doctor-browser.md +12 -0
  23. package/dist/studio/assets/{hyperframes-player-D4jpio27.js → hyperframes-player-BiCGkoKi.js} +1 -1
  24. package/dist/studio/assets/{index-srObT-DA.js → index-CnL24iBm.js} +1 -1
  25. package/dist/studio/assets/{index-CqjWmIbE.js → index-Cp6reNm_.js} +1 -1
  26. package/dist/studio/assets/{index-BOMWJSjh.js → index-wCPvBGsm.js} +144 -144
  27. package/dist/studio/index.html +1 -1
  28. package/dist/studio/index.js +2562 -2538
  29. package/dist/studio/index.js.map +1 -1
  30. package/package.json +1 -1
@@ -1,85 +1,11 @@
1
- # Route briefs — what the intent layer asks, per route
1
+ # Route briefs (moved)
2
2
 
3
- The adaptive half of the intent layer (`/hyperframes` § 4, steps 4–6): each route's entry names the **must-haves** to ask now, the **conditional** questions its input can add, the **deferred asks** to announce (questions that stay in the workflow because their recommendations need pipeline data — a probed clip, a captured site), and whether the two **run-shape questions** (storyboard? · automation or companion?) apply. An entry that names **pitch-eligible** fields sends an unformed request through the pitch round (`pitch-round.md`) after routing; the chosen concept answers those fields. An entry without that line never enters the round. These entries live here, in the router skill, because workflow skills install lazily — at routing time the matched workflow may not be on the machine yet.
3
+ Each route's interview entry must-haves, conditional questions, deferred asks,
4
+ pitch-eligible fields, and whether the run-shape questions apply — now lives in that
5
+ route's own file, together with its input/output/trigger contract:
4
6
 
5
- Field semantics and question rules: `hyperframes-core/references/brief-contract.md` § 2–3. Every question: recommended option first, receipt attached; a remembered value becomes the recommendation with its source named. The intro text of the brief always states **message** and **language** (state, don't ask).
7
+ `references/routes/<workflow>.md` e.g. `routes/faceless-explainer.md`,
8
+ `routes/pr-to-video.md` (including the PR-size → length table).
6
9
 
7
- ## `/faceless-explainer`
8
-
9
- - **Must-haves:** **angle** — concept / how-to / listicle / narrative, recommend the one the text's own shape suggests · **length** — inside the 30–90s sweet spot, scaled to how much the text actually teaches · **destination** — YouTube / embed → 16:9 · X / LinkedIn / Instagram feed → 1:1 · Shorts / TikTok → 9:16.
10
- - **Conditional:** a pasted script adds **`VO_MODE`** — use it verbatim, or restructure per scene?
11
- - **Pitch round:** `message` + `angle` — five tellings of the same topic are five different videos.
12
- - **Run-shape:** both.
13
-
14
- ## `/product-launch-video`
15
-
16
- - **First, sell or show?** One question when the request doesn't say: market the product (a promo), or show the site as-is (a tour / showcase)? A show-it answer is **intent, not a different pipeline**: write it into `BRIEF.md` (`## Intent` / `## Customizations` — "feature the site's own captured screens as the video's assets") and the workflow's normal steps carry it — the captured screens become the featured `asset_candidates`.
17
- - **Must-haves:** **angle** — story shapes from the site's / brief's own positioning, recommend one with its basis · **length** — 30–90s sweet spot, scaled to the material · **destination** — as above.
18
- - **Conditional:** a show-it-as-is ask adds **what to show** — the whole site, or specific pages/sections (into `BRIEF.md`'s body); a pasted script/brief adds **`VO_MODE`** (verbatim or restructured?); a script that only names a site adds **capture?** — crawl it for brand + assets (default), or text-only / "don't scrape" (no-capture mode, a preset supplies the design system).
19
- - **Pitch round:** `message` + `angle`, after sell-or-show is settled — the pitches inherit that intent.
20
- - **Run-shape:** both.
21
-
22
- ## `/pr-to-video`
23
-
24
- - **Must-haves:** the **PR reference** (URL, `owner/repo#N`, or "this PR") · **angle** — changelog / feature-reveal / fix-explainer / refactor-walkthrough, recommend the one the PR itself suggests · **audience** — developers (default) · mixed technical · non-technical stakeholders · **length** — from the size table below · **destination** — 16:9 is the default for a code explainer.
25
- - **Length comes from the PR's change size**, not a fixed guess — peek once, read-only (the workflow's Step 1 still does the full deterministic fetch):
26
-
27
- ```bash
28
- gh pr view <PR_REF> --json title,additions,deletions,changedFiles
29
- ```
30
-
31
- Pick the tier from `additions + deletions` (nudged up by `changedFiles`) and lead with it (hard cap ~3 min):
32
-
33
- | PR change size | Recommended length |
34
- | --------------------------------- | ------------------ |
35
- | trivial (≲ 50 lines changed) | ~20–40s |
36
- | focused (~50–200 lines) | ~40–70s |
37
- | substantial (~200–600 lines) | ~70–110s |
38
- | large (≳ 600 lines, or 25+ files) | ~110–180s |
39
-
40
- State the basis in one phrase ("~40s — small change, +44/−13 across 12 files"). The tier is a **ceiling** on how much story the diff can support, never a floor to fill: a one-headline story recommends inside 30–90s regardless of tier (the tier's range may still appear as a non-recommended fuller-walkthrough option).
41
-
42
- - **Pitch round:** `angle` and the opening hook — the diff fixes the facts, not the telling.
43
- - **Run-shape:** both.
44
-
45
- ## `/general-video`
46
-
47
- - **Open-ended requests only:** first derive a one-sentence `message`. Ask `audience` only when it is unclear and would change the story or terminology. Ask `destination` only when it would change aspect or composition. Ask for a priority only when the brief contains a real trade-off. Default to one best version; ask about variations only when the user requests options or comparison.
48
- - **Specific requests:** a complete ask such as “a static title card with our logo for a website hero” needs no discovery questions.
49
- - **Pitch round:** `message` — the unformed open-ended request is this round's home case.
50
- - **Run-shape:** both questions apply. `/general-video` is also the companion host, so `flow: companion` stays on this route with the full toolbox.
51
-
52
- ## `/music-to-video`
53
-
54
- - **Must-haves:** the **music source** — a track file, a video to pull audio from, or generate one from a mood description · **destination → aspect**.
55
- - **Deferred (announce):** brand (font + palette) and the genre feel are chosen at its Step 3 by design — they emerge from the track's analysis, not from a question up front.
56
- - **Pitch round:** `message` — the visual concept riding the beat grid (lyric treatment, montage story, kinetic type); brand and genre feel still land at Step 3.
57
- - **Run-shape:** both.
58
-
59
- ## `/motion-graphics`
60
-
61
- - Autonomous by design: at most **one** clarifying question, owned by its director step, in the flow. No must-haves here beyond confirming the input; route directly.
62
- - **Run-shape:** neither — the piece is seconds long; a board and a companion session have nothing to add.
63
- - **Front-door capability offer:** skip it. The director's one-question limit is authoritative.
64
-
65
- ## `/slideshow`
66
-
67
- - The one question is the routing confirmation itself — "do you want this as a HyperFrames slideshow?" — asked during triage (it survives every mode: wrong routing is a quality problem). The deck contract owns everything after.
68
- - **Run-shape:** neither — the deliverable is a navigable deck, not a rendered video.
69
- - **Front-door capability offer:** skip it. After route confirmation, the deck workflow owns all remaining choices.
70
-
71
- ## `/embedded-captions`
72
-
73
- - **Must-haves:** which clip (the input file).
74
- - **Deferred (announce):** the caption **identity** pick — its Step 0 probes the clip first, then shortlists 2–3 identities from the catalog and recommends one. Say that's coming.
75
- - **Run-shape:** neither — the footage is untouched; there is no storyboard to review.
76
-
77
- ## `/talking-head-recut`
78
-
79
- - **Must-haves:** which clip (the input file).
80
- - **Deferred (announce):** its render-strategy questions — aspect ratio, layout, style group, card count — stay at its Step 7, where the recommendations come from the probed footage and transcript. Say they're coming.
81
- - **Run-shape:** neither.
82
-
83
- ## `/remotion-to-hyperframes`
84
-
85
- - Not served by the intent layer — a migration with no brief. Route directly.
10
+ The interview procedure itself (the eight steps) is `references/intent-interview.md`.
11
+ Field semantics and question rules: `hyperframes-core/references/brief-contract.md` § 2–3.
@@ -0,0 +1,11 @@
1
+ # Route: embedded-captions
2
+
3
+ - **Input:** Existing talking-head footage to caption. It is an actual media file, not a URL or creative brief.
4
+ - **Output:** The same footage, untouched, with a caption layer and selected caption identity. The subject may occlude embedded captions. Any length.
5
+ - **Triggers:** "add captions", "add subtitles", "captions behind the subject", "cinematic captions for my clip".
6
+
7
+ ## Interview
8
+
9
+ - **Must-haves:** which clip (the input file).
10
+ - **Deferred (announce):** the caption **identity** pick — its Step 0 probes the clip first, then shortlists 2–3 identities from the catalog and recommends one. Say that's coming.
11
+ - **Run-shape:** neither — the footage is untouched; there is no storyboard to review.
@@ -0,0 +1,12 @@
1
+ # Route: faceless-explainer
2
+
3
+ - **Input:** A topic, article, notes, or arbitrary text being explained, with no product being marketed and no website to capture.
4
+ - **Output:** A faceless explainer MP4 with invented typography, abstract graphics, diagrams, or data visualization. Sweet spot 30–90s; hard cap about 3 minutes.
5
+ - **Triggers:** "faceless explainer about X", "explain how DNS works as a video", "turn this article into an explainer".
6
+
7
+ ## Interview
8
+
9
+ - **Must-haves:** **angle** — concept / how-to / listicle / narrative, recommend the one the text's own shape suggests · **length** — inside the 30–90s sweet spot, scaled to how much the text actually teaches · **destination** — YouTube / embed → 16:9 · X / LinkedIn / Instagram feed → 1:1 · Shorts / TikTok → 9:16.
10
+ - **Conditional:** a pasted script adds **`VO_MODE`** — use it verbatim, or restructure per scene?
11
+ - **Pitch round:** `message` + `angle` — five tellings of the same topic are five different videos.
12
+ - **Run-shape:** both.
@@ -0,0 +1,12 @@
1
+ # Route: general-video
2
+
3
+ - **Input:** Any custom creation or edit not covered by a specialized route: a static title card, longer brand or sizzle reel, multi-scene montage, static loop/poster, NLE-like footage remix, or freeform composition. It also executes every `flow: companion` brief.
4
+ - **Output:** A HyperFrames composition of any length or format through design → plan → static layout → animation → check → approval → render.
5
+ - **Triggers:** "make a static title card", "longer brand reel", "multi-scene composition", "static loop", "custom video", or any unmatched video request.
6
+
7
+ ## Interview
8
+
9
+ - **Open-ended requests only:** first derive a one-sentence `message`. Ask `audience` only when it is unclear and would change the story or terminology. Ask `destination` only when it would change aspect or composition. Ask for a priority only when the brief contains a real trade-off. Default to one best version; ask about variations only when the user requests options or comparison.
10
+ - **Specific requests:** a complete ask such as "a static title card with our logo for a website hero" needs no discovery questions.
11
+ - **Pitch round:** `message` — the unformed open-ended request is this round's home case.
12
+ - **Run-shape:** both questions apply. `/general-video` is also the companion host, so `flow: companion` stays on this route with the full toolbox.
@@ -0,0 +1,11 @@
1
+ # Route: motion-graphics
2
+
3
+ - **Input:** A short design-led unit, typically under 10s, with no narration, where motion is the message: kinetic type, stat/count-up, chart hit, logo sting, animated title, lower-third, map, tweet/headline/page highlight, or asset-fusion shot.
4
+ - **Output:** A short MP4 or transparent alpha WebM/MOV overlay.
5
+ - **Triggers:** "an 8s logo sting", "animate this stat", "kinetic-type intro", "animate this title", "transparent lower-third overlay".
6
+
7
+ ## Interview
8
+
9
+ - Autonomous by design: at most **one** clarifying question, owned by its director step, in the flow. No must-haves here beyond confirming the input; route directly.
10
+ - **Run-shape:** neither — the piece is seconds long; a board and a companion session have nothing to add.
11
+ - **Front-door capability offer:** skip it. The director's one-question limit is authoritative.
@@ -0,0 +1,12 @@
1
+ # Route: music-to-video
2
+
3
+ - **Input:** A music track, or a video whose audio becomes the track, with no narration or website capture. User images or videos are optional.
4
+ - **Output:** A beat-synced MP4 driven by a deterministic beat/energy map (`audiomap.json`). It may become a lyric video, slideshow, visualizer, or kinetic promo without changing pipelines.
5
+ - **Triggers:** "make a video for this song", "beat-synced video", "lyric video", "music visualizer", "kinetic promo to this beat".
6
+
7
+ ## Interview
8
+
9
+ - **Must-haves:** the **music source** — a track file, a video to pull audio from, or generate one from a mood description · **destination → aspect**.
10
+ - **Deferred (announce):** brand (font + palette) and the genre feel are chosen at its Step 3 by design — they emerge from the track's analysis, not from a question up front.
11
+ - **Pitch round:** `message` — the visual concept riding the beat grid (lyric treatment, montage story, kinetic type); brand and genre feel still land at Step 3.
12
+ - **Run-shape:** both.
@@ -0,0 +1,28 @@
1
+ # Route: pr-to-video
2
+
3
+ - **Input:** A GitHub PR URL, `owner/repo#N`, or "this PR", read through `gh`; it is not a website capture request.
4
+ - **Output:** A changelog, feature reveal, fix explainer, or refactor walkthrough with diff, before/after, file-tree, and impact scenes. Hard cap about 3 minutes; duration follows change size.
5
+ - **Triggers:** "make a video about this PR", "turn PR #1187 into a changelog video", "release-notes video from this pull request".
6
+
7
+ ## Interview
8
+
9
+ - **Must-haves:** the **PR reference** (URL, `owner/repo#N`, or "this PR") · **angle** — changelog / feature-reveal / fix-explainer / refactor-walkthrough, recommend the one the PR itself suggests · **audience** — developers (default) · mixed technical · non-technical stakeholders · **length** — from the size table below · **destination** — 16:9 is the default for a code explainer.
10
+ - **Length comes from the PR's change size**, not a fixed guess — peek once, read-only (the workflow's Step 1 still does the full deterministic fetch):
11
+
12
+ ```bash
13
+ gh pr view <PR_REF> --json title,additions,deletions,changedFiles
14
+ ```
15
+
16
+ Pick the tier from `additions + deletions` (nudged up by `changedFiles`) and lead with it (hard cap ~3 min):
17
+
18
+ | PR change size | Recommended length |
19
+ | --------------------------------- | ------------------ |
20
+ | trivial (≲ 50 lines changed) | ~20–40s |
21
+ | focused (~50–200 lines) | ~40–70s |
22
+ | substantial (~200–600 lines) | ~70–110s |
23
+ | large (≳ 600 lines, or 25+ files) | ~110–180s |
24
+
25
+ State the basis in one phrase ("~40s — small change, +44/−13 across 12 files"). The tier is a **ceiling** on how much story the diff can support, never a floor to fill: a one-headline story recommends inside 30–90s regardless of tier (the tier's range may still appear as a non-recommended fuller-walkthrough option).
26
+
27
+ - **Pitch round:** `angle` and the opening hook — the diff fixes the facts, not the telling.
28
+ - **Run-shape:** both.
@@ -0,0 +1,13 @@
1
+ # Route: product-launch-video
2
+
3
+ - **Input:** A website URL; a script or brief that names a site; or a product-launch script with no derivable site or an explicit "do not scrape" instruction. Capture website assets and brand tokens unless the brief selects no-capture mode. Ask whether supplied script copy is verbatim voice-over or may be restructured.
4
+ - **Output:** A product promo, launch video, site tour, or showcase MP4. Sweet spot 30–90s; hard cap about 3 minutes. A show-it-as-is brief features captured screens rather than inventing a separate route.
5
+ - **Triggers:** "launch video for X", "promo for our site", "turn this script into a 60s promo", "text-only launch video", "turn this website into a video", "site tour from this URL".
6
+
7
+ ## Interview
8
+
9
+ - **First, sell or show?** One question when the request doesn't say: market the product (a promo), or show the site as-is (a tour / showcase)? A show-it answer is **intent, not a different pipeline**: write it into `BRIEF.md` (`## Intent` / `## Customizations` — "feature the site's own captured screens as the video's assets") and the workflow's normal steps carry it — the captured screens become the featured `asset_candidates`.
10
+ - **Must-haves:** **angle** — story shapes from the site's / brief's own positioning, recommend one with its basis · **length** — 30–90s sweet spot, scaled to the material · **destination** — YouTube / embed → 16:9 · X / LinkedIn / Instagram feed → 1:1 · Shorts / TikTok → 9:16.
11
+ - **Conditional:** a show-it-as-is ask adds **what to show** — the whole site, or specific pages/sections (into `BRIEF.md`'s body); a pasted script/brief adds **`VO_MODE`** (verbatim or restructured?); a script that only names a site adds **capture?** — crawl it for brand + assets (default), or text-only / "don't scrape" (no-capture mode, a preset supplies the design system).
12
+ - **Pitch round:** `message` + `angle`, after sell-or-show is settled — the pitches inherit that intent.
13
+ - **Run-shape:** both.
@@ -0,0 +1,9 @@
1
+ # Route: remotion-to-hyperframes
2
+
3
+ - **Input:** Existing Remotion React source, only when the user explicitly asks to port, convert, or migrate it. A passing Remotion mention is not a trigger.
4
+ - **Output:** A HyperFrames HTML composition translated from the source and compared with the Remotion render through the migration evaluation harness.
5
+ - **Triggers:** "port my Remotion project", "convert this Remotion composition", "migrate from Remotion".
6
+
7
+ ## Interview
8
+
9
+ - Not served by the intent layer — a migration with no brief. Route directly.
@@ -0,0 +1,11 @@
1
+ # Route: slideshow
2
+
3
+ - **Input:** A brief, outline, or existing page to author as a presentation, pitch deck, or interactive deck. If "slides", "deck", or "convert this page" is ambiguous, confirm that the user wants a HyperFrames slideshow before authoring.
4
+ - **Output:** A runnable HyperFrames composition plus the JSON island used by `SlideshowController`: discrete slides, fragment reveals, branching, hotspots, presenter mode, and speaker notes. The deliverable is a navigable deck, not an MP4.
5
+ - **Triggers:** "make a pitch deck", "interactive presentation", "convert this page into slides", "slideshow with presenter mode".
6
+
7
+ ## Interview
8
+
9
+ - The one question is the routing confirmation itself — "do you want this as a HyperFrames slideshow?" — asked during triage (it survives every mode: wrong routing is a quality problem). The deck contract owns everything after.
10
+ - **Run-shape:** neither — the deliverable is a navigable deck, not a rendered video.
11
+ - **Front-door capability offer:** skip it. After route confirmation, the deck workflow owns all remaining choices.
@@ -0,0 +1,11 @@
1
+ # Route: talking-head-recut
2
+
3
+ - **Input:** Existing talking-head, interview, or podcast footage to package. The underlying clip plays unchanged.
4
+ - **Output:** The same footage with transcript-synced graphic-overlay cards: kinetic titles, lower-thirds, data callouts, pull-quotes, side panels, or picture-in-picture. Any length.
5
+ - **Triggers:** "package this video", "add graphic overlays to my talk", "add lower-thirds or data callouts to this interview".
6
+
7
+ ## Interview
8
+
9
+ - **Must-haves:** which clip (the input file).
10
+ - **Deferred (announce):** its render-strategy questions — aspect ratio, layout, style group, card count — stay at its Step 7, where the recommendations come from the probed footage and transcript. Say they're coming.
11
+ - **Run-shape:** neither.
@@ -1,70 +1,10 @@
1
- # Workflow catalog
1
+ # Workflow catalog (moved)
2
2
 
3
- Use this catalog while routing, before the selected workflow is lazy-installed. After the routing table in `../SKILL.md` yields a candidate, read that candidate's section and confirm that its input and output match the request.
3
+ Each workflow's input/output/trigger contract now lives in its own route file one
4
+ small read per candidate instead of a whole catalog:
4
5
 
5
- ## Sections
6
+ `references/routes/<workflow>.md` — e.g. `routes/product-launch-video.md`,
7
+ `routes/general-video.md`, `routes/remotion-to-hyperframes.md`.
6
8
 
7
- - [`/product-launch-video`](#product-launch-video), [`/faceless-explainer`](#faceless-explainer), [`/pr-to-video`](#pr-to-video)
8
- - [`/embedded-captions`](#embedded-captions), [`/talking-head-recut`](#talking-head-recut)
9
- - [`/motion-graphics`](#motion-graphics), [`/music-to-video`](#music-to-video), [`/slideshow`](#slideshow)
10
- - [`/general-video`](#general-video), [`/remotion-to-hyperframes`](#remotion-to-hyperframes)
11
-
12
- ## `/product-launch-video`
13
-
14
- - **Input:** A website URL; a script or brief that names a site; or a product-launch script with no derivable site or an explicit “do not scrape” instruction. Capture website assets and brand tokens unless the brief selects no-capture mode. Ask whether supplied script copy is verbatim voice-over or may be restructured.
15
- - **Output:** A product promo, launch video, site tour, or showcase MP4. Sweet spot 30–90s; hard cap about 3 minutes. A show-it-as-is brief features captured screens rather than inventing a separate route.
16
- - **Triggers:** “launch video for X”, “promo for our site”, “turn this script into a 60s promo”, “text-only launch video”, “turn this website into a video”, “site tour from this URL”.
17
-
18
- ## `/faceless-explainer`
19
-
20
- - **Input:** A topic, article, notes, or arbitrary text being explained, with no product being marketed and no website to capture.
21
- - **Output:** A faceless explainer MP4 with invented typography, abstract graphics, diagrams, or data visualization. Sweet spot 30–90s; hard cap about 3 minutes.
22
- - **Triggers:** “faceless explainer about X”, “explain how DNS works as a video”, “turn this article into an explainer”.
23
-
24
- ## `/pr-to-video`
25
-
26
- - **Input:** A GitHub PR URL, `owner/repo#N`, or “this PR”, read through `gh`; it is not a website capture request.
27
- - **Output:** A changelog, feature reveal, fix explainer, or refactor walkthrough with diff, before/after, file-tree, and impact scenes. Hard cap about 3 minutes; duration follows change size.
28
- - **Triggers:** “make a video about this PR”, “turn PR #1187 into a changelog video”, “release-notes video from this pull request”.
29
-
30
- ## `/embedded-captions`
31
-
32
- - **Input:** Existing talking-head footage to caption. It is an actual media file, not a URL or creative brief.
33
- - **Output:** The same footage, untouched, with a caption layer and selected caption identity. The subject may occlude embedded captions. Any length.
34
- - **Triggers:** “add captions”, “add subtitles”, “captions behind the subject”, “cinematic captions for my clip”.
35
-
36
- ## `/talking-head-recut`
37
-
38
- - **Input:** Existing talking-head, interview, or podcast footage to package. The underlying clip plays unchanged.
39
- - **Output:** The same footage with transcript-synced graphic-overlay cards: kinetic titles, lower-thirds, data callouts, pull-quotes, side panels, or picture-in-picture. Any length.
40
- - **Triggers:** “package this video”, “add graphic overlays to my talk”, “add lower-thirds or data callouts to this interview”.
41
-
42
- ## `/motion-graphics`
43
-
44
- - **Input:** A short design-led unit, typically under 10s, with no narration, where motion is the message: kinetic type, stat/count-up, chart hit, logo sting, animated title, lower-third, map, tweet/headline/page highlight, or asset-fusion shot.
45
- - **Output:** A short MP4 or transparent alpha WebM/MOV overlay.
46
- - **Triggers:** “an 8s logo sting”, “animate this stat”, “kinetic-type intro”, “animate this title”, “transparent lower-third overlay”.
47
-
48
- ## `/music-to-video`
49
-
50
- - **Input:** A music track, or a video whose audio becomes the track, with no narration or website capture. User images or videos are optional.
51
- - **Output:** A beat-synced MP4 driven by a deterministic beat/energy map (`audiomap.json`). It may become a lyric video, slideshow, visualizer, or kinetic promo without changing pipelines.
52
- - **Triggers:** “make a video for this song”, “beat-synced video”, “lyric video”, “music visualizer”, “kinetic promo to this beat”.
53
-
54
- ## `/slideshow`
55
-
56
- - **Input:** A brief, outline, or existing page to author as a presentation, pitch deck, or interactive deck. If “slides”, “deck”, or “convert this page” is ambiguous, confirm that the user wants a HyperFrames slideshow before authoring.
57
- - **Output:** A runnable HyperFrames composition plus the JSON island used by `SlideshowController`: discrete slides, fragment reveals, branching, hotspots, presenter mode, and speaker notes. The deliverable is a navigable deck, not an MP4.
58
- - **Triggers:** “make a pitch deck”, “interactive presentation”, “convert this page into slides”, “slideshow with presenter mode”.
59
-
60
- ## `/general-video`
61
-
62
- - **Input:** Any custom creation or edit not covered above: a static title card, longer brand or sizzle reel, multi-scene montage, static loop/poster, NLE-like footage remix, or freeform composition. It also executes every `flow: companion` brief.
63
- - **Output:** A HyperFrames composition of any length or format through design → plan → static layout → animation → check → approval → render.
64
- - **Triggers:** “make a static title card”, “longer brand reel”, “multi-scene composition”, “static loop”, “custom video”, or any unmatched video request.
65
-
66
- ## `/remotion-to-hyperframes`
67
-
68
- - **Input:** Existing Remotion React source, only when the user explicitly asks to port, convert, or migrate it. A passing Remotion mention is not a trigger.
69
- - **Output:** A HyperFrames HTML composition translated from the source and compared with the Remotion render through the migration evaluation harness.
70
- - **Triggers:** “port my Remotion project”, “convert this Remotion composition”, “migrate from Remotion”.
9
+ The same file carries that route's interview entry (must-haves, conditionals, deferred
10
+ asks, run-shape), so confirming a route is exactly one read.
@@ -31,6 +31,18 @@ Common issues:
31
31
  - **Missing FFmpeg** — install via `brew install ffmpeg` (macOS) or your package manager.
32
32
  - **Missing bundled Chrome** — run `npx hyperframes browser ensure`.
33
33
  - **Low memory** — close other Chromes, reduce `--workers`, or use `--quality draft`.
34
+ - **Chrome exits instantly inside an agent sandbox (macOS)** — seatbelt-style sandboxes
35
+ (e.g. codex `workspace-write`) block Chromium's Mach port bootstrap
36
+ (`MachPortRendezvous`; openai/codex#21292), so every Chrome — bundled, system, or
37
+ headless shell — dies at startup. This is a host-level block, not a HyperFrames or
38
+ Chrome install problem: compile checks and audio still pass, only rendering is
39
+ unavailable. State the blocker and deliver the checked composition; render outside the
40
+ sandbox or via `render --docker` / cloud rendering where available. **Do not build a
41
+ substitute rasterizer** (magick/PIL/SVG frame pipelines) — on a blocked-browser host
42
+ the deliverable IS the checked composition plus this blocker note, and rendering is
43
+ handed to `--docker`, cloud, or the user. Write your final summary the moment the
44
+ blocker is identified, BEFORE any optional fallback work: a later session failure must
45
+ not erase the report of work already done.
34
46
 
35
47
  ## browser
36
48
 
@@ -1,4 +1,4 @@
1
- var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-BOMWJSjh.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
1
+ var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-wCPvBGsm.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1 +1 @@
1
- import{g as P}from"./index-BOMWJSjh.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
1
+ import{g as P}from"./index-wCPvBGsm.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-BOMWJSjh.js";/*!
1
+ import{n as Qi}from"./index-wCPvBGsm.js";/*!
2
2
  * Copyright (c) 2026-present, Vanilagy and contributors
3
3
  *
4
4
  * This Source Code Form is subject to the terms of the Mozilla Public