cueframe 0.6.0 → 0.7.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/dist/analyze-5OURFQXO.js +2 -0
- package/dist/{chunk-U3YHQOER.js → chunk-56LDB4H5.js} +1 -1
- package/dist/cueframe.js +74 -73
- package/dist/skills/composing-video/SKILL.md +1 -1
- package/dist/skills/cueframe-brand-demo/SKILL.md +1 -1
- package/dist/skills/cueframe-cli/SKILL.md +46 -46
- package/dist/skills/cueframe-component-authoring/SKILL.md +56 -38
- package/dist/skills/cueframe-connect/SKILL.md +1 -1
- package/dist/skills/cueframe-product-video/SKILL.md +7 -7
- package/package.json +2 -2
- package/dist/analyze-Q6MIQWOJ.js +0 -2
|
@@ -382,7 +382,7 @@ Each playbook is an illustrative format default; explicit intent and scope gover
|
|
|
382
382
|
| Long-form → clips | `suggest_briefs` → `wait_job(kind:"suggestions")` → `compose({ suggestionId })` |
|
|
383
383
|
| Auto-reframe to another aspect | `derive_composition` (content-aware 9:16 / 1:1 / 4:5 from a 16:9 master) |
|
|
384
384
|
| Discover what to build with | `list_catalog` — pass filters such as `category`/`kind`/`tier`/`useCase`/`mood`/`intent`, plus `limit` and the returned pagination cursor. For builtin packages, request `projection:"component-library"` and `origin:"builtin"`, then resolve the selected exact identity before insertion. Each entry carries `placement` (how to author it), `tier`/`useCase`, and `fixedCopy` (baked text no param changes). Read `cueframe://component/{id}` for the full **prop schema**. |
|
|
385
|
-
| Own / fork a custom graphic | `get_component_source` / `create_component`
|
|
385
|
+
| Own / fork a custom graphic | `get_component_source` (exact scoped v3 pin for builtins) / `create_component` / `update_component` (preserve the complete source snapshot) — **see `cueframe-component-authoring`** for the full fork→preview→push loop |
|
|
386
386
|
| Several cells that share space and must reflow together (feature grid, rail + fluid content, cast + type) | An authored component on `FlexLayout` from `@cueframe/animate` — tracks are **weights** (`{ weight: 0, basis: px }` = content-sized, pushes neighbours), `tracksEnd` animates the reflow per frame, `fits` per cell (`stretch`/`contain`/`cover`/`position`/`scale`/`matte`). Static PiP / split is clip `region` + `fit` instead. Never CSS-scale the layout. **See `cueframe-component-authoring`** |
|
|
387
387
|
| Seed + edit the timeline | `apply_composition` (atomic batch ops; `dry_run:true` to check, `if_match` for OCC) — this is where clips, reframe, captions, and format are authored |
|
|
388
388
|
| Set the brand | `create_brand_kit` (402-gated) → set `brandKitId` on the **project** (`create_project` / `update_project`). It lives on the project, NOT on a composition op — trying to set it elsewhere is silently dropped. |
|
|
@@ -261,4 +261,4 @@ frames) before declaring done.
|
|
|
261
261
|
which is the engine's job now.
|
|
262
262
|
- This recipe lives in a skill on purpose: the engine stays use-case-free; the
|
|
263
263
|
product opinions (what to extract, which overlays, how to brand) live here and
|
|
264
|
-
ship via `npx -y cueframe@0.
|
|
264
|
+
ship via `npx -y cueframe@0.7 install`.
|
|
@@ -31,11 +31,11 @@ both MCP and this CLI exist so you do not have to.
|
|
|
31
31
|
|
|
32
32
|
## Overview
|
|
33
33
|
|
|
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.
|
|
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.7 describe --json`.
|
|
35
35
|
|
|
36
|
-
**Run it as `npx -y cueframe@0.
|
|
36
|
+
**Run it as `npx -y cueframe@0.7 …` — every command in this skill is written that way, and
|
|
37
37
|
that form is executable verbatim.** There is no `cueframe` on your PATH unless you put it
|
|
38
|
-
there: `npx -y cueframe@0.
|
|
38
|
+
there: `npx -y cueframe@0.7 install` wires the MCP server and drops these skills, but npx
|
|
39
39
|
unpacks to an ephemeral cache, so it installs no binary. `npx` re-resolves the current
|
|
40
40
|
version on each call (~0.5s warm, ~5s cold), which also means these commands never go
|
|
41
41
|
stale. If you are running many in a row and want to skip that, `npm i -g cueframe` once
|
|
@@ -46,9 +46,9 @@ the documented path.
|
|
|
46
46
|
**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
47
|
|
|
48
48
|
**Core principle — discover, don't guess.** Never author a composition from the
|
|
49
|
-
examples below alone. The live contract is `npx -y cueframe@0.
|
|
49
|
+
examples below alone. The live contract is `npx -y cueframe@0.7 schema composition` (prints
|
|
50
50
|
the real wire schema the server enforces); confirm any draft with
|
|
51
|
-
`npx -y cueframe@0.
|
|
51
|
+
`npx -y cueframe@0.7 composition validate -b @file.json` BEFORE you render. Validation is
|
|
52
52
|
free and instant; a render is neither. The examples here are orientation — the
|
|
53
53
|
schema is the source of truth.
|
|
54
54
|
|
|
@@ -70,20 +70,20 @@ delivery, not checking each edit. CLI validation does not replace visual evidenc
|
|
|
70
70
|
# Commands run against production; auth is stored in ~/.cueframe/auth.json.
|
|
71
71
|
|
|
72
72
|
# 1. Register media (one or many — mixed video / image / audio).
|
|
73
|
-
npx -y cueframe@0.
|
|
73
|
+
npx -y cueframe@0.7 upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
|
|
74
74
|
|
|
75
75
|
# 2. Create a project (sets aspect/format).
|
|
76
|
-
npx -y cueframe@0.
|
|
76
|
+
npx -y cueframe@0.7 project create -n "promo" -a 9:16 --json # → projectId
|
|
77
77
|
|
|
78
78
|
# 3. Author the composition: tracks of clips (per-clip reframe/trim), optional
|
|
79
79
|
# captions (captions.segments), brandKitId. The composition is the SSOT.
|
|
80
80
|
# Discover the live schema, then validate the draft BEFORE saving/rendering:
|
|
81
|
-
npx -y cueframe@0.
|
|
82
|
-
npx -y cueframe@0.
|
|
83
|
-
npx -y cueframe@0.
|
|
81
|
+
npx -y cueframe@0.7 schema composition # → live wire schema
|
|
82
|
+
npx -y cueframe@0.7 composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
|
|
83
|
+
npx -y cueframe@0.7 composition put <projectId> -b @composition.json # ETag auto
|
|
84
84
|
|
|
85
85
|
# 4. Render the saved composition to MP4. SSE-watches + downloads when done.
|
|
86
|
-
npx -y cueframe@0.
|
|
86
|
+
npx -y cueframe@0.7 render <projectId> -o ./out.mp4 --json
|
|
87
87
|
# → render_queued → render_progress* → render_complete
|
|
88
88
|
#
|
|
89
89
|
# `render` takes ONLY a projectId and renders the SAVED composition (tracks +
|
|
@@ -92,14 +92,14 @@ npx -y cueframe@0.6 render <projectId> -o ./out.mp4 --json
|
|
|
92
92
|
# a hand-authored composition; if absent, the clip is rendered without captions.
|
|
93
93
|
|
|
94
94
|
# Reattach to an in-flight render later (e.g. after disconnect):
|
|
95
|
-
npx -y cueframe@0.
|
|
95
|
+
npx -y cueframe@0.7 render watch <renderId> -p <projectId> -o ./out.mp4 --json
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
## Anatomy of a composition.json
|
|
99
99
|
|
|
100
100
|
This section orients you to the shape; the authoritative contract is
|
|
101
|
-
`npx -y cueframe@0.
|
|
102
|
-
unclear, and `npx -y cueframe@0.
|
|
101
|
+
`npx -y cueframe@0.7 schema composition` (the live wire schema) — run it when a field is
|
|
102
|
+
unclear, and `npx -y cueframe@0.7 composition validate -b @file.json` to check a draft.
|
|
103
103
|
|
|
104
104
|
`composition put` takes the **bare** `Composition` object (no wrapper; the CLI POSTs
|
|
105
105
|
the `@file` verbatim and handles the ETag). Minimal valid shape:
|
|
@@ -166,18 +166,18 @@ the composition yourself (above).
|
|
|
166
166
|
|
|
167
167
|
```bash
|
|
168
168
|
# 1. Upload + chain the AI clip pass.
|
|
169
|
-
npx -y cueframe@0.
|
|
170
|
-
# (or run it explicitly: npx -y cueframe@0.
|
|
169
|
+
npx -y cueframe@0.7 upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
|
|
170
|
+
# (or run it explicitly: npx -y cueframe@0.7 analyze <mediaItemId> --wait --json)
|
|
171
171
|
|
|
172
172
|
# 2. List clip suggestions (publicId sug_…, title, startMs/endMs, score).
|
|
173
|
-
npx -y cueframe@0.
|
|
173
|
+
npx -y cueframe@0.7 clips <mediaItemId> --json
|
|
174
174
|
|
|
175
175
|
# 3. Create a project AND author its composition from the chosen suggestion.
|
|
176
|
-
npx -y cueframe@0.
|
|
177
|
-
# (or, on an existing project: npx -y cueframe@0.
|
|
176
|
+
npx -y cueframe@0.7 project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
|
|
177
|
+
# (or, on an existing project: npx -y cueframe@0.7 composition from-suggestion <projectId> -s <sug_…>)
|
|
178
178
|
|
|
179
179
|
# 4. Render — same framework verb as above.
|
|
180
|
-
npx -y cueframe@0.
|
|
180
|
+
npx -y cueframe@0.7 render <projectId> -o ./out.mp4 --json
|
|
181
181
|
```
|
|
182
182
|
|
|
183
183
|
Both flows converge on `composition put` → `render`; the on-ramp just authors the
|
|
@@ -194,51 +194,51 @@ video and composites it (the shared renderer never runs your code).
|
|
|
194
194
|
|
|
195
195
|
```bash
|
|
196
196
|
# 1. Scaffold a workspace (writes cueframe.json + cueframe/components/). Idempotent.
|
|
197
|
-
npx -y cueframe@0.
|
|
197
|
+
npx -y cueframe@0.7 init --json
|
|
198
198
|
|
|
199
199
|
# 2a. Scaffold a component in cueframe/components/<id>/ as owned, editable source.
|
|
200
|
-
npx -y cueframe@0.
|
|
200
|
+
npx -y cueframe@0.7 new component my-badge --json
|
|
201
201
|
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
# cueframe/components/my-badge/index.tsx as your starting point.
|
|
202
|
+
# Built-in forks require an exact v3 sourceSnapshot; retain its TSX, definition and manifest.
|
|
203
|
+
# The CLI sends index.tsx + definition.json + the workspace asset manifest as one v3 source.
|
|
205
204
|
|
|
206
205
|
# 3. Edit cueframe/components/<id>/ — it's standard Remotion. The component is mounted
|
|
207
|
-
#
|
|
206
|
+
# with params/assets/render; definition.json declares its source-v3 capabilities and timing.
|
|
207
|
+
# The nested asset manifest remains version 2.
|
|
208
208
|
|
|
209
209
|
# 4. Publish to CueFrame so it can render (uploads index.tsx as the component's tsxSource).
|
|
210
|
-
npx -y cueframe@0.
|
|
211
|
-
npx -y cueframe@0.
|
|
210
|
+
npx -y cueframe@0.7 push my-badge --json # one component
|
|
211
|
+
npx -y cueframe@0.7 sync --json # every component in the workspace
|
|
212
212
|
|
|
213
213
|
# 5. Reference the component id in your composition as a {kind:'component', componentId, props}
|
|
214
214
|
# clip, then render with the same verb. Preview a single component first via the MCP
|
|
215
215
|
# preview_component loop.
|
|
216
|
-
npx -y cueframe@0.
|
|
216
|
+
npx -y cueframe@0.7 render <projectId> -o ./out.mp4 --json
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
## Quick reference
|
|
220
220
|
|
|
221
221
|
| Need to… | Command |
|
|
222
222
|
|---|---|
|
|
223
|
-
| See every command + flags | `npx -y cueframe@0.
|
|
224
|
-
| Install/refresh managed skills | `npx -y cueframe@0.
|
|
225
|
-
| List projects | `npx -y cueframe@0.
|
|
226
|
-
| List your media | `npx -y cueframe@0.
|
|
227
|
-
| Discover the live composition schema | `npx -y cueframe@0.
|
|
228
|
-
| Validate a draft (no save, no render) | `npx -y cueframe@0.
|
|
229
|
-
| Read composition + ETag | `npx -y cueframe@0.
|
|
230
|
-
| Write composition | `npx -y cueframe@0.
|
|
231
|
-
| Export to Final Cut | `npx -y cueframe@0.
|
|
232
|
-
| Export to Premiere | `npx -y cueframe@0.
|
|
233
|
-
| Anything not wrapped | `npx -y cueframe@0.
|
|
234
|
-
| Validate a composition without mutating | `npx -y cueframe@0.
|
|
223
|
+
| See every command + flags | `npx -y cueframe@0.7 describe --json` |
|
|
224
|
+
| Install/refresh managed skills | `npx -y cueframe@0.7 install` (shared `~/.agents/skills` and Claude `~/.claude/skills`; locally changed or untracked packages are preserved and reported) |
|
|
225
|
+
| List projects | `npx -y cueframe@0.7 list -n 50` |
|
|
226
|
+
| List your media | `npx -y cueframe@0.7 clips` (no mediaId arg) |
|
|
227
|
+
| Discover the live composition schema | `npx -y cueframe@0.7 schema composition` |
|
|
228
|
+
| Validate a draft (no save, no render) | `npx -y cueframe@0.7 composition validate -b @plan.json` |
|
|
229
|
+
| Read composition + ETag | `npx -y cueframe@0.7 composition get <projectId> --json` |
|
|
230
|
+
| Write composition | `npx -y cueframe@0.7 composition put <projectId> -b @plan.json` (ETag auto) |
|
|
231
|
+
| Export to Final Cut | `npx -y cueframe@0.7 export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
|
|
232
|
+
| Export to Premiere | `npx -y cueframe@0.7 export premiere <projectId> -s <sug> --wait -o cut.zip` |
|
|
233
|
+
| Anything not wrapped | `npx -y cueframe@0.7 api GET /v1/... -i` (escape hatch, like `gh api`) |
|
|
234
|
+
| Validate a composition without mutating | `npx -y cueframe@0.7 composition validate -b @plan.json` |
|
|
235
235
|
|
|
236
236
|
## Auth
|
|
237
237
|
|
|
238
238
|
Commands run against production. Authenticate once:
|
|
239
239
|
|
|
240
|
-
- `npx -y cueframe@0.
|
|
241
|
-
- `npx -y cueframe@0.
|
|
240
|
+
- `npx -y cueframe@0.7 login` — OAuth device flow (laptops).
|
|
241
|
+
- `npx -y cueframe@0.7 auth <cf_live_… key>` — save a static API key (CI / headless).
|
|
242
242
|
|
|
243
243
|
Creds are stored in `~/.cueframe/auth.json`; the key can also come from the `CUEFRAME_API_KEY` env var.
|
|
244
244
|
|
|
@@ -256,11 +256,11 @@ Errors come as `{"event":"error", "phase":"<step>", "message":"...", "code":"...
|
|
|
256
256
|
|
|
257
257
|
| Mistake | Reality |
|
|
258
258
|
|---|---|
|
|
259
|
-
| Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.
|
|
260
|
-
| Polling for render completion with a sleep loop | `npx -y cueframe@0.
|
|
259
|
+
| Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe@0.7 api METHOD /v1/...` — same auth, same JSON pipeline. |
|
|
260
|
+
| Polling for render completion with a sleep loop | `npx -y cueframe@0.7 render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
|
|
261
261
|
| Skipping `--json` and trying to parse human output | Human output is for humans. Agents always use `--json`. |
|
|
262
262
|
| 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. |
|
|
263
|
-
| Calling `npx -y cueframe@0.
|
|
263
|
+
| Calling `npx -y cueframe@0.7 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). |
|
|
264
264
|
| 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. |
|
|
265
265
|
|
|
266
266
|
## When this skill applies (routing)
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
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.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# CueFrame component authoring (fork / customize / own)
|
|
@@ -16,8 +16,8 @@ For scoped revisions, preserve unrelated timing, media, audio and shared brand-k
|
|
|
16
16
|
Use `cueframe-compose-loop`'s [preview workflow](../cueframe-compose-loop/references/preview-workflow.md)
|
|
17
17
|
to select hosted or local evidence and separate iteration from final delivery.
|
|
18
18
|
|
|
19
|
-
CueFrame ships
|
|
20
|
-
effects, transitions
|
|
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
21
|
and render it on CueFrame — or author a brand-new component. This is shadcn-for-video: own the
|
|
22
22
|
component code; CueFrame is the reliable engine that renders it.
|
|
23
23
|
|
|
@@ -26,32 +26,41 @@ component code; CueFrame is the reliable engine that renders it.
|
|
|
26
26
|
See the `cueframe-scene-shot` skill and `cueframe://scene-shot`. Author a component here when
|
|
27
27
|
you need behaviour the scene contract does not express.
|
|
28
28
|
|
|
29
|
-
**
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
**Source format matters:**
|
|
30
|
+
- Built-ins use source v3: keep the complete `sourceSnapshot`, including `definition`,
|
|
31
|
+
`manifest`, and `tsxSource`. Its definition declares input schema, defaults, timing,
|
|
32
|
+
brand/media bindings and capabilities. Do not infer these from the source code or flatten
|
|
33
|
+
a v3 source into a v2 module. The nested asset manifest can still have `version: 2`.
|
|
34
|
+
- Existing user-authored v2 sources use
|
|
35
|
+
`({ durationInFrames, params, assets, render }) => JSX`. Preserve their format when editing.
|
|
36
|
+
- Neither renderer runs authored source in the editor process. Local and hosted execution
|
|
37
|
+
use isolated render processes and exact immutable source revisions.
|
|
37
38
|
|
|
38
39
|
## Path A — MCP agent (no filesystem; source lives server-side)
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
1. **
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
`
|
|
47
|
-
|
|
41
|
+
Use the live tool schema for request envelopes; hosted write fields are normally under `body`.
|
|
42
|
+
|
|
43
|
+
1. **Discover and read a built-in:** call `list_components` 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), and `supportedSourceVersions: "3"`.
|
|
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 v3 `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.
|
|
48
56
|
3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
|
|
49
57
|
preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
|
|
50
58
|
verified artifact produced by the same bundle contract used by final render. A failed
|
|
51
59
|
`component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
|
|
52
60
|
(same id, in place), and preview again.
|
|
53
61
|
**Once the component is placed in a project, pass that project on every update:**
|
|
54
|
-
`update_component({ componentId, body: {
|
|
62
|
+
`update_component({ componentId, body: { source: editedSnapshot, projectId, compositionId? } })`
|
|
63
|
+
for v3; an existing v2 component uses its supported v2 edit fields. A placed clip
|
|
55
64
|
renders the exact version it pins; only the composition you name moves to the new version in the
|
|
56
65
|
same write (`repinned` says what moved). Without `projectId` your clips keep rendering the old
|
|
57
66
|
version, and `placementsPinnedToPrevious` counts them.
|
|
@@ -68,26 +77,32 @@ Source lives in `cueframe/components/<id>/` (the `cueframe.json` workspace); edi
|
|
|
68
77
|
standard Remotion, push to render.
|
|
69
78
|
|
|
70
79
|
```bash
|
|
71
|
-
npx -y cueframe@0.
|
|
72
|
-
npx -y cueframe@0.
|
|
73
|
-
#
|
|
74
|
-
#
|
|
80
|
+
npx -y cueframe@0.7 init --json # scaffold cueframe.json + cueframe/components/
|
|
81
|
+
npx -y cueframe@0.7 new component my-badge --json # scaffold a component in the workspace
|
|
82
|
+
# New scaffolds contain index.tsx, config.ts and definition.json (source v3).
|
|
83
|
+
# For a builtin fork, retain its TSX, complete definition and asset manifest together.
|
|
75
84
|
# …edit cueframe/components/<id>/ in your editor (standard Remotion)…
|
|
76
|
-
npx -y cueframe@0.
|
|
77
|
-
# or: npx -y cueframe@0.
|
|
85
|
+
npx -y cueframe@0.7 push my-badge --json # upload index.tsx as the component tsxSource
|
|
86
|
+
# or: npx -y cueframe@0.7 sync --json # push every component in the workspace
|
|
78
87
|
# reference the component id in your composition, then render:
|
|
79
|
-
npx -y cueframe@0.
|
|
88
|
+
npx -y cueframe@0.7 render <projectId> -o ./out.mp4 --json
|
|
80
89
|
```
|
|
81
90
|
|
|
82
|
-
The CLI writes
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
The CLI writes `index.tsx` (module), `config.ts` (metadata) and `definition.json` (complete v3
|
|
92
|
+
input schema, defaults, timing and capabilities). Its asset manifest lives at
|
|
93
|
+
`cueframe.json` → `components.<id>.manifest`; that nested manifest retains version 2.
|
|
94
|
+
`push`/`sync` send these as one v3 `source` snapshot. For a builtin fork, copy **all three source
|
|
95
|
+
parts** from the selected `sourceSnapshot`: TSX, definition and manifest; choose the owned ID
|
|
96
|
+
consistently. Never replace a definition with the blank scaffold's defaults.
|
|
97
|
+
Older workspaces without `definition.json` are refused before API calls: review and declare
|
|
98
|
+
their real behavior instead of running `new --force` over existing source. To preview before
|
|
99
|
+
a full render, push it and use the appropriate component preview loop.
|
|
85
100
|
|
|
86
101
|
## Path C — Director editing a local desktop project (project-embedded source)
|
|
87
102
|
|
|
88
103
|
When `get_context` reports the project lane as local, motion does not require an account or an org
|
|
89
104
|
component. When exposed, use `open_component_preview` to compile an isolated preview (new source,
|
|
90
|
-
or `component_id`
|
|
105
|
+
with an explicit `component_definition`, or `component_id` to preserve an existing library source), `update_component_preview`
|
|
91
106
|
with exact-text edits (`{oldText, newText, replaceAll?}`, each `oldText` matching once), and
|
|
92
107
|
`render_component_preview_frame` for exact frame evidence. Inspect playback for motion;
|
|
93
108
|
`commit_component_preview` publishes the checked source to the library and pins the clip, with a
|
|
@@ -111,6 +126,7 @@ timeline. An inline custom overlay has this shape:
|
|
|
111
126
|
"params": {
|
|
112
127
|
"jsxSource": "export default function Graphic({ durationInFrames, params, assets, render }) { ... }",
|
|
113
128
|
"componentManifest": { "version": 2, "assets": {}, "graphics": { "api": "canvas2d", "required": true, "accelerationPreference": "software-allowed" }, "alphaPolicy": "requires-transparency" },
|
|
129
|
+
"componentDefinition": { "inputSchema": { "type": "object", "properties": {}, "additionalProperties": false }, "defaults": {}, "timing": { "defaultDuration": { "frames": 90, "fps": 30 } }, "brandBindings": [], "capabilities": [{ "kind": "clip" }] },
|
|
114
130
|
"componentAssets": {}
|
|
115
131
|
}
|
|
116
132
|
}
|
|
@@ -120,7 +136,9 @@ timeline. An inline custom overlay has this shape:
|
|
|
120
136
|
```
|
|
121
137
|
|
|
122
138
|
The desktop compiles the module in an isolated child process and creates it in the desktop's component
|
|
123
|
-
library
|
|
139
|
+
library as a complete v3 source. Declare the actual parameter schema and defaults in
|
|
140
|
+
`componentDefinition`; the empty schema above is for a graphic with no custom parameters.
|
|
141
|
+
Keep a fork's existing definition and nested manifest together with its source. Inline source creates a component only: a clip whose component already exists with other
|
|
124
142
|
source is refused as `component_exists`, and that component changes through edits.
|
|
125
143
|
The timeline and final export render that exact version; no preview media is baked. A compile failure
|
|
126
144
|
refuses the whole batch and leaves the composition untouched. Use `create_component` only for a reusable
|
|
@@ -140,10 +158,10 @@ loops, refs, constructors, typed arrays, canvas, and WebGPU when needed. Drive v
|
|
|
140
158
|
`render.frame`/`render.fps` and seed variation from `render.seed`; ambient time/randomness is refused.
|
|
141
159
|
|
|
142
160
|
## Choosing what to fork
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
161
|
+
Use the `component-library` projection to choose a definition, inspect its input schema and
|
|
162
|
+
capabilities, then fetch its exact scoped source as described in Path A. Presets and recipes
|
|
163
|
+
are different card kinds: follow their exact definition/document references rather than treating
|
|
164
|
+
those IDs as source IDs. Inspect appropriate previews before judging visual behavior.
|
|
147
165
|
|
|
148
166
|
## Layout inside a component — `FlexLayout` / `solveFlex`
|
|
149
167
|
When a graphic has several cells that must share space — a feature grid, a fixed rail beside
|
|
@@ -180,8 +198,8 @@ const R = params.region ?? { x: 0, y: 0, w: 1, h: 1 };
|
|
|
180
198
|
## Don't
|
|
181
199
|
- Don't expect a forked primitive to use rich named props — read `params` inside and use the explicit
|
|
182
200
|
`assets` and `render` bags for media and frame state.
|
|
183
|
-
-
|
|
184
|
-
|
|
201
|
+
- When a built-in fits the request, fork its exact v3 snapshot using Path A. Never discard its
|
|
202
|
+
definition by copying only its TSX; preserve the definition and manifest too.
|
|
185
203
|
- Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
|
|
186
204
|
- Don't update a placed component without its `projectId` in the body — the placed clips keep the
|
|
187
205
|
version they pin, so the next preview or render shows the old graphic.
|
|
@@ -23,7 +23,7 @@ When a required capability is missing, explain the limitation and the supported
|
|
|
23
23
|
- **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
|
|
24
24
|
`https://api.cueframe.ai/v1/mcp`.
|
|
25
25
|
- **Other agents (Cursor, Codex, VS Code, Windsurf, Zed, Antigravity CLI, Copilot CLI, …):**
|
|
26
|
-
use `npx -y cueframe@0.
|
|
26
|
+
use `npx -y cueframe@0.7 install --help` to select the intended client; preserve existing configuration and avoid duplicate installs.
|
|
27
27
|
- **ChatGPT:** the CLI cannot wire it because there is no local config to write; add
|
|
28
28
|
`https://api.cueframe.ai/v1/mcp` as a custom connector instead.
|
|
29
29
|
- **No account (pay per call):** connect
|
|
@@ -21,7 +21,7 @@ to author, not how to transport it.
|
|
|
21
21
|
|
|
22
22
|
**Drive the primitives over MCP if you can call tools** (`new_composition` /
|
|
23
23
|
`apply_composition` / `validate_composition` / `create_render` — see the
|
|
24
|
-
`cueframe-connect` skill for the one-line setup). The `npx -y cueframe@0.
|
|
24
|
+
`cueframe-connect` skill for the one-line setup). The `npx -y cueframe@0.7 …` commands
|
|
25
25
|
written out below are the same operations for a terminal or CI job with no MCP
|
|
26
26
|
host; see the `cueframe-cli` skill.
|
|
27
27
|
|
|
@@ -64,7 +64,7 @@ style's) over each window. Result → `source.reframe.segments` on the clip.
|
|
|
64
64
|
## 3. Compose
|
|
65
65
|
|
|
66
66
|
One video track, the screen recording as a media clip carrying the reframe.
|
|
67
|
-
`npx -y cueframe@0.
|
|
67
|
+
`npx -y cueframe@0.7 composition put <projectId> -b @composition.json` (see `cueframe-cli`).
|
|
68
68
|
Choose `-a 16:9` for landscape product video, `9:16` for social.
|
|
69
69
|
|
|
70
70
|
## 4. Polish — layer overlay primitives (this is what makes it look "produced")
|
|
@@ -102,21 +102,21 @@ check framing with `preview_frame` and click/zoom timing with an affected-window
|
|
|
102
102
|
For a small revision, verify that change and relevant regressions without exporting the whole film.
|
|
103
103
|
When delivering the finished video:
|
|
104
104
|
|
|
105
|
-
`npx -y cueframe@0.
|
|
105
|
+
`npx -y cueframe@0.7 render <projectId> -o out.mp4 --json`. Verify the output (ffprobe +
|
|
106
106
|
sample frames) before declaring done.
|
|
107
107
|
|
|
108
108
|
## Worked examples — composition JSON
|
|
109
109
|
|
|
110
110
|
These are **orientation, not the contract.** The live wire schema is
|
|
111
|
-
`npx -y cueframe@0.
|
|
112
|
-
`npx -y cueframe@0.
|
|
111
|
+
`npx -y cueframe@0.7 schema composition`, and the way to know a draft is correct is
|
|
112
|
+
`npx -y cueframe@0.7 composition validate -b @composition.json` — it runs the same
|
|
113
113
|
validator the server enforces, with no save and no render. Discover + validate
|
|
114
114
|
before you render; never spend a render to find a schema mistake.
|
|
115
115
|
|
|
116
116
|
Each block below is a complete `@composition.json` (the bare object `composition put`
|
|
117
117
|
accepts: top-level `v`, `format`, `tracks`, optional `captions`). All five validate
|
|
118
118
|
against the real wire schema + save invariants (swap the `<…MediaId>` placeholders for
|
|
119
|
-
real `npx -y cueframe@0.
|
|
119
|
+
real `npx -y cueframe@0.7 upload` ids). Conventions that keep them valid:
|
|
120
120
|
|
|
121
121
|
- Tracks hold **`contents`** (not `clips`); each clip wraps a `source`.
|
|
122
122
|
- A clip's `source.kind` must match the track `kind`: `media` → `video`/`image`/`audio`
|
|
@@ -298,4 +298,4 @@ Talking-head with an `active-speaker` reframe and a `heroText` title at `zPlane:
|
|
|
298
298
|
background. See EX3 / EX4 below.
|
|
299
299
|
- This recipe lives in a skill on purpose: the engine stays use-case-free; the
|
|
300
300
|
product opinions (style, which primitives, layout) live here and ship via
|
|
301
|
-
`npx -y cueframe@0.
|
|
301
|
+
`npx -y cueframe@0.7 install`. Add sibling recipes (`cueframe-podcast-clip`, …) the same way.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cueframe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Agent-native CLI for CueFrame — author compositions and render video from the terminal (early-access preview).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cueframe",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"tsup": "^8.5.1",
|
|
48
48
|
"vitest": "^4.1.2",
|
|
49
49
|
"@cueframe/sdk": "^0.5.0",
|
|
50
|
-
"@cueframe/skills": "0.
|
|
50
|
+
"@cueframe/skills": "0.2.0"
|
|
51
51
|
},
|
|
52
52
|
"repository": {
|
|
53
53
|
"type": "git",
|
package/dist/analyze-Q6MIQWOJ.js
DELETED