@higgsfield/video-editor-mcp 1.1.1-dev.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +63 -26
  2. package/dist/cli.mjs +284 -112
  3. package/dist/guide.md +2 -3
  4. package/dist/index.html +1 -1
  5. package/dist/launcher.mjs +34 -14
  6. package/dist/server.mjs +209 -265
  7. package/node_modules/@higgsfield/higgsedit/dist/api.d.ts +481 -0
  8. package/node_modules/@higgsfield/higgsedit/dist/{chunk-PFQYUJQL.mjs → chunk-3XVMJSV2.mjs} +1 -1
  9. package/node_modules/@higgsfield/higgsedit/dist/{chunk-F4CMIG5G.mjs → chunk-4VE54E4U.mjs} +3 -1
  10. package/node_modules/@higgsfield/higgsedit/dist/{chunk-2JYLVSVV.mjs → chunk-55JARHLA.mjs} +205 -65
  11. package/node_modules/@higgsfield/higgsedit/dist/{chunk-YLVXQIPX.mjs → chunk-E4N76T2R.mjs} +1 -1
  12. package/node_modules/@higgsfield/higgsedit/dist/{chunk-OCIZ36XD.mjs → chunk-ECRSOIKI.mjs} +1 -1
  13. package/node_modules/@higgsfield/higgsedit/dist/{chunk-IEPPEDEU.mjs → chunk-ENALCTAD.mjs} +1 -1
  14. package/node_modules/@higgsfield/higgsedit/dist/chunk-HY2E7IWX.mjs +43 -0
  15. package/node_modules/@higgsfield/higgsedit/dist/{chunk-NARTAWRN.mjs → chunk-HYCUOCUQ.mjs} +9 -4
  16. package/node_modules/@higgsfield/higgsedit/dist/{chunk-C3GSB3XZ.mjs → chunk-NLEIBCAK.mjs} +1 -7
  17. package/node_modules/@higgsfield/higgsedit/dist/{chunk-2WKNH7OL.mjs → chunk-O3AVYZ6U.mjs} +1 -1
  18. package/node_modules/@higgsfield/higgsedit/dist/chunk-UXO22E3P.mjs +22 -0
  19. package/node_modules/@higgsfield/higgsedit/dist/{chunk-BH2QF635.mjs → chunk-V5XTCFYK.mjs} +4 -100
  20. package/node_modules/@higgsfield/higgsedit/dist/chunk-W2TANYEH.mjs +118 -0
  21. package/node_modules/@higgsfield/higgsedit/dist/{chunk-DVN4LUXV.mjs → chunk-XY5CCUOZ.mjs} +2 -6
  22. package/node_modules/@higgsfield/higgsedit/dist/{chunk-KIWGVAPJ.mjs → chunk-Y7SAX2P4.mjs} +8 -12
  23. package/node_modules/@higgsfield/higgsedit/dist/chunk-YNAIRXOP.mjs +22 -0
  24. package/node_modules/@higgsfield/higgsedit/dist/{chunk-WENFTPXQ.mjs → chunk-ZO3NDQD3.mjs} +1 -1
  25. package/node_modules/@higgsfield/higgsedit/dist/higgsedit.mjs +13 -13
  26. package/node_modules/@higgsfield/higgsedit/package.json +4 -1
  27. package/package.json +4 -4
  28. package/plugin/.codex-plugin/plugin.json +1 -1
  29. package/plugin/skills/video-editing/SKILL.md +109 -95
  30. package/plugin/mcp.json +0 -10
  31. package/plugin/plugin.json +0 -41
  32. package/plugin/skills/motion-craft/SKILL.md +0 -87
  33. package/plugin/skills/motion-craft/agents/openai.yaml +0 -6
  34. package/plugin/skills/motion-craft/references/causality.md +0 -25
  35. package/plugin/skills/motion-craft/references/composition.md +0 -20
  36. package/plugin/skills/motion-craft/references/easing.md +0 -19
  37. package/plugin/skills/motion-craft/references/qc.md +0 -33
  38. package/plugin/skills/motion-craft/references/recipes.md +0 -31
  39. package/plugin/skills/motion-craft/references/stepped.md +0 -43
  40. package/plugin/skills/motion-craft/references/timing.md +0 -60
  41. package/plugin/skills/motion-craft/references/tsx.md +0 -60
  42. package/plugin/skills/motion-craft/references/typography.md +0 -22
  43. package/plugin/skills/video-editing/agents/openai.yaml +0 -6
  44. package/plugin/skills/video-editing/references/animation-contract.md +0 -45
  45. package/plugin/skills/video-editing/references/assembly.md +0 -58
  46. package/plugin/skills/video-editing/references/caption-systems.md +0 -29
  47. package/plugin/skills/video-editing/references/caption-titling.md +0 -41
  48. package/plugin/skills/video-editing/references/clip-geometry.md +0 -37
  49. package/plugin/skills/video-editing/references/compose.md +0 -283
  50. package/plugin/skills/video-editing/references/editor-measured.md +0 -37
  51. package/plugin/skills/video-editing/references/failure-modes.md +0 -37
  52. package/plugin/skills/video-editing/references/local-setup.md +0 -25
  53. package/plugin/skills/video-editing/references/motion-language.md +0 -27
  54. package/plugin/skills/video-editing/references/provenance.md +0 -7
  55. package/plugin/skills/video-editing/references/sandbox.md +0 -31
  56. package/plugin/skills/video-editing/references/shot-blueprints.md +0 -24
  57. package/plugin/skills/video-editing/references/title-animation.md +0 -29
  58. package/plugin/skills/video-editing/references/tsx-projects.md +0 -187
  59. package/plugin/skills/video-editing/references/workflows.md +0 -41
