cueframe 0.4.7 → 0.4.9

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.
@@ -50,8 +50,11 @@ correction, retain the approved edit and check relevant regressions without auto
50
50
  `focus:{mode:"active-speaker"}` as the base, `all-faces` to hold a two-shot, a `face` +
51
51
  `shotScale:"close"` punch-in on the emphasis line. A static center crop is the amateur tell;
52
52
  the camera should move because the conversation moved.
53
- 6. **Captions from the real transcript.** `captions.fromTranscript` with the mediaId and the
54
- clip's window; style via `setCaptionStyle` — plated, high-contrast, never over the mouth or
53
+ 6. **Captions from the edited clip.** Save cuts and exclusions first, then call
54
+ `captions.fromComposition` with the speech track ID in a separate `apply_composition` call.
55
+ It projects the real transcript through every saved edit; clips must have saved duration matching playable source duration divided by playbackRate. Re-run after later edits. Get the
56
+ exact input from `describe_composition_ops({type:"captions.fromComposition"})` and style via
57
+ `setCaptionStyle` — plated, high-contrast, never over the mouth or
55
58
  eyes. Where the footage allows, put the emphasized keyword BEHIND the speaker as an overlay
56
59
  clip at `zPlane:"behind-subject"` — the focused signature depth move. If the user explicitly
57
60
  wants every running caption behind the speaker, set the caption layer's own
@@ -79,7 +82,7 @@ Quoted from `video-craft-standards` §4 (Talking-head clip) — the full checkli
79
82
  > **MUST** Active-speaker reframe (`focus: active-speaker` / `face`) — a moving camera, not a
80
83
  > static center crop.
81
84
 
82
- > **MUST** Captions timed to the real transcript (`captions.fromTranscript`); behind-speaker
85
+ > **MUST** Captions timed to the edited clip (`captions.fromComposition`); behind-speaker
83
86
  > placement where the footage allows it. **MUST** Dead air and false starts cut
84
87
  > (`addExcludedRange` / `cutAndRipple`).
85
88
 
@@ -203,8 +203,9 @@ npx -y cueframe new component my-badge --json
203
203
  npx -y cueframe push my-badge --json # one component
204
204
  npx -y cueframe sync --json # every component in the workspace
205
205
 
206
- # 5. Reference the component id in your composition (as an alpha-layer clip), then render
207
- # with the same verb. Preview a single component first via the MCP preview_component loop.
206
+ # 5. Reference the component id in your composition as a {kind:'component', componentId, props}
207
+ # clip, then render with the same verb. Preview a single component first via the MCP
208
+ # preview_component loop.
208
209
  npx -y cueframe render <projectId> -o ./out.mp4 --json
209
210
  ```
210
211
 
@@ -42,11 +42,17 @@ Single self-contained module per component (`create_component` takes one `tsxSou
42
42
  verified artifact produced by the same bundle contract used by final render. A failed
43
43
  `component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
44
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.
45
50
  Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
46
51
  duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
47
- 4. **Check integration:** add it as an `alpha-layer` clip (`apply_composition`), then inspect
48
- saved-composition stills or a scoped `preview_clip` for placement and motion. Use
49
- `create_render` → `wait_job kind:"render"` when delivering a finished MP4, not per tweak.
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.
50
56
 
51
57
  ## Path B — CLI / coding agent (customer-owned source under git)
52
58
 
@@ -72,10 +78,12 @@ MCP path stores. To preview before a full render, push it and use the MCP `previ
72
78
  ## Path C — Director editing a local desktop project (project-embedded source)
73
79
 
74
80
  When `get_context` reports the project lane as local, motion does not require an account or an org
75
- component. When exposed, use `open_component_preview` to compile an isolated preview,
76
- `update_component_preview` to replace its source, and `render_component_preview_frame` for exact
77
- frame evidence. Inspect playback for motion; `commit_component_preview` commits the checked revision
78
- with a fresh ETag. Close the preview when finished. This loop does not bake a timeline video and
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
79
87
  does not imply HMR: source updates still compile.
80
88
 
81
89
  If those tools are unavailable, add/update through `apply_composition` and inspect the local
@@ -103,7 +111,9 @@ timeline. An inline custom overlay has this shape:
103
111
  }
