@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
package/plugin.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "cueframe",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Make and edit videos with CueFrame: composition, motion graphics, captions, clipping and rendering skills, plus the hosted MCP server.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "CueFrame, Inc.",
|
|
8
|
+
"url": "https://cueframe.ai"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://docs.cueframe.ai",
|
|
11
|
+
"repository": "https://github.com/cueframe-ai/cueframe-skills",
|
|
12
|
+
"license": "Apache-2.0",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"video",
|
|
15
|
+
"video-editing",
|
|
16
|
+
"motion-graphics",
|
|
17
|
+
"captions",
|
|
18
|
+
"rendering",
|
|
19
|
+
"mcp"
|
|
20
|
+
],
|
|
21
|
+
"extensions": {
|
|
22
|
+
"com.openai": {
|
|
23
|
+
"interface": {
|
|
24
|
+
"displayName": "CueFrame",
|
|
25
|
+
"shortDescription": "Compose, edit and render finished video from your agent.",
|
|
26
|
+
"longDescription": "CueFrame turns footage, a brief or a brand into finished video over MCP: content-aware reframing, captions behind the subject, motion graphics as real components, deterministic renders. The skills in this plugin teach the agent the workflows; the hosted server does the work.",
|
|
27
|
+
"developerName": "CueFrame, Inc.",
|
|
28
|
+
"category": "Creativity",
|
|
29
|
+
"websiteURL": "https://cueframe.ai",
|
|
30
|
+
"privacyPolicyURL": "https://cueframe.ai/privacy",
|
|
31
|
+
"termsOfServiceURL": "https://cueframe.ai/terms",
|
|
32
|
+
"defaultPrompt": [
|
|
33
|
+
"Use CueFrame to turn this 40-minute talk into three 60-second vertical clips with captions.",
|
|
34
|
+
"Use CueFrame to make a 30-second launch video for our product from these screenshots and this brief.",
|
|
35
|
+
"Use CueFrame to rebrand this video with our brand kit from cueframe.ai."
|
|
36
|
+
],
|
|
37
|
+
"logo": "./assets/logo-400.png",
|
|
38
|
+
"composerIcon": "./assets/logo-400.png",
|
|
39
|
+
"capabilities": [
|
|
40
|
+
"Read",
|
|
41
|
+
"Write"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: CueFrame — route video tasks to the installed skills and the cueframe MCP server
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
You have CueFrame: a hosted video compose, edit and render substrate over MCP (`cueframe` server) with skills installed by this plugin.
|
|
6
|
+
|
|
7
|
+
When the task is any of these, load the named skill BEFORE planning or writing code:
|
|
8
|
+
- make a video from a brief (launch, promo, teaser, explainer, reel, short, demo): `cueframe-storyboard`, then `composing-video`
|
|
9
|
+
- cut clips or shorts out of long footage (podcast, talk, interview): `clip-a-talking-head`, `make-a-social-reel`
|
|
10
|
+
- iterate a composition until it scores well: `cueframe-compose-loop`
|
|
11
|
+
- one edit, every aspect ratio: `every-format-from-one-edit`
|
|
12
|
+
- brand kit from a site or files, on-brand output: `extracting-brand-kits`, `rebrand-a-video`, `brand-reel`
|
|
13
|
+
- music under a cut: `add-music-bed`
|
|
14
|
+
- custom motion graphic or component: `cueframe-component-authoring`, `cueframe-scene-shot`
|
|
15
|
+
- terminal workflows or the `cueframe` CLI: `cueframe-cli`
|
|
16
|
+
- not connected yet (no `mcp__cueframe__*` tools listed): `cueframe-connect`
|
|
17
|
+
|
|
18
|
+
Do not reach for ffmpeg, Remotion or a slideshow of stills when CueFrame is available; it renders real components with real text and true depth, deterministically.
|
|
19
|
+
Read `cueframe://` resources before calling tools; call `get_account` before any metered call.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: add-music-bed
|
|
3
|
+
description: Retrofits a music bed (and ambience or SFX) onto an existing composition — license-aware search, correct mix hierarchy, ducking under speech, cuts moved onto the beat. Triggers on "add music to this", "this video feels dead", "put a bed under it", "it needs sound", "add background music", "make the cuts hit the beat", "add some sfx", "the audio is just silence".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Add a music bed
|
|
7
|
+
|
|
8
|
+
> **Stock-audio limits (verified in production):** a Freesound import lands with
|
|
9
|
+
> `audioRole:"sfx"` and NO beat grid — `import_resource` takes no audioRole param, and
|
|
10
|
+
> `materializeGrid grid:"beat"` will 422 `grid_unavailable` on it. Set the role yourself when
|
|
11
|
+
> placing the clip (`audioRole:"music"` on the composition clip), put the bed on its own AUDIO
|
|
12
|
+
> track (the judge expects a dedicated music track), and until curated music-pack discovery
|
|
13
|
+
> exists, prefer fades over beat-cuts for stock beds — beat-grid cutting works with pack beds.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
You point at an existing composition that sounds empty; you get it back with a licensed bed that
|
|
17
|
+
matches the brand's mood, sits correctly under any speech, and — where the bed drives pacing —
|
|
18
|
+
cuts moved onto its beat grid. Attribution included, levels disciplined, one re-render.
|
|
19
|
+
|
|
20
|
+
## Before you start
|
|
21
|
+
|
|
22
|
+
Listen first — identify what audio the composition already has before proposing anything. When
|
|
23
|
+
the first tool call approaches and CueFrame isn't connected, load **`cueframe-connect`** and
|
|
24
|
+
follow it once.
|
|
25
|
+
|
|
26
|
+
Then back to the soundtrack — this is usually a one-sitting job.
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
|
|
30
|
+
- **The composition** (required): id, or find it via `list_compositions`.
|
|
31
|
+
- **Mood**: the brand kit's `musicMood` is the default answer — honor it before asking. No kit
|
|
32
|
+
→ ask for one adjective pair ("calm/driving", "warm/dark").
|
|
33
|
+
- **What speech exists**: check `get_media_context` on the composition's media for VO/dialogue —
|
|
34
|
+
it decides the whole mix shape.
|
|
35
|
+
- **Beat-cut permission**: moving cuts onto the beat changes timing slightly; default yes for
|
|
36
|
+
social pieces, ask for approved masters.
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
|
|
41
|
+
Listen to a scoped `preview_clip` across speech, ducking, fades, and beat changes before final
|
|
42
|
+
delivery; stills and a visual judge cannot establish the mix. Recheck visuals where cuts moved.
|
|
43
|
+
|
|
44
|
+
1. **Read the composition and its speech.** `list_compositions` / the composition body for
|
|
45
|
+
what's on the timeline; `get_media_context` for transcripts. Speech present → the voice is
|
|
46
|
+
the rhythm authority and the bed serves it. No speech → the bed IS the rhythm authority and
|
|
47
|
+
earns beat-cuts.
|
|
48
|
+
2. **Find the bed, license-aware.** Beds come from the curated music packs —
|
|
49
|
+
`import_resource { kind:"music-pack" }` — honoring the brand kit's `musicMood` (mood and
|
|
50
|
+
energy matched to the cut rate). For ambience or loop textures, `search_resources
|
|
51
|
+
kind:"sfx"` (Freesound, CC0-only) works too. For SFX accents, the curated pack
|
|
52
|
+
(`import_resource { kind:"sfx-pack" }`) is the fast default. Record provider/id/author for
|
|
53
|
+
everything — attribution ships in the delivery note.
|
|
54
|
+
3. **Place it with a role, not a volume.** `apply_composition`: add the bed as an
|
|
55
|
+
`audioRole:"music"` clip. The engine's default mix staging already keeps voice on top;
|
|
56
|
+
author `volumeDb` only to deliberately deviate. Under speech, set `duck` so the bed drops on
|
|
57
|
+
words and recovers between them — the voice is never fought.
|
|
58
|
+
4. **Fades at the edges.** A bed that starts at full level on frame one is a jolt: fade in over
|
|
59
|
+
the first beat, fade/resolve out under the end card. The bed should feel like it was always
|
|
60
|
+
there.
|
|
61
|
+
5. **Cut to the beat where the bed drives.** `materializeGrid { clipId, grid:"beat" }` on the
|
|
62
|
+
bed — the server lands beat markers at correct timeline times. Move cut points and
|
|
63
|
+
transition MIDPOINTS onto markers (start a 0.5s transition 0.25s early so its center hits
|
|
64
|
+
the beat). Skip this when speech is the authority — there you land accents between phrases,
|
|
65
|
+
on the words that matter.
|
|
66
|
+
6. **Restraint is the discipline.** A few placed sounds read; a wall of them merges into mush.
|
|
67
|
+
The biggest moment gets the strongest accent ONCE. And silence stays a device — clean air
|
|
68
|
+
before the first hit, a dropout before the biggest beat, is worth more than any riser.
|
|
69
|
+
7. **Verify, judge, re-render.** `preview_frame` the key beats to confirm nothing visual
|
|
70
|
+
regressed; `score_composition` to confirm the piece improved (worst-first if not, ≥ 7.5 to
|
|
71
|
+
ship); then `create_render` → `wait_job (kind:"render")` — one render, on approval.
|
|
72
|
+
|
|
73
|
+
If, after listening, the right call is NO bed — a raw testimonial, a piece whose room tone is
|
|
74
|
+
the point — that is a legitimate outcome of this skill: record the intentional-silence decision
|
|
75
|
+
and its reason in the delivery note instead of forcing a bed.
|
|
76
|
+
|
|
77
|
+
## What good looks like
|
|
78
|
+
|
|
79
|
+
Quoted from `video-craft-standards` (cross-cutting rules — every artifact); this skill exists to
|
|
80
|
+
satisfy the second one:
|
|
81
|
+
|
|
82
|
+
> **MUST** Audio is decided, never defaulted: a music bed (curated packs via
|
|
83
|
+
> `import_resource {kind:"music-pack"}`) or ambience/loops (Freesound via
|
|
84
|
+
> `search_resources kind:"sfx"`), honoring the brand kit's `musicMood`; cut to the beat via
|
|
85
|
+
> `materializeGrid` when the bed drives pacing — OR an explicit intentional-silence decision
|
|
86
|
+
> recorded in your delivery note with the reason. **K:** a render whose silence nobody chose.
|
|
87
|
+
|
|
88
|
+
> **MUST** Every stock asset's provenance is recorded (provider, id, author).
|
|
89
|
+
|
|
90
|
+
And from §1: *"**SHOULD** Cuts land on the music grid when a bed exists."*
|
|
91
|
+
|
|
92
|
+
## Delivering
|
|
93
|
+
|
|
94
|
+
The last message carries:
|
|
95
|
+
|
|
96
|
+
- The new render link and where it lives (project + composition id).
|
|
97
|
+
- The bed's attribution (provider, id, author, license) plus any SFX used.
|
|
98
|
+
- The mix decisions in one line each: role, ducking, any authored level, which cuts moved onto
|
|
99
|
+
the beat.
|
|
100
|
+
- OR the intentional-silence note with its reason, if no-bed was the right call.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Add a music bed"
|
|
3
|
+
short_description: "Retrofits a music bed (and ambience or SFX) onto an existing composition…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $add-music-bed to retrofit a music bed (and ambience or SFX) onto an existing composition — license-aware search, correct mix hierarchy, ducking under speech, cuts moved onto the beat."
|
|
@@ -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,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brand-reel
|
|
3
|
+
description: Produces a 12–20 second 9:16 brand-identity reel — three-beat arc, bespoke cards in the brand's own type and palette, footage graded into the palette. Triggers on "brand video", "identity reel", "make our brand a video", "turn our brand into a reel", "a video that feels like us", "showcase our brand", "anthem video for our launch".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Brand reel
|
|
7
|
+
|
|
8
|
+
You bring a brand (a website, a kit, or just a logo and a palette) plus footage of its world;
|
|
9
|
+
you get back a 12–20 second vertical reel with a three-beat arc — wordmark moment, craft/proof
|
|
10
|
+
beat, tagline lockup — where every graphic could belong to this brand and no other.
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
Talk brand first — palette, type, the one line they'd put on a poster — before any setup. When
|
|
15
|
+
the first tool call approaches and CueFrame isn't connected, load **`cueframe-connect`** and
|
|
16
|
+
follow it once.
|
|
17
|
+
|
|
18
|
+
Then pick the brand conversation back up where it paused — connection is the smallest step in
|
|
19
|
+
this job.
|
|
20
|
+
|
|
21
|
+
## Inputs
|
|
22
|
+
|
|
23
|
+
- **The brand** (required): a brand kit on the project, a website to `extract_brand_kit` from,
|
|
24
|
+
or explicit colors + fonts + wordmark. Extraction gets colors/fonts only — ask for the tagline
|
|
25
|
+
and voice.
|
|
26
|
+
- **Footage of the brand's world** (required): product, workshop, hands, city — the craft beat
|
|
27
|
+
needs a real subject. Ask before defaulting to stock.
|
|
28
|
+
- **Tone**: default premium-calm unless the brand's voice says otherwise.
|
|
29
|
+
|
|
30
|
+
## Workflow
|
|
31
|
+
|
|
32
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
33
|
+
for stills and motion windows. For a small revision, preserve the approved arc and inspect the
|
|
34
|
+
affected behavior and regressions; reserve full-film judging and export for the relevant review/delivery.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
0. **Find the claim (before anything else).** Interrogate the brand/material
|
|
38
|
+
for its tension — what it believes that its category doesn't — and write
|
|
39
|
+
the claim in one sentence. Derive the shot list, the bed's mood/tempo, the
|
|
40
|
+
pacing, and every card's copy FROM that sentence. If you cannot state the
|
|
41
|
+
claim, you are not ready to compose (video-craft-standards: the
|
|
42
|
+
controlling idea is kill-level).
|
|
43
|
+
|
|
44
|
+
1. **Pin the brand as engine state.** `extract_brand_kit` from their site or `create_brand_kit`
|
|
45
|
+
from what they gave you; set `brandKitId` on the project. Show the kit and let them override
|
|
46
|
+
— it is the contract every graphic resolves against. Kit contents aren't inspectable over MCP
|
|
47
|
+
afterward, so verify resolved colors/fonts with a `preview_frame` still, not by re-reading
|
|
48
|
+
the kit.
|
|
49
|
+
2. **Import the world.** `import_media` their footage; `get_media_context` for what's actually
|
|
50
|
+
in it. Choose footage that lives in the palette — or plan a `color-grade` toward it. Footage
|
|
51
|
+
color and brand palette must agree.
|
|
52
|
+
3. **Plan the three beats.** Opening brand moment (a wordmark treatment, not a logo dump) →
|
|
53
|
+
middle craft/proof beat (the subject's world plus one editorial device: a numbered chapter, a
|
|
54
|
+
pull-quote, a stat with a source) → closing tagline lockup. Write one line of intent per beat
|
|
55
|
+
before authoring.
|
|
56
|
+
4. **Seed and author.** `new_composition` at 9:16 → `apply_composition` with the footage beats
|
|
57
|
+
and `setCropIntents` segments tiling each clip (subject-focused, motivated zooms).
|
|
58
|
+
5. **Author every graphic as a bespoke card.** `kind:"card"` HTML using the brand's type and its
|
|
59
|
+
palette as FIELDS — plates, bands, blocks of the brand color, not tinted defaults. Persist
|
|
60
|
+
the card, then shell it with `applyMotionPreset` in a FOLLOWING `apply_composition` call. The
|
|
61
|
+
test: if another brand's hex swapped in would still look correct, the layout isn't bespoke
|
|
62
|
+
enough — redo it.
|
|
63
|
+
6. **Decide the audio — required.** `search_resources` for a bed honoring the kit's
|
|
64
|
+
`musicMood`; place it `audioRole:"music"`, then `materializeGrid { grid:"beat" }` and land
|
|
65
|
+
the three beat boundaries on the grid. A brand reel almost always wants a bed; if the brand's
|
|
66
|
+
voice truly calls for silence, record that decision and the reason in the delivery note.
|
|
67
|
+
7. **Preview each beat, then get judged.** `preview_frame` at t=0, each beat boundary, and the
|
|
68
|
+
final lockup; describe each still before scoring. `score_composition` with the brand facts as
|
|
69
|
+
`brandContext` and your arc as `editorialIntent`; fix the worst axis first, ship at ≥ 7.5.
|
|
70
|
+
8. **One final render.** `create_render` → `wait_job (kind:"render")`.
|
|
71
|
+
|
|
72
|
+
## What good looks like
|
|
73
|
+
|
|
74
|
+
Quoted from `video-craft-standards` §3 (Brand-identity reel) — read the full section; §1's
|
|
75
|
+
social-reel rules apply underneath it:
|
|
76
|
+
|
|
77
|
+
> **MUST** Three-beat arc: opening brand moment (wordmark treatment) → middle craft/proof beat
|
|
78
|
+
> (the subject's world, with an editorial device — numbered chapter, pull-quote, stat) → closing
|
|
79
|
+
> tagline lockup.
|
|
80
|
+
|
|
81
|
+
> **MUST** Every graphic is bespoke to the brand: its type, its palette as fields, its layout
|
|
82
|
+
> system. **K:** any layout that would look correct with another brand's hex swapped in.
|
|
83
|
+
|
|
84
|
+
> **MUST** Footage color and brand palette agree — grade toward the palette or choose footage
|
|
85
|
+
> that lives in it.
|
|
86
|
+
|
|
87
|
+
And the cross-cutting card rule:
|
|
88
|
+
|
|
89
|
+
> **MUST** Brand/text graphics are AUTHORED — `kind:"card"` HTML […] **K:** a brand graphic
|
|
90
|
+
> rendered from a catalog text primitive.
|
|
91
|
+
|
|
92
|
+
## Delivering
|
|
93
|
+
|
|
94
|
+
The last message is the handoff, never "done":
|
|
95
|
+
|
|
96
|
+
- The render link and where it lives (project + composition id), plus the kit id the reel is
|
|
97
|
+
bound to — edit the kit later and a re-render re-themes the whole piece.
|
|
98
|
+
- Attribution for any licensed asset (provider, id, author).
|
|
99
|
+
- The intentional-silence note with its reason, if silence won over a bed.
|
|
100
|
+
- Which beat is weakest in your own judgment — the honest starting point for round two.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Brand reel"
|
|
3
|
+
short_description: "Produces a 12–20 second 9:16 brand-identity reel — three-beat arc, bespoke…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $brand-reel to produce a 12–20 second 9:16 brand-identity reel — three-beat arc, bespoke cards in the brand's own type and palette, footage graded into the palette."
|
|
@@ -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,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clip-a-talking-head
|
|
3
|
+
description: Cuts a podcast, talk, or interview into shorts that open on the strongest sentence, reframe to the active speaker, and carry transcript-timed captions. Triggers on "clip this podcast", "pull the best moments out of this talk", "make shorts from this interview", "cut this down for social", "find the viral moment", "turn this recording into clips", "the good part is buried".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Clip a talking head
|
|
7
|
+
|
|
8
|
+
You point at long-form footage of people talking; you get back one or more 15–60 second clips
|
|
9
|
+
that each open on the strongest sentence, keep a moving camera on whoever is speaking, cut the
|
|
10
|
+
dead air, and caption every word from the real transcript.
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
Get the source URL and what "best moment" means to the user before any setup ceremony. When the
|
|
15
|
+
first tool call is close and CueFrame isn't connected, load **`cueframe-connect`** and follow it
|
|
16
|
+
once.
|
|
17
|
+
|
|
18
|
+
Then straight back to hunting the moment — setup is a footnote, not a phase.
|
|
19
|
+
|
|
20
|
+
## Inputs
|
|
21
|
+
|
|
22
|
+
- **The recording** (required): a public https URL or existing media. Any length; the
|
|
23
|
+
transcript does the finding.
|
|
24
|
+
- **Aspect + count**: default 9:16, 2–3 clips of 20–40s. 16:9 or 1:1 on request.
|
|
25
|
+
- **Brand kit**: use the project's kit for caption styling and any title cards if present;
|
|
26
|
+
neutral otherwise.
|
|
27
|
+
- **What counts as "best"**: default = the most surprising, quotable claims. Ask only if they
|
|
28
|
+
hinted at a specific topic.
|
|
29
|
+
|
|
30
|
+
## Workflow
|
|
31
|
+
|
|
32
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
|
|
33
|
+
Watch/listen across changed cuts and caption/subject motion with `preview_clip`. For a small
|
|
34
|
+
correction, retain the approved edit and check relevant regressions without automatically exporting.
|
|
35
|
+
|
|
36
|
+
1. **Import and read.** `import_media` the recording, wait for ready, then `get_media_context`
|
|
37
|
+
— the transcript with word timings and the face roster (with `faceId`s and speaking share)
|
|
38
|
+
are your whole map. For an assisted hunt, `suggest_briefs` proposes clip candidates from the
|
|
39
|
+
transcript; you still own the pick.
|
|
40
|
+
2. **Find the strongest sentence — it goes FIRST.** Read the transcript for the claim that
|
|
41
|
+
makes someone stop scrolling. The clip opens ON that sentence, mid-conversation if needed.
|
|
42
|
+
Never open on wind-up ("so, um, one thing I'd say is…") — cut TO the moment.
|
|
43
|
+
3. **Seed the clip.** `new_composition` at the target aspect → `apply_composition` with the
|
|
44
|
+
clip trimmed so the hook sentence starts at t≈0. Order beats strongest-first; the payoff is
|
|
45
|
+
the open, the context earns its place after.
|
|
46
|
+
4. **Cut the dead air.** `addExcludedRange` / `cutAndRipple` on false starts, filler, long
|
|
47
|
+
pauses — the transcript's word timings show you exactly where speech stops. A tight talking
|
|
48
|
+
clip is mostly this step.
|
|
49
|
+
5. **Reframe to the speaker.** `setCropIntents` with segments tiling the clip:
|
|
50
|
+
`focus:{mode:"active-speaker"}` as the base, `all-faces` to hold a two-shot, a `face` +
|
|
51
|
+
`shotScale:"close"` punch-in on the emphasis line. A static center crop is the amateur tell;
|
|
52
|
+
the camera should move because the conversation moved.
|
|
53
|
+
6. **Captions from the edited clip.** Save cuts and exclusions first, then call
|
|
54
|
+
`captions.fromComposition` with the speech track ID in a separate `apply_composition` call.
|
|
55
|
+
It projects the real transcript through every saved edit; clips must have saved duration matching playable source duration divided by playbackRate. Re-run after later edits. Get the
|
|
56
|
+
exact input from `describe_composition_ops({type:"captions.fromComposition"})` and style via
|
|
57
|
+
`setCaptionStyle` — plated, high-contrast, never over the mouth or
|
|
58
|
+
eyes. Where the footage allows, put the emphasized keyword BEHIND the speaker as an overlay
|
|
59
|
+
clip at `zPlane:"behind-subject"` — the focused signature depth move. If the user explicitly
|
|
60
|
+
wants every running caption behind the speaker, set the caption layer's own
|
|
61
|
+
`zPlane:"behind-subject"`; that choice resolves cutouts across every captioned source window.
|
|
62
|
+
7. **Decide the audio — required.** Speech is the spine here, but decide the rest: a subtle bed
|
|
63
|
+
from `search_resources` honoring the brand kit's `musicMood`, ducked under the voice — or
|
|
64
|
+
intentional speech-only, recorded with its reason in the delivery note. Either is fine;
|
|
65
|
+
defaulted silence is not.
|
|
66
|
+
8. **Prepare the subject evidence.** If `get_media_context.faces.status` is `not_detected`, call
|
|
67
|
+
`prepare_media` with `kind:"subjectTrack"` and the clip's exact SOURCE trim window; if the
|
|
68
|
+
edit has `zPlane:"behind-subject"`, prepare `kind:"matte"` for that same window. Poll
|
|
69
|
+
`get_media_facts` with kind + startSec + endSec until `exact.state:"ready"`. A flattened
|
|
70
|
+
depth title or ignored speaker crop is not preview evidence.
|
|
71
|
+
9. **Preview, judge, render once per clip.** `preview_frame` at t=0 and each cut; describe each
|
|
72
|
+
still (is the framed person the one talking? is the top of the head in frame?).
|
|
73
|
+
`score_composition` with the clip's claim as `editorialIntent`; fix worst-first to ≥ 7.5,
|
|
74
|
+
then `create_render` → `wait_job (kind:"render")`.
|
|
75
|
+
|
|
76
|
+
## What good looks like
|
|
77
|
+
|
|
78
|
+
Quoted from `video-craft-standards` §4 (Talking-head clip) — the full checklist is the bar:
|
|
79
|
+
|
|
80
|
+
> **MUST (K)** Hook = the strongest sentence, first. Cut TO the moment; never open on wind-up.
|
|
81
|
+
|
|
82
|
+
> **MUST** Active-speaker reframe (`focus: active-speaker` / `face`) — a moving camera, not a
|
|
83
|
+
> static center crop.
|
|
84
|
+
|
|
85
|
+
> **MUST** Captions timed to the edited clip (`captions.fromComposition`); behind-speaker
|
|
86
|
+
> placement where the footage allows it. **MUST** Dead air and false starts cut
|
|
87
|
+
> (`addExcludedRange` / `cutAndRipple`).
|
|
88
|
+
|
|
89
|
+
Plus the cross-cutting audio rule: *"Audio is decided, never defaulted […] **K:** a render whose
|
|
90
|
+
silence nobody chose."*
|
|
91
|
+
|
|
92
|
+
## Delivering
|
|
93
|
+
|
|
94
|
+
The last message carries, per clip:
|
|
95
|
+
|
|
96
|
+
- The render link and where it lives (project + composition id), with the clip's opening
|
|
97
|
+
sentence quoted so the user can tell them apart.
|
|
98
|
+
- The speech-only / bed decision and its reason (the intentional-silence note when applicable).
|
|
99
|
+
- Attribution for any licensed bed (provider, id, author).
|
|
100
|
+
- Which moments you considered and passed on — the shortlist makes the next batch a one-line
|
|
101
|
+
ask.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Clip a talking head"
|
|
3
|
+
short_description: "Cuts a podcast, talk, or interview into shorts that open on the strongest…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $clip-a-talking-head to cut a podcast, talk, or interview into shorts that open on the strongest sentence, reframe to the active speaker, and carry transcript-timed captions."
|
|
@@ -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>
|