cueframe 0.1.2 → 0.3.0

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.
@@ -5,6 +5,9 @@ description: Use when turning a local app into a brand-consistent product demo w
5
5
 
6
6
  # CueFrame — Brand demo recipe
7
7
 
8
+ > **Kit truth over MCP (current limits):** kit CONTENTS are not yet inspectable over MCP (`get_profile` lists names only), so `$brand:` tokens resolve blind — verify resolved fonts/colors with a `preview_frame` still, and when the kit conflicts with an explicit client spec, the spec wins (hardcode it and note the conflict). Bind kits by the SERVER id from `get_profile` (slug binding is unreliable — it can silently bind nothing); always confirm via the project response `brandKitId`.
9
+
10
+
8
11
  A **use-case recipe** that runs end-to-end from inside the user's own project
9
12
  folder. You (Claude) already see their code and their running app — that's the
10
13
  unfair advantage. This skill turns that context into a brand-consistent product
@@ -35,7 +38,7 @@ extract brand (repo + live UI) → create_brand_kit
35
38
  → capture (Kishu: Playwright walkthrough of localhost → MP4) → import_media
36
39
  → get_media_context (faces + transcript)
37
40
  → apply_composition (edit plan + brand template, refs brandKitId + $brand:)
38
- → create_composition { fromComposition:true } → wait_job kind:compose
41
+ → compose { fromComposition:true } → wait_job kind:compose
39
42
  → create_render → wait_job kind:render → branded MP4
40
43
  ```
41
44
 
@@ -95,7 +98,7 @@ matter, click the features worth showing, pause on results.
95
98
 
96
99
  Get the recording into CueFrame with `import_media` (public https URL) — it's
97
100
  async; poll `list_media` for `processingStatus:"ready"` (or register
98
- `create_webhook` on `media.ready`). Keep the click points; you'll map them onto
101
+ `create_webhook` on `media.completed`). Keep the click points; you'll map them onto
99
102
  the rendered duration for the zoom.
100
103
 
101
104
  ## 3. Context → `get_media_context`
@@ -207,19 +210,19 @@ durations are illustrative — match your source.
207
210
  }
208
211
  ```
209
212
 
210
- ## 5. Refine + judge → `create_composition { fromComposition: true }`
213
+ ## 5. Refine + judge → `compose { fromComposition: true }`
211
214
 
212
- Hand the seed to the Director: `create_composition` with `{ fromComposition: true }`
215
+ Hand the seed to the Director: `compose` with `{ fromComposition: true }`
213
216
  authors an ensemble of candidates from your seed, runs the **server-side judge —
214
217
  including the brand axis** (on-brand color/type/voice cohesion), and saves the
215
218
  winner. Returns a `composeJobId`; `wait_job` `kind:"compose"` (or a webhook on
216
- `compose.complete`). The result carries the winner's composite score — verification
219
+ `compose.completed`). The result carries the winner's composite score — verification
217
220
  is built in. Pass your brief as `editorialIntent` so editorial is graded against
218
221
  what you meant. (To self-drive the loop instead, see `cueframe-compose-loop`.)
219
222
 
220
223
  ## 6. Render → branded MP4
221
224
 
222
- `create_render` → `wait_job` `kind:"render"` (or a webhook on `render.complete`)
225
+ `create_render` → `wait_job` `kind:"render"` (or a webhook on `render.completed`)
223
226
  for the download URL. The output is brand-frozen: the kit's **intro/outro** bumper
224
227
  the video, the **logo** bug sits in its corner, **motion** drives the overlay
