@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.
- package/README.md +63 -26
- package/dist/cli.mjs +284 -112
- package/dist/guide.md +2 -3
- package/dist/index.html +1 -1
- package/dist/launcher.mjs +34 -14
- package/dist/server.mjs +209 -265
- package/node_modules/@higgsfield/higgsedit/dist/api.d.ts +481 -0
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-PFQYUJQL.mjs → chunk-3XVMJSV2.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-F4CMIG5G.mjs → chunk-4VE54E4U.mjs} +3 -1
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-2JYLVSVV.mjs → chunk-55JARHLA.mjs} +205 -65
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-YLVXQIPX.mjs → chunk-E4N76T2R.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-OCIZ36XD.mjs → chunk-ECRSOIKI.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-IEPPEDEU.mjs → chunk-ENALCTAD.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/chunk-HY2E7IWX.mjs +43 -0
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-NARTAWRN.mjs → chunk-HYCUOCUQ.mjs} +9 -4
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-C3GSB3XZ.mjs → chunk-NLEIBCAK.mjs} +1 -7
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-2WKNH7OL.mjs → chunk-O3AVYZ6U.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/chunk-UXO22E3P.mjs +22 -0
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-BH2QF635.mjs → chunk-V5XTCFYK.mjs} +4 -100
- package/node_modules/@higgsfield/higgsedit/dist/chunk-W2TANYEH.mjs +118 -0
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-DVN4LUXV.mjs → chunk-XY5CCUOZ.mjs} +2 -6
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-KIWGVAPJ.mjs → chunk-Y7SAX2P4.mjs} +8 -12
- package/node_modules/@higgsfield/higgsedit/dist/chunk-YNAIRXOP.mjs +22 -0
- package/node_modules/@higgsfield/higgsedit/dist/{chunk-WENFTPXQ.mjs → chunk-ZO3NDQD3.mjs} +1 -1
- package/node_modules/@higgsfield/higgsedit/dist/higgsedit.mjs +13 -13
- package/node_modules/@higgsfield/higgsedit/package.json +4 -1
- package/package.json +4 -4
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/skills/video-editing/SKILL.md +109 -95
- package/plugin/mcp.json +0 -10
- package/plugin/plugin.json +0 -41
- package/plugin/skills/motion-craft/SKILL.md +0 -87
- package/plugin/skills/motion-craft/agents/openai.yaml +0 -6
- package/plugin/skills/motion-craft/references/causality.md +0 -25
- package/plugin/skills/motion-craft/references/composition.md +0 -20
- package/plugin/skills/motion-craft/references/easing.md +0 -19
- package/plugin/skills/motion-craft/references/qc.md +0 -33
- package/plugin/skills/motion-craft/references/recipes.md +0 -31
- package/plugin/skills/motion-craft/references/stepped.md +0 -43
- package/plugin/skills/motion-craft/references/timing.md +0 -60
- package/plugin/skills/motion-craft/references/tsx.md +0 -60
- package/plugin/skills/motion-craft/references/typography.md +0 -22
- package/plugin/skills/video-editing/agents/openai.yaml +0 -6
- package/plugin/skills/video-editing/references/animation-contract.md +0 -45
- package/plugin/skills/video-editing/references/assembly.md +0 -58
- package/plugin/skills/video-editing/references/caption-systems.md +0 -29
- package/plugin/skills/video-editing/references/caption-titling.md +0 -41
- package/plugin/skills/video-editing/references/clip-geometry.md +0 -37
- package/plugin/skills/video-editing/references/compose.md +0 -283
- package/plugin/skills/video-editing/references/editor-measured.md +0 -37
- package/plugin/skills/video-editing/references/failure-modes.md +0 -37
- package/plugin/skills/video-editing/references/local-setup.md +0 -25
- package/plugin/skills/video-editing/references/motion-language.md +0 -27
- package/plugin/skills/video-editing/references/provenance.md +0 -7
- package/plugin/skills/video-editing/references/sandbox.md +0 -31
- package/plugin/skills/video-editing/references/shot-blueprints.md +0 -24
- package/plugin/skills/video-editing/references/title-animation.md +0 -29
- package/plugin/skills/video-editing/references/tsx-projects.md +0 -187
- 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.
|