Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7fe8bab
refactor(skills): restructure product-launch-video into product-lunch…
WaterrrForever Jun 19, 2026
d08e942
fix(skills): correct directory name product-lunch-video -> product-la…
WaterrrForever Jun 19, 2026
d7e4a5d
docs(skill): add inspect + snapshot to product-launch-video validation
WaterrrForever Jun 20, 2026
0bb82d2
feat(skill): add 10 frame-presets and register them in design-spec
WaterrrForever Jun 20, 2026
7a01e7c
refactor(product-launch-video): make every frame a directed shot
WaterrrForever Jun 21, 2026
a789cc5
fix(product-launch-video): floor SFX search min_score to 0.4
WaterrrForever Jun 21, 2026
6532d02
refactor(product-launch-video): stage assets at Step 4; tighten prompts
WaterrrForever Jun 21, 2026
9771c58
chore(skills): refresh skill test list, add biennale caption skin
WaterrrForever Jun 21, 2026
5537d6c
fix(product-launch-video): restore skill name to match directory
WaterrrForever Jun 21, 2026
8a0cb7c
feat(skills): per-preset caption skins + auto-load in product-launch …
WaterrrForever Jun 21, 2026
abf43ae
feat(product-launch-video): one-command Step 2 — build-frame remixes …
WaterrrForever Jun 21, 2026
b416f5d
feat(media): shared audio engine (TTS/BGM/SFX); wire product-launch +…
WaterrrForever Jun 21, 2026
922524e
refactor(product-launch-video): stage assets into assets/ not public/
WaterrrForever Jun 21, 2026
e1782e6
refactor(product-launch-video): build-frame token remix + caption tweaks
WaterrrForever Jun 21, 2026
d61de27
refactor(pr-to-video): restructure onto the script-driven architecture
WaterrrForever Jun 21, 2026
8c9a176
refactor(faceless-explainer): restructure onto the script-driven arch…
WaterrrForever Jun 21, 2026
aca40cd
feat(hyperframes-creative): add claude frame preset
WaterrrForever Jun 21, 2026
e43b377
fix(core): escape digit-leading id selectors in standalone sub-compos…
WaterrrForever Jun 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 32 additions & 1 deletion packages/cli/src/capture/contentExtractor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -494,5 +494,36 @@ export function generateAssetDescriptions(
/* no fonts dir */
}

return [...captionedLines, ...uncaptionedLines, ...svgLines, ...fontLines];
// Describe videos — high-value motion clips. The video-manifest.json (written
// earlier by captureVideoManifest) carries each clip's DOM heading/caption +
// dims. Surfaced FIRST and tagged `[video]`: for a product/demo these moving
// clips are usually the strongest hero material, and downstream planners key off
// the `[video]` marker. (The `videos/` dir is skipped in the image walk above —
// its entries come from the manifest, which has the captions the bare files lack.)
const videoLines: string[] = [];
try {
const manifest = JSON.parse(
readFileSync(join(outputDir, "extracted", "video-manifest.json"), "utf-8"),
) as Array<{
filename?: string;
localPath?: string;
caption?: string;
heading?: string;
width?: number;
height?: number;
}>;
for (const v of manifest) {
if (!v.localPath) continue; // only describe clips that actually downloaded
const base = v.localPath.split("/").pop() || v.filename || "";
if (!base) continue;
const desc =
(v.caption || v.heading || "").trim().replace(/\s+/g, " ").slice(0, 140) || "motion clip";
const dims = v.width && v.height ? `, ~${v.width}×${v.height}` : "";
videoLines.push(`${base} — [video] ${desc}${dims}`);
}
} catch {
/* no video manifest */
}

return [...videoLines, ...captionedLines, ...uncaptionedLines, ...svgLines, ...fontLines];
}
29 changes: 8 additions & 21 deletions skills/general-video/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
---
name: general-video
description: >
Use as the fallback for custom HyperFrames HTML video composition authoring
when no specialized workflow fits. Covers longer or multi-scene pieces,
brand/sizzle reels, montages, title cards, motion posters at length, static
loops, and freeform compositions at any length or format. Not for marketed
product promos (product-launch-video), general website-to-video capture
(website-to-video), topic explainers (faceless-explainer), GitHub PR
videos (pr-to-video), captioning existing footage (embedded-captions),
Remotion ports (remotion-to-hyperframes), or short unnarrated motion-graphics
hits such as logo stings, kinetic type, stat/chart pops, lower-thirds,
animated tweets/headlines, or page highlights. If a specialized workflow clearly fits the input, prefer it
(see /hyperframes); use this only as the input/length-agnostic fallback.
The fallback workflow for authoring custom HyperFrames video compositions at
any length or format — longer or multi-scene pieces, brand / sizzle reels,
montages, title cards, static loops, and freeform compositions. Input- and
length-agnostic. If a specialized workflow clearly fits the input — a
marketed product, a website, a topic explainer, a GitHub PR, existing
footage, a short motion graphic, or a Remotion port — prefer it (see
/hyperframes); use this only as the general fallback when none fit.
metadata: { "tags": "orchestrator, general-video, fallback, freeform, composition-authoring" }
---

# general-video — general composition authoring
# general-video — general video workflow

> **Confirm the route before you build.** This is the **fallback** for custom composition authoring. If the input clearly fits a specialized workflow, prefer it: marketed product → `/product-launch-video`; general site → `/website-to-video`; topic explainer → `/faceless-explainer`; GitHub PR → `/pr-to-video`; existing footage → `/embedded-captions` · `/graphic-overlays`; short unnarrated motion graphic → `/motion-graphics`; Remotion port → `/remotion-to-hyperframes`. **Out of scope**: live / at-render-time data, NLE-style editing of a finished video, or producing footage HyperFrames can't capture. Unsure? **Read `/hyperframes` first.**

Expand Down Expand Up @@ -121,12 +117,3 @@ This maps the skill's full surface (see the `description`) to its references —
- [ ] contrast warnings addressed; for multi-scene work, review the animation map (`hyperframes-animation/scripts/animation-map.mjs`)
- [ ] deliver the preview; render to MP4 only on explicit request
- [ ] surface the preview **only at handoff** (it is the stable, final preview); don't pop one mid-build — build-phase snapshots are headless

## Not this workflow

- A specific **product / company / SaaS / website** being marketed, launched, or promoted → `/product-launch-video`
- A **concept / topic / article / how-X-works** being explained, no product → `/faceless-explainer`
- A **GitHub PR / code change** → `/pr-to-video`
- An **existing talking-head video** to add captions to → `/embedded-captions`
- Porting an existing **Remotion** composition → `/remotion-to-hyperframes`
- Cutting / editing a **finished video file** like an NLE → out of scope (HyperFrames composites HTML and media into a deterministic timeline; it does not edit footage)
Loading
Loading