225
228
  entrances, and every `$brand:` color/font is resolved. Verify the output (sample
@@ -157,7 +157,7 @@ video and composites it (the shared renderer never runs your code).
157
157
  cueframe init --json
158
158
 
159
159
  # 2a. FORK a built-in primitive into cueframe/components/<id>/ as owned, editable source.
160
- # Discover ids from the catalog: cueframe api GET /v1/components (87 primitives).
160
+ # Discover ids from the catalog: cueframe api GET /v1/components (the live primitive catalog).
161
161
  cueframe eject cinematic-title --json
162
162
 
163
163
  # 2b. …or scaffold a blank custom component.
@@ -27,9 +27,9 @@ Single self-contained module per component (`create_component` takes one `tsxSou
27
27
  ids from the catalog (`/v1/components`). *(Or author from scratch — skip to step 2.)*
28
28
  2. **Author/own it:** edit the `tsxSource`, then `create_component({ componentId, tsxSource, … })`
29
29
  to store your customized copy (origin `server-native`; if forked, `ejectedFrom` is stamped).
30
- 3. **Iterate (author→preview→fix):** `open_session` → `preview_component({ componentId, params })`
30
+ 3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` (sessionless; if a cold first call returns 409 box_warming, retry in a few seconds)
31
31
  renders ONE still. A 422 `component_does_not_compile` returns the compiler error — read it, fix
32
- via `update_component` (same id, in place), preview again. `close_session` when done.
32
+ via `update_component` (same id, in place), preview again.
33
33
  4. **Render:** add it to a composition as an `alpha-layer` clip (`apply_composition`), then
34
34
  `create_render` → `wait_job kind:"render"` for the MP4.
35
35
 
@@ -57,7 +57,7 @@ MCP path stores. To preview before a full render, push it and use the MCP `previ
57
57
  The catalog (`/v1/components`) gives each primitive's `description` / `useWhen` / `tags` / `mood` /
58
58
  `tier` / `useCase` / `examples` (example params) + `propSchema` + its source via `get_component_source`.
59
59
  Read the spec + the code to pick a starting point. (Rendered preview thumbnails are a separate
60
- follow-up — today you choose from prose + params + source, or compose+`render_frame` to see it.)
60
+ follow-up — today you choose from prose + params + source, or compose+`preview_frame` to see it.)
61
61
 
62
62
  ## Don't
63
63
  - Don't expect a forked primitive to use rich named props — it's adapted to `({durationInFrames,
@@ -5,6 +5,9 @@ description: Use when an AI agent should DRIVE CueFrame to a high-quality clip i
5
5
 
6
6
  # CueFrame — Compose convergence loop
7
7
 
8
+ > **LANE SCOPE:** this skill is written against the DESKTOP/REST compose-session surface. Over MCP those endpoints do not exist — use the `composing-video` skill (sessionless judge/preview) instead; this document is reference for the REST lane only.
9
+
10
+
8
11
  You are the director. CueFrame gives you hands (author), eyes (capture), and a
9
12
  judge (verify); you supply the taste and the iteration. The engine does NOT
10
13
  auto-compose for you here — you drive the loop and decide when it's done. Drive
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: cueframe-storyboard
3
+ description: Use BEFORE composing when starting a NEW video from scratch and you need to plan its structure — turning a rough ask ("make a launch video", "30s promo", "an explainer for our API") into a concrete beat flow. Owns the intake + storyboard step: interview the user for the brief, resolve the format from the platform, and lay out the hook→body→cta beats that drive the compose workflow. Triggers on "plan a video", "storyboard", "structure this video", "outline the video", "where do I start", or any new-video ask that has no structure yet. Hand off to composing-video for per-beat craft.
4
+ ---
5
+
6
+ # CueFrame Storyboard: brief → flow
7
+
8
+ > **The bar:** the `video-craft-standards` skill (GET /v1/skills/video-craft-standards) defines DONE for every artifact class — per-class MUST checklists and kill criteria. Read it before composing and score against it before rendering. When this skill and that document disagree, the standards win.
9
+
10
+
11
+ ## The one idea
12
+
13
+ **You are the planner.** You have the user, the whole conversation, the brand, and the judgment — you are
14
+ the smartest thing in this loop. CueFrame is the hands. This skill is the **intake + structure** step:
15
+ turn intent into a concrete **beat flow** *before* you seed a composition, so the curated workflow (media →
16
+ components → seed) executes a plan instead of a guess. Craft — grounded-vs-slop, the verify loop — belongs
17
+ to the sibling **composing-video** skill; this skill gets you a flow, then hands off to it.
18
+
19
+ Do not offload the *thinking* to CueFrame. There is no server that plans the video for you, and you would
20
+ not want one — it would be a blind model with none of your context. Plan here, in the open, with the user.
21
+
22
+ ## 1. Interview for the brief — ask only what you can't infer
23
+
24
+ Fill the brief from the conversation first; ask the user **only for the 1–2 things you genuinely cannot
25
+ infer**, and STATE what you assume for the rest. Never wall them with a form.
26
+
27
+ - **Goal / intent** *(required)* — what is this video FOR? launch, promo, explainer, demo, teaser, recap.
28
+ - **Platform** *(sets the format)* — reels / tiktok / shorts → **9:16, ~20s** · youtube → **16:9, ~45s** ·
29
+ linkedin / x → **1:1, ~20s** · web → **16:9, ~30s**. (Or an explicit aspect ratio + duration.)
30
+ - **Audience**, **tone** (punchy / premium-calm / playful / authoritative), **CTA**, **must-includes**
31
+ (a number, a name, a screen), **references** (a style to echo), **brand kit**.
32
+
33
+ If the ask is "make a launch video for our API," you already have goal + a hint of audience — ask "Reels,
34
+ YouTube, or your site?" and infer the rest: *"I'll assume a developer audience and a punchy tone — say if
35
+ you'd rather it feel calm/premium."* One or two questions, not seven.
36
+
37
+ ## 2. Structure the flow — the storyboard
38
+
39
+ Lay the duration into **beats** using the fixed editorial vocabulary
40
+ **hook → context → body → proof → cta → outro** (use what the piece needs — most short-form is
41
+ hook → body → cta). For each beat decide:
42
+
43
+ - a one-line **intent** (what this beat does for the viewer),
44
+ - a **duration** (they sum to the target; the hook earns attention in ~3s),
45
+ - a **media need** — real footage is the strongest grounding and CueFrame's home turf, so reach for it
46
+ first; otherwise `generate` a *purposeful* clip (a diagram of the real mechanism, the real UI) or `find`
47
+ stock. Animated text over a gradient is not grounding — it's the slop default,
48
+ - an optional **graphic** (a lower-third, title, CTA card),
49
+ - a **caption** and/or a **VO/script** line.
50
+
51
+ **Ground it, don't invent it.** Pick every graphic/scene from `list_catalog` (filter by `useCase`/`tier`)
52
+ — never hardcode hex or positions or name a component that doesn't exist. Theme from the brand kit. If
53
+ you're planning over real footage, read `get_media_context` (detected faces + transcript) so beat timing,
54
+ crops, and captions land on what's actually there.
55
+
56
+ ## 3. Show the flow, then persist it as a Brief
57
+
58
+ Show the user the beat list **first** — a five-line outline. It is cheap to change here and expensive to
59
+ change after a render, so this is where you converge on structure. On their go, **persist the plan with
60
+ `create_brief`** — the beats/goal/format/gates you just elicited map 1:1 onto its fields, and the plan stops
61
+ being chat-ephemeral (it survives the session, carries a cost quote, and is honored field-by-field):
62
+
63
+ 1. `import_media` / `generate_media` for each beat's media need,
64
+ 2. `create_brief` — goal, audience, platform/format, durationSec, tone, cta, locale, and the beats
65
+ (each with its editorial intent and, when you're cutting real footage, MOMENT PINNING
66
+ `source: {mediaId, startSec, endSec}` from the transcript — honored to-the-frame or refused).
67
+ Relay the response's **quote** (compose + estimated render) BEFORE composing.
68
+ 3. `compose { briefId }` — the Director authors FROM your brief; every field is honored or the
69
+ compose is refused loudly naming the field. Gates: put `holdAt: ["layout"]` in the brief's `gates` when
70
+ the user wants to approve the storyboard mid-flight; `autoApprove: true` for hands-off.
71
+ 4. `score_composition` / `consult` to fix the weakest beat,
72
+ 5. `create_render` for the MP4.
73
+
74
+ **Two graphic media — pick per beat, and review accordingly:** a `card` (verbatim HTML in
75
+ `seededGraphics`) is a STATIC graphic — cheap, approve it from a still; a **component**
76
+ (`create_component`, `useCurrentFrame`) is MOTION — a still is one frame, so preview it before trusting it.
77
+ Seeded graphics you author into the brief are carried VERBATIM as locked clips — the Director never
78
+ re-authors them; `exclusions` bans graphic kinds you never want it to author.
79
+
80
+ Then load **composing-video** and apply its craft to make each beat good.
81
+
82
+ ## Related skills & positioning
83
+
84
+ This skill owns **structure/intake**; its siblings own execution and craft — defer to them:
85
+
86
+ - **composing-video** — the craft/quality layer (grounded specificity vs. slop, the vision → rubric →
87
+ verify loop). Load it *after* you have a flow; it makes each beat good.
88
+ - **cueframe-compose-loop** — the author → render → verify → fix convergence loop + the ship bar.
89
+ - **cueframe-product-video** — click-points → auto-zoom tiling + PiP for screen demos.
90
+ - **cueframe-brand-demo** — brand-token vocabulary + auto intro/outro/logo for branded launches.
91
+ - **cueframe-component-authoring** — fork → preview → push for a custom graphic a beat needs.
92
+ - **cueframe-cli** — the `cueframe` binary + wire mechanics.
93
+
94
+ ## The boundary
95
+
96
+ You own the **vision** (the one idea and the flow for *this* video) and **data correctness** (a wrong
97
+ number you supply is rendered faithfully — the mistake is yours). CueFrame owns being faithful, legible,
98
+ and giving you real footage + real components to plan against. Reason from this; skip the whole flow only
99
+ for a re-render of an approved composition or a single trivial one-off.
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: every-format-from-one-edit
3
+ description: Derives content-aware 9:16, 1:1, and 4:5 siblings from one finished composition — same edit, every platform, no re-editing. Triggers on "make this vertical too", "I need this for TikTok and LinkedIn", "every aspect ratio", "square version of this", "resize for Reels", "one video, all platforms", "port this edit to Shorts".
4
+ ---
5
+
6
+ # Every format from one edit
7
+
8
+ You finish ONE edit; you get back its siblings for every platform — 9:16 for
9
+ Reels/TikTok/Shorts, 1:1 and 4:5 for feeds — derived content-aware from the master,
10
+ subject-tracked rather than letterboxed, each judged and rendered on its own. The edit decisions
11
+ are made once; the formats are a job, not a re-edit.
12
+
13
+ ## Before you start
14
+
15
+ Confirm which master and which target platforms before setup. When the first tool call
16
+ approaches and CueFrame isn't connected:
17
+
18
+ - **Claude Code:** offer to run
19
+ `claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — browser OAuth,
20
+ one **Allow** click.
21
+ - **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
22
+ `https://api.cueframe.ai/v1/mcp`.
23
+ - **Other agents:** paste `set up https://cueframe.ai/skill.md`, or run
24
+ `npx -y cueframe install`.
25
+
26
+ Then straight to deriving — this whole job is minutes when the master is good.
27
+
28
+ ## Inputs
29
+
30
+ - **The master composition** (required): a finished, approved edit — find it via
31
+ `list_compositions` if the user doesn't have the id. If the master isn't done, finish it first
32
+ (this skill multiplies quality AND flaws).
33
+ - **Target aspects**: default all three siblings — 9:16, 1:1, 4:5. The documented derive lane
34
+ starts from a 16:9 master.
35
+ - **Per-platform tweaks**: default none — determinism is the point. Take an explicit ask (e.g.
36
+ "shorter for TikTok") as a separate edit on the derived sibling.
37
+
38
+ ## Workflow
39
+
40
+ 1. **Verify the master is actually done.** It passed its class checklist, its audio was
41
+ decided, its render was approved. Deriving from a draft ships the draft's flaws four times.
42
+ 2. **Derive each sibling.** `derive_composition` per target aspect — the reframe is
43
+ content-aware: it tracks the subject into the new frame instead of letterboxing. Each
44
+ sibling is a real composition you can edit independently afterward; the master is never
45
+ touched.
46
+ 3. **Audit every sibling on real pixels — required, not optional.** `preview_frame` each
47
+ sibling at t=0, hook-end, and each card's midpoint; describe each still. What to look for
48
+ per aspect: the subject's head fully in the vertical frame; cards and captions inside the
49
+ safe area (no critical copy in the outer ~8%); no beat where the tighter crop lost the thing
50
+ the beat exists to show.
51
+ 4. **Fix per-sibling, surgically.** Where a crop or card misbehaves, `apply_composition` on
52
+ THAT sibling — nudge a `setCropIntents` segment, resize a card for the narrower frame
53
+ (re-shell with `applyMotionPreset` in a following call if you replace the card). Don't
54
+ re-edit the story; the story is the master's.
55
+ 5. **Confirm the audio carried.** The master's decided audio — bed, ducking, beat-aligned cuts
56
+ (`materializeGrid` markers), or its intentional silence — rides into each sibling. Verify
57
+ the bed is present and the silence decision, if any, still holds; the sibling's delivery
58
+ note repeats it. If a sibling needs a different bed, `search_resources` honoring the brand
59
+ kit's `musicMood` and swap it on that sibling only.
60
+ 6. **Judge each sibling as its own artifact.** `score_composition` per sibling with the
61
+ master's vision as `editorialIntent`. A 9:16 sibling is a social reel and answers to that
62
+ class's checklist — hook inside 2 seconds still applies in the new crop. Fix worst-first to
63
+ ≥ 7.5.
64
+ 7. **Render each approved sibling.** `create_render` → `wait_job (kind:"render")` per
65
+ composition. One final render per approval; iterate with previews.
66
+
67
+ ## What good looks like
68
+
69
+ Quoted from `video-craft-standards` (cross-cutting rules — every artifact):
70
+
71
+ > **MUST** Safe-area respected: no critical copy in the outer ~8% of frame.
72
+
73
+ > **MUST** One final render per approval; iterate with previews, not renders.
74
+
75
+ > **MUST** Delivery never ends with "done": the last message carries the output link and where
76
+ > to find it, plus the intentional-silence note if any.
77
+
78
+ And the class rule that governs each sibling: a derived 9:16 answers to §1 (Social reel) —
79
+ *"**MUST (K)** The hook lands inside 2 seconds"* — a derived 16:9 to its own class. Derivation
80
+ changes the frame, never the bar.
81
+
82
+ ## Delivering
83
+
84
+ The last message is a manifest, never "done":
85
+
86
+ - Every sibling's render link, labeled by aspect and platform, and where each lives (project +
87
+ composition id — the master's id too, since it stays the source of truth).
88
+ - The master's attribution list (it covers all siblings — same assets).
89
+ - The intentional-silence note, restated once, if the master chose silence.
90
+ - Any sibling-specific edits you made (which crop nudged, which card resized) so future master
91
+ edits know what to re-check after re-deriving.
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: extracting-brand-kits
3
+ description: Use when the user says "make my video look like THIS" with a reference video, screenshots, or a moodboard — build a CueFrame brand kit FROM that inspiration so every subsequent compose speaks its visual language. Owns the extraction step: sample the reference's graphics-bearing frames, upload them as exemplars, reproduce each recurring motif as an authored graphic verified against the reference, and upsert the kit with the full language payload. Triggers on "match this style", "like this reference", "use this video as inspiration", "extract a brand kit", "moodboard". Hand off to cueframe-storyboard/composing-video once the kit is bound.
4
+ ---
5
+
6
+ # Extracting brand kits: reference pixels → a kit the engine honors
7
+
8
+ ## The one idea
9
+
10
+ **No summarization anywhere in the path.** A reference described in prose converges on house style
11
+ with the reference's palette — the pixels are the ground truth. You (the agent) are the extractor:
12
+ you SEE the reference, curate its frames, and reproduce its motifs as ordinary authored graphics,
13
+ verified against the reference by looking. The kit you produce carries (a) **exemplar frames** the
14
+ compose maker and judge both see, and (b) **motif skins** — card HTML the designer reproduces —
15
+ plus code-checked facts (caption profile, density, palette). Once bound to a project, the engine
16
+ takes over: the planner plans to your density, the designer sees your exemplars
17
+ (`view_style_reference`), the judge grades every candidate against them, and a half-applied kit
18
+ fails the compose loudly instead of shipping house style.
19
+
20
+ Everything below drives the public `/v1` API with your API key. Frames never pass through chat —
21
+ they go straight to storage via presigned PUTs.
22
+
23
+ ## 0. Prereqs
24
+
25
+ - An API key with `projects:write` (create_brand_kit gates on the `brand_kits` plan feature — check `get_account` first; 402 names the feature).
26
+ - `ffmpeg` locally, and the reference video file (download it first if it's a URL).
27
+ - Know the org's IDENTITY kit if one exists (`get_profile` → brandKits). Inspiration NEVER overwrites identity: logo, brand fonts, and identity color slots come from the existing kit (or stay for the user to fill) — extraction contributes the LANGUAGE only.
28
+
29
+ ## 1. Sample the reference (local, ffmpeg)
30
+
31
+ Uniform sampling misses short-lived graphics (1–3s overlays). Sample two ways and union:
32
+
33
+ ```bash
34
+ # scene cuts
35
+ ffmpeg -i ref.mp4 -vf "select='gt(scene,0.22)',showinfo" -vsync vfr scenes/%03d.jpg
36
+ # 2fps sweep (catches overlays that appear without a cut)
37
+ ffmpeg -i ref.mp4 -vf fps=2,scale=720:-1 -q:v 4 sweep/%04d.jpg
38
+ ```
39
+
40
+ Then LOOK at the frames and curate: keep the **graphics-bearing** ones — frames where a card,
41
+ pill, stat, lower-third, caption treatment, or end-card is visible and sharp. Drop near-duplicates.
42
+ **≤24 frames**, each downscaled to ≤720px width, jpeg. For each animated graphic, also note the
43
+ timestamp where it ENTERS (you'll classify its motion in step 5; re-watch that 1s window at
44
+ `ffmpeg -ss <t> -t 1 -i ref.mp4 -vf fps=12 burst/%02d.jpg` if you need to see the entrance).
45
+
46
+ Optional but recommended: build a contact sheet for the human's "right vibe?" check:
47
+ `ffmpeg -i frames/frame-%02d.jpg -filter_complex tile=6x4 sheet.jpg`.
48
+
49
+ ## 2. Upload the exemplars (the ingest door)
50
+
51
+ ```
52
+ POST /v1/brand-kits/exemplar-uploads { "count": <n>, "includeContactSheet": true }
53
+ ```
54
+
55
+ Returns presigned PUT slots under the org's `brand-inspiration/…` prefix — the ONLY namespace the
56
+ kit door accepts exemplar keys from. PUT each curated frame (order matters: frame-01 ↔ index 0 —
57
+ motif `evidence` arrays reference these indexes), PUT the sheet, keep the returned `key` list.
58
+ URLs expire in 15 minutes; re-POST for a fresh batch if you run over.
59
+
60
+ ## 3. Inventory the motifs
61
+
62
+ Look across the exemplars and list every RECURRING graphic treatment (expect ~5–12 for a designed
63
+ reference). For each, write:
64
+
65
+ - `id` — `m1`, `m2`, …
66
+ - `observed` — one precise sentence ("thin-outline rounded keyword pill, single word, beside subject").
67
+ - `role` — the closed vocabulary the planner/designer speak (exact values):
68
+ `title-card | stat | lower-third | pull-quote | hero | logo-tag | enumeration | sequence | comparison`.
69
+ Pick the role each motif best SERVES — the designer's steering matches on it exactly.
70
+ - `evidence` — the exemplar indexes (0-based) it appears in.
71
+ - `zone` — normalized `{x, y, w, h}` where it lives.
72
+ - Behind-the-subject motifs (text the speaker occludes): record them with `coverage: "skipped"` and
73
+ `skipReason: "behind-subject — card graphics render front-only"`. Do NOT attempt them.
74
+
75
+ Also read the CAPTION treatment off the frames (step 6 consumes it): plate or plateless? base/
76
+ highlight colors? case? emphasis styling? entrance feel (~ms)?
77
+
78
+ ## 4. Reproduce each motif as a card (author → look → refine, ≤3 iterations)
79
+
80
+ For each non-skipped motif, author it as a **card** (freeform HTML/CSS — rendered verbatim) and
81
+ verify it against the exemplar BY LOOKING:
82
+
83
+ 1. **Measure first**: read the exemplar — border weight, radius, padding, font size relative to
84
+ frame, colors. Measurement-seeded CSS gets you ~90% in one shot.
85
+ 2. Author `{ "kind": "card", "html": "…", "tokens": { … } }`. Bind every brand-swappable color
86
+ through `tokens` with `$brand:` refs (e.g. `"line": "$brand:colors.accent"`, referenced in CSS
87
+ as `var(--cf-line)`) so the kit's identity re-themes it. No `<script>`, no `@keyframes` (inert —
88
+ motion is step 5).
89
+ 3. Render it (`preview_frame` on a scratch session, or `preview_component` if you forked a
90
+ component) and compare the still against the exemplar side by side. Fix the largest visible
91
+ difference. Repeat — **cap 3 iterations**, keep the best.
92
+ 4. Record `diffScore` (your honest 0–1 same-language judgment) and `coverage`:
93
+ `"reproduced"` (≥0.8) or `"approximated"`.
94
+
95
+ Prefer a catalog primitive (`list_catalog`) over a card ONLY if it genuinely matches closer —
96
+ record it as `{ "kind": "overlay", "primitiveId": "…", "params": { … } }`. A custom component
97
+ (`{ "kind": "component", "componentId": "…" }`) only for motifs with internal motion (counters).
98
+
99
+ ## 5. Classify motion (closed vocabulary — never invent animation)
100
+
101
+ Watch each motif's entrance burst and map it:
102
+
103
+ - Graphic motion presets (exact values): `fade-up | slide-in-left | slide-in-right | scale-pop | stagger-reveal`,
104
+ with `enterMs` / `exitMs` / `staggerMs` timings you observed.
105
+ - Caption per-word entrances: `none | fade | word-pop | stagger-up`.
106
+ - Unsure or the reference does something the vocabulary can't say? Pick the NEAREST preset and set
107
+ `"confidence": "low"` — honesty beats fabrication; the vocabulary grows engine-side, not here.
108
+
109
+ ## 6. Compute the facts
110
+
111
+ - `captionProfile` — from step 3's caption read. The kit door speaks the full look: `color`,
112
+ `highlightColor`, `plate` (`"none"` for the clean plateless look), `entrance`, `entranceMs`,
113
+ `exitMs`, `emphasisColor/Scale/FontWeight/FontStyle`, `emphasisPlate` knobs, `textTransform`.
114
+ - `density` — `{ "graphicsPerMin": <count/duration*60>, "maxSimultaneous": <max overlapping> }`.
115
+ - Palette → `extraColors` entries `{ "hex", "label": "inspiration accent N", "usage": "swappable" }`.
116
+ NEVER write the identity `colors.*` slots, `headingFont`/`bodyFont`, or `logo` from the
117
+ reference — copy those from the base identity kit, or leave them for the user.
118
+ - `styleRubric` — 2–4 sentences the JUDGE will grade with: name the motif language, the caption
119
+ treatment, and what disqualifies a frame ("filled chips or plated captions are off-language").
120
+
121
+ ## 7. Upsert the kit + bind it
122
+
123
+ One `create_brand_kit` call (it's an upsert — re-POST the same `kitId` to curate):
124
+
125
+ ```jsonc
126
+ {
127
+ "kitId": "acme-launchfilm",
128
+ "name": "Acme × Launch Film",
129
+ // identity: copied from the base kit or neutral — never from the reference
130
+ "colors": { … }, "headingFont": { … }, "bodyFont": { … },
131
+ "extraColors": [ { "hex": "#F5B942", "label": "inspiration accent 1", "usage": "swappable" } ],
132
+ "captionProfile": { "plate": "none", "entrance": "fade", "entranceMs": 220, … },
133
+ "exemplarKeys": [ "<keys from step 2, in frame order>" ],
134
+ "contactSheetKey": "<sheet key>",
135
+ "motifs": [ { "id": "m1", "observed": "…", "body": { "kind": "card", … }, "motion": { "preset": "fade-up", "enterMs": 320 }, "role": "pull-quote", "zone": { … }, "evidence": [0, 2], "diffScore": 0.93, "coverage": "reproduced" } ],
136
+ "styleRubric": "…",
137
+ "density": { "graphicsPerMin": 4, "maxSimultaneous": 2 },
138
+ "inspiration": { "sources": ["<reference URL>"], "extractedAt": <now ms>, "extractionVersion": "skill-1" }
139
+ }
140
+ ```
141
+
142
+ The door validates loudly: exemplar keys must come from step 2's batch, motif roles/presets must be
143
+ in-vocabulary, evidence indexes must be in range. A 422 names exactly what to fix.
144
+
145
+ Then bind: `update_project { "brandKitId": "acme-launchfilm" }`. Show the human the contact sheet
146
+ ("right vibe?") before composing. From here, hand off to **cueframe-storyboard** — every compose
147
+ against the project now plans, designs, and JUDGES in the reference's language, and refuses to
148
+ ship house style if any part of the kit fails to resolve.
149
+
150
+ ## Failure honesty
151
+
152
+ - Reference has no graphics language (talking head, zero overlays)? Say so — upsert nothing, or a
153
+ captions-only kit. Don't invent motifs.
154
+ - A motif you can't match in 3 iterations ships as `"approximated"` with its real diffScore — the
155
+ judge's floor will surface it; don't inflate.
156
+ - Behind-subject motifs stay `"skipped"` with the reason. The engine refuses them loudly anyway.
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: launch-video
3
+ description: Turns screen recordings and product footage into a 30–90 second 16:9 launch film — payoff-first hook, real product surface punched in, a building bed or narration, one CTA end card. Triggers on "make a launch video", "announcement video for this feature", "turn this screen recording into a demo film", "product video from these captures", "we're shipping Friday and need a video", "feature announcement".
4
+ ---
5
+
6
+ # Launch video
7
+
8
+ You bring real screen recordings or product footage plus the one outcome the feature delivers;
9
+ you get back a 30–90 second 16:9 announcement that opens on the payoff, shows the actual product
10
+ doing the real thing, builds under a bed or narration, and lands on a single CTA.
11
+
12
+ ## Before you start
13
+
14
+ Nail the payoff sentence and collect the captures before any setup. When the first tool call
15
+ approaches and CueFrame isn't connected:
16
+
17
+ - **Claude Code:** offer to run
18
+ `claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — browser OAuth,
19
+ one **Allow**.
20
+ - **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
21
+ `https://api.cueframe.ai/v1/mcp`.
22
+ - **Other agents:** paste `set up https://cueframe.ai/skill.md`, or run
23
+ `npx -y cueframe install`.
24
+
25
+ Keep the momentum — the video plan is the hard part, the connection is not.
26
+
27
+ ## Inputs
28
+
29
+ - **Real captures** (required): screen recordings, product footage, real output. CueFrame does
30
+ not screen-record — the user records (or uses a capture client) and you `import_media` the
31
+ file. Never mock what's missing; ask for the real capture.
32
+ - **The payoff**: the outcome in the user's words ("close the books two days faster"), plus the
33
+ CTA (one action) and launch date if any.
34
+ - **Brand kit**: project kit if present; ask for wordmark + accent color otherwise.
35
+ - **Voice**: default a building instrumental bed with captioned key lines; narrated VO if they
36
+ have a script or want one generated.
37
+
38
+ ## Workflow
39
+
40
+ 1. **Import the real surface.** `import_media` every capture; wait for ready;
41
+ `get_media_context` for what each recording actually shows (and the transcript, if narrated
42
+ footage exists). Inventory the strongest 3–5 real moments before writing a beat.
43
+ 2. **Open on the payoff, not the name.** The hook is the OUTCOME — the result on screen, the
44
+ pain disappearing — inside the first seconds. "Introducing X" is throat-clearing; the
45
+ outcome-first frame is the hook. No logo, no title card first.
46
+ 3. **Structure: hook → problem → reveal → proof → CTA.** `new_composition` at 16:9 →
47
+ `apply_composition` with the beats. Pacing tightens as the payoff approaches — clips get
48
+ shorter toward the reveal.
49
+ 4. **Punch in on the real pixels.** A click target is tiny in a full-frame capture;
50
+ `setCropIntents` with `point` focus segments zooming to the exact UI region per step,
51
+ `frame-center` in the gaps, tiling every clip. The single biggest amateur-to-pro delta in
52
+ product video.
53
+ 5. **Cards for the claims and the end card.** Key lines and the closing CTA are `kind:"card"`
54
+ HTML in the brand's type and palette — persisted first, then shelled with
55
+ `applyMotionPreset` in a FOLLOWING `apply_composition` call. One CTA on the end card, held
56
+ long enough to read, plus the date if there is one.
57
+ 6. **Audio that builds — required.** `search_resources` for a bed honoring the brand kit's
58
+ `musicMood`, energy arcing toward the reveal; place it `audioRole:"music"`,
59
+ `materializeGrid { grid:"beat" }`, and land beat boundaries and the reveal on the grid. If
60
+ narrated: the VO is the rhythm authority instead — cut to the voice and duck the bed under
61
+ it. Silence is almost never right for a launch; if chosen anyway, record the decision and
62
+ reason in the delivery note.
63
+ 7. **Caption narration.** If there is a voice, `captions.fromTranscript` (or authored word
64
+ timings for generated VO), styled legible via `setCaptionStyle`. Captions are mandatory when
65
+ narrated.
66
+ 8. **Preview, judge, one render.** `preview_frame` at t=0, hook-end, the reveal, and the end
67
+ card; describe each still — is that a REAL capture on screen? Then `score_composition` with
68
+ the payoff line as `editorialIntent`; fix worst-first to ≥ 7.5; `create_render` →
69
+ `wait_job (kind:"render")`.
70
+
71
+ ## What good looks like
72
+
73
+ Quoted from `video-craft-standards` §2 (Launch film / feature announcement) — the full checklist
74
+ wins:
75
+
76
+ > **MUST (K)** Payoff-first hook: the OUTCOME, not the feature name ("Close the books two days
77
+ > faster" beats "Introducing the reconciliation module"). No throat-clearing.
78
+
79
+ > **MUST** Narration or a bed that builds toward the reveal; pacing tightens as the payoff
80
+ > approaches. **MUST** Real product surface: actual UI/screens/output — never mocked.
81
+
82
+ > **MUST** End card with a single CTA. **MUST** Captions present when narrated.
83
+
84
+ And cross-cutting: *"Footage carries the video: real footage / real UI / real data ≥60% of
85
+ runtime for footage-first classes."*
86
+
87
+ ## Delivering
88
+
89
+ Close with the handoff, never "done":
90
+
91
+ - The render link and where it lives (project + composition id).
92
+ - Attribution for the bed and any licensed asset (provider, id, author).
93
+ - The intentional-silence note with its reason, in the rare case silence was chosen.
94
+ - A one-line cutdown offer: the 16:9 master can become 9:16 / 1:1 siblings for social (see
95
+ `every-format-from-one-edit`).
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: make-a-social-reel
3
+ description: Turns footage into a finished 9:16 social reel — hook inside 2 seconds, poster-grade type, a decided music bed, one final render. Triggers on "make me a reel from this", "turn this into a short", "cut a clip for TikTok / Reels / Shorts", "make this vertical", "make a social clip from this video", "the opening is boring", "can you make this pop for Instagram".
4
+ ---
5
+
6
+ # Make a social reel
7
+
8
+ You hand over footage (a file URL, a talk, a product moment); you get back a 9:16 reel of 8–30
9
+ seconds that opens on its strongest image, cuts on the music, carries brand-grade type, and ends
10
+ on a deliberate beat — with a download link, not a "done".
11
+
12
+ ## Before you start
13
+
14
+ Don't stall the conversation on setup — get the footage, the hook, and the tone agreed first.
15
+ When the first real tool call is imminent and CueFrame isn't connected:
16
+
17
+ - **Claude Code:** offer to run
18
+ `claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — a browser tab
19
+ opens and the user clicks **Allow**.
20
+ - **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
21
+ `https://api.cueframe.ai/v1/mcp`.
22
+ - **Any other agent:** paste `set up https://cueframe.ai/skill.md`, or run
23
+ `npx -y cueframe install`.
24
+
25
+ Thirty seconds, then straight back to the reel — treat it as a detour, never a gate.
26
+
27
+ ## Inputs
28
+
29
+ - **Footage** (required): a public https URL, or something already in `list_media`. If they have
30
+ nothing, ask for the real thing before reaching for stock — real footage is the whole edge.
31
+ - **Brand kit**: use the project's kit if one exists; otherwise ask for a color + font or extract
32
+ one. Default: proceed with a neutral palette and say so.
33
+ - **Tone / platform**: default punchy, 15–25s, sound-on-with-captions. Ask only if the answer
34
+ would change the cut.
35
+
36
+ ## Workflow
37
+
38
+
39
+ 0. **Find the claim (before anything else).** Interrogate the brand/material
40
+ for its tension — what it believes that its category doesn't — and write
41
+ the claim in one sentence. Derive the shot list, the bed's mood/tempo, the
42
+ pacing, and every card's copy FROM that sentence. If you cannot state the
43
+ claim, you are not ready to compose (video-craft-standards: the
44
+ controlling idea is kill-level).
45
+
46
+ 1. **Import and read the footage.** `import_media` (public https URL), poll `list_media` until
47
+ ready, then `get_media_context` — faces, transcript, word timings. The context tells you
48
+ where the hook lives; don't guess.
49
+ 2. **Pick the hook before you touch the timeline.** The strongest image, motion, or claim in the
50
+ footage — the outcome, not the feature name, is the hook. If the best moment is at 0:47, the
51
+ reel opens at 0:47. No logo-first cold opens, ever.
52
+ 3. **Seed the timeline.** `new_composition` at 9:16, then `apply_composition`: clips trimmed to
53
+ the beats you chose, a new visual beat at least every ~4 seconds. Cut TO moments; never let a
54
+ clip run out.
55
+ 4. **Reframe for vertical.** `setCropIntents` with segments that tile every clip —
56
+ `active-speaker` or `face` focus when a person carries it, `point` focus on the action
57
+ otherwise. A wide shot letterboxed into 9:16 is a fail, not a fallback.
58
+ 5. **Author the type as cards.** Brand text is `kind:"card"` HTML — your typography,
59
+ palette-as-fields, considered alignment — persisted first, then shelled with
60
+ `applyMotionPreset` in a FOLLOWING `apply_composition` call. Catalog text primitives are
61
+ utility only.
62
+ 6. **Decide the audio — required, never skipped.** Search a bed with `search_resources` honoring
63
+ the brand kit's `musicMood`, place it as an `audioRole:"music"` clip, then `materializeGrid`
64
+ `{ grid:"beat" }` and land your cut points and transition midpoints on the markers. If the
65
+ piece is genuinely better silent, that is a decision — record it and its reason in the
66
+ delivery note. A reel whose silence nobody chose is not done.
67
+ 7. **Caption any speech.** `captions.fromTranscript` with the mediaId, styled via
68
+ `setCaptionStyle` (plated, bottom, out of the mouth/eyes). Most social viewing is sound-off;
69
+ don't karaoke a beat with no speech.
70
+ 8. **Look, then get judged.** `preview_frame` at t=0, hook-end, and every beat boundary;
71
+ describe each still in words before scoring it. Then `score_composition` with your one-line
72
+ vision as `editorialIntent` — fix the worst criterion first. Ship at composite ≥ 7.5, budget
73
+ 3–5 passes.
74
+ 9. **One final render.** `create_render` → `wait_job (kind:"render")`. Iterate with previews,
75
+ not renders.
76
+
77
+ ## What good looks like
78
+
79
+ Quoted from `video-craft-standards` §1 (Social reel) — the full checklist wins over this skill
80
+ wherever they disagree:
81
+
82
+ > **MUST (K)** The hook lands inside 2 seconds: the strongest image, motion, or claim opens the
83
+ > piece. No logo-first cold opens, no fade-in-from-black preambles.
84
+
85
+ > **MUST** Typography is poster-grade: composed plates/fields in the brand palette, considered
86
+ > alignment and scale. **K:** centered white text floating on footage.
87
+
88
+ > **MUST** Pacing is cut-driven: a new visual beat at least every ~4s […] **MUST** Ends on a
89
+ > deliberate beat: tagline, logo, or CTA lockup — not a clip running out.
90
+
91
+ And the cross-cutting audio rule:
92
+
93
+ > **MUST** Audio is decided, never defaulted […] **K:** a render whose silence nobody chose.
94
+
95
+ ## Delivering
96
+
97
+ Never end with "done". The last message carries:
98
+
99
+ - The render's download URL and where it lives (the project, by composition id).
100
+ - Attribution for every stock asset used (provider, id, author) — the provenance you recorded at
101
+ import.
102
+ - The intentional-silence note with its reason, if you chose silence over a bed.
103
+ - One line on what you'd tighten next, so the follow-up edit has a starting point.