@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.
Files changed (80) hide show
  1. package/.agents/plugins/marketplace.json +12 -0
  2. package/.claude-plugin/marketplace.json +6 -0
  3. package/.claude-plugin/plugin.json +15 -0
  4. package/.codex-plugin/plugin.json +30 -0
  5. package/.cursor-plugin/plugin.json +1 -0
  6. package/.mcp.json +1 -0
  7. package/AGENTS.md +20 -0
  8. package/LICENSE +202 -0
  9. package/NOTICE +4 -0
  10. package/README.md +111 -0
  11. package/assets/icon.svg +16 -0
  12. package/assets/logo-400.png +0 -0
  13. package/gemini-extension.json +1 -0
  14. package/glama.json +1 -0
  15. package/hooks/hooks.json +7 -0
  16. package/hooks/session-inject.md +15 -0
  17. package/hooks/session-start.sh +6 -0
  18. package/llms-install.md +47 -0
  19. package/mcp.json +1 -0
  20. package/package.json +57 -0
  21. package/plugin.json +46 -0
  22. package/rules/cueframe.mdc +19 -0
  23. package/skills/add-music-bed/SKILL.md +100 -0
  24. package/skills/add-music-bed/agents/openai.yaml +6 -0
  25. package/skills/add-music-bed/assets/icon.svg +16 -0
  26. package/skills/brand-reel/SKILL.md +100 -0
  27. package/skills/brand-reel/agents/openai.yaml +6 -0
  28. package/skills/brand-reel/assets/icon.svg +16 -0
  29. package/skills/clip-a-talking-head/SKILL.md +101 -0
  30. package/skills/clip-a-talking-head/agents/openai.yaml +6 -0
  31. package/skills/clip-a-talking-head/assets/icon.svg +16 -0
  32. package/skills/composing-video/SKILL.md +702 -0
  33. package/skills/composing-video/agents/openai.yaml +6 -0
  34. package/skills/composing-video/assets/icon.svg +16 -0
  35. package/skills/cueframe-brand-demo/SKILL.md +257 -0
  36. package/skills/cueframe-brand-demo/agents/openai.yaml +6 -0
  37. package/skills/cueframe-brand-demo/assets/icon.svg +16 -0
  38. package/skills/cueframe-cli/SKILL.md +265 -0
  39. package/skills/cueframe-cli/agents/openai.yaml +6 -0
  40. package/skills/cueframe-cli/assets/icon.svg +16 -0
  41. package/skills/cueframe-component-authoring/SKILL.md +179 -0
  42. package/skills/cueframe-component-authoring/agents/openai.yaml +6 -0
  43. package/skills/cueframe-component-authoring/assets/icon.svg +16 -0
  44. package/skills/cueframe-compose-loop/SKILL.md +114 -0
  45. package/skills/cueframe-compose-loop/agents/openai.yaml +6 -0
  46. package/skills/cueframe-compose-loop/assets/icon.svg +16 -0
  47. package/skills/cueframe-compose-loop/references/preview-workflow.md +37 -0
  48. package/skills/cueframe-connect/SKILL.md +45 -0
  49. package/skills/cueframe-connect/agents/openai.yaml +6 -0
  50. package/skills/cueframe-connect/assets/icon.svg +16 -0
  51. package/skills/cueframe-product-video/SKILL.md +293 -0
  52. package/skills/cueframe-product-video/agents/openai.yaml +6 -0
  53. package/skills/cueframe-product-video/assets/icon.svg +16 -0
  54. package/skills/cueframe-scene-shot/SKILL.md +68 -0
  55. package/skills/cueframe-scene-shot/agents/openai.yaml +6 -0
  56. package/skills/cueframe-scene-shot/assets/icon.svg +16 -0
  57. package/skills/cueframe-storyboard/SKILL.md +104 -0
  58. package/skills/cueframe-storyboard/agents/openai.yaml +6 -0
  59. package/skills/cueframe-storyboard/assets/icon.svg +16 -0
  60. package/skills/every-format-from-one-edit/SKILL.md +87 -0
  61. package/skills/every-format-from-one-edit/agents/openai.yaml +6 -0
  62. package/skills/every-format-from-one-edit/assets/icon.svg +16 -0
  63. package/skills/extracting-brand-kits/SKILL.md +159 -0
  64. package/skills/extracting-brand-kits/agents/openai.yaml +6 -0
  65. package/skills/extracting-brand-kits/assets/icon.svg +16 -0
  66. package/skills/launch-video/SKILL.md +93 -0
  67. package/skills/launch-video/agents/openai.yaml +6 -0
  68. package/skills/launch-video/assets/icon.svg +16 -0
  69. package/skills/make-a-social-reel/SKILL.md +105 -0
  70. package/skills/make-a-social-reel/agents/openai.yaml +6 -0
  71. package/skills/make-a-social-reel/assets/icon.svg +16 -0
  72. package/skills/rebrand-a-video/SKILL.md +95 -0
  73. package/skills/rebrand-a-video/agents/openai.yaml +6 -0
  74. package/skills/rebrand-a-video/assets/icon.svg +16 -0
  75. package/skills/video-craft-standards/SKILL.md +128 -0
  76. package/skills/video-craft-standards/agents/openai.yaml +6 -0
  77. package/skills/video-craft-standards/assets/icon.svg +16 -0
  78. package/skills-dir.d.ts +1 -0
  79. package/skills-dir.js +2 -0
  80. 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>