104
112
  ```
105
113
 
106
- The desktop compiles the module in an isolated child process and persists its immutable source version.
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.
107
117
  The timeline and final export render that exact version; no preview media is baked. A compile failure
108
118
  refuses the whole batch and leaves the composition untouched. Use `create_component` only for a reusable
109
119
  org-catalog component on a reachable cloud lane.
@@ -165,3 +175,5 @@ const R = params.region ?? { x: 0, y: 0, w: 1, h: 1 };
165
175
  - Don't hand-roll a graphic from zero when a built-in is close — fork it (fetch the source with
166
176
  `get_component_source`, paste it into a `npx -y cueframe new component` scaffold) and edit.
167
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.
@@ -9,7 +9,7 @@ Read the current tool contracts and project context. Do not infer a hosted sessi
9
9
  | Need | Hosted evidence | Local desktop evidence, when exposed |
10
10
  |---|---|---|
11
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`; inspect playback and `render_component_preview_frame` at exact frames |
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
13
  | Saved composition layout and overlap | `preview_frame`, batching the needed timestamps | The local composition preview/capture tools |
14
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
15
  | Finished deliverable | `create_render` and verify the resulting file | The project's export path and verification of its resulting file |
@@ -56,9 +56,11 @@ affected window and regressions without automatically rerunning the full-film ju
56
56
  narrated: the VO is the rhythm authority instead — cut to the voice and duck the bed under
57
57
  it. Silence is almost never right for a launch; if chosen anyway, record the decision and
58
58
  reason in the delivery note.
59
- 7. **Caption narration.** If there is a voice, `captions.fromTranscript` (or authored word
60
- timings for generated VO), styled legible via `setCaptionStyle`. Captions are mandatory when
61
- narrated.
59
+ 7. **Caption narration.** For transcribed voice, save the edits first, then call
60
+ `captions.fromComposition` with the narration track ID in a separate `apply_composition`
61
+ call. Speech clips must have saved duration matching playable source duration divided by
62
+ playbackRate. Re-run after later edits. Use authored word timings for generated VO without a
63
+ transcript, and style legibly via `setCaptionStyle`. Captions are mandatory when narrated.
62
64
  8. **Preview, judge, one render.** `preview_frame` at t=0, hook-end, the reveal, and the end
63
65
  card; describe each still — is that a REAL capture on screen? Then `score_composition` with
64
66
  the payoff line as `editorialIntent`; fix worst-first to ≥ 7.5; `create_render` →
@@ -61,7 +61,12 @@ affected window and regressions without automatically rerunning the full-film ju
61
61
  `{ grid:"beat" }` and land your cut points and transition midpoints on the markers. If the
62
62
  piece is genuinely better silent, that is a decision — record it and its reason in the
63
63
  delivery note. A reel whose silence nobody chose is not done.
64
- 7. **Caption any speech.** `captions.fromTranscript` with the mediaId, styled via
64
+ 7. **Caption any speech.** After saving the edited clips, use
65
+ `captions.fromComposition` with the speech track ID in a separate `apply_composition`
66
+ call. It follows trims, excluded ranges and clip placement across the reel. Speech clips
67
+ must have saved duration matching playable source duration divided by playbackRate.
68
+ Re-run it after later edits. Discover its exact input with
69
+ `describe_composition_ops({type:"captions.fromComposition"})`, then style via
65
70
  `setCaptionStyle` (plated, bottom, out of the mouth/eyes). Most social viewing is sound-off;
66
71
  don't karaoke a beat with no speech.
67
72
  8. **Look, then get judged.** `preview_frame` at t=0, hook-end, and every beat boundary;
@@ -108,7 +108,9 @@ Everything in §1, plus:
108
108
  never open on wind-up.
109
109
  - **MUST** Active-speaker reframe (`focus: active-speaker` / `face`) — a
110
110
  moving camera, not a static center crop.
111
- - **MUST** Captions timed to the real transcript (`captions.fromTranscript`).
111
+ - **MUST** Captions timed to the saved edited timeline (`captions.fromComposition`
112
+ after the clip edits; re-run after later edits). Speech clips must have saved duration matching playable source duration divided by
113
+ playbackRate.
112
114
  The focused behind-the-speaker LOOK is an overlay text layer at
113
115
  `zPlane:"behind-subject"` where the footage allows. Use caption-layer
114
116
  `zPlane:"behind-subject"` only when the user explicitly wants every running
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cueframe",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
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",
@@ -45,10 +45,10 @@
45
45
  "tsup": "^8.5.1",
46
46
  "vitest": "^4.1.2",
47
47
  "@cueframe/component-runtime": "0.1.0",
48
- "@cueframe/sdk": "0.1.5",
48
+ "@cueframe/composition": "0.1.0",
49
49
  "@cueframe/plane": "0.1.0",
50
- "@cueframe/primitives": "0.1.0",
51
- "@cueframe/composition": "0.1.0"
50
+ "@cueframe/sdk": "0.2.2",
51
+ "@cueframe/primitives": "0.1.0"
52
52
  },
53
53
  "repository": {
54
54
  "type": "git",
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{Y as a}from"./chunk-WFQZXC67.js";import"./chunk-MCQRX24V.js";export{a as analyzeCommand};