@@ -1,37 +0,0 @@
1
- # Limits and diagnostics
2
-
3
- | Symptom / refusal | Contract |
4
- | --------------------------------- | ---------------------------------------------------------------------------------------------- |
5
- | Frame or motion field unknown | Installed CLI/types determine support; source changes do not update an installed bundle |
6
- | Fill under hug / unresolved slot | Fill needs a resolvable parent axis; absolute frames need dimensions |
7
- | Child or keys exceed lifetime | Local spans must fit the owner; frames exclude their exact endpoint |
8
- | `animate` object rejected | `animate` is an array; frame `motion` is an object |
9
- | Duplicate property tracks | Replacement channels have one owner; raw offsets add and uniform scales multiply |
10
- | Incorrect shader animation target | `effectIndex` selects a declared effect; `effectParam` is its existing numeric key |
11
- | Missing shader / texture / GL | Rendering fails; texture binding uses imported `handle.id`, not URL or handle object |
12
- | Shader raster overflow | Raster bounds exclude overflowing child/stroke/ink; clip or inset the content |
13
- | LUT / shader adjustment / HTML | Unsupported by the native CLI |
14
- | Text `fill` / rect stroke object | Text uses `color`; rect uses flat `strokeColor`/`strokeWidth`; path has `stroke` object |
15
- | Missing glyphs | Font registration does not establish glyph coverage; Lucide paths have no font dependency |
16
- | Stretched footage | `fill` stretches; frame-slot `contain`/`cover` preserve aspect |
17
- | Unexpected source moment | `from`/`trimStart` are source time, not placement time |
18
- | Lost human edits | Whole-script build replaces timeline; fresh `inspect` + bounded `do`/`ops` preserve other work |
19
-
20
- ## Evidence provided by each command
21
-
22
- - `doctor`: installed native dependencies and render smoke.
23
- - `compose` with `dryRun: true`: validation and compiled layout, without mutation.
24
- - `inspect --at`: evaluated parameters and lifetimes, not shader execution/world geometry.
25
- - `frame` / `render`: actual pixels and runtime diagnostics. `sheet` samples frames.
26
- - `probe` / ffprobe: actual media streams; extensions do not establish codecs/depth.
27
-
28
- Ten-bit encoding does not guarantee ten-bit processing. Render `fallbacks` report
29
- windows that used the eight-bit compositor; GLSL itself is RGBA8. Shader GL selection
30
- is independent of video encoder `accel`. Native and browser shader support differ.
31
-
32
- Main10 sources decode directly through ffmpeg without a compatibility transcode.
33
- Frame equality requires matching assets/fonts/runtime. MP4 metadata and encoders
34
- can change container hashes. An interrupted render or a successful script with no
35
- render call is not a completed movie.
36
-
37
- [API](compose.md) · [Inspection](editor-measured.md)
@@ -1,25 +0,0 @@
1
- # Local plugin setup
2
-
3
- The Higgsfield Video Editor plugin supplies `video-editing`, `motion-craft` and
4
- the `video_editing_*` tools. Run setup on the user's Mac, outside `sandbox_exec`.
5
- Requires Node.js 22.12 or later.
6
-
7
- ```sh
8
- dir="$HOME/.higgsfield/video-editor-mcp"
9
- npm install --prefix "$dir" --registry=https://registry.npmjs.org/ --ignore-scripts --no-audit --no-fund @higgsfield/video-editor-mcp@latest
10
- cli="$dir/node_modules/@higgsfield/video-editor-mcp/dist/cli.mjs"
11
- node "$cli" doctor
12
- node "$cli" install-plugin
13
- ```
14
-
15
- If the registry is unreachable or denies the package, report the error. Never
16
- substitute a different package or bypass the registry. Fix a failed doctor check.
17
- Reload the desktop app to discover plugin skills, then start a new chat for its
18
- tools. If a standalone `higgsfield-use-video-editor` MCP registration is also
19
- present, inspect it and remove it before using the plugin to avoid duplicate
20
- tools. Do not remove an entry with a different configuration.
21
-
22
- The npm install's launcher checks for updates in the background at startup, at
23
- most once per hour. Server, UI, Higgsedit and the registered plugin bundle update
24
- together; active chats retain their current version. Reload the app for updated
25
- skills and metadata. `node "$cli" update` forces an immediate check.
@@ -1,27 +0,0 @@
1
- # Motion feature mappings
2
-
3
- These are combinations of native features, not additional preset names.
4
- Exact fields and limits: [composition API](compose.md).
5
-
6
- | Result | Supported mechanism |
7
- | --------------------------------- | ---------------------------------------------------------------------------- |
8
- | Entrance / hold / exit | Frame `motion.enter`, `settle`, end-anchored `exit` |
9
- | Pop / overshoot / spring | Choreography easing objects or explicit raw scale keys |
10
- | Staggered cards | `motion.timeline.stagger` with `each`; targets are immediate child frames |
11
- | Word / character / line arrival | Text `motion.by`; one text clip |
12
- | Wipe / phrase highlight | Frame `clip` + `reveal`, or animated mask geometry |
13
- | Counter and bar | One timeline leaf with `targets`: transform bindings plus explicit `counter` |
14
- | Slider / cursor / target coupling | Shared `targets` progress or identical authored key times |
15
- | State replacement | Timed sibling clips, opacity tracks, or sequence transitions |
16
- | Repeated movement | Finite closed `animate` chain with `repeat` |
17
- | Connector reveal / morph | Mask wipe, or matching `d`/`morphTo` with `morphProgress` |
18
- | Camera move / parallax | Parent frame transforms, or compose camera with top-level `z` |
19
- | Particles / glitch | Finite generated shapes and deterministic authored keyframe tables |
20
-
21
- A mask wipe is not a path-length-aware stroke draw. Shaped glyph outlines instead
22
- support `textDrawProgress` with font bytes and visible stroke.
23
-
24
- Shared counters use held scene-fps samples for all coupled bindings, not a
25
- runtime text callback. Independent animated values are not automatically coupled.
26
- A color tween is a solid-color change; gradient stencils use separate geometry
27
- and mattes. None of these mappings implies cross-scene object identity.
@@ -1,7 +0,0 @@
1
- # Reference provenance
2
-
3
- This skill's reference organization was informed by the public Apache-2.0 project [heygen-com/hyperframes](https://github.com/heygen-com/hyperframes), inspected at commit `8800214`.
4
-
5
- Only general documentation patterns were retained, such as separating renderer contracts from examples and grouping related capabilities by deliverable.
6
-
7
- All commands, APIs, schemas, timing semantics, effects, layout behavior, project mutation rules, and limitations documented here are for `higgsedit`. HyperFrames-specific `data-*` clips, GSAP timelines, adapters, lint commands, and render architecture are not supported `higgsedit` syntax.
@@ -1,31 +0,0 @@
1
- This reference applies to sandbox `project.json` projects, not local TSX.
2
-
3
- # Sandbox script API
4
-
5
- Scripts accept JSX/TSX or supplied node builders; no React or DOM runtime.
6
-
7
- | Call | Result |
8
- | --------------------------------------------------------------------------------- | --------------------------- |
9
- | `await project({dir, size, fps, background})` | Create/open project |
10
- | `await p.add(file)` | Import asset; return handle |
11
- | `p.cut(handle, {from, dur, at, fit})` | Place footage/audio |
12
- | `p.compose(nodes, {at, dur, name, camera})` | Place native graphics/media |
13
- | `p.duration()` / `await p.read()` | Timeline length / document |
14
- | `await p.frame(time, out)` | PNG |
15
- | `await p.render(out, {draft, depth, codec, bitrate, accel, shards, concurrency})` | Encoded movie |
16
-
17
- `from` is source seconds; composition `at` is timeline seconds. Frame children
18
- and animations use local seconds. `cut` and `compose` record work synchronously.
19
-
20
- See the [complete example](compose.md#complete-example).
21
-
22
- ## Capabilities
23
-
24
- | Area | Features |
25
- | -------- | ---------------------------------------------------------------------------------------------------------- |
26
- | Media | Import images/video/audio; source trims, cuts, fitting and audio mixing |
27
- | Layout | Persistent frames: column, row, equal-column grid, absolute; fill/hug sizing |
28
- | Graphics | Text, shaped fonts, rectangles, gradients, paths, Lucide icons, masks and mattes |
29
- | Motion | Raw keyframes, frame choreography, shared counters, token text, transitions, 2.5D camera |
30
- | Effects | Standard filters, shadows, motion blur, custom GLSL, image textures, animated uniforms |
31
- | Output | Native PNGs, contact sheets, MP4/MOV/MKV, H.264, H.265/HEVC Main10, AV1, target bitrate, editable projects |
@@ -1,24 +0,0 @@
1
- # Shot construction primitives
2
-
3
- These are capability mappings, not required scene templates.
4
-
5
- | Need | Native primitives |
6
- | ---------------------------------- | ---------------------------------------------------------------------------------- |
7
- | Sequential phrases or states | `sequence`, child `at`/`duration`, text keyframes |
8
- | Cards, lists, or logo walls | persistent `frame` with column, row, or equal-column grid layout |
9
- | Input-to-result demonstration | frames for UI regions, cursor paths, explicit state clips |
10
- | Control and target moving together | shared keyframe data applied to separate nodes or frame motion targets |
11
- | Footage beside graphics | row/column frame with a centered `media` slot and text/card frames |
12
- | Talking head with overlays | spine cut for audio/picture plus composed frames for titles and cards |
13
- | Metrics and charts | text, rect, path, `effectParam`, width/height, color, and draw-progress tracks |
14
- | Hub-and-spoke diagram | path connectors, icon/media nodes, groups, and 2D transforms |
15
- | Before/after comparison | row or grid frames with synchronized node tracks |
16
- | Zoom or parallax | top-level `z` values plus `compose(..., { camera })`, or group/frame 2D transforms |
17
- | Logo or title build | path, shaped-text draw progress, masks, reveal, token motion, and keyframes |
18
- | Abstract field | deterministic path/rect states, gradients, effects, and explicit tracks |
19
-
20
- Persistent frames retain editable layout. `layout="grid"` supports an integer `columns` count with equal columns; spans and `minmax` are unsupported. `layout="none"` enables deliberate positioning.
21
-
22
- Frame child clocks are parent-local. Keyframes are node-local. A child with explicit timing must fit the parent's half-open lifetime. There are no per-frame callbacks; represent state with keyframes, sequence children, text motion, frame choreography, or explicit clips.
23
-
24
- Use `contain` or `cover` media in a frame with resolvable dimensions. Animate frame width/height when layout should reflow; use `reveal` when layout should remain fixed.
@@ -1,29 +0,0 @@
1
- # Title animation primitives
2
-
3
- Titles are native node trees. There is no title-animation library or per-frame callback API.
4
-
5
- ## Primitives
6
-
7
- - **Move, scale, rotate, fade:** node `animate` tracks or frame `motion`.
8
- - **Blur and color:** raw `animate` tracks, not frame poses.
9
- - **Token entrance:** `text.motion` by character, word, or line.
10
- - **Wipe:** frame `reveal` or node mask with `maskWidth`/`maskHeight` animation.
11
- - **Outline and draw-on:** text `strokeColor`/`strokeWidth`; shaped text `textDrawProgress`; path `strokeWidth` animation or mask reveals.
12
- - **Reflowing resize:** animate persistent frame `width` or `height`.
13
- - **Fixed-layout transform:** animate a frame or group transform.
14
- - **State sequence:** `sequence` children, explicit child timing, or keyframe chains.
15
- - **2.5D camera:** top-level node `z` plus `compose(..., { camera })`.
16
- - **Effects:** ordered node `effects`; animate numeric parameters with `property: "effectParam"`, `effectIndex`, and `effectParam`.
17
- - **Motion blur:** `motionBlur: true` or `{ samples, shutter }`; effects are evaluated through motion-blur samples.
18
-
19
- ## Timing contract
20
-
21
- Animation times are local to the node. Replacement properties use one track; raw offsets add and uniform scales multiply. Keyframe times must strictly increase and the chain must end within the node lifetime. Frame children use the immediate parent's local clock and must fit its half-open lifetime.
22
-
23
- Component node trees compile at local time zero. Place only the component instance root on the timeline; nested nodes retain local timing.
24
-
25
- A positioned frame can use `origin="center"` for center-based transforms. Frame `width`/`height` tracks trigger layout; `reveal` does not.
26
-
27
- Text uses flat `strokeColor` and `strokeWidth`, not a `stroke` object. `path()` accepts `M/L/H/V/C/Q/Z` commands in its own pixel coordinate system and does not scale path data merely because `width` or `height` changes.
28
-
29
- Raw easing accepts named curves or four cubic-bezier handles. Frame choreography also supports steps, overshoot, and bounded spring timing.
@@ -1,187 +0,0 @@
1
- # Local project guide
2
-
3
- The local document is `index.tsx` with assets in `media/` and output in `renders/`.
4
- Use local `video_editing_*` tools, not sandbox project APIs. Import assets with
5
- `video_editing_import_media` and check them with `video_editing_media_probe`.
6
-
7
- ## Project
8
-
9
- ```tsx
10
- export default function Project() {
11
- return (
12
- <stage id="stage">
13
- <scene id="scene" width={1080} height={1920} fps={30} fill="#0b0c0e">
14
- <sequence id="cuts">
15
- <video
16
- id="a"
17
- src="./media/a.mp4"
18
- width={1080}
19
- height={1920}
20
- start={0}
21
- end={4}
22
- transition={{ type: "dissolve", duration: 0.5 }}
23
- />
24
- <video
25
- id="b"
26
- src="./media/b.mp4"
27
- width={1080}
28
- height={1920}
29
- start={4}
30
- end={7}
31
- sourceIn={2}
32
- />
33
- </sequence>
34
- <text
35
- id="title"
36
- x={90}
37
- y={860}
38
- width={900}
39
- end={3}
40
- fontSize={96}
41
- fontWeight={700}
42
- align="center"
43
- fill="#ffffff"
44
- enter={{ preset: "slide-up", duration: 0.4 }}
45
- >
46
- Title
47
- </text>
48
- </scene>
49
- </stage>
50
- );
51
- }
52
- ```
53
-
54
- ## Loop
55
-
56
- Read `video_editing_outline`, make bounded `video_editing_edit` changes, preview
57
- with `video_editing_preview_frames`, then render and poll `video_editing_render_status`.
58
- Undo/redo is shared with the panel. Rendered files remain on the user's disk.
59
-
60
- ## Edits
61
-
62
- | op | Fields | Notes |
63
- | ----------- | ----------------------------------------------- | -------------------------------------------------------------- |
64
- | `set-prop` | `id`, `name`, `value` | Literal JSON; `null` removes; paths like `animate.opacity.1.1` |
65
- | `set-text` | `id`, `text` | `<text>` content |
66
- | `insert` | `id` (parent), `tag`, `props`, `text`, `before` | Returns the new id; `props` cannot set `id` |
67
- | `remove` | `id` | |
68
- | `move` | `id`, `parent`, `before` | |
69
- | `retime` | `id`, `start`, `end` | On the parent's clock |
70
- | `set-const` | `name`, `value`, `file` | An `@inspect` const from the outline |
71
-
72
- Refusals write nothing: `expression` (the prop is computed by code), `loop-bound` (made inside a
73
- `map`), `shared-component` (one component used in several places), `not-found`, `ambiguous-id` and
74
- `invalid`. Change the controlling `@inspect` const, edit an unshared element instead, or explain the
75
- limit. Do not repeat a refused edit unchanged.
76
-
77
- A path like `animate.opacity.1.1` (the second keyframe's value) only addresses a literal that already
78
- exists. To add one, set the whole prop: `name: "animate"` with `{ opacity: [[0, 0], [0.5, 1]] }`.
79
-
80
- ## Time
81
-
82
- `Time` is seconds, `"30f"` (frames at the scene fps), `"MM:SS"` or `"HH:MM:SS"`. `start`/`end` are on the
83
- parent scene's or group's clock. Keyframe times are relative to the element's start.
84
-
85
- ## Elements
86
-
87
- `stage`, `scene`, `group`, `sequence`, `rect`, `text`, `textRange`, `image`, `video`, `audio`,
88
- `captions`, `adjustmentLayer`, `shaderPaint`, `surface` and `html`.
89
-
90
- - Transform on visual elements: `x`, `y`, `width`, `height`, `anchorX`/`anchorY` (fractions of the box,
91
- default top-left), `rotation` (degrees), `scale`, `opacity`, `blur`, shadows, `stroke`, `clip`,
92
- `blend`, `mask`, `effects` and `constrainX`/`constrainY`.
93
- - `fill` takes a CSS colour or `{ type: "linear" | "radial", rotation, stops }`.
94
- - `video`/`audio`: `sourceIn`, `volume`, `muted`, `fadeIn`, `fadeOut`, `speed`, `preservePitch` and
95
- `syncTo` (the id of another recording to align by audio). `video`/`image`: `fit` (`cover`, `contain`
96
- or `fill`) and `cornerRadius`.
97
- - `sequence`: clips back to back. Give each child `start`/`end` with every `start` at the previous
98
- `end`; `check` warns about overlaps. A child's `transition` is `dissolve`, `slideFromRight`,
99
- `slideFromLeft`, `fadeToBlack`, `fadeToWhite`, `whipPan`, `zoomThrough` or `pixelDissolve`.
100
- - `textRange start end` restyles characters of its parent `<text>`.
101
- - `captions src`: a `.srt`, `.vtt` or word-timed `.json` transcript; `preset` is `classic`, `whisper`,
102
- `cascade`, `spotlight`, `paper`, `guinea` or `stark`. Shift `sourceIn`/`sourceOut` along with the
103
- footage.
104
- - `adjustmentLayer`: draws nothing; its transform applies to the sibling just before it, which makes
105
- punch-ins and shakes.
106
-
107
- ## Timeline structure
108
-
109
- Each direct child of a scene creates a timeline track, even when its lifetime does
110
- not overlap another child. A direct `<sequence>` creates one track containing its
111
- children as clips; a `<group>` keeps its overlapping children inside one editable clip.
112
-
113
- For consecutive graphic shots, put each shot's text and shapes in a named group,
114
- then put the shot groups in one sequence. Keep independent overlays and audio on
115
- separate tracks when their timing or stacking requires it. Do not put overlapping
116
- elements directly in a sequence or move unrelated layers together merely to reduce
117
- the track count. Preserve sibling order: later siblings paint above earlier ones.
118
-
119
- Use full-scene group geometry for unchanged coordinates. Child times are on the
120
- group's clock: when moving an element into a group starting at 4s, subtract 4s from
121
- its start/end, preserving its animation keyframes relative to its own start.
122
- Keep the computed offsets without rounding; rounding can move an entrance by one frame.
123
- The edit API currently rounds numbers to milliseconds. Inspect written timing after
124
- regrouping; use TSX expressions such as `start={7.8 - 7}` when exact timing requires it.
125
-
126
- This four-shot graphic has one track with four group clips. Inside a group, the
127
- background and title overlap and remain individually editable:
128
-
129
- ```tsx
130
- export default function Project() {
131
- return (
132
- <stage id="stage">
133
- <scene id="scene" width={640} height={360} fps={30} end={4} fill="#101629">
134
- <sequence id="poster" name="Poster shots">
135
- <group id="intro" name="Intro" width={640} height={360} start={0} end={1}>
136
- <rect id="intro-bg" width={640} height={360} fill="#101629" end={1} />
137
- <text id="intro-title" x={40} y={120} end={1} fontSize={48} fill="#ffffff">
138
- MAKE
139
- </text>
140
- </group>
141
- <group id="room" name="Room" width={640} height={360} start={1} end={2}>
142
- <rect id="room-bg" width={640} height={360} fill="#6252f4" end={1} />
143
- <text
144
- id="room-title"
145
- x={40}
146
- y={120}
147
- start={0.1}
148
- end={1}
149
- fontSize={48}
150
- fill="#ffffff"
151
- enter={{ preset: "fade", duration: 0.2 }}
152
- >
153
- ROOM
154
- </text>
155
- </group>
156
- <group id="for" name="For" width={640} height={360} start={2} end={3}>
157
- <rect id="for-bg" width={640} height={360} fill="#25204f" end={1} />
158
- <text id="for-title" x={40} y={120} end={1} fontSize={48} fill="#ffffff">
159
- FOR
160
- </text>
161
- </group>
162
- <group id="wonder" name="Wonder" width={640} height={360} start={3} end={4}>
163
- <rect id="wonder-bg" width={640} height={360} fill="#ff6338" end={1} />
164
- <text id="wonder-title" x={40} y={120} end={1} fontSize={48} fill="#ffffff">
165
- WONDER
166
- </text>
167
- </group>
168
- </sequence>
169
- </scene>
170
- </stage>
171
- );
172
- }
173
- ```
174
-
175
- Inspect the outline after authoring: these groups should appear under `poster`,
176
- with their text and shapes one level deeper. Check shot boundaries and an animated
177
- instant in the preview as well; a successful MP4 render does not verify track structure.
178
-
179
- ## Motion
180
-
181
- `animate={{ opacity: [[0, 0], [0.5, 1, "easeOut"]] }}`: each keyframe is
182
- `[time, value, easing?]`, and the easing applies to the segment that starts there. Easings are
183
- `linear`, `easeIn`, `easeOut`, `easeInOut`, `step` and `cubicBezier(x1, y1, x2, y2)`. Most numeric props and `fill` are animatable.
184
-
185
- `enter`/`exit` take `{ preset, duration, easing, at }`. The presets are `fade`, `grow`, `shrink`, `blur`,
186
- `slide-left`, `slide-right`, `slide-up`, `slide-down`, `spin` and `twist`, plus the text-only
187
- `appear-word`, `appear-character` and `scramble`.
@@ -1,41 +0,0 @@
1
- # Project commands and sync
2
-
3
- ## Mutation models
4
-
5
- | Project | Behavior |
6
- | --------------- | --------------------------------------------------------------------- |
7
- | Script-owned | `build edit.jsx` creates/replaces its timeline |
8
- | Existing/shared | Fresh `read`/`inspect` plus bounded `do` or `ops` changes |
9
- | Canonical | Host-provided connection, ordered transactions and actor-scoped undo |
10
- | Legacy linked | File pull/push; concurrent whole-file writes can overwrite each other |
11
-
12
- ```bash
13
- higgsedit read PROJECT
14
- higgsedit inspect PROJECT --id CLIP_ID --at 6.5
15
- higgsedit do PROJECT --list
16
- higgsedit do PROJECT trim --clipId CLIP_ID --start 1 --end 4
17
- higgsedit ops PROJECT patch.json
18
- ```
19
-
20
- `trim` changes edges in place without moving other clips; its start/end are
21
- absolute scene seconds. `inspect --at` uses whole-project timeline seconds and
22
- requires an ID or unambiguous name. Evaluated effects are not execution proof.
23
- IDs/array paths can change after rebuilds; ops paths require current document state.
24
-
25
- Other verbs include `place`, `insert_ripple`, `remove_ripple`, `broll`, `duck`,
26
- `remove_silences`, and component placement/update. The installed `--list` and
27
- per-verb `--help` provide parameters.
28
-
29
- ## Components and connections
30
-
31
- `components build` compiles local modules; `component.place`, `component.patch`
32
- and `component.update` operate on instances. [Component clocks](assembly.md).
33
-
34
- Legacy `sync link|unlink|push|pull|clone|status|archive` manages file-backed sharing.
35
- Canonical `sync attach` and `sync new-canonical` use supplied connection config;
36
- legacy clone/link is not a substitute for canonical credentials.
37
-
38
- The OpenAI tool surface has no editable-project publishing service. Local project
39
- files are not hosted editor URLs. Canonical sync needs an explicitly supplied
40
- connection; the skill does not supply credentials. Whole-script rebuild still
41
- replaces the timeline.