@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,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cueframe-component-authoring
|
|
3
|
+
description: Use when authoring, forking, or customizing a CueFrame motion-graphics component/primitive/graphic — e.g. "customize the cinematic-title primitive", "make my own animated lower-third", "fork a CueFrame template and edit it", "author a custom graphic and render it". Covers cloud MCP, local desktop, and CLI project paths through the same component-v2 contract. Use BEFORE hand-writing a component from scratch — forking a built-in is usually the faster start.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CueFrame component authoring (fork / customize / own)
|
|
7
|
+
|
|
8
|
+
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
9
|
+
to select hosted or local evidence and separate iteration from final delivery.
|
|
10
|
+
|
|
11
|
+
CueFrame ships 87 built-in motion-graphics **primitives** (titles, lower-thirds, captions,
|
|
12
|
+
effects, transitions, scenes). You can **fork any of them as editable source**, customize it,
|
|
13
|
+
and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
|
|
14
|
+
component code; CueFrame is the reliable engine that renders it.
|
|
15
|
+
|
|
16
|
+
**Before you hand-write 3D:** a device mockup or a screenshot floating in a lit 3D scene is a
|
|
17
|
+
**scene shot** — validated JSON with `scene.add` / `scene.update`, not a component you author.
|
|
18
|
+
See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
|
|
19
|
+
you need behaviour the scene contract does not express.
|
|
20
|
+
|
|
21
|
+
**The two facts that shape everything:**
|
|
22
|
+
- A component is mounted through contract v2 as
|
|
23
|
+
**`({ durationInFrames, params, assets, render }) => JSX`**. `render` contains frame, fps,
|
|
24
|
+
dimensions, deterministic seed, and color space. A from-scratch component must default-export
|
|
25
|
+
this shape; older components may ignore the added properties.
|
|
26
|
+
- Neither renderer runs authored component source in the editor process. Hosted org components are
|
|
27
|
+
baked in an isolated box. A local project compiles source in a separate headless-Chromium child
|
|
28
|
+
process, pins the immutable source version in the project, and uses that version for the editor and export.
|
|
29
|
+
|
|
30
|
+
## Path A — MCP agent (no filesystem; source lives server-side)
|
|
31
|
+
|
|
32
|
+
Single self-contained module per component (`create_component` takes one `tsxSource`).
|
|
33
|
+
|
|
34
|
+
1. **Fork a built-in:** `get_component_source(componentId: "cinematic-title")` → returns the
|
|
35
|
+
primitive's editable single-module `tsxSource` (the named component + the adapter). Discover
|
|
36
|
+
ids from the catalog (`/v1/components`). *(Or author from scratch — skip to step 2.)*
|
|
37
|
+
2. **Author/own it:** edit the `tsxSource`, declare its v2 `manifest`, then call
|
|
38
|
+
`create_component({ componentId, tsxSource, manifest, … })` to store your customer-owned copy.
|
|
39
|
+
If forked, `ejectedFrom` is stamped.
|
|
40
|
+
3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
|
|
41
|
+
preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
|
|
42
|
+
verified artifact produced by the same bundle contract used by final render. A failed
|
|
43
|
+
`component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
|
|
44
|
+
(same id, in place), and preview again.
|
|
45
|
+
**Once the component is placed in a project, pass that project on every update:**
|
|
46
|
+
`update_component({ componentId, body: { tsxSource, projectId, compositionId? } })`. A placed clip
|
|
47
|
+
renders the exact version it pins; only the composition you name moves to the new version in the
|
|
48
|
+
same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
|
|
49
|
+
version, and `placementsPinnedToPrevious` counts them.
|
|
50
|
+
Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
|
|
51
|
+
duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
|
|
52
|
+
4. **Check integration:** add it as a `{kind:'component', componentId, props}` clip
|
|
53
|
+
(`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
|
|
54
|
+
placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
|
|
55
|
+
finished MP4, not per tweak.
|
|
56
|
+
|
|
57
|
+
## Path B — CLI / coding agent (customer-owned source under git)
|
|
58
|
+
|
|
59
|
+
Source lives in `cueframe/components/<id>/` (the `cueframe.json` workspace); edit locally as
|
|
60
|
+
standard Remotion, push to render.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npx -y cueframe@0.5 init --json # scaffold cueframe.json + cueframe/components/
|
|
64
|
+
npx -y cueframe@0.5 new component my-badge --json # scaffold a component in the workspace
|
|
65
|
+
# to start from a built-in instead of a blank file: fetch its source with the
|
|
66
|
+
# `get_component_source` tool and paste it into cueframe/components/my-badge/index.tsx
|
|
67
|
+
# …edit cueframe/components/<id>/ in your editor (standard Remotion)…
|
|
68
|
+
npx -y cueframe@0.5 push my-badge --json # upload index.tsx as the component tsxSource
|
|
69
|
+
# or: npx -y cueframe@0.5 sync --json # push every component in the workspace
|
|
70
|
+
# reference the component id in your composition, then render:
|
|
71
|
+
npx -y cueframe@0.5 render <projectId> -o ./out.mp4 --json
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The CLI writes a 3-file layout (`index.tsx` = renderable module + adapter; `_config.ts` + `config.ts`
|
|
75
|
+
= local workspace metadata). `push` sends `index.tsx` as the single `tsxSource` — the same shape the
|
|
76
|
+
MCP path stores. To preview before a full render, push it and use the MCP `preview_component` loop.
|
|
77
|
+
|
|
78
|
+
## Path C — Director editing a local desktop project (project-embedded source)
|
|
79
|
+
|
|
80
|
+
When `get_context` reports the project lane as local, motion does not require an account or an org
|
|
81
|
+
component. When exposed, use `open_component_preview` to compile an isolated preview (new source,
|
|
82
|
+
or `component_id` for a component already in the desktop's library), `update_component_preview`
|
|
83
|
+
with exact-text edits (`{oldText, newText, replaceAll?}`, each `oldText` matching once), and
|
|
84
|
+
`render_component_preview_frame` for exact frame evidence. Inspect playback for motion;
|
|
85
|
+
`commit_component_preview` publishes the checked source to the library and pins the clip, with a
|
|
86
|
+
fresh ETag. `read_component` and `edit_component` read and edit the library directly. Close the preview when finished. This loop does not bake a timeline video and
|
|
87
|
+
does not imply HMR: source updates still compile.
|
|
88
|
+
|
|
89
|
+
If those tools are unavailable, add/update through `apply_composition` and inspect the local
|
|
90
|
+
timeline. An inline custom overlay has this shape:
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"type": "clip.add",
|
|
95
|
+
"clip": {
|
|
96
|
+
"id": "local-motion",
|
|
97
|
+
"kind": "overlay",
|
|
98
|
+
"startTime": 0,
|
|
99
|
+
"duration": 3,
|
|
100
|
+
"source": {
|
|
101
|
+
"kind": "overlay",
|
|
102
|
+
"primitiveId": "custom",
|
|
103
|
+
"params": {
|
|
104
|
+
"jsxSource": "export default function Graphic({ durationInFrames, params, assets, render }) { ... }",
|
|
105
|
+
"componentManifest": { "version": 2, "assets": {}, "graphics": { "api": "canvas2d", "required": true, "accelerationPreference": "software-allowed" }, "alphaPolicy": "requires-transparency" },
|
|
106
|
+
"componentAssets": {}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"newTrack": true
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The desktop compiles the module in an isolated child process and creates it in the desktop's component
|
|
115
|
+
library. Inline source creates a component only: a clip whose component already exists with other
|
|
116
|
+
source is refused as `component_exists`, and that component changes through edits.
|
|
117
|
+
The timeline and final export render that exact version; no preview media is baked. A compile failure
|
|
118
|
+
refuses the whole batch and leaves the composition untouched. Use `create_component` only for a reusable
|
|
119
|
+
org-catalog component on a reachable cloud lane.
|
|
120
|
+
|
|
121
|
+
For media-backed graphics, declare each slot in `componentManifest.assets`, bind the slot to a
|
|
122
|
+
project media id in `componentAssets`, and read its request-scoped handle from `assets`. The renderer
|
|
123
|
+
localizes and hashes the file before execution. Remote URLs, undeclared assets, arbitrary filesystem
|
|
124
|
+
paths, WebGL substitution, and static/card substitution are not fallback paths.
|
|
125
|
+
|
|
126
|
+
Declare `componentManifest.alphaPolicy` explicitly: `requires-transparency` for overlays and
|
|
127
|
+
`allows-opaque` for intentional full-frame plates. Both adapters verify the same field.
|
|
128
|
+
|
|
129
|
+
Normal static imports are supported only from the runtime allowlist: React, Remotion, Three.js
|
|
130
|
+
WebGPU/TSL, React Three Fiber/Drei, Remotion Three, and CueFrame animation helpers. Use ordinary hooks,
|
|
131
|
+
loops, refs, constructors, typed arrays, canvas, and WebGPU when needed. Drive visible animation from
|
|
132
|
+
`render.frame`/`render.fps` and seed variation from `render.seed`; ambient time/randomness is refused.
|
|
133
|
+
|
|
134
|
+
## Choosing what to fork
|
|
135
|
+
The catalog (`/v1/components`) gives each primitive's `description` / `useWhen` / `tags` / `mood` /
|
|
136
|
+
`tier` / `useCase` / `examples` (example params) + `propSchema` + its source via `get_component_source`.
|
|
137
|
+
Read the spec + the code to pick a starting point. (Rendered preview thumbnails are a separate
|
|
138
|
+
follow-up — today you choose from prose + params + source, or compose+`preview_frame` to see it.)
|
|
139
|
+
|
|
140
|
+
## Layout inside a component — `FlexLayout` / `solveFlex`
|
|
141
|
+
When a graphic has several cells that must share space — a feature grid, a fixed rail beside
|
|
142
|
+
fluid content, a cast of objects next to type — don't hand-place pixels. The layout helpers
|
|
143
|
+
are in `@cueframe/animate` (on the import allowlist):
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
import { FlexLayout } from '@cueframe/animate';
|
|
147
|
+
const R = params.region ?? { x: 0, y: 0, w: 1, h: 1 };
|
|
148
|
+
<FlexLayout
|
|
149
|
+
tracks={[{ weight: 0, basis: 520 }, 1, { weight: 3, split: [1, 1] }]}
|
|
150
|
+
tracksEnd={[{ weight: 0, basis: 520 }, 1, { weight: 1, split: [2, 1] }]}
|
|
151
|
+
fits={[{ mode: 'stretch' }, { mode: 'position' }, { mode: 'matte', aspect: 1 }, { mode: 'stretch' }]}
|
|
152
|
+
gap={16} width={R.w * width} height={R.h * height}>
|
|
153
|
+
<Rail /> <Type /> <Art /> <Block />
|
|
154
|
+
</FlexLayout>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- Tracks are **weights, not pixels**; `{ weight: 0, basis: 520 }` is content-sized and pushes its
|
|
158
|
+
neighbours. Children fill the leaves depth-first (a `split` nests cells on the other axis).
|
|
159
|
+
- `tracksEnd` animates: weights ease across the clip and **every cell re-solves per frame**. A cell
|
|
160
|
+
present on only one side enters from / exits to zero. Layout is the motion — no keyframed positions.
|
|
161
|
+
- `fits`, one per leaf: `stretch | contain | cover | position | scale | matte`. `position` keeps type at
|
|
162
|
+
its natural size; `matte` clips a window instead of resizing the art.
|
|
163
|
+
- Inside a `params.region` container pass `width`/`height` = the region's pixel size so nested splits and
|
|
164
|
+
aspect fits solve against the region, not the frame. **Never CSS-`scale()` the layout** — it resamples;
|
|
165
|
+
size the container instead.
|
|
166
|
+
- 3D in the same rig: `solveFlex(tree, size, weights)` returns the boxes; `flexBoxToThree(box, size)`
|
|
167
|
+
centres a mesh under `<ThreeCanvas orthographic>` (frustum pinned 1:1 to pixels), so one canvas holds
|
|
168
|
+
every object exactly on its cell.
|
|
169
|
+
- Same inputs, same boxes everywhere: the solve is pure and yoga-backed; nothing is measured from the DOM.
|
|
170
|
+
Text is placed, not measured — declare sizes with `basis` when a cell must fit its content.
|
|
171
|
+
|
|
172
|
+
## Don't
|
|
173
|
+
- Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
|
|
174
|
+
`assets` and `render` bags for media and frame state.
|
|
175
|
+
- Don't hand-roll a graphic from zero when a built-in is close — fork it (fetch the source with
|
|
176
|
+
`get_component_source`, paste it into a `npx -y cueframe@0.5 new component` scaffold) and edit.
|
|
177
|
+
- Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
|
|
178
|
+
- Don't update a placed component without its `projectId` in the body — the placed clips keep the
|
|
179
|
+
version they pin, so the next preview or render shows the old graphic.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "CueFrame component authoring (fork / customize / own)"
|
|
3
|
+
short_description: "Use when authoring, forking, or customizing a CueFrame motion-graphics…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $cueframe-component-authoring when authoring, forking, or customizing a CueFrame motion-graphics component/primitive/graphic — e.g. \"customize the cinematic-title primitive\", \"make my own animated lower-third\", \"fork a CueFrame template and edit it\", \"author a custom graphic and render it\"."
|
|
@@ -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,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cueframe-compose-loop
|
|
3
|
+
description: Use when an AI agent should DRIVE CueFrame to a high-quality clip itself — author a composition, look at rendered frames, score it with CueFrame's judge, fix the weakest thing, and repeat until it's good — e.g. "turn this source into a polished 9:16 clip", "compose and self-correct until it scores well". This is the agent-driven convergence loop over the CueFrame primitives in the `cueframe-cli` skill.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CueFrame — Compose convergence loop
|
|
7
|
+
|
|
8
|
+
You are the director. CueFrame gives you hands (author), eyes (capture), and a
|
|
9
|
+
judge (verify); you supply the taste and the iteration. The engine does NOT
|
|
10
|
+
auto-compose for you here — you drive the loop and decide when it's done. Drive
|
|
11
|
+
the primitives with the `cueframe-cli` skill; this tells you *how to converge*.
|
|
12
|
+
|
|
13
|
+
Before choosing a preview or export, read [preview-workflow.md](references/preview-workflow.md).
|
|
14
|
+
It owns hosted/local routing, bounded motion evidence, and the distinction between a small edit
|
|
15
|
+
and final delivery. For a minor revision, keep the approved brief and inspect the changed behavior
|
|
16
|
+
plus relevant regressions; do not restart the full planning/judging loop below.
|
|
17
|
+
|
|
18
|
+
## The loop
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
get_context → author → scoped preview (look) → judge if useful
|
|
22
|
+
↑ │
|
|
23
|
+
└──────── fix the WORST criterion ──────┘ → stop → render
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Hosted preview and scoring are durable, stateless jobs. Keep their job IDs and
|
|
27
|
+
wait for each terminal result; there is no hosted render box to open, warm, or close.
|
|
28
|
+
Use the local live-preview tools when working in a desktop project that exposes them.
|
|
29
|
+
|
|
30
|
+
## 0. Context — always first
|
|
31
|
+
|
|
32
|
+
`GET /v1/media/:id/context` (`cueframe_api_getMediaContext`) returns what you need
|
|
33
|
+
to author well for a source:
|
|
34
|
+
|
|
35
|
+
- **faces** — the subject roster per source window: `faceId` (face-0 = largest/
|
|
36
|
+
primary speaker), normalized `bbox`, `speakingShare` (0–1). Use these to aim
|
|
37
|
+
reframe/crop intents at the right subject. `faces.status: "not_detected"` means
|
|
38
|
+
no detection has run yet — author without face-targeted reframe, or trigger a
|
|
39
|
+
pass first; never invent face ids.
|
|
40
|
+
- **transcript** — utterances with per-word `start`/`end` (seconds). Use for
|
|
41
|
+
caption timing and for placing overlays on the right beat.
|
|
42
|
+
|
|
43
|
+
## 1. Author
|
|
44
|
+
|
|
45
|
+
Build/modify the working composition with the op vocabulary —
|
|
46
|
+
`cueframe_api_applyCompositionOp` (one op) or `putComposition` (whole). Op keys
|
|
47
|
+
are `.strict()`: a typo'd key is rejected, not silently dropped, so read the
|
|
48
|
+
error and fix the key. Reference faces from get_context in your reframe segments;
|
|
49
|
+
time captions/overlays from the transcript word timings.
|
|
50
|
+
|
|
51
|
+
## 2. Preview — look at it
|
|
52
|
+
|
|
53
|
+
Use the curated `preview_frame` MCP tool, or
|
|
54
|
+
`POST /v1/projects/:id/preview-frame-jobs`, with the composition target and the
|
|
55
|
+
timestamps you need to inspect. The operation returns `{ jobId }` immediately.
|
|
56
|
+
Call `wait_job({ kind: "preview_frame", id: jobId })`, then view the image artifact
|
|
57
|
+
URLs in the successful result. Look at the beats you're unsure about: a cut, an
|
|
58
|
+
overlay entrance, or the hook. The stills are real render evidence, not continuous-motion proof.
|
|
59
|
+
Use `preview_clip` for the affected composition window to judge cuts, entrances, camera movement,
|
|
60
|
+
and audio timing; use `preview_component` or `preview_card` for isolated authoring checks.
|
|
61
|
+
|
|
62
|
+
## 3. Score it
|
|
63
|
+
|
|
64
|
+
Use `score_composition`, or `POST /v1/projects/:id/score-composition`, with the
|
|
65
|
+
composition target plus optional `editorialIntent` and `brandContext`. It returns
|
|
66
|
+
`{ jobId }`; call `wait_job({ kind: "verify", jobId })`. CueFrame's judge samples
|
|
67
|
+
the meaningful beats, renders them, and returns:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
{ perCriterion: { editorial, spatial, brand, caption } each { score 0–10, critique },
|
|
71
|
+
composite, // weighted overall
|
|
72
|
+
critique, // worst-first, leads with the criterion to fix
|
|
73
|
+
beats }
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The four criteria:
|
|
77
|
+
|
|
78
|
+
| criterion | what it grades |
|
|
79
|
+
|---|---|
|
|
80
|
+
| **editorial** | does the framing/cut serve the stated intent (the hook, the point)? |
|
|
81
|
+
| **spatial** | subject framing — centered/tight enough, not lost in dead space, not occluded by captions |
|
|
82
|
+
| **brand** | on-brand color/typography/voice; cohesive look |
|
|
83
|
+
| **caption** | caption legibility, timing, placement (or `no_captions` when absent) |
|
|
84
|
+
|
|
85
|
+
You get **scores and the critique, never the rubric** — the taste is CueFrame's.
|
|
86
|
+
Pass `editorialIntent` (your brief/hook) so editorial is graded against what you
|
|
87
|
+
meant.
|
|
88
|
+
|
|
89
|
+
## 4. Fix the worst — then re-score
|
|
90
|
+
|
|
91
|
+
Read `critique` — it names the lowest criterion first and says why. Fix **that one
|
|
92
|
+
thing** (re-author the relevant ops), then score again. One criterion per pass:
|
|
93
|
+
chasing all four at once thrashes. Example: editorial 4 "two subjects off-center
|
|
94
|
+
vs centered intent" → tighten the reframe onto face-0 → re-score. A layout critique
|
|
95
|
+
("cramped", "unbalanced", "text crowds the art") on a component built with
|
|
96
|
+
`FlexLayout` is a `tracks` weight or `fits` change — re-author those and re-solve; never
|
|
97
|
+
nudge pixels (see `cueframe-component-authoring`).
|
|
98
|
+
|
|
99
|
+
## 5. Stop — then render
|
|
100
|
+
|
|
101
|
+
For a whole-film review, use **composite ≥ ~7.5** as a guide alongside the brief's actual
|
|
102
|
+
acceptance criteria. Two no-improvement passes are a reason to stop spending and report what
|
|
103
|
+
remains, not to declare a rejected result approved. Render with `create_render` only when a
|
|
104
|
+
finished video is requested or the work reaches final delivery. A scoped revision can end with
|
|
105
|
+
verified preview evidence and an explicit note that no new final export was made.
|
|
106
|
+
|
|
107
|
+
## Notes
|
|
108
|
+
|
|
109
|
+
- **Whose tokens:** you run this loop on your own model/tokens; CueFrame bills the
|
|
110
|
+
infra (capture/render) + the judge. That's the point — you keep the orchestration.
|
|
111
|
+
- **Don't re-derive the judge or beat sampling** — verify owns both. Your job is
|
|
112
|
+
author → read scores → fix worst → repeat.
|
|
113
|
+
- **Budget the loop:** 3–5 scoring passes is plenty for most clips. If composite
|
|
114
|
+
won't climb, the limiter is usually the source or the intent, not more passes.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "CueFrame — Compose convergence loop"
|
|
3
|
+
short_description: "Use when an AI agent should DRIVE CueFrame to a high-quality clip itself…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $cueframe-compose-loop when an AI agent should DRIVE CueFrame to a high-quality clip itself — author a composition, look at rendered frames, score it with CueFrame's judge, fix the weakest thing, and repeat until it's good — e.g. \"turn this source into a polished 9:16 clip\", \"compose and self-correct until it scores well\"."
|
|
@@ -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,37 @@
|
|
|
1
|
+
# Preview, iteration, and delivery
|
|
2
|
+
|
|
3
|
+
Choose the evidence for the current request. A small revision is not a new-film workflow. Preserve the approved brief, timeline, and unaffected source; inspect the affected behavior and relevant regressions. Export when the user requests a finished video or the work reaches final delivery, not after every preview or parameter edit.
|
|
4
|
+
|
|
5
|
+
## Select the available lane
|
|
6
|
+
|
|
7
|
+
Read the current tool contracts and project context. Do not infer a hosted session from a local desktop tool, or require cloud registration for a local project.
|
|
8
|
+
|
|
9
|
+
| Need | Hosted evidence | Local desktop evidence, when exposed |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Isolated HTML card layout | `preview_card` with the card's HTML and tokens | Inspect the card in the local project |
|
|
12
|
+
| Authored component layout or motion | `preview_component`, with explicit dimensions, FPS, params, assets, and appropriate duration | `open_component_preview` → `update_component_preview` (exact-text edits); inspect playback and `render_component_preview_frame` at exact frames |
|
|
13
|
+
| Saved composition layout and overlap | `preview_frame`, batching the needed timestamps | The local composition preview/capture tools |
|
|
14
|
+
| Cuts, entrances, camera motion, or audio timing | `preview_clip` for the affected `[fromSec, toSec)` window, including its lead-in and settle | Play/seek the affected window; capture matching frames when needed |
|
|
15
|
+
| Finished deliverable | `create_render` and verify the resulting file | The project's export path and verification of its resulting file |
|
|
16
|
+
|
|
17
|
+
Hosted calls use `projectId` and the request shape declared by the live tool. `preview_component` returns a job ID: wait with `kind:"preview"`. `preview_frame` uses `kind:"preview_frame"`. `preview_clip` returns a render job: wait with `kind:"render"`, even though it is a preview. Reuse the returned job ID; do not submit duplicate jobs while waiting. Hosted evidence jobs do not require opening or warming a compose session.
|
|
18
|
+
|
|
19
|
+
The local component preview compiles replacement source revisions; it is not a promise of browser HMR or zero compilation work. `commit_component_preview` commits the inspected revision with a fresh project ETag. An isolated preview does not itself edit the saved timeline. Close the preview when finished if that tool is available.
|
|
20
|
+
|
|
21
|
+
## Bound the work without changing the animation
|
|
22
|
+
|
|
23
|
+
- Use a component's existing params for supported changes; update its source in place only when necessary. Do not create a new component ID for each tweak.
|
|
24
|
+
- `durationInFrames` sets the component's render duration; it is **not a generic trim window**. Shortening it can retime animations normalized over duration. Preserve production timing. Use a documented component-specific offset only if it preserves that timing, or use the saved composition's `preview_clip` window. `startFrame` is not a universal preview API parameter.
|
|
25
|
+
- Preserve FPS when judging motion. Choose resolution for the question: a low-resolution motion preview may establish timing but not typography, glass edges, or final-resolution shader quality. Use appropriate stills for those details.
|
|
26
|
+
- Batch related still timestamps. Build contact sheets from returned images for inspection; a grid is a presentation of sampled frames, not proof of continuous motion. Watch the critical window as well. Listen when the change affects sound.
|
|
27
|
+
- Scope output and compute are different: a short composition preview can still trigger preparation or an alpha bake on a cache miss. Inspect progress/receipts before diagnosing cost. Do not promise instant previews, cross-job cache hits, or that every requested still requires a full bake.
|
|
28
|
+
|
|
29
|
+
## Evidence and stopping
|
|
30
|
+
|
|
31
|
+
Keep component source revision/hash, params, asset bindings, dimensions, FPS, requested frames/window, and returned artifact/job identity together. For hosted composition parity, inspect `previewed.source`, composition ID, and ETag where provided. Source can change without changing the composition ETag. Unchanged pixels outside an edit's visible frame range do not by themselves prove a stale cache.
|
|
32
|
+
|
|
33
|
+
Compare affected frames and motion with the reference at matching timestamps. Keep isolated-component proof distinct from saved-composition proof and final-export proof. For a minor edit, stop once the requested behavior and relevant regressions are checked; report the preview and explicitly say if no new final export was made.
|
|
34
|
+
|
|
35
|
+
Use `score_composition` for broader editorial/brand review when useful and within budget. Do not require repeated whole-film judging to verify a known local correction. A judge score does not override a failed acceptance criterion or the user's visual feedback.
|
|
36
|
+
|
|
37
|
+
Check account balance and current quotes before metered hosted work. Record actual job charges separately for preview, judging, and final export; separate those from agent time/token cost and from infrastructure estimates. Compare workflows only after testing equivalent changes and evidence requirements. Existing previews should be exercised before proposing new infrastructure.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cueframe-connect
|
|
3
|
+
description: Use when CueFrame is not connected yet, the user asks how to connect or authenticate CueFrame, or another CueFrame skill is about to call a tool and needs the one-time setup path for Claude Code, Claude, ChatGPT, Cursor, Codex, VS Code, Windsurf, Zed, Antigravity CLI, Copilot CLI, or an x402 wallet.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Connect CueFrame
|
|
7
|
+
|
|
8
|
+
Connect only when the first CueFrame tool call is imminent. Setup is a short detour, not a phase;
|
|
9
|
+
resume the user's original task immediately afterward.
|
|
10
|
+
|
|
11
|
+
- **Claude Code:** offer to run
|
|
12
|
+
`claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — a browser
|
|
13
|
+
opens and the user clicks **Allow**. No API key.
|
|
14
|
+
- **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
|
|
15
|
+
`https://api.cueframe.ai/v1/mcp`.
|
|
16
|
+
- **Other agents (Cursor, Codex, VS Code, Windsurf, Zed, Antigravity CLI, Copilot CLI, …):**
|
|
17
|
+
run `npx -y cueframe@0.5 install` — it detects what is on the machine and wires each one.
|
|
18
|
+
- **ChatGPT:** the CLI cannot wire it because there is no local config to write; add
|
|
19
|
+
`https://api.cueframe.ai/v1/mcp` as a custom connector instead.
|
|
20
|
+
- **No account (pay per call):** connect
|
|
21
|
+
`https://api.cueframe.ai/v1/mcp/x402` — no sign-up or API key; priced calls settle
|
|
22
|
+
per call in USDC over x402 from the agent's wallet.
|
|
23
|
+
|
|
24
|
+
Do not ask the user to configure a model provider for CueFrame. This connection exposes CueFrame's
|
|
25
|
+
tools; the host agent keeps using its already-selected CueFrame Gateway, BYOK, or local model.
|
|
26
|
+
|
|
27
|
+
## Then confirm it works, before you plan anything
|
|
28
|
+
|
|
29
|
+
Connected is not the same as working, and finding out at the first *paid* call is the expensive
|
|
30
|
+
way. Two free read-only calls prove the whole path:
|
|
31
|
+
|
|
32
|
+
1. **Discover the surface.** List the tools your host now exposes. You should see the compose loop
|
|
33
|
+
(`new_composition`, `apply_composition`, `validate_composition`, `create_render`) alongside
|
|
34
|
+
discovery reads (`list_catalog`, `list_media`, `get_account`). There are also resources
|
|
35
|
+
(`cueframe://scene-shot` for 3D product shots) and workflow prompts — a flat tool list is not
|
|
36
|
+
the whole surface.
|
|
37
|
+
2. **Smoke-call `get_account`.** It takes no arguments, costs nothing, and answers the questions
|
|
38
|
+
worth knowing before you spend: which org the key is bound to, the plan, per-feature
|
|
39
|
+
entitlements and — the one that matters — `balance`, not `included`. CueFrame is credit-funded,
|
|
40
|
+
so rendering, generation, preview stills, the judge and the Director all draw on ONE shared
|
|
41
|
+
wallet. If `get_account` returns, authentication, routing and scope are all proven.
|
|
42
|
+
|
|
43
|
+
If a later call fails on scope, the error names the exact missing permission (for example
|
|
44
|
+
`billing:read`, which `get_usage` needs and a creative-only key will not have). Mint a key with
|
|
45
|
+
that scope rather than guessing at the surface.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Connect CueFrame"
|
|
3
|
+
short_description: "Use when CueFrame is not connected yet, the user asks how to connect or…"
|
|
4
|
+
icon_small: "./assets/icon.svg"
|
|
5
|
+
icon_large: "./assets/icon.svg"
|
|
6
|
+
default_prompt: "Use $cueframe-connect when CueFrame is not connected yet, the user asks how to connect or authenticate CueFrame, or another CueFrame skill is about to call a tool and needs the one-time setup path for Claude Code, Claude, ChatGPT, Cursor, Codex, VS Code, Windsurf, Zed, Antigravity CLI, Copilot CLI, or an x402 wallet."
|
|
@@ -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>
|