cueframe 0.9.4 → 0.11.3

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 (51) hide show
  1. package/README.md +39 -30
  2. package/dist/analyze-C3MSCON6.js +2 -0
  3. package/dist/chunk-OAJBHFAJ.js +18 -0
  4. package/dist/cueframe.js +55 -54
  5. package/dist/skills/add-music-bed/SKILL.md +5 -23
  6. package/dist/skills/brand-reel/SKILL.md +5 -28
  7. package/dist/skills/clip-a-talking-head/SKILL.md +2 -20
  8. package/dist/skills/composing-video/SKILL.md +36 -424
  9. package/dist/skills/composing-video/references/acceptance-template.md +21 -0
  10. package/dist/skills/composing-video/references/audio-design.md +125 -0
  11. package/dist/skills/composing-video/references/card-and-motion-runtime.md +49 -0
  12. package/dist/skills/composing-video/references/craft-principles.md +25 -0
  13. package/dist/skills/composing-video/references/film-planning.md +37 -0
  14. package/dist/skills/composing-video/references/format-decisions.md +17 -0
  15. package/dist/skills/composing-video/references/format-playbooks.md +96 -0
  16. package/dist/skills/composing-video/references/motion-design.md +25 -0
  17. package/dist/skills/composing-video/references/project-policy.md +18 -0
  18. package/dist/skills/composing-video/references/sfx-pack.md +69 -0
  19. package/dist/skills/composing-video/references/sound-and-timing.md +15 -0
  20. package/dist/skills/composing-video/references/tool-map.md +43 -0
  21. package/dist/skills/cueframe-brand-demo/SKILL.md +2 -8
  22. package/dist/skills/cueframe-cli/SKILL.md +73 -59
  23. package/dist/skills/cueframe-component-authoring/SKILL.md +20 -169
  24. package/dist/skills/cueframe-component-authoring/references/authoring-paths.md +72 -0
  25. package/dist/skills/cueframe-component-authoring/references/forking-and-layout.md +35 -0
  26. package/dist/skills/cueframe-component-authoring/references/native-component-workflows.md +98 -0
  27. package/dist/skills/cueframe-component-authoring/references/native-source-contract.md +54 -0
  28. package/dist/skills/cueframe-component-authoring/references/parented-device-card.json +13 -0
  29. package/dist/skills/cueframe-component-authoring/references/parented-motion.md +25 -0
  30. package/dist/skills/cueframe-component-authoring/references/retired-projects.md +26 -0
  31. package/dist/skills/cueframe-compose-loop/SKILL.md +14 -112
  32. package/dist/skills/cueframe-compose-loop/references/convergence-loop.md +128 -0
  33. package/dist/skills/cueframe-compose-loop/references/preview-workflow.md +7 -3
  34. package/dist/skills/cueframe-connect/SKILL.md +4 -9
  35. package/dist/skills/cueframe-connect/references/tools.md +146 -0
  36. package/dist/skills/cueframe-product-video/SKILL.md +9 -14
  37. package/dist/skills/cueframe-reference-video/SKILL.md +30 -0
  38. package/dist/skills/cueframe-reference-video/references/measurement-and-comparison.md +45 -0
  39. package/dist/skills/cueframe-reference-video/scripts/motion-grid.sh +116 -0
  40. package/dist/skills/cueframe-scene-shot/SKILL.md +2 -8
  41. package/dist/skills/cueframe-storyboard/SKILL.md +1 -7
  42. package/dist/skills/every-format-from-one-edit/SKILL.md +3 -19
  43. package/dist/skills/extracting-brand-kits/SKILL.md +1 -7
  44. package/dist/skills/launch-video/SKILL.md +6 -26
  45. package/dist/skills/make-a-social-reel/SKILL.md +7 -26
  46. package/dist/skills/rebrand-a-video/SKILL.md +2 -19
  47. package/dist/skills/video-craft-standards/SKILL.md +20 -103
  48. package/dist/skills/video-craft-standards/references/format-standards.md +118 -0
  49. package/package.json +12 -11
  50. package/dist/analyze-XP2BESVX.js +0 -2
  51. package/dist/chunk-RSOHINDT.js +0 -18
@@ -5,13 +5,7 @@ description: Use when editing, clipping, or rendering video via the CueFrame CLI
5
5
 
6
6
  # CueFrame CLI
7
7
 
8
- ## Scope and capability policy
9
-
10
- User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
11
-
12
- Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
13
-
14
- For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
8
+ Use the [project and capability policy](../composing-video/references/project-policy.md) for scope, current state and metered work.
15
9
 
16
10
  ## MCP is the primary surface — read this before using the CLI
17
11
 
@@ -31,11 +25,11 @@ both MCP and this CLI exist so you do not have to.
31
25
 
32
26
  ## Overview
33
27
 
34
- The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `npx -y cueframe@0.9 describe --json`.
28
+ The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `npx -y cueframe@0.11 describe --json`.
35
29
 
36
- **Run it as `npx -y cueframe@0.9 …` — every command in this skill is written that way, and
30
+ **Run it as `npx -y cueframe@0.11 …` — every command in this skill is written that way, and
37
31
  that form is executable verbatim.** There is no `cueframe` on your PATH unless you put it
38
- there: `npx -y cueframe@0.9 install` wires the MCP server and drops these skills, but npx
32
+ there: `npx -y cueframe@0.11 install` wires the MCP server and drops these skills, but npx
39
33
  unpacks to an ephemeral cache, so it installs no binary. `npx` re-resolves the current
40
34
  version on each call (~0.5s warm, ~5s cold), which also means these commands never go
41
35
  stale. If you are running many in a row and want to skip that, `npm i -g cueframe` once
@@ -46,9 +40,9 @@ the documented path.
46
40
  **The framework is three verbs:** `upload` (register media) → `composition put` (author the timeline) → `render` (→ MP4). The `Composition` is the contract — render takes the saved composition, nothing else. Everything domain-specific (AI clip suggestions, FCPXML/Premiere export) is a **use-case on-ramp** layered on top, not part of the core.
47
41
 
48
42
  **Core principle — discover, don't guess.** Never author a composition from the
49
- examples below alone. The live contract is `npx -y cueframe@0.9 schema composition` (prints
43
+ examples below alone. The live contract is `npx -y cueframe@0.11 schema composition` (prints
50
44
  the real wire schema the server enforces); confirm any draft with
51
- `npx -y cueframe@0.9 composition validate -b @file.json` BEFORE you render. Validation is
45
+ `npx -y cueframe@0.11 composition validate -b @file.json` BEFORE you render. Validation is
52
46
  free and instant; a render is neither. The examples here are orientation — the
53
47
  schema is the source of truth.
54
48
 
@@ -65,44 +59,62 @@ Validate first, then use `preview_card` / `preview_component` for isolated graph
65
59
  MCP tools or the CLI's `api` escape hatch with the live request contract. Full `render` is for
66
60
  delivery, not checking each edit. CLI validation does not replace visual evidence.
67
61
 
62
+ To compare a certified reference frame with an existing saved preview, use `compare`:
63
+
64
+ ```bash
65
+ npx -y cueframe@0.11 compare <projectId> --reference-media <mediaId> --reference-representation <identity> --reference-frame 117 --candidate-job <jobId> --candidate-artifact <artifactId> --out ./comparison --json
66
+ ```
67
+
68
+ The command calls the shared comparison operation; it does not rerender the composition. `--views overlay,difference` selects diagnostics and `--crop x,y,width,height` uses one common-coordinate crop. NDJSON contains source identities and image receipts, never base64 payloads. `--out` saves verified PNGs; without it, image receipts explicitly say `metadata_only`. Inspect those images and relevant motion before judging the film.
69
+
68
70
  ```bash
69
71
  # 0. Always use --json for agent-driven runs (NDJSON to stdout, no spinners).
70
72
  # Commands run against production; auth is stored in ~/.cueframe/auth.json.
71
73
 
72
74
  # 1. Register media (one or many — mixed video / image / audio).
73
- npx -y cueframe@0.9 upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
75
+ npx -y cueframe@0.11 upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
74
76
 
75
77
  # 2. Create a project (sets aspect/format).
76
- npx -y cueframe@0.9 project create -n "promo" -a 9:16 --json # → projectId
78
+ npx -y cueframe@0.11 project create -n "promo" -a 9:16 --json # → projectId
77
79
 
78
80
  # 3. Author the composition: tracks of clips (per-clip reframe/trim), optional
79
81
  # captions (captions.segments), brandKitId. The composition is the SSOT.
80
82
  # Discover the live schema, then validate the draft BEFORE saving/rendering:
81
- npx -y cueframe@0.9 schema composition # → live wire schema
82
- npx -y cueframe@0.9 composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
83
- npx -y cueframe@0.9 composition put <projectId> -b @composition.json # ETag auto
83
+ npx -y cueframe@0.11 schema composition # → live wire schema
84
+ npx -y cueframe@0.11 composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
85
+ npx -y cueframe@0.11 composition get <projectId> --json # → etag (not found = no composition yet)
86
+ npx -y cueframe@0.11 composition put <projectId> -b @composition.json --if-match <etag>
87
+ # --if-match is required: a save made since your `get` fails with 409 stale_etag
88
+ # instead of being overwritten. Re-`get`, re-apply your edit, retry. Use --create
89
+ # only for the first composition of a project (refused 409 if one exists).
84
90
 
85
91
  # 4. Render the saved composition to MP4. SSE-watches + downloads when done.
86
- npx -y cueframe@0.9 render <projectId> -o ./out.mp4 --json
92
+ npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
87
93
  # → render_queued → render_progress* → render_complete
88
94
  #
89
95
  # `render` takes ONLY a projectId and renders the SAVED composition (tracks +
90
- # captions). A clip suggestion is NOT required. Same project → same MP4 (idempotent).
96
+ # captions). A clip suggestion is NOT required. Re-running the same command on an
97
+ # unchanged composition replays the same render (the Idempotency-Key hashes the
98
+ # project, the composition ETag and the request: --aspect/--fps/--resolution/
99
+ # --priority/--intent); editing the composition or changing a flag starts a new one.
100
+ # Without --aspect it renders the composition's own format. --aspect must match the
101
+ # composition's aspect (a new aspect is a `derive_composition`, not a render flag);
102
+ # pass it with --resolution hd|fhd|4k to change only the output resolution.
91
103
  # Captions: render reads composition.captions — put caption words there to caption
92
104
  # a hand-authored composition; if absent, the clip is rendered without captions.
93
105
 
94
106
  # Reattach to an in-flight render later (e.g. after disconnect):
95
- npx -y cueframe@0.9 render watch <renderId> -p <projectId> -o ./out.mp4 --json
107
+ npx -y cueframe@0.11 render watch <renderId> -p <projectId> -o ./out.mp4 --json
96
108
  ```
97
109
 
98
110
  ## Anatomy of a composition.json
99
111
 
100
112
  This section orients you to the shape; the authoritative contract is
101
- `npx -y cueframe@0.9 schema composition` (the live wire schema) — run it when a field is
102
- unclear, and `npx -y cueframe@0.9 composition validate -b @file.json` to check a draft.
113
+ `npx -y cueframe@0.11 schema composition` (the live wire schema) — run it when a field is
114
+ unclear, and `npx -y cueframe@0.11 composition validate -b @file.json` to check a draft.
103
115
 
104
- `composition put` takes the **bare** `Composition` object (no wrapper; the CLI POSTs
105
- the `@file` verbatim and handles the ETag). Minimal valid shape:
116
+ `composition put` takes the **bare** `Composition` object (no wrapper; the CLI PUTs
117
+ the `@file` verbatim with your `--if-match` ETag). Minimal valid shape:
106
118
 
107
119
  ```json
108
120
  {
@@ -166,18 +178,18 @@ the composition yourself (above).
166
178
 
167
179
  ```bash
168
180
  # 1. Upload + chain the AI clip pass.
169
- npx -y cueframe@0.9 upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
170
- # (or run it explicitly: npx -y cueframe@0.9 analyze <mediaItemId> --wait --json)
181
+ npx -y cueframe@0.11 upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
182
+ # (or run it explicitly: npx -y cueframe@0.11 analyze <mediaItemId> --wait --json)
171
183
 
172
184
  # 2. List clip suggestions (publicId sug_…, title, startMs/endMs, score).
173
- npx -y cueframe@0.9 clips <mediaItemId> --json
185
+ npx -y cueframe@0.11 clips <mediaItemId> --json
174
186
 
175
187
  # 3. Create a project AND author its composition from the chosen suggestion.
176
- npx -y cueframe@0.9 project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
177
- # (or, on an existing project: npx -y cueframe@0.9 composition from-suggestion <projectId> -s <sug_…>)
188
+ npx -y cueframe@0.11 project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
189
+ # (or, on an existing project: npx -y cueframe@0.11 composition from-suggestion <projectId> -s <sug_…>)
178
190
 
179
191
  # 4. Render — same framework verb as above.
180
- npx -y cueframe@0.9 render <projectId> -o ./out.mp4 --json
192
+ npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
181
193
  ```
182
194
 
183
195
  Both flows converge on `composition put` → `render`; the on-ramp just authors the
@@ -185,59 +197,61 @@ composition from a suggestion instead of you hand-writing it.
185
197
 
186
198
  Pipe `--json` output through `jq -c 'select(.event=="…")'` to grab specific lifecycle events.
187
199
 
188
- ## Component authoring — fork a built-in primitive or scaffold your own
200
+ ## Component authoring: scaffold your own
189
201
 
190
- Own the motion-graphics components you render (shadcn-style): fork a built-in CueFrame
191
- primitive as editable source, customize it, and render it on CueFrame — or scaffold a blank
192
- one. The source lives in your repo under version control; CueFrame bakes it to a transparent
193
- video and composites it (the shared renderer never runs your code).
202
+ Own the motion-graphics components you render (shadcn-style): scaffold a native component as
203
+ editable source, customize it, and render it on CueFrame. The source lives in your repo under
204
+ version control; CueFrame bakes it to a transparent video and composites it (the shared
205
+ renderer never runs your code). The CLI does not fork built-ins: the maintained builtin
206
+ presets and recipes are placed as they are (list them with `list_catalog`
207
+ projection `component-library`).
194
208
 
195
209
  ```bash
196
210
  # 1. Scaffold a workspace (writes cueframe.json + cueframe/components/). Idempotent.
197
- npx -y cueframe@0.9 init --json
211
+ npx -y cueframe@0.11 init --json
198
212
 
199
213
  # 2a. Scaffold a component in cueframe/components/<id>/ as owned, editable source.
200
- npx -y cueframe@0.9 new component my-badge --category ui-blocks --json
214
+ npx -y cueframe@0.11 new component my-badge --category ui-blocks --json
201
215
 
202
216
  # The scaffold is a native (version 4) source: template.html + definition.json, with its
203
- # manifest in cueframe.json. Built-in forks copy the exact template, definition and manifest.
217
+ # manifest in cueframe.json.
204
218
 
205
219
  # 3. Edit cueframe/components/<id>/template.html (one HyperFrames sub-composition ending in
206
220
  # __cfScene.mount(...)) and definition.json (inputs, defaults, timing, capabilities).
207
221
 
208
222
  # 4. Publish to CueFrame so it can render (the server admits the source or names the rule it breaks).
209
- npx -y cueframe@0.9 push my-badge --json # one component
210
- npx -y cueframe@0.9 sync --json # every component in the workspace
223
+ npx -y cueframe@0.11 push my-badge --json # one component
224
+ npx -y cueframe@0.11 sync --json # every component in the workspace
211
225
 
212
226
  # 5. Reference the component id in your composition as a {kind:'component', componentId, props}
213
227
  # clip, then render with the same verb. Preview a single component first via the MCP
214
228
  # preview_component loop.
215
- npx -y cueframe@0.9 render <projectId> -o ./out.mp4 --json
229
+ npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
216
230
  ```
217
231
 
218
232
  ## Quick reference
219
233
 
220
234
  | Need to… | Command |
221
235
  |---|---|
222
- | See every command + flags | `npx -y cueframe@0.9 describe --json` |
223
- | Install/refresh managed skills | `npx -y cueframe@0.9 install` (shared `~/.agents/skills` and Claude `~/.claude/skills`; locally changed or untracked packages are preserved and reported) |
224
- | List projects | `npx -y cueframe@0.9 list -n 50` |
225
- | List your media | `npx -y cueframe@0.9 clips` (no mediaId arg) |
226
- | Discover the live composition schema | `npx -y cueframe@0.9 schema composition` |
227
- | Validate a draft (no save, no render) | `npx -y cueframe@0.9 composition validate -b @plan.json` |
228
- | Read composition + ETag | `npx -y cueframe@0.9 composition get <projectId> --json` |
229
- | Write composition | `npx -y cueframe@0.9 composition put <projectId> -b @plan.json` (ETag auto) |
230
- | Export to Final Cut | `npx -y cueframe@0.9 export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
231
- | Export to Premiere | `npx -y cueframe@0.9 export premiere <projectId> -s <sug> --wait -o cut.zip` |
232
- | Anything not wrapped | `npx -y cueframe@0.9 api GET /v1/... -i` (escape hatch, like `gh api`) |
233
- | Validate a composition without mutating | `npx -y cueframe@0.9 composition validate -b @plan.json` |
236
+ | See every command + flags | `npx -y cueframe@0.11 describe --json` |
237
+ | Install/refresh managed skills | `npx -y cueframe@0.11 install` (shared `~/.agents/skills` and Claude `~/.claude/skills`; locally changed or untracked packages are preserved and reported) |
238
+ | List projects | `npx -y cueframe@0.11 list -n 50` |
239
+ | List your media | `npx -y cueframe@0.11 clips` (no mediaId arg) |
240
+ | Discover the live composition schema | `npx -y cueframe@0.11 schema composition` |
241
+ | Validate a draft (no save, no render) | `npx -y cueframe@0.11 composition validate -b @plan.json` |
242
+ | Read composition + ETag | `npx -y cueframe@0.11 composition get <projectId> --json` |
243
+ | Write composition | `npx -y cueframe@0.11 composition put <projectId> -b @plan.json --if-match <etag>` (`--create` for the first composition) |
244
+ | Export to Final Cut | `npx -y cueframe@0.11 export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
245
+ | Export to Premiere | `npx -y cueframe@0.11 export premiere <projectId> -s <sug> --wait -o cut.zip` |
246
+ | Anything not wrapped | `npx -y cueframe@0.11 api GET /v1/... -i` (escape hatch, like `gh api`) |
247
+ | Validate a composition without mutating | `npx -y cueframe@0.11 composition validate -b @plan.json` |
234
248
 
235
249
  ## Auth
236
250
 
237
251
  Commands run against production. Authenticate once:
238
252
 
239
- - `npx -y cueframe@0.9 login` — OAuth device flow (laptops).
240
- - `npx -y cueframe@0.9 auth <cf_live_… key>` — save a static API key (CI / headless).
253
+ - `npx -y cueframe@0.11 login` — OAuth device flow (laptops).
254
+ - `npx -y cueframe@0.11 auth <cf_live_… key>` — save a static API key (CI / headless).
241
255
 
242
256
  Creds are stored in `~/.cueframe/auth.json`; the key can also come from the `CUEFRAME_API_KEY` env var.
243
257
 
@@ -255,11 +269,11 @@ Errors come as `{"event":"error", "phase":"<step>", "message":"...", "code":"...
255
269
 
256
270
  | Mistake | Reality |
257
271
  |---|---|
258
- | Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.9 api METHOD /v1/...` — same auth, same JSON pipeline. |
259
- | Polling for render completion with a sleep loop | `npx -y cueframe@0.9 render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
272
+ | Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.11 api METHOD /v1/...` — same auth, same JSON pipeline. |
273
+ | Polling for render completion with a sleep loop | `npx -y cueframe@0.11 render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
260
274
  | Skipping `--json` and trying to parse human output | Human output is for humans. Agents always use `--json`. |
261
- | Hand-editing the composition without an ETag | `composition put` GETs the ETag for you; `from-suggestion` rebuilds from a clip. Don't hand-craft unless you have to. |
262
- | Calling `npx -y cueframe@0.9 render <projectId> <suggestionId>` (old two-positional shape) | `render` takes ONLY a projectId; commander rejects the extra arg. It renders the SAVED composition — author it first via `composition put` (hand-author) or `project create --from-suggestion <sug>` (clip-finder on-ramp). |
275
+ | Hand-editing the composition without an ETag | `composition put` refuses without `--if-match <etag>` from the `composition get` your edit started from. Don't fetch a fresh ETag right before the put: that overwrites anyone who saved in between. `--create` is only for a project's first composition; there is no unconditional overwrite. |
276
+ | Calling `npx -y cueframe@0.11 render <projectId> <suggestionId>` (old two-positional shape) | `render` takes ONLY a projectId; commander rejects the extra arg. It renders the SAVED composition — author it first via `composition put` (hand-author) or `project create --from-suggestion <sug>` (clip-finder on-ramp). |
263
277
  | Assuming `render` needs a clip suggestion / that captions only come from a suggestion | No — `render` renders the saved composition directly; a suggestion is optional. Captions come from `composition.captions` (author them in the `put` JSON). The clip-suggestion on-ramp just fills those captions for you by slicing the transcript at author time. |
264
278
 
265
279
  ## When this skill applies (routing)
@@ -1,187 +1,38 @@
1
1
  ---
2
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 using complete versioned source snapshots. Use BEFORE hand-writing a component from scratch — forking a built-in is usually the faster start.
3
+ description: "Use when authoring, forking or customizing CueFrame HTML cards, motion-graphics primitives or reusable native components, including a fork of an exact catalog source. Covers cloud MCP, local desktop and CLI project paths using complete versioned source snapshots. For scene-shot devices and cameras use cueframe-scene-shot. Triggers on \"customize the parallax look\", \"make my own animated lower-third\", \"fork a CueFrame template and edit it\", \"author a custom graphic and render it\". Use before hand-writing a component from scratch: forking a built-in is usually the faster start."
4
4
  ---
5
5
 
6
- # CueFrame component authoring (fork / customize / own)
6
+ # CueFrame graphic authoring
7
7
 
8
- ## Scope and capability policy
8
+ Use the [project and capability policy](../composing-video/references/project-policy.md). Preserve the current project and source identities; make the intended visual behavior inspectable and editable.
9
9
 
10
- User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
10
+ ## Choose the representation
11
11
 
12
- Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
12
+ - **HTML card:** authored typography, UI, diagrams and 2D motion with deterministic CSS. It can depict perspective, but does not provide the scene renderer's physical camera, lighting or occlusion.
13
+ - **Whole-clip keyframes:** position, scale, rotation and opacity when the entire card or layer moves together. Read the current `clip.setKeyframes` schema; times are relative to the clip.
14
+ - **Scene shot:** supported groups, devices, pages, world text, surfaces and cameras. Use `cueframe-scene-shot` and its current schema; author JSON, not the generated wrapper.
15
+ - **Native component:** reusable version-4 media-tile scenes with declared inputs, assets and deterministic rendering. Discover a near-fit definition before writing one. Read the [native source contract](references/native-source-contract.md), then the applicable [MCP, CLI or desktop workflow](references/native-component-workflows.md). This is not an arbitrary browser application runtime.
13
16
 
14
- For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
17
+ A definition, preset and recipe are different catalog items. Preserve the selected item's exact scoped identity. A builtin source read needs `componentId`, `sourceVersionId` and `builtinCollection`; unavailable pins do not authorize a different source. Keep the complete template, manifest and definition when forking.
15
18
 
16
- Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
17
- to select hosted or local evidence and separate iteration from final delivery.
19
+ ## Cards: geometry, clock and controls
18
20
 
19
- CueFrame ships built-in motion-graphics definitions (titles, lower-thirds, captions,
20
- effects, transitions and layouts). Discover the current catalog; fork an exact definition, customize it,
21
- and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
22
- component code; CueFrame is the reliable engine that renders it.
21
+ A card source is `{kind:"card", html, tokens}`. Each token key `x` becomes the CSS property `--cf-x`; read `var(--cf-x)`. Keys have no leading dashes. Missing variables silently invalidate CSS, so inspect returned warnings and actual output. Use literal or supported whole-string brand references and do not overwrite reserved motion variables.
23
22
 
24
- **Before you hand-write 3D:** a device mockup or a screenshot floating in a lit 3D scene is a
25
- **scene shot** — validated JSON with `scene.add` / `scene.update`, not a component you author.
26
- See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
27
- you need behaviour the scene contract does not express.
23
+ The host injects a clip-local clock each frame: `--cf-frame`, `--cf-t` (seconds), `--cf-fps`, `--cf-duration` (frames), `--cf-progress`, `--cf-ease`, `--cf-enter` and `--cf-exit`. CSS animations, transitions and timers are not the render clock. The built-in entrance/exit ramps span up to 18 frames; use explicit event times when the brief needs other choreography.
28
24
 
29
- **Source format matters:**
30
- - New and changed components are native (source version 4): `{version:4, componentId, template,
31
- manifest, definition}`. `template` is one HyperFrames sub-composition whose script ends in one
32
- `__cfScene.mount(...)`; the manifest is `{version:4, runtime:'hyperframes', hfContract:1,
33
- kind:'scene', assets, graphics, alphaPolicy}`. The definition declares input schema, defaults,
34
- timing, brand/media bindings and capabilities. The server instructions' Component Contract has
35
- the full rules. Version-3 TSX sources are retired and refused as `component_source_retired`.
36
- - Neither renderer runs authored source in the editor process. Local and hosted execution
37
- use isolated render processes and exact immutable source revisions.
25
+ Use flex/grid for text and UI reflow, and coordinate-based nested transforms for spatial animation. Parent mounted contents to their object: a moving phone should carry its bezel, screen mask and controls. Use a separate local transform only when that part really moves relative to the object. The [parented motion recipe](references/parented-motion.md) includes a complete editable card with a shared pose and named pointer-contact/response times.
38
26
 
39
- ## Path A — MCP agent (no filesystem; source lives server-side)
27
+ Expose likely revisions as meaningful inputs rather than unrelated constants. A card's text token used by CSS `content` needs a quoted CSS string. Preserve the current token values when changing its HTML. The native component definition declares defaults and input controls; its placement binds media in `execution.assets`, separately from `params`.
40
28
 
41
- Use the live tool schema for request envelopes; hosted write fields are normally under `body`.
29
+ ## Iterate on the saved result
42
30
 
43
- 1. **Discover and read a built-in:** call `list_catalog` with
44
- `projection: "component-library", origin: "builtin", libraryKind: "definition"`.
45
- Select the intended card and preserve its complete scoped source reference. Call
46
- `get_component_source` with that reference's `componentId`, `sourceVersionId`,
47
- `builtinCollection` (its scope collection).
48
- ID-only builtin reads are unsupported. An unavailable exact pin is a refusal; never
49
- retry another scope or an unpinned head.
50
- 2. **Author/own it:** edit the complete native `sourceSnapshot`; use your chosen owned ID
51
- consistently in its `componentId` and the request. Send it as `body.source` to
52
- `create_component`, with required metadata. Preserve its definition, capability
53
- declarations, manifest and source format. For an existing component, keep its ID and
54
- use `update_component` with the complete source. Do not send an old pin as the identity
55
- of changed source: saving produces a new immutable source version.
56
- 3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
57
- preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
58
- verified artifact produced by the same bundle contract used by final render. A failed
59
- `component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
60
- (same id, in place), and preview again.
61
- **Repin only the requested scope:** for all matching placements in one composition, use
62
- `update_component({ componentId, body: { source: editedSnapshot, projectId, compositionId? } })`
63
- with the observed revision and dependency guards. A placed clip
64
- renders the exact version it pins; only the composition you name moves to the new version in the
65
- same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
66
- version, and `placementsPinnedToPrevious` counts them. For a single placement, update the
67
- source without `projectId`, then change only that clip to the returned exact source pin
68
- using the observed concurrency guards.
69
- Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
70
- duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
71
- 4. **Check integration:** add it as a `{kind:'component', componentId, props:{},
72
- execution:{version:4,componentId,sourceVersionId,params,seed,assets}, placement:{version:3,kind:'clip'}}` clip
73
- (`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
74
- placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
75
- finished MP4, not per tweak.
31
+ Keep the same owned component ID while updating its complete source. Saving creates a new immutable source version; existing placements keep their old pins unless explicitly repinned in the intended composition. An isolated preview is not a saved timeline edit. The workflow reference explains scoped repinning and local preview commits.
76
32
 
77
- ## Path B — CLI / coding agent (customer-owned source under git)
33
+ Use [cueframe-compose-loop](../cueframe-compose-loop/SKILL.md) for isolated, integrated and final evidence. Preserve production duration when previewing duration-dependent motion. Check the relationship that could fail, including screen corners, overlap, pointer contact and the complete ending, rather than only a pleasing middle still. For `needsUpgrade`, use [retired-source recovery](references/retired-projects.md) and replace only the reported clips.
78
34
 
79
- Source lives in `cueframe/components/<id>/` (the `cueframe.json` workspace); edit the native
80
- template locally, push to render.
35
+ ## Detailed guidance
81
36
 
82
- ```bash
83
- npx -y cueframe@0.9 init --json # scaffold cueframe.json + cueframe/components/
84
- npx -y cueframe@0.9 new component my-badge --category ui-blocks --json # scaffold a component in the workspace
85
- # New scaffolds contain template.html and definition.json (native source, version 4).
86
- # …edit cueframe/components/<id>/template.html and definition.json in your editor…
87
- npx -y cueframe@0.9 push my-badge --json # send the native source; the server admits it
88
- # or: npx -y cueframe@0.9 sync --json # push every component in the workspace
89
- # reference the component id in your composition, then render:
90
- npx -y cueframe@0.9 render <projectId> -o ./out.mp4 --json
91
- ```
92
-
93
- The CLI writes `template.html` and `definition.json` (input schema, defaults, timing and
94
- capabilities). `cueframe.json` → `components.<id>` holds the version-4 `manifest` and the catalog
95
- `name` and `category`, which `push` requires; it refuses a component missing either.
96
- `push`/`sync` send these as one native `source`, checked against the contract's source schema;
97
- the server's admission (template lint, determinism, declarations) refuses with a named rule.
98
- For a builtin fork, copy **all three parts** from the selected `sourceSnapshot`: template,
99
- definition and manifest. A workspace component that still has a version-3 `index.tsx` is
100
- refused as `component_source_retired` before any API call; author it again as a native template. To preview before
101
- a full render, push it and use the appropriate component preview loop.
102
-
103
- ## Path C — Director editing a local desktop project (project-embedded source)
104
-
105
- When `get_context` reports the project lane as local, motion does not need an account or an org
106
- component. Components here are native (source version 4) too:
107
- - **New component:** open a draft with `open_component_preview`, passing `template`,
108
- `component_manifest` (`{version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets,
109
- graphics, alphaPolicy}`) and `component_definition`.
110
- - **Existing component:** pass `component_id` instead, to start from the clip's pinned version or
111
- the library version.
112
-
113
- The draft is admitted in full: template lint, determinism and the variable declaration.
114
- `data-composition-variables` must equal the definition's projection (its scalar inputSchema
115
- properties, then the manifest's slots).
116
-
117
- Edit the draft with `update_component_preview` (exact-text `{oldText, newText, replaceAll?}`
118
- edits). Check exact frames with `render_component_preview_frame`, and inspect playback for motion.
119
- `commit_component_preview` publishes the checked source to the library and pins the clip, with a
120
- fresh ETag. `read_component` and `edit_component` read and edit the library directly. Close the
121
- preview when finished.
122
-
123
- Media slots are image or video, declared in `component_manifest.assets` and bound to project
124
- media ids in `component_assets`. The template passes them to `MediaTileScene` as
125
- `streams: { hero: { asset: assets.hero } }`. Declare `alphaPolicy` explicitly:
126
- `requires-transparency` for overlays, `allows-opaque` for full-frame plates.
127
-
128
- Every frame must be a pure function of `render.frame`, params and `render.seed`. Timers, `Date`,
129
- network, imports, other globals and CSS animation are refused at admission. The timeline and final
130
- export render the exact committed version. Use `create_component` only for a reusable org-catalog
131
- component on a reachable cloud lane.
132
-
133
- ## Upgrading an old project
134
-
135
- `get_composition` returns `needsUpgrade` only when clips from before the native cutover remain:
136
- `[{clipId, kind, componentId?, sourceVersionId?, primitiveId?, successorComponentId?,
137
- successorSourceVersionId?}]`. Saves and renders refuse those clips. A retired component is
138
- refused with `component_source_retired`, and a retired
139
- primitive with `render_unknown_primitive`. Upgrade only the listed clips. Keep every other clip,
140
- timing, track and brand-kit binding as it is.
141
-
142
- - **Any entry with a `successorSourceVersionId`:** call `repin_component` with its clip ids. It
143
- moves them to the native successor and keeps their saved inputs.
144
- - **`v3-component` with no successor** (a custom pre-cutover component): read its source, params,
145
- timing and placement, and author a native replacement with `create_component` as a version-4
146
- template following the server instructions' Component Contract.
147
- - **`unpinned-component`:** the clip carries a `retired` record (what was stored before the cutover), with its
148
- props preserved. Re-author it from those props the same way.
149
- - **`retired-primitive`:** rebuild what `primitiveId` drew from the clip's params, as a card or
150
- a native component.
151
-
152
- For each replacement, use `apply_composition` to replace only that clip at the same start,
153
- duration, track and placement, pinned to the new exact `sourceVersionId`. Map the old params
154
- onto the new inputs; do not invent new content. Verify each clip with `preview_frame` at a time
155
- inside its window and confirm `needsUpgrade` is gone. Only then render (`create_render`).
156
-
157
- ## Choosing what to fork
158
- Use the `component-library` projection to choose a definition, inspect its input schema and
159
- capabilities, then fetch its exact scoped source as described in Path A. Presets and recipes
160
- are different card kinds: follow their exact definition/document references rather than treating
161
- those IDs as source IDs. Inspect appropriate previews before judging visual behavior.
162
-
163
- ## Layout inside a component — CSS flex/grid
164
-
165
- When several cells must share space (a feature grid, a fixed rail beside fluid content, a cast of
166
- objects next to type), lay them out with CSS flex or grid in the HTML, not hand-placed pixels.
167
- Use the template of a native component, or a `card`:
168
-
169
- ```html
170
- <div style="display:grid; grid-template-columns: 520px 1fr 3fr; gap:16px; width:100%; height:100%">
171
- <div class="rail"></div><div class="type"></div><div class="art"></div>
172
- </div>
173
- ```
174
-
175
- - Fixed tracks (`520px`) hold content-sized cells. Fractions (`1fr`, `3fr`) share what is left.
176
- - Animate a reflow from the frame, never from time: in a card, drive `grid-template-columns`
177
- or `flex-basis` from `var(--cf-progress)` (or `--cf-enter`/`--cf-exit`); in a native template,
178
- derive it from `render.frame`.
179
- - Size the container to its region instead of CSS-`scale()`-ing the layout, which resamples.
180
- Use `object-fit` for media in a cell.
181
-
182
- ## Don't
183
- - Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
184
- `assets` and `render` bags for media and frame state.
185
- - When a built-in fits the request, fork its exact snapshot using Path A. Never discard its
186
- definition by copying only its template; preserve the definition and manifest too.
187
- - Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
37
+ - [Authoring paths](references/authoring-paths.md): the MCP path step by step, when no filesystem is available.
38
+ - [Forking and layout](references/forking-and-layout.md): what to fork, flex and grid inside a component, and what to avoid.
@@ -0,0 +1,72 @@
1
+ # Authoring paths
2
+
3
+ Defaults, examples and detail for this topic. The [skill](../SKILL.md) and the [project and capability policy](../../composing-video/references/project-policy.md) take precedence where they differ, and the current tool schemas are authoritative.
4
+
5
+ ## Scope and capability policy
6
+
7
+ User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
8
+
9
+ Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
10
+
11
+ For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../../cueframe-compose-loop/references/preview-workflow.md).
12
+
13
+ Use `cueframe-compose-loop`'s [preview workflow](../../cueframe-compose-loop/references/preview-workflow.md)
14
+ to select hosted or local evidence and separate iteration from final delivery.
15
+
16
+ CueFrame ships built-in motion-graphics definitions (titles, lower-thirds, captions,
17
+ effects, transitions and layouts). Discover the current catalog; fork an exact definition, customize it,
18
+ and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
19
+ component code; CueFrame is the reliable engine that renders it.
20
+
21
+ **Before you hand-write 3D:** a device mockup or a screenshot floating in a lit 3D scene is a
22
+ **scene shot** — validated JSON with `scene.add` / `scene.update`, not a component you author.
23
+ See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
24
+ you need behaviour the scene contract does not express.
25
+
26
+ **Source format matters:**
27
+ - New and changed components are native (source version 4): `{version:4, componentId, template,
28
+ manifest, definition}`. `template` is one HyperFrames sub-composition whose script ends in one
29
+ `__cfScene.mount(...)`; the manifest is `{version:4, runtime:'hyperframes', hfContract:1,
30
+ kind:'scene', assets, graphics, alphaPolicy}`. The definition declares input schema, defaults,
31
+ timing, brand/media bindings and capabilities. The server instructions' Component Contract has
32
+ the full rules. Version-3 TSX sources are retired and refused as `component_source_retired`.
33
+ - Neither renderer runs authored source in the editor process. Local and hosted execution
34
+ use isolated render processes and exact immutable source revisions.
35
+
36
+ ## Path A — MCP agent (no filesystem; source lives server-side)
37
+
38
+ Use the live tool schema for request envelopes; hosted write fields are normally under `body`.
39
+
40
+ 1. **Discover and read a built-in:** call `list_catalog` with
41
+ `projection: "component-library", origin: "builtin", libraryKind: "definition"`.
42
+ Select the intended card and preserve its complete scoped source reference. Call
43
+ `get_component_source` with that reference's `componentId`, `sourceVersionId`,
44
+ `builtinCollection` (its scope collection).
45
+ ID-only builtin reads are unsupported. An unavailable exact pin is a refusal; never
46
+ retry another scope or an unpinned head.
47
+ 2. **Author/own it:** edit the complete native `sourceSnapshot`; use your chosen owned ID
48
+ consistently in its `componentId` and the request. Send it as `body.source` to
49
+ `create_component`, with required metadata. Preserve its definition, capability
50
+ declarations, manifest and source format. For an existing component, keep its ID and
51
+ use `update_component` with the complete source. Do not send an old pin as the identity
52
+ of changed source: saving produces a new immutable source version.
53
+ 3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
54
+ preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
55
+ verified artifact produced by the same bundle contract used by final render. A failed
56
+ `component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
57
+ (same id, in place), and preview again.
58
+ **Repin only the requested scope:** for all matching placements in one composition, use
59
+ `update_component({ componentId, body: { source: editedSnapshot, projectId, compositionId? } })`
60
+ with the observed revision and dependency guards. A placed clip
61
+ renders the exact version it pins; only the composition you name moves to the new version in the
62
+ same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
63
+ version, and `placementsPinnedToPrevious` counts them. For a single placement, update the
64
+ source without `projectId`, then change only that clip to the returned exact source pin
65
+ using the observed concurrency guards.
66
+ Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
67
+ duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
68
+ 4. **Check integration:** add it as a `{kind:'component', componentId, props:{},
69
+ execution:{version:4,componentId,sourceVersionId,params,seed,assets}, placement:{version:3,kind:'clip'}}` clip
70
+ (`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
71
+ placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
72
+ finished MP4, not per tweak.
@@ -0,0 +1,35 @@
1
+ # Forking and layout
2
+
3
+ Defaults, examples and detail for this topic. The [skill](../SKILL.md) and the [project and capability policy](../../composing-video/references/project-policy.md) take precedence where they differ, and the current tool schemas are authoritative.
4
+
5
+ ## Choosing what to fork
6
+ Use the `component-library` projection to choose a definition, inspect its input schema and
7
+ capabilities, then fetch its exact scoped source as described in Path A. Presets and recipes
8
+ are different card kinds: follow their exact definition/document references rather than treating
9
+ those IDs as source IDs. Inspect appropriate previews before judging visual behavior.
10
+
11
+ ## Layout inside a component — CSS flex/grid
12
+
13
+ When several cells must share space (a feature grid, a fixed rail beside fluid content, a cast of
14
+ objects next to type), lay them out with CSS flex or grid in the HTML, not hand-placed pixels.
15
+ Use the template of a native component, or a `card`:
16
+
17
+ ```html
18
+ <div style="display:grid; grid-template-columns: 520px 1fr 3fr; gap:16px; width:100%; height:100%">
19
+ <div class="rail"></div><div class="type"></div><div class="art"></div>
20
+ </div>
21
+ ```
22
+
23
+ - Fixed tracks (`520px`) hold content-sized cells. Fractions (`1fr`, `3fr`) share what is left.
24
+ - Animate a reflow from the frame, never from time: in a card, drive `grid-template-columns`
25
+ or `flex-basis` from `var(--cf-progress)` (or `--cf-enter`/`--cf-exit`); in a native template,
26
+ derive it from `render.frame`.
27
+ - Size the container to its region instead of CSS-`scale()`-ing the layout, which resamples.
28
+ Use `object-fit` for media in a cell.
29
+
30
+ ## Don't
31
+ - Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
32
+ `assets` and `render` bags for media and frame state.
33
+ - When a built-in fits the request, fork its exact snapshot using Path A. Never discard its
34
+ definition by copying only its template; preserve the definition and manifest too.
35
+ - Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.