@cueframe/skills 0.1.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.
- package/.agents/plugins/marketplace.json +12 -0
- package/.claude-plugin/marketplace.json +6 -0
- package/.claude-plugin/plugin.json +15 -0
- package/.codex-plugin/plugin.json +30 -0
- package/.cursor-plugin/plugin.json +1 -0
- package/.mcp.json +1 -0
- package/AGENTS.md +20 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +111 -0
- package/assets/icon.svg +16 -0
- package/assets/logo-400.png +0 -0
- package/gemini-extension.json +1 -0
- package/glama.json +1 -0
- package/hooks/hooks.json +7 -0
- package/hooks/session-inject.md +15 -0
- package/hooks/session-start.sh +6 -0
- package/llms-install.md +47 -0
- package/mcp.json +1 -0
- package/package.json +57 -0
- package/plugin.json +46 -0
- package/rules/cueframe.mdc +19 -0
- package/skills/add-music-bed/SKILL.md +100 -0
- package/skills/add-music-bed/agents/openai.yaml +6 -0
- package/skills/add-music-bed/assets/icon.svg +16 -0
- package/skills/brand-reel/SKILL.md +100 -0
- package/skills/brand-reel/agents/openai.yaml +6 -0
- package/skills/brand-reel/assets/icon.svg +16 -0
- package/skills/clip-a-talking-head/SKILL.md +101 -0
- package/skills/clip-a-talking-head/agents/openai.yaml +6 -0
- package/skills/clip-a-talking-head/assets/icon.svg +16 -0
- package/skills/composing-video/SKILL.md +702 -0
- package/skills/composing-video/agents/openai.yaml +6 -0
- package/skills/composing-video/assets/icon.svg +16 -0
- package/skills/cueframe-brand-demo/SKILL.md +257 -0
- package/skills/cueframe-brand-demo/agents/openai.yaml +6 -0
- package/skills/cueframe-brand-demo/assets/icon.svg +16 -0
- package/skills/cueframe-cli/SKILL.md +265 -0
- package/skills/cueframe-cli/agents/openai.yaml +6 -0
- package/skills/cueframe-cli/assets/icon.svg +16 -0
- package/skills/cueframe-component-authoring/SKILL.md +179 -0
- package/skills/cueframe-component-authoring/agents/openai.yaml +6 -0
- package/skills/cueframe-component-authoring/assets/icon.svg +16 -0
- package/skills/cueframe-compose-loop/SKILL.md +114 -0
- package/skills/cueframe-compose-loop/agents/openai.yaml +6 -0
- package/skills/cueframe-compose-loop/assets/icon.svg +16 -0
- package/skills/cueframe-compose-loop/references/preview-workflow.md +37 -0
- package/skills/cueframe-connect/SKILL.md +45 -0
- package/skills/cueframe-connect/agents/openai.yaml +6 -0
- package/skills/cueframe-connect/assets/icon.svg +16 -0
- package/skills/cueframe-product-video/SKILL.md +293 -0
- package/skills/cueframe-product-video/agents/openai.yaml +6 -0
- package/skills/cueframe-product-video/assets/icon.svg +16 -0
- package/skills/cueframe-scene-shot/SKILL.md +68 -0
- package/skills/cueframe-scene-shot/agents/openai.yaml +6 -0
- package/skills/cueframe-scene-shot/assets/icon.svg +16 -0
- package/skills/cueframe-storyboard/SKILL.md +104 -0
- package/skills/cueframe-storyboard/agents/openai.yaml +6 -0
- package/skills/cueframe-storyboard/assets/icon.svg +16 -0
- package/skills/every-format-from-one-edit/SKILL.md +87 -0
- package/skills/every-format-from-one-edit/agents/openai.yaml +6 -0
- package/skills/every-format-from-one-edit/assets/icon.svg +16 -0
- package/skills/extracting-brand-kits/SKILL.md +159 -0
- package/skills/extracting-brand-kits/agents/openai.yaml +6 -0
- package/skills/extracting-brand-kits/assets/icon.svg +16 -0
- package/skills/launch-video/SKILL.md +93 -0
- package/skills/launch-video/agents/openai.yaml +6 -0
- package/skills/launch-video/assets/icon.svg +16 -0
- package/skills/make-a-social-reel/SKILL.md +105 -0
- package/skills/make-a-social-reel/agents/openai.yaml +6 -0
- package/skills/make-a-social-reel/assets/icon.svg +16 -0
- package/skills/rebrand-a-video/SKILL.md +95 -0
- package/skills/rebrand-a-video/agents/openai.yaml +6 -0
- package/skills/rebrand-a-video/assets/icon.svg +16 -0
- package/skills/video-craft-standards/SKILL.md +128 -0
- package/skills/video-craft-standards/agents/openai.yaml +6 -0
- package/skills/video-craft-standards/assets/icon.svg +16 -0
- package/skills-dir.d.ts +1 -0
- package/skills-dir.js +2 -0
- package/skills.sh.json +1 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Every format from one edit"
|
|
3
|
+
short_description: "Derives content-aware 9:16, 1:1, and 4:5 siblings from one finished…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $every-format-from-one-edit to derive content-aware 9:16, 1:1, and 4:5 siblings from one finished composition — same edit, every platform, no re-editing."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<clipPath id="cf-favicon-clip"><circle cx="128" cy="128" r="118"/></clipPath>
|
|
3
|
+
<circle cx="128" cy="128" r="118" fill="#f7c948"/>
|
|
4
|
+
<g clip-path="url(#cf-favicon-clip)">
|
|
5
|
+
<path d="M88 128Q160 40 300-40" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
6
|
+
<path d="M88 128Q170 60 310 20" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
7
|
+
<path d="M88 128Q180 80 316 70" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
8
|
+
<path d="M88 128Q186 110 320 110" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
9
|
+
<path d="M88 128Q186 146 320 146" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
10
|
+
<path d="M88 128Q180 176 316 186" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
11
|
+
<path d="M88 128Q170 196 310 236" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
12
|
+
<path d="M88 128Q160 216 300 296" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="88" cy="128" r="20" fill="#160f08"/>
|
|
15
|
+
<circle cx="88" cy="128" r="8" fill="#f7c948"/>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: extracting-brand-kits
|
|
3
|
+
description: >-
|
|
4
|
+
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.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Extracting brand kits: reference pixels → a kit the engine honors
|
|
8
|
+
|
|
9
|
+
## The one idea
|
|
10
|
+
|
|
11
|
+
**No summarization anywhere in the path.** A reference described in prose converges on house style
|
|
12
|
+
with the reference's palette — the pixels are the ground truth. You (the agent) are the extractor:
|
|
13
|
+
you SEE the reference, curate its frames, and reproduce its motifs as ordinary authored graphics,
|
|
14
|
+
verified against the reference by looking. The kit you produce carries (a) **exemplar frames** the
|
|
15
|
+
compose maker and judge both see, and (b) **motif skins** — card HTML the designer reproduces —
|
|
16
|
+
plus code-checked facts (caption profile, density, palette). Once bound to a project, the engine
|
|
17
|
+
takes over: the planner plans to your density, the designer sees your exemplars
|
|
18
|
+
(`view_style_reference`), the judge grades every candidate against them, and a half-applied kit
|
|
19
|
+
fails the compose loudly instead of shipping house style.
|
|
20
|
+
|
|
21
|
+
Everything below drives the public `/v1` API with your API key. Frames never pass through chat —
|
|
22
|
+
they go straight to storage via presigned PUTs.
|
|
23
|
+
|
|
24
|
+
## 0. Prereqs
|
|
25
|
+
|
|
26
|
+
- An API key with `projects:write`. `create_brand_kit` gates on the `brand_kits` entitlement, which EVERY plan grants including free, and it costs no credits — so brand kits are not a paywall to route around. (`get_account` confirms it; a 402 names the feature.)
|
|
27
|
+
- `ffmpeg` locally, and the reference video file (download it first if it's a URL).
|
|
28
|
+
- 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.
|
|
29
|
+
|
|
30
|
+
## 1. Sample the reference (local, ffmpeg)
|
|
31
|
+
|
|
32
|
+
Uniform sampling misses short-lived graphics (1–3s overlays). Sample two ways and union:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# scene cuts
|
|
36
|
+
ffmpeg -i ref.mp4 -vf "select='gt(scene,0.22)',showinfo" -vsync vfr scenes/%03d.jpg
|
|
37
|
+
# 2fps sweep (catches overlays that appear without a cut)
|
|
38
|
+
ffmpeg -i ref.mp4 -vf fps=2,scale=720:-1 -q:v 4 sweep/%04d.jpg
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Then LOOK at the frames and curate: keep the **graphics-bearing** ones — frames where a card,
|
|
42
|
+
pill, stat, lower-third, caption treatment, or end-card is visible and sharp. Drop near-duplicates.
|
|
43
|
+
**≤24 frames**, each downscaled to ≤720px width, jpeg. For each animated graphic, also note the
|
|
44
|
+
timestamp where it ENTERS (you'll classify its motion in step 5; re-watch that 1s window at
|
|
45
|
+
`ffmpeg -ss <t> -t 1 -i ref.mp4 -vf fps=12 burst/%02d.jpg` if you need to see the entrance).
|
|
46
|
+
|
|
47
|
+
Optional but recommended: build a contact sheet for the human's "right vibe?" check:
|
|
48
|
+
`ffmpeg -i frames/frame-%02d.jpg -filter_complex tile=6x4 sheet.jpg`.
|
|
49
|
+
|
|
50
|
+
## 2. Upload the exemplars (the ingest door)
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
POST /v1/brand-kits/exemplar-uploads { "count": <n>, "includeContactSheet": true }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Returns presigned PUT slots under the org's `brand-inspiration/…` prefix — the ONLY namespace the
|
|
57
|
+
kit door accepts exemplar keys from. PUT each curated frame (order matters: frame-01 ↔ index 0 —
|
|
58
|
+
motif `evidence` arrays reference these indexes), PUT the sheet, keep the returned `key` list.
|
|
59
|
+
URLs expire in 15 minutes; re-POST for a fresh batch if you run over.
|
|
60
|
+
|
|
61
|
+
## 3. Inventory the motifs
|
|
62
|
+
|
|
63
|
+
Look across the exemplars and list every RECURRING graphic treatment (expect ~5–12 for a designed
|
|
64
|
+
reference). For each, write:
|
|
65
|
+
|
|
66
|
+
- `id` — `m1`, `m2`, …
|
|
67
|
+
- `observed` — one precise sentence ("thin-outline rounded keyword pill, single word, beside subject").
|
|
68
|
+
- `role` — the closed vocabulary the planner/designer speak (exact values):
|
|
69
|
+
`title-card | stat | lower-third | pull-quote | hero | logo-tag | enumeration | sequence | comparison`.
|
|
70
|
+
Pick the role each motif best SERVES — the designer's steering matches on it exactly.
|
|
71
|
+
- `evidence` — the exemplar indexes (0-based) it appears in.
|
|
72
|
+
- `zone` — normalized `{x, y, w, h}` where it lives.
|
|
73
|
+
- Behind-the-subject motifs (text the speaker occludes): record them with `coverage: "skipped"` and
|
|
74
|
+
`skipReason: "behind-subject — card graphics render front-only"`. Do NOT attempt them.
|
|
75
|
+
|
|
76
|
+
Also read the CAPTION treatment off the frames (step 6 consumes it): plate or plateless? base/
|
|
77
|
+
highlight colors? case? emphasis styling? entrance feel (~ms)?
|
|
78
|
+
|
|
79
|
+
## 4. Reproduce each motif as a card (author → look → refine, ≤3 iterations)
|
|
80
|
+
|
|
81
|
+
For each non-skipped motif, author it as a **card** (freeform HTML/CSS — rendered verbatim) and
|
|
82
|
+
verify it against the exemplar BY LOOKING:
|
|
83
|
+
|
|
84
|
+
1. **Measure first**: read the exemplar — border weight, radius, padding, font size relative to
|
|
85
|
+
frame, colors. Measurement-seeded CSS gets you ~90% in one shot.
|
|
86
|
+
2. Author `{ "kind": "card", "html": "…", "tokens": { … } }`. Bind every brand-swappable color
|
|
87
|
+
through `tokens` with `$brand:` refs (e.g. `"line": "$brand:colors.accent"`, referenced in CSS
|
|
88
|
+
as `var(--cf-line)`) so the kit's identity re-themes it. No `<script>`, no `@keyframes` (inert —
|
|
89
|
+
motion is step 5).
|
|
90
|
+
3. Preview the isolated card with `preview_card` (or `preview_component` for an authored
|
|
91
|
+
component) and compare against the exemplar side by side. Use `cueframe-compose-loop`'s
|
|
92
|
+
[preview workflow](../cueframe-compose-loop/references/preview-workflow.md) for saved-context
|
|
93
|
+
checks and motion windows. Fix the largest visible
|
|
94
|
+
difference. Repeat — **cap 3 iterations**, keep the best.
|
|
95
|
+
4. Record `diffScore` (your honest 0–1 same-language judgment) and `coverage`:
|
|
96
|
+
`"reproduced"` (≥0.8) or `"approximated"`.
|
|
97
|
+
|
|
98
|
+
Prefer a catalog primitive (`list_catalog`) over a card ONLY if it genuinely matches closer —
|
|
99
|
+
record it as `{ "kind": "overlay", "primitiveId": "…", "params": { … } }`. A custom component
|
|
100
|
+
(`{ "kind": "component", "componentId": "…" }`) only for motifs with internal motion (counters).
|
|
101
|
+
|
|
102
|
+
## 5. Classify motion (closed vocabulary — never invent animation)
|
|
103
|
+
|
|
104
|
+
Watch each motif's entrance burst and map it:
|
|
105
|
+
|
|
106
|
+
- Graphic motion presets (exact values): `fade-up | slide-in-left | slide-in-right | scale-pop | stagger-reveal`,
|
|
107
|
+
with `enterMs` / `exitMs` / `staggerMs` timings you observed.
|
|
108
|
+
- Caption per-word entrances: `none | fade | word-pop | stagger-up`.
|
|
109
|
+
- Unsure or the reference does something the vocabulary can't say? Pick the NEAREST preset and set
|
|
110
|
+
`"confidence": "low"` — honesty beats fabrication; the vocabulary grows engine-side, not here.
|
|
111
|
+
|
|
112
|
+
## 6. Compute the facts
|
|
113
|
+
|
|
114
|
+
- `captionProfile` — from step 3's caption read. The kit door speaks the full look: `color`,
|
|
115
|
+
`highlightColor`, `plate` (`"none"` for the clean plateless look), `entrance`, `entranceMs`,
|
|
116
|
+
`exitMs`, `emphasisColor/Scale/FontWeight/FontStyle`, `emphasisPlate` knobs, `textTransform`.
|
|
117
|
+
- `density` — `{ "graphicsPerMin": <count/duration*60>, "maxSimultaneous": <max overlapping> }`.
|
|
118
|
+
- Palette → `extraColors` entries `{ "hex", "label": "inspiration accent N", "usage": "swappable" }`.
|
|
119
|
+
NEVER write the identity `colors.*` slots, `headingFont`/`bodyFont`, or `logo` from the
|
|
120
|
+
reference — copy those from the base identity kit, or leave them for the user.
|
|
121
|
+
- `styleRubric` — 2–4 sentences the JUDGE will grade with: name the motif language, the caption
|
|
122
|
+
treatment, and what disqualifies a frame ("filled chips or plated captions are off-language").
|
|
123
|
+
|
|
124
|
+
## 7. Upsert the kit + bind it
|
|
125
|
+
|
|
126
|
+
One `create_brand_kit` call (it's an upsert — re-POST the same `kitId` to curate):
|
|
127
|
+
|
|
128
|
+
```jsonc
|
|
129
|
+
{
|
|
130
|
+
"kitId": "acme-launchfilm",
|
|
131
|
+
"name": "Acme × Launch Film",
|
|
132
|
+
// identity: copied from the base kit or neutral — never from the reference
|
|
133
|
+
"colors": { … }, "headingFont": { … }, "bodyFont": { … },
|
|
134
|
+
"extraColors": [ { "hex": "#F5B942", "label": "inspiration accent 1", "usage": "swappable" } ],
|
|
135
|
+
"captionProfile": { "plate": "none", "entrance": "fade", "entranceMs": 220, … },
|
|
136
|
+
"exemplarKeys": [ "<keys from step 2, in frame order>" ],
|
|
137
|
+
"contactSheetKey": "<sheet key>",
|
|
138
|
+
"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" } ],
|
|
139
|
+
"styleRubric": "…",
|
|
140
|
+
"density": { "graphicsPerMin": 4, "maxSimultaneous": 2 },
|
|
141
|
+
"inspiration": { "sources": ["<reference URL>"], "extractedAt": <now ms>, "extractionVersion": "skill-1" }
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The door validates loudly: exemplar keys must come from step 2's batch, motif roles/presets must be
|
|
146
|
+
in-vocabulary, evidence indexes must be in range. A 422 names exactly what to fix.
|
|
147
|
+
|
|
148
|
+
Then bind: `update_project { "brandKitId": "acme-launchfilm" }`. Show the human the contact sheet
|
|
149
|
+
("right vibe?") before composing. From here, hand off to **cueframe-storyboard** — every compose
|
|
150
|
+
against the project now plans, designs, and JUDGES in the reference's language, and refuses to
|
|
151
|
+
ship house style if any part of the kit fails to resolve.
|
|
152
|
+
|
|
153
|
+
## Failure honesty
|
|
154
|
+
|
|
155
|
+
- Reference has no graphics language (talking head, zero overlays)? Say so — upsert nothing, or a
|
|
156
|
+
captions-only kit. Don't invent motifs.
|
|
157
|
+
- A motif you can't match in 3 iterations ships as `"approximated"` with its real diffScore — the
|
|
158
|
+
judge's floor will surface it; don't inflate.
|
|
159
|
+
- Behind-subject motifs stay `"skipped"` with the reason. The engine refuses them loudly anyway.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Extracting brand kits: reference pixels → a kit the engine honors"
|
|
3
|
+
short_description: "Use when the user says \"make my video look like THIS\" with a reference video…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $extracting-brand-kits 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."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<clipPath id="cf-favicon-clip"><circle cx="128" cy="128" r="118"/></clipPath>
|
|
3
|
+
<circle cx="128" cy="128" r="118" fill="#f7c948"/>
|
|
4
|
+
<g clip-path="url(#cf-favicon-clip)">
|
|
5
|
+
<path d="M88 128Q160 40 300-40" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
6
|
+
<path d="M88 128Q170 60 310 20" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
7
|
+
<path d="M88 128Q180 80 316 70" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
8
|
+
<path d="M88 128Q186 110 320 110" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
9
|
+
<path d="M88 128Q186 146 320 146" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
10
|
+
<path d="M88 128Q180 176 316 186" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
11
|
+
<path d="M88 128Q170 196 310 236" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
12
|
+
<path d="M88 128Q160 216 300 296" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="88" cy="128" r="20" fill="#160f08"/>
|
|
15
|
+
<circle cx="88" cy="128" r="8" fill="#f7c948"/>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,93 @@
|
|
|
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, load **`cueframe-connect`** and follow it once.
|
|
16
|
+
|
|
17
|
+
Keep the momentum — the video plan is the hard part, the connection is not.
|
|
18
|
+
|
|
19
|
+
## Inputs
|
|
20
|
+
|
|
21
|
+
- **Real captures** (required): screen recordings, product footage, real output. CueFrame does
|
|
22
|
+
not screen-record — the user records (or uses a capture client) and you `import_media` the
|
|
23
|
+
file. Never mock what's missing; ask for the real capture.
|
|
24
|
+
- **The payoff**: the outcome in the user's words ("close the books two days faster"), plus the
|
|
25
|
+
CTA (one action) and launch date if any.
|
|
26
|
+
- **Brand kit**: project kit if present; ask for wordmark + accent color otherwise.
|
|
27
|
+
- **Voice**: default a building instrumental bed with captioned key lines; narrated VO if they
|
|
28
|
+
have a script or want one generated.
|
|
29
|
+
|
|
30
|
+
## Workflow
|
|
31
|
+
|
|
32
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
33
|
+
for layout and motion evidence. A follow-up tweak preserves the approved brief; inspect the
|
|
34
|
+
affected window and regressions without automatically rerunning the full-film judge or export.
|
|
35
|
+
|
|
36
|
+
1. **Import the real surface.** `import_media` every capture; wait for ready;
|
|
37
|
+
`get_media_context` for what each recording actually shows (and the transcript, if narrated
|
|
38
|
+
footage exists). Inventory the strongest 3–5 real moments before writing a beat.
|
|
39
|
+
2. **Open on the payoff, not the name.** The hook is the OUTCOME — the result on screen, the
|
|
40
|
+
pain disappearing — inside the first seconds. "Introducing X" is throat-clearing; the
|
|
41
|
+
outcome-first frame is the hook. No logo, no title card first.
|
|
42
|
+
3. **Structure: hook → problem → reveal → proof → CTA.** `new_composition` at 16:9 →
|
|
43
|
+
`apply_composition` with the beats. Pacing tightens as the payoff approaches — clips get
|
|
44
|
+
shorter toward the reveal.
|
|
45
|
+
4. **Punch in on the real pixels.** A click target is tiny in a full-frame capture;
|
|
46
|
+
`setCropIntents` with `point` focus segments zooming to the exact UI region per step,
|
|
47
|
+
`frame-center` in the gaps, tiling every clip. The single biggest amateur-to-pro delta in
|
|
48
|
+
product video.
|
|
49
|
+
5. **Cards for the claims and the end card.** Key lines and the closing CTA are `kind:"card"`
|
|
50
|
+
HTML in the brand's type and palette — persisted first, then shelled with
|
|
51
|
+
`applyMotionPreset` in a FOLLOWING `apply_composition` call. One CTA on the end card, held
|
|
52
|
+
long enough to read, plus the date if there is one.
|
|
53
|
+
6. **Audio that builds — required.** `search_resources` for a bed honoring the brand kit's
|
|
54
|
+
`musicMood`, energy arcing toward the reveal; place it `audioRole:"music"`,
|
|
55
|
+
`materializeGrid { grid:"beat" }`, and land beat boundaries and the reveal on the grid. If
|
|
56
|
+
narrated: the VO is the rhythm authority instead — cut to the voice and duck the bed under
|
|
57
|
+
it. Silence is almost never right for a launch; if chosen anyway, record the decision and
|
|
58
|
+
reason in the delivery note.
|
|
59
|
+
7. **Caption narration.** For transcribed voice, save the edits first, then call
|
|
60
|
+
`captions.fromComposition` with the narration track ID in a separate `apply_composition`
|
|
61
|
+
call. Speech clips must have saved duration matching playable source duration divided by
|
|
62
|
+
playbackRate. Re-run after later edits. Use authored word timings for generated VO without a
|
|
63
|
+
transcript, and style legibly via `setCaptionStyle`. Captions are mandatory when narrated.
|
|
64
|
+
8. **Preview, judge, one render.** `preview_frame` at t=0, hook-end, the reveal, and the end
|
|
65
|
+
card; describe each still — is that a REAL capture on screen? Then `score_composition` with
|
|
66
|
+
the payoff line as `editorialIntent`; fix worst-first to ≥ 7.5; `create_render` →
|
|
67
|
+
`wait_job (kind:"render")`.
|
|
68
|
+
|
|
69
|
+
## What good looks like
|
|
70
|
+
|
|
71
|
+
Quoted from `video-craft-standards` §2 (Launch film / feature announcement) — the full checklist
|
|
72
|
+
wins:
|
|
73
|
+
|
|
74
|
+
> **MUST (K)** Payoff-first hook: the OUTCOME, not the feature name ("Close the books two days
|
|
75
|
+
> faster" beats "Introducing the reconciliation module"). No throat-clearing.
|
|
76
|
+
|
|
77
|
+
> **MUST** Narration or a bed that builds toward the reveal; pacing tightens as the payoff
|
|
78
|
+
> approaches. **MUST** Real product surface: actual UI/screens/output — never mocked.
|
|
79
|
+
|
|
80
|
+
> **MUST** End card with a single CTA. **MUST** Captions present when narrated.
|
|
81
|
+
|
|
82
|
+
And cross-cutting: *"Footage carries the video: real footage / real UI / real data ≥60% of
|
|
83
|
+
runtime for footage-first classes."*
|
|
84
|
+
|
|
85
|
+
## Delivering
|
|
86
|
+
|
|
87
|
+
Close with the handoff, never "done":
|
|
88
|
+
|
|
89
|
+
- The render link and where it lives (project + composition id).
|
|
90
|
+
- Attribution for the bed and any licensed asset (provider, id, author).
|
|
91
|
+
- The intentional-silence note with its reason, in the rare case silence was chosen.
|
|
92
|
+
- A one-line cutdown offer: the 16:9 master can become 9:16 / 1:1 siblings for social (see
|
|
93
|
+
`every-format-from-one-edit`).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Launch video"
|
|
3
|
+
short_description: "Turns screen recordings and product footage into a 30–90 second 16:9 launch…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $launch-video to turn 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."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<clipPath id="cf-favicon-clip"><circle cx="128" cy="128" r="118"/></clipPath>
|
|
3
|
+
<circle cx="128" cy="128" r="118" fill="#f7c948"/>
|
|
4
|
+
<g clip-path="url(#cf-favicon-clip)">
|
|
5
|
+
<path d="M88 128Q160 40 300-40" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
6
|
+
<path d="M88 128Q170 60 310 20" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
7
|
+
<path d="M88 128Q180 80 316 70" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
8
|
+
<path d="M88 128Q186 110 320 110" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
9
|
+
<path d="M88 128Q186 146 320 146" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
10
|
+
<path d="M88 128Q180 176 316 186" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
11
|
+
<path d="M88 128Q170 196 310 236" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
12
|
+
<path d="M88 128Q160 216 300 296" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="88" cy="128" r="20" fill="#160f08"/>
|
|
15
|
+
<circle cx="88" cy="128" r="8" fill="#f7c948"/>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
load **`cueframe-connect`** and follow it once.
|
|
17
|
+
|
|
18
|
+
Thirty seconds, then straight back to the reel — treat it as a detour, never a gate.
|
|
19
|
+
|
|
20
|
+
## Inputs
|
|
21
|
+
|
|
22
|
+
- **Footage** (required): a public https URL, or something already in `list_media`. If they have
|
|
23
|
+
nothing, ask for the real thing before reaching for stock — real footage is the whole edge.
|
|
24
|
+
- **Brand kit**: use the project's kit if one exists; otherwise ask for a color + font or extract
|
|
25
|
+
one. Default: proceed with a neutral palette and say so.
|
|
26
|
+
- **Tone / platform**: default punchy, 15–25s, sound-on-with-captions. Ask only if the answer
|
|
27
|
+
would change the cut.
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
32
|
+
for layout and motion evidence. A follow-up tweak preserves the approved brief; inspect the
|
|
33
|
+
affected window and regressions without automatically rerunning the full-film judge or export.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
0. **Find the claim (before anything else).** Interrogate the brand/material
|
|
37
|
+
for its tension — what it believes that its category doesn't — and write
|
|
38
|
+
the claim in one sentence. Derive the shot list, the bed's mood/tempo, the
|
|
39
|
+
pacing, and every card's copy FROM that sentence. If you cannot state the
|
|
40
|
+
claim, you are not ready to compose (video-craft-standards: the
|
|
41
|
+
controlling idea is kill-level).
|
|
42
|
+
|
|
43
|
+
1. **Import and read the footage.** `import_media` (public https URL), poll `list_media` until
|
|
44
|
+
ready, then `get_media_context` — faces, transcript, word timings. The context tells you
|
|
45
|
+
where the hook lives; don't guess.
|
|
46
|
+
2. **Pick the hook before you touch the timeline.** The strongest image, motion, or claim in the
|
|
47
|
+
footage — the outcome, not the feature name, is the hook. If the best moment is at 0:47, the
|
|
48
|
+
reel opens at 0:47. No logo-first cold opens, ever.
|
|
49
|
+
3. **Seed the timeline.** `new_composition` at 9:16, then `apply_composition`: clips trimmed to
|
|
50
|
+
the beats you chose, a new visual beat at least every ~4 seconds. Cut TO moments; never let a
|
|
51
|
+
clip run out.
|
|
52
|
+
4. **Reframe for vertical.** `setCropIntents` with segments that tile every clip —
|
|
53
|
+
`active-speaker` or `face` focus when a person carries it, `point` focus on the action
|
|
54
|
+
otherwise. A wide shot letterboxed into 9:16 is a fail, not a fallback.
|
|
55
|
+
5. **Author the type as cards.** Brand text is `kind:"card"` HTML — your typography,
|
|
56
|
+
palette-as-fields, considered alignment — persisted first, then shelled with
|
|
57
|
+
`applyMotionPreset` in a FOLLOWING `apply_composition` call. Catalog text primitives are
|
|
58
|
+
utility only.
|
|
59
|
+
6. **Decide the audio — required, never skipped.** Search a bed with `search_resources` honoring
|
|
60
|
+
the brand kit's `musicMood`, place it as an `audioRole:"music"` clip, then `materializeGrid`
|
|
61
|
+
`{ grid:"beat" }` and land your cut points and transition midpoints on the markers. If the
|
|
62
|
+
piece is genuinely better silent, that is a decision — record it and its reason in the
|
|
63
|
+
delivery note. A reel whose silence nobody chose is not done.
|
|
64
|
+
7. **Caption any speech.** After saving the edited clips, use
|
|
65
|
+
`captions.fromComposition` with the speech track ID in a separate `apply_composition`
|
|
66
|
+
call. It follows trims, excluded ranges and clip placement across the reel. Speech clips
|
|
67
|
+
must have saved duration matching playable source duration divided by playbackRate.
|
|
68
|
+
Re-run it after later edits. Discover its exact input with
|
|
69
|
+
`describe_composition_ops({type:"captions.fromComposition"})`, then style via
|
|
70
|
+
`setCaptionStyle` (plated, bottom, out of the mouth/eyes). Most social viewing is sound-off;
|
|
71
|
+
don't karaoke a beat with no speech.
|
|
72
|
+
8. **Look, then get judged.** `preview_frame` at t=0, hook-end, and every beat boundary;
|
|
73
|
+
describe each still in words before scoring it. Then `score_composition` with your one-line
|
|
74
|
+
vision as `editorialIntent` — fix the worst criterion first. Ship at composite ≥ 7.5, budget
|
|
75
|
+
3–5 passes.
|
|
76
|
+
9. **One final render.** `create_render` → `wait_job (kind:"render")`. Iterate with previews,
|
|
77
|
+
not renders.
|
|
78
|
+
|
|
79
|
+
## What good looks like
|
|
80
|
+
|
|
81
|
+
Quoted from `video-craft-standards` §1 (Social reel) — the full checklist wins over this skill
|
|
82
|
+
wherever they disagree:
|
|
83
|
+
|
|
84
|
+
> **MUST (K)** The hook lands inside 2 seconds: the strongest image, motion, or claim opens the
|
|
85
|
+
> piece. No logo-first cold opens, no fade-in-from-black preambles.
|
|
86
|
+
|
|
87
|
+
> **MUST** Typography is poster-grade: composed plates/fields in the brand palette, considered
|
|
88
|
+
> alignment and scale. **K:** centered white text floating on footage.
|
|
89
|
+
|
|
90
|
+
> **MUST** Pacing is cut-driven: a new visual beat at least every ~4s […] **MUST** Ends on a
|
|
91
|
+
> deliberate beat: tagline, logo, or CTA lockup — not a clip running out.
|
|
92
|
+
|
|
93
|
+
And the cross-cutting audio rule:
|
|
94
|
+
|
|
95
|
+
> **MUST** Audio is decided, never defaulted […] **K:** a render whose silence nobody chose.
|
|
96
|
+
|
|
97
|
+
## Delivering
|
|
98
|
+
|
|
99
|
+
Never end with "done". The last message carries:
|
|
100
|
+
|
|
101
|
+
- The render's download URL and where it lives (the project, by composition id).
|
|
102
|
+
- Attribution for every stock asset used (provider, id, author) — the provenance you recorded at
|
|
103
|
+
import.
|
|
104
|
+
- The intentional-silence note with its reason, if you chose silence over a bed.
|
|
105
|
+
- One line on what you'd tighten next, so the follow-up edit has a starting point.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Make a social reel"
|
|
3
|
+
short_description: "Turns footage into a finished 9:16 social reel — hook inside 2 seconds…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $make-a-social-reel to turn footage into a finished 9:16 social reel — hook inside 2 seconds, poster-grade type, a decided music bed, one final render."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<clipPath id="cf-favicon-clip"><circle cx="128" cy="128" r="118"/></clipPath>
|
|
3
|
+
<circle cx="128" cy="128" r="118" fill="#f7c948"/>
|
|
4
|
+
<g clip-path="url(#cf-favicon-clip)">
|
|
5
|
+
<path d="M88 128Q160 40 300-40" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
6
|
+
<path d="M88 128Q170 60 310 20" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
7
|
+
<path d="M88 128Q180 80 316 70" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
8
|
+
<path d="M88 128Q186 110 320 110" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
9
|
+
<path d="M88 128Q186 146 320 146" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
10
|
+
<path d="M88 128Q180 176 316 186" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
11
|
+
<path d="M88 128Q170 196 310 236" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
12
|
+
<path d="M88 128Q160 216 300 296" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="88" cy="128" r="20" fill="#160f08"/>
|
|
15
|
+
<circle cx="88" cy="128" r="8" fill="#f7c948"/>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rebrand-a-video
|
|
3
|
+
description: Swaps the brand kit under an existing video and re-renders — tokens, bumpers, logo, captions, and motion re-theme automatically; hardcoded card values get surgical edits. Triggers on "rebrand this video", "swap the brand", "we changed our colors", "new logo, same video", "make this video match the new brand", "re-theme our launch video", "white-label this for a client".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rebrand a video
|
|
7
|
+
|
|
8
|
+
You bring a finished video and a new brand (a kit, a website, or new colors/fonts/logo); you get
|
|
9
|
+
the same video back wearing the new identity — everything bound to brand tokens re-themes at
|
|
10
|
+
render, and the few graphics that hardcoded the old brand get found and fixed. Change one line,
|
|
11
|
+
not the whole video.
|
|
12
|
+
|
|
13
|
+
## Before you start
|
|
14
|
+
|
|
15
|
+
Collect the new brand's facts first — the swap itself is fast. When the first tool call
|
|
16
|
+
approaches and CueFrame isn't connected, load **`cueframe-connect`** and follow it once.
|
|
17
|
+
|
|
18
|
+
Then back to the brand — most of this job is a kit definition and an audit.
|
|
19
|
+
|
|
20
|
+
## Inputs
|
|
21
|
+
|
|
22
|
+
- **The video** (required): the composition (via `list_compositions`) and which project it lives
|
|
23
|
+
in.
|
|
24
|
+
- **The new brand** (required): an existing kit id, a website to `extract_brand_kit` from
|
|
25
|
+
(colors/fonts only — ask for logo, tagline, voice), or explicit values for `create_brand_kit`.
|
|
26
|
+
- **Same identity or a new one?** Restyling THIS brand → upsert the same kit id and every
|
|
27
|
+
composition pointing at it re-themes. White-labeling for someone else → a NEW kit, so the
|
|
28
|
+
original stays intact.
|
|
29
|
+
- **Tone shift**: does the new brand change the music mood too? Check the kit's `musicMood`
|
|
30
|
+
intent.
|
|
31
|
+
|
|
32
|
+
## Workflow
|
|
33
|
+
|
|
34
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
35
|
+
for affected graphics and saved-composition checks. Inspect motion if the kit changes timing;
|
|
36
|
+
keep the final re-render separate from previews used to resolve individual styling corrections.
|
|
37
|
+
|
|
38
|
+
1. **Pin the new brand as a kit.** `extract_brand_kit` or `create_brand_kit`; show the kit and
|
|
39
|
+
get sign-off — it is the contract. Then bind it: upsert in place (same kit id) to restyle,
|
|
40
|
+
or point the project at the new kit for a white-label. The kit lives on the PROJECT, not on
|
|
41
|
+
a composition op.
|
|
42
|
+
2. **Know what re-themes for free.** Everything resolved at render: `$brand:` color/font/motion
|
|
43
|
+
tokens on overlays and cards, the kit's intro/outro bumpers, the logo corner mark, the
|
|
44
|
+
caption profile, the motion identity. Edit the kit, re-render, these all follow — that is
|
|
45
|
+
the whole "one line" story.
|
|
46
|
+
3. **Hunt what does NOT re-theme.** Anything that hardcoded the old brand: literal hexes or
|
|
47
|
+
font names inside `kind:"card"` HTML, an old wordmark imported as media, footage graded
|
|
48
|
+
toward the old palette, baked stock choices that lived in the old world. Walk the
|
|
49
|
+
composition's overlay and card clips and list every literal value — this audit is the real
|
|
50
|
+
work.
|
|
51
|
+
4. **Verify with pixels, not the kit.** Kit contents aren't inspectable over MCP after
|
|
52
|
+
creation, so the truth is the frame: `preview_frame` at t=0, each card, the bumpers, and the
|
|
53
|
+
end card. Describe each still — is any old color, font, or mark visible? A `$brand:` token
|
|
54
|
+
that fails to resolve is loud in render logs and falls to a legible neutral; a hardcoded old
|
|
55
|
+
hex is silent, which is why you hunt it by eye.
|
|
56
|
+
5. **Fix the holdouts surgically.** `apply_composition` edits per offending clip: rebind card
|
|
57
|
+
fields to `$brand:` tokens (so the NEXT rebrand really is one line), swap the old-wordmark
|
|
58
|
+
media, re-grade footage toward the new palette. A replaced card gets re-shelled with
|
|
59
|
+
`applyMotionPreset` in a FOLLOWING call. The §3 test governs every card you touch: if the
|
|
60
|
+
old brand's hex would still look correct in it, the layout was never bespoke — rebuild it,
|
|
61
|
+
don't tint it.
|
|
62
|
+
6. **Re-decide the audio — required.** A brand swap is a mood swap: check the bed against the
|
|
63
|
+
new kit's `musicMood`. Wrong mood → `search_resources` a replacement (license recorded),
|
|
64
|
+
same role and ducking, `materializeGrid` re-run if cut timing shifts. Still right → say so
|
|
65
|
+
in the delivery note. If the piece was intentionally silent, confirm that decision still
|
|
66
|
+
fits the new brand and restate it.
|
|
67
|
+
7. **Judge against the NEW brand, render once.** `score_composition` with the new brand facts
|
|
68
|
+
as `brandContext` — the brand axis is exactly the check this job needs. Fix worst-first to
|
|
69
|
+
≥ 7.5, then `create_render` → `wait_job (kind:"render")`.
|
|
70
|
+
|
|
71
|
+
## What good looks like
|
|
72
|
+
|
|
73
|
+
Quoted from `video-craft-standards` §3 (Brand-identity reel) — the bespoke test applies to every
|
|
74
|
+
card in any class:
|
|
75
|
+
|
|
76
|
+
> **MUST** Every graphic is bespoke to the brand: its type, its palette as fields, its layout
|
|
77
|
+
> system. **K:** any layout that would look correct with another brand's hex swapped in.
|
|
78
|
+
|
|
79
|
+
> **MUST** Footage color and brand palette agree — grade toward the palette or choose footage
|
|
80
|
+
> that lives in it.
|
|
81
|
+
|
|
82
|
+
And cross-cutting: *"**MUST** Brand/text graphics are AUTHORED — `kind:"card"` HTML (your
|
|
83
|
+
typography, layout, palette-as-fields) […] **K:** a brand graphic rendered from a catalog text
|
|
84
|
+
primitive."*
|
|
85
|
+
|
|
86
|
+
## Delivering
|
|
87
|
+
|
|
88
|
+
The last message closes the loop, never "done":
|
|
89
|
+
|
|
90
|
+
- The re-rendered link and where it lives (project + composition id), plus the kit id now bound
|
|
91
|
+
— and the one-line promise made true: next time, edit the kit and re-render.
|
|
92
|
+
- What re-themed automatically vs what you hand-edited (the audit list from step 3) — the user
|
|
93
|
+
should know which parts of their video are now token-bound.
|
|
94
|
+
- Attribution for any newly licensed bed or asset (provider, id, author).
|
|
95
|
+
- The audio decision: bed kept / bed swapped and why / intentional silence restated.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Rebrand a video"
|
|
3
|
+
short_description: "Swaps the brand kit under an existing video and re-renders — tokens, bumpers…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $rebrand-a-video to swap the brand kit under an existing video and re-renders — tokens, bumpers, logo, captions, and motion re-theme automatically; hardcoded card values get surgical edits."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<clipPath id="cf-favicon-clip"><circle cx="128" cy="128" r="118"/></clipPath>
|
|
3
|
+
<circle cx="128" cy="128" r="118" fill="#f7c948"/>
|
|
4
|
+
<g clip-path="url(#cf-favicon-clip)">
|
|
5
|
+
<path d="M88 128Q160 40 300-40" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
6
|
+
<path d="M88 128Q170 60 310 20" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
7
|
+
<path d="M88 128Q180 80 316 70" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
8
|
+
<path d="M88 128Q186 110 320 110" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
9
|
+
<path d="M88 128Q186 146 320 146" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
10
|
+
<path d="M88 128Q180 176 316 186" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
11
|
+
<path d="M88 128Q170 196 310 236" fill="none" stroke="#160f08" stroke-width="4.5"/>
|
|
12
|
+
<path d="M88 128Q160 216 300 296" fill="none" stroke="#160f08" stroke-width="5"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="88" cy="128" r="20" fill="#160f08"/>
|
|
15
|
+
<circle cx="88" cy="128" r="8" fill="#f7c948"/>
|
|
16
|
+
</svg>
|