goatedit-mcp 1.1.15 → 1.1.17

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.
@@ -20501,6 +20501,29 @@ var BASE_TOOLS = [
20501
20501
  },
20502
20502
  method: "addNull"
20503
20503
  },
20504
+ {
20505
+ name: "set_camera",
20506
+ description: 'One camera for the whole sequence. While it is on screen, every clip switched to 3D (set_clip_effect type "layer3d") is seen through it, so a dolly, truck, pan, orbit, zoom or rack focus moves them all together, each by its own depth: near layers slide past far ones. 2D layers ignore it. At rest it changes nothing (layers at posZ 0 draw 1:1), so build the layout flat, push layers back with layer3d posZ (1080p px, bigger is farther), then move the camera. Creates the camera if the sequence has none (spanning the sequence unless startTime/duration say otherwise); call again to change it. Layers stack by track, not by depth: keep nearer layers on higher tracks (the reply warns when they are not).',
20507
+ inputSchema: {
20508
+ type: "object",
20509
+ properties: {
20510
+ cameraId: str("The camera to change, when the sequence has more than one."),
20511
+ startTime: num("Seconds. On a new camera, defaults to 0."),
20512
+ duration: num("Seconds. On a new camera, defaults to the rest of the sequence."),
20513
+ name: str("Display name for a new camera."),
20514
+ params: {
20515
+ type: "object",
20516
+ description: "Static settings. x / y: truck right and pedestal down, 1080p px. z: dolly toward the scene, 1080p px (a layer at posZ 1000 reaches the lens at about z 2480). pan (look right +), tilt (look up +), roll, degrees. orbit (swing right around the pivot +), orbitTilt (rise over it +), degrees; pivotZ: depth of the point it swings around (put it at the hero layer's posZ). fov: vertical field of view, 40 default; narrower zooms in from where the camera stands. focalLength: the same in full-frame mm (33 mm = 40\xB0). aperture: depth-of-field blur, 0 sharp; focus: depth of the plane in focus, 1080p px."
20517
+ },
20518
+ keyframes: {
20519
+ type: "object",
20520
+ description: "Per-setting animation, times in seconds from the camera clip's start: { z: [{ time: 0, value: 0, ease: [0.65, 0, 0.35, 1] }, { time: 3, value: 600 }] } (ease is a CSS cubic-bezier into the next key; hold: true steps). focalLength keys are converted to fov. A static value given in params for a keyframed setting removes its keys."
20521
+ },
20522
+ remove: bool("Delete the camera; 3D layers go back to their own cameras.")
20523
+ }
20524
+ },
20525
+ method: "setCamera"
20526
+ },
20504
20527
  {
20505
20528
  name: "set_parent",
20506
20529
  description: "Parent a clip to another clip or null, After Effects style. The clip stays exactly where it is when parented; from then on it follows the parent's move, scale and rotation, orbiting the parent's position and spreading as it scales. parentId null unparents. position / scale / rotation pick-whip a single channel to a different clip (null cuts that channel loose): a channel parent passes on only its own change. Parent first, then animate the parent.",
@@ -21141,7 +21164,7 @@ var BASE_TOOLS = [
21141
21164
  clipId: CLIP_ID,
21142
21165
  type: {
21143
21166
  type: "string",
21144
- description: "Effect type: blur, invert, hue, saturation, brightness, contrast, exposure, grayscale, sepia, gradientMap, vignette, filmGrain, flicker, posterizeTime, lensDistortion, chromaticAberration, lensFlare, liquidGlass, opacityFx, colorCorrection, depthMap, gradientMap, vegas, glow, pixelDissolve, motionBlur, dropShadow, reflection, colorama, outline, echo, flutedGlass, lightRays, halftone, datamosh, roughenEdges, filmStock, halation, starGlow, filmDamage, lightLeak, thermal, colorBalance, duotone, levels, monochrome, channelMixer, dither, threshold, fourColorGradient, lensBlur, boxBlur, directionalBlur, spinBlur, zoomBlur, sharpen, cameraShake, bulge, twirl, ripple, waveWarp, polarCoords, turbulentDisplace, elasticGrid, gridSplit, cubify, glitch, vhs, ntsc, crtScreen, ledScreen, rgbSplit, jpegGlitch, ascii, macpaint, modulation, stripe, risograph, emboss, bevel, inkBleed, paperTexture, paperCutout, crossHatch, scatter, blobTracker, edgeGlow, pageTurn, lightSweep, deepGlow, twister, fill, compositeOriginal, grid, repeater, plus transform, layer3d, model3d and showcase. Call describe_effect with a type for its parameters, their ranges and what they do before setting anything but the obvious. An unknown name comes back with the full list."
21167
+ description: "Effect type: blur, invert, hue, saturation, brightness, contrast, exposure, grayscale, sepia, gradientMap, vignette, filmGrain, flicker, posterizeTime, lensDistortion, chromaticAberration, lensFlare, liquidGlass, opacityFx, colorCorrection, depthMap, gradientMap, vegas, glow, pixelDissolve, motionBlur, dropShadow, reflection, colorama, outline, echo, flutedGlass, lightRays, halftone, datamosh, roughenEdges, filmStock, halation, starGlow, filmDamage, lightLeak, thermal, colorBalance, duotone, levels, monochrome, channelMixer, dither, threshold, fourColorGradient, lensBlur, boxBlur, directionalBlur, spinBlur, zoomBlur, sharpen, cameraShake, bulge, twirl, ripple, waveWarp, polarCoords, turbulentDisplace, elasticGrid, gridSplit, cubify, glitch, vhs, ntsc, crtScreen, ledScreen, rgbSplit, jpegGlitch, ascii, macpaint, modulation, stripe, risograph, emboss, bevel, inkBleed, paperTexture, paperCutout, crossHatch, scatter, blobTracker, edgeGlow, pageTurn, lightSweep, deepGlow, twister, fill, compositeOriginal, grid, repeater, plus transform, layer3d, camera3d (on a camera clip; use set_camera), model3d and showcase. Call describe_effect with a type for its parameters, their ranges and what they do before setting anything but the obvious. An unknown name comes back with the full list."
21145
21168
  },
21146
21169
  params: {
21147
21170
  type: "object",
@@ -21234,7 +21257,7 @@ var BASE_TOOLS = [
21234
21257
  },
21235
21258
  {
21236
21259
  name: "set_text_animation",
21237
- description: "Give a text clip a staggered entrance \u2014 the words rising one after another, letters typing on, a karaoke highlight sweeping through, a mask wipe travelling over the glyphs. The compositor animates per letter, word or line, so a title arrives instead of cutting on. Naming a preset alone uses the timing it was designed with; unit, stagger and durationIn override it. The response reports how long the entrance takes and warns when it outlasts the clip.",
21260
+ description: "Give a text clip a staggered entrance and exit \u2014 the words rising one after another, letters typing on, a karaoke highlight sweeping through, a mask wipe travelling over the glyphs. The compositor animates per letter, word or line, so a title arrives instead of cutting on. Naming a preset alone uses the timing it was designed with; unit, stagger and durationIn override it. The response reports how long the entrance takes and warns when it outlasts the clip.",
21238
21261
  inputSchema: {
21239
21262
  type: "object",
21240
21263
  properties: {
@@ -21259,7 +21282,19 @@ var BASE_TOOLS = [
21259
21282
  },
21260
21283
  placeholder: str('Colour of a solid bar drawn where each unit will appear until it enters, e.g. "#111111" \u2014 words waiting their turn as redaction bars. Empty string removes it.'),
21261
21284
  activeScale: num("Kinetic presets: size of the active word, 1 for no pop (stops it colliding with its neighbours). Defaults per preset, 1.1\u20131.32."),
21262
- remove: bool("Take the animation off, leaving the text to cut on.")
21285
+ remove: bool("Take the animation off, leaving the text to cut on."),
21286
+ exit: {
21287
+ type: ["object", "null"],
21288
+ description: `How the text leaves: any entrance preset (not the karaoke/kinetic ones or countUp) played out so it finishes on the clip's last frame, through the same units. Set alone, the text cuts on and only animates out. Letter-by-letter delete: { preset: "typewriterCursor" } with unit letter \u2014 the caret blinks, then backspaces last letter first. null removes the exit.`,
21289
+ properties: {
21290
+ preset: str("Exit preset, e.g. blurIn, slideUp, maskRise, typewriter, typewriterCursor (delete with a caret)."),
21291
+ duration: num("Seconds for one unit to leave. Defaults to the preset's."),
21292
+ stagger: num("Seconds between units leaving. Defaults to the preset's."),
21293
+ order: { type: "string", enum: ["forward", "reverse", "center", "edges", "random"], description: "Which unit leaves first. forward: the first word goes first. Defaults to reverse for typewriter exits (backspace), reading order otherwise." },
21294
+ distance: num("Travel in px @1080p for the moving presets."),
21295
+ seed: num("Seed for random order.")
21296
+ }
21297
+ }
21263
21298
  },
21264
21299
  required: ["clipId"]
21265
21300
  },
@@ -22057,8 +22092,8 @@ var SKILLS = [
22057
22092
  {
22058
22093
  "path": "SKILL.md",
22059
22094
  "uri": "skill://goatedit/goatedit-motion-design/SKILL.md",
22060
- "text": '---\nname: goatedit-motion-design\ndescription: Motion design for GoatEdit \u2014 easing, durations, stagger, overshoot, hierarchy and holds with exact numbers; how one scene hands motion to the next (direction, matched speed, cutting mid-motion, carriers); the seam techniques (push, zoom-through, inverse zoom, match cut, morph, rack focus); keeping a scene alive without idle wobble; kinetic typography; and which GoatEdit tool does each. Use before animating anything, joining scenes, or when a video feels static, jumpy, floaty or "like slides".\n---\n\n# Motion design\n\nMotion has one job: show the viewer where to look next. Every move answers\n"what changed, and where should the eye go?" A video should feel like one\ncontinuous camera move through ideas, not a stack of slides that each animate\non their own.\n\n## The numbers\n\n| Principle | Rule |\n| --- | --- |\n| Easing | Never linear. Arriving: ease-out `[0.22,1,0.36,1]`. Leaving: ease-in `[0.55,0,1,0.45]`. Moving on screen: in-out `[0.65,0,0.35,1]`. Snappy arrivals: expo-out. |\n| Duration | Nudge 0.15 s. Entrance 0.3\u20130.5 s, never one element over 0.8 s. Across the frame 0.4\u20130.7 s. Camera push at a cut 0.35\u20130.45 s each side. Exit about 75% of its entrance. |\n| Stagger | 30\u201360 ms between siblings, in reading order or outward from the hero; the whole group inside 0.4\u20130.5 s. With 8+ items tighten the gap rather than lengthen the group. |\n| Overshoot | Pops and arrivals overshoot 5\u201310% and settle. Never on camera moves. No bounce-out or elastic-out eases: they read as a toy. |\n| Anticipation | A big exit starts with 0.1 s the other way, 3\u20135% of the distance. |\n| Hierarchy | One hero move at a time; everything else smaller, shorter or later. |\n| Consistency | Similar elements share one ease and one duration. Never a unique pair per element. |\n| Arcs | Organic things travel on curves; type and UI may go straight. |\n| Squash and stretch | Fast round things stretch along their travel and squash on impact. |\n| Motion blur | Only on fast moves, 2D layers only. |\n| Parallax | Background layers move 30\u201360% as far as the foreground. |\n| Holds | After an impact or reveal, hold 0.3\u20130.6 s. Text stays 0.3 s a word plus 0.5 s. |\n| Stillness before the payoff | Leave 0.3\u20130.75 s between the action and its result \u2014 the dramatic comma. |\n| Rhythm | Alternate fast and slow. Don\'t use the same join twice running unless it is a pattern. |\n| Sync | A visual lands 0.1\u20130.25 s before the word it shows, never after. With music, hero moves land on beats. |\n\n## One film, one current\n\n**Pick one direction for the whole video** \u2014 say, leftward \u2014 and send every\nordinary scene change that way. Other directions are reserved and mean\nsomething when spent:\n\n| Vector | Means |\n| --- | --- |\n| The current (e.g. left) | next beat, forward progress |\n| Up | a conclusion or reveal rising above what came before |\n| Zoom forward (push in) | going deeper into the same thought |\n| Zoom backward (pull out) | arrival: something bigger lands, the payoff |\n\n- Never run two scene changes back to back in opposite directions; ping-pong\n reads as a mistake. A change of direction needs a visible cause (a click,\n an impact) or a new chapter.\n\n## How one scene hands to the next\n\n**The rule:** how scene A leaves decides how scene B arrives \u2014 same axis,\nsame direction, matched speed, and the cut falls mid-motion on both sides.\n\n1. **Axis.** Sideways stays sideways, vertical stays vertical, zoom stays\n zoom.\n2. **Direction.** Never mirror. On zoom, direction is whether things grow or\n shrink: a shrinking (pull-back) exit must be answered by an entrance that\n also shrinks into place (starts oversized), not one that grows from small.\n This is the most common mistake, because grow-from-small is everyone\'s\n default entrance.\n3. **Speed.** Exit with ease-in, enter with the matching ease-out, over the\n same distance and time \u2014 the two halves of one in-out curve, so the speed\n matches at the cut.\n4. **Phase.** Cut while both sides are moving. A scene that settles to rest\n before the cut, or an entrance that starts from rest after it, is a dead\n beat.\n5. **No crossfades between scenes.** A dissolve has nothing for the eye to\n follow. Keep dissolves for time passing or a dream-like mood.\n\n**Carriers.** The eye follows objects. The strongest join hands a concrete\nthing across the cut at the same place and speed: a card that becomes the\nnext screen, a word that becomes a heading, a dot that becomes a map pin, a\ncursor mid-path. Plan carriers at storyboard time.\n\n**Partial travel.** Scene pushes travel about 12% of the frame (about 230 px\nat 1920) with a quick fade, not a full-frame slide. Full-frame slides look\nlike a slideshow.\n\n## The joins, and the GoatEdit tool for each\n\n`list_cuts` shows every cut and which ones are still (`stillCuts`).\n`join_scenes` makes them flow. `auto` picks one and says why in `picked`.\n\n| Technique | Use for | GoatEdit |\n| --- | --- | --- |\n| **Push** (cut the curve) | the default scene change, in the film\'s current | `join_scenes` type `push`, `direction` = the current, `duration` 0.3\u20130.4 |\n| **Zoom-through** | going deeper: fly into one hero element, the next scene opens out of it | `join_scenes` type `zoomThrough`, `clipId` = that element. Never into one letter of a row |\n| **Inverse zoom** | the payoff arriving: outgoing shrinks away, incoming arrives oversized and settles | push-out camera keys with `set_keyframes`: out 1\u21920.8, in 1.25\u21921, expo-out, about 0.7 s total. Spend it once or twice per video |\n| **Match cut** | one layer becomes another in the same spot | `join_scenes` type `matchCut` with `fromClipId`/`toClipId` |\n| **Morph** | every layer grows out of its partner (Smart Animate) \u2014 the strongest join | `join_scenes` type `morph`; name partners with the same last word |\n| **Rack focus** | the one cut you want seen: same surface, new state | blur spike 8\u201312 px peak at the cut with a 1.06 scale breath (`set_clip_effect` blur keyframes); at most once every 8 s |\n| **Hard cut on a beat** | energy, music videos, reels | no join; cut exactly on the beat marker |\n\nBlur on zoom joins: about 10 px for text-sized subjects, 18\u201320 px for\nfull-frame surfaces. Use two or three join types per video and repeat them;\nvariety for its own sake reads as a template showcase.\n\n## Keeping a scene alive\n\nA scene that finishes its entrance with seconds left is a planning problem.\nFill it with story, not wobble. Idle loops on graphics (floating, breathing,\npulsing glow) read as "the video is waiting" \u2014 don\'t. Each stretch between\nentrance and exit belongs to one of these:\n\n- **Staged reveals** \u2014 hold content back and reveal it on the words that\n name it. The default when a scene has two or more ideas.\n- **Camera with intent** \u2014 start wide, travel, arrive on the subject. A slow\n push on a photo or footage (3\u20138% over the shot) counts; `animate_scene`\'s\n `hold` drift on pictures does this.\n A push through a scene with depth is not one zoom: split it into planes\n (backdrop, subject, props in front) and let each grow at its own rate \u2014\n near things grow faster than far ones. Everything on one null scaled\n equally reads flat.\n- **The product doing its thing** \u2014 a progress bar fills, a count ticks, a\n highlight steps down a list.\n- **Acted-out beats** \u2014 a card files into a stack, an item is dragged, a\n result assembles.\n- **Cursor-led** \u2014 an oversized cursor walks to a button and its click\n triggers the next beat.\n\nTest: pause on any second. Something meaningful should be mid-flight.\n\n**Cause and effect.** Chain moves so each is launched by the last \u2014 click,\nsquash, release, flight, impact, recoil, reveal. A reaction starts on the\nframe of its cause, not "shortly after". Heavy things rebound slower; small\nthings snap.\n\n## Entrances\n\n- **Waterfall entry** for titles, openers and lists: words arrive from below\n one after another, each starting before the last settles, gaps shrinking,\n the last one snapping. Heavy words travel 60\u201380 px over 0.16\u20130.2 s, normal\n words 40\u201350 px over 0.13\u20130.16 s, small words 30\u201345 px over 0.1\u20130.13 s.\n Opacity cuts on rather than fading.\n- **One direction per cascade.** Never ease-in-out on an entrance.\n- **Text keeps its own animation.** A text layer gets a text preset\n (`set_text_animation`, letters or words, `delay` for its place in the\n cascade), never a block keyframe move.\n\n| Feel | Hero title | Text | Row of words | Picture hero | Support |\n| --- | --- | --- | --- | --- | --- |\n| smooth | `cinematicRise` | `riseFade` | `riseFade` | blurIn, zoomIn, maskReveal | fadeUp |\n| snappy | `maskRise` | `slideUp` | `maskRise` | popIn, slideIn, maskReveal | slideIn outward from the hero |\n| bouncy | `springUp` | `scaleIn` | `bounceDrop` | dropIn, popIn, spinIn | popIn |\n\nPick one feel for the whole video. `animate_scene` applies these by role\n(ground, hero, support, text, detail, follower) with `style` = the feel; use\n`dryRun: true` to see the plan, then hand-key only the hero move.\n\n## Kinetic typography\n\n- Time every word to the voice: `set_text_animation` with `syncToWords`, or\n cut each word on at its real start from `get_transcript`.\n- One to four words on screen at a time; the key word bigger, heavier or in\n the accent.\n- Vary scale and position with the rhythm of the line \u2014 a stressed word hits\n harder (`slamIn`, `focusPull`), a soft word drifts (`riseFade`).\n- Move the camera, not every word: a group of words can push or rotate as one\n (parent them to a null with `add_null` and `set_parent`).\n- Hand from line to line with a word-level push in the current\'s direction.\n\n## Stepped motion\n\nFor a hand-made, editorial or collage feel, step graphics at 12 fps inside a\n24\u201330 fps video (`set_clip_effect` `posterizeTime`). Keep camera moves and\nfootage smooth.\n\n## Workflow in GoatEdit\n\n1. Approved stills, one element per layer, layers named for their partners.\n2. `animate_scene` (`all: true` or per scene) in one feel.\n3. Hand-key the hero move with `set_keyframes` (times relative to the clip\n start; posX/posY are fractions of the frame).\n4. `list_cuts`, then `join_scenes` on each still cut, in the current.\n5. `lint_motion`; run each finding\'s `fix` calls one at a time; lint again\n until only judgement notes remain.\n6. `export_range` strips around every join and hero move, then fix what you\n see. A lint pass is not a watch.\n\nGoatEdit specifics: HTML clips crop at their box when moved \u2014 animate inside\nthem with CSS. 3D frames render slowly through the bridge, so keep strips\nshort. `describe_motion` returns the numbers `lint_motion` checks.\n',
22061
- "digest": "sha256:d702e8725b07fef02ada42d2a48e236c71d7b1228f00202cad640cf69b6b5033"
22095
+ "text": '---\nname: goatedit-motion-design\ndescription: Motion design for GoatEdit \u2014 easing, durations, stagger, overshoot, hierarchy and holds with exact numbers; how one scene hands motion to the next (direction, matched speed, cutting mid-motion, carriers); the seam techniques (push, zoom-through, inverse zoom, match cut, morph, rack focus); keeping a scene alive without idle wobble; kinetic typography; and which GoatEdit tool does each. Use before animating anything, joining scenes, or when a video feels static, jumpy, floaty or "like slides".\n---\n\n# Motion design\n\nMotion has one job: show the viewer where to look next. Every move answers\n"what changed, and where should the eye go?" A video should feel like one\ncontinuous camera move through ideas, not a stack of slides that each animate\non their own.\n\n## The numbers\n\n| Principle | Rule |\n| --- | --- |\n| Easing | Never linear. Arriving: ease-out `[0.22,1,0.36,1]`. Leaving: ease-in `[0.55,0,1,0.45]`. Moving on screen: in-out `[0.65,0,0.35,1]`. Snappy arrivals: expo-out. |\n| Duration | Nudge 0.15 s. Entrance 0.3\u20130.5 s, never one element over 0.8 s. Across the frame 0.4\u20130.7 s. Camera push at a cut 0.35\u20130.45 s each side. Exit about 75% of its entrance. |\n| Stagger | 30\u201360 ms between siblings, in reading order or outward from the hero; the whole group inside 0.4\u20130.5 s. With 8+ items tighten the gap rather than lengthen the group. |\n| Overshoot | Pops and arrivals overshoot 5\u201310% and settle. Never on camera moves. No bounce-out or elastic-out eases: they read as a toy. |\n| Anticipation | A big exit starts with 0.1 s the other way, 3\u20135% of the distance. |\n| Hierarchy | One hero move at a time; everything else smaller, shorter or later. |\n| Consistency | Similar elements share one ease and one duration. Never a unique pair per element. |\n| Arcs | Organic things travel on curves; type and UI may go straight. |\n| Squash and stretch | Fast round things stretch along their travel and squash on impact. |\n| Motion blur | Only on fast moves, 2D layers only. |\n| Parallax | Background layers move 30\u201360% as far as the foreground. |\n| Holds | After an impact or reveal, hold 0.3\u20130.6 s. Text stays 0.3 s a word plus 0.5 s. |\n| Stillness before the payoff | Leave 0.3\u20130.75 s between the action and its result \u2014 the dramatic comma. |\n| Rhythm | Alternate fast and slow. Don\'t use the same join twice running unless it is a pattern. |\n| Sync | A visual lands 0.1\u20130.25 s before the word it shows, never after. With music, hero moves land on beats. |\n\n## One film, one current\n\n**Pick one direction for the whole video** \u2014 say, leftward \u2014 and send every\nordinary scene change that way. Other directions are reserved and mean\nsomething when spent:\n\n| Vector | Means |\n| --- | --- |\n| The current (e.g. left) | next beat, forward progress |\n| Up | a conclusion or reveal rising above what came before |\n| Zoom forward (push in) | going deeper into the same thought |\n| Zoom backward (pull out) | arrival: something bigger lands, the payoff |\n\n- Never run two scene changes back to back in opposite directions; ping-pong\n reads as a mistake. A change of direction needs a visible cause (a click,\n an impact) or a new chapter.\n\n## How one scene hands to the next\n\n**The rule:** how scene A leaves decides how scene B arrives \u2014 same axis,\nsame direction, matched speed, and the cut falls mid-motion on both sides.\n\n1. **Axis.** Sideways stays sideways, vertical stays vertical, zoom stays\n zoom.\n2. **Direction.** Never mirror. On zoom, direction is whether things grow or\n shrink: a shrinking (pull-back) exit must be answered by an entrance that\n also shrinks into place (starts oversized), not one that grows from small.\n This is the most common mistake, because grow-from-small is everyone\'s\n default entrance.\n3. **Speed.** Exit with ease-in, enter with the matching ease-out, over the\n same distance and time \u2014 the two halves of one in-out curve, so the speed\n matches at the cut.\n4. **Phase.** Cut while both sides are moving. A scene that settles to rest\n before the cut, or an entrance that starts from rest after it, is a dead\n beat.\n5. **No crossfades between scenes.** A dissolve has nothing for the eye to\n follow. Keep dissolves for time passing or a dream-like mood.\n\n**Carriers.** The eye follows objects. The strongest join hands a concrete\nthing across the cut at the same place and speed: a card that becomes the\nnext screen, a word that becomes a heading, a dot that becomes a map pin, a\ncursor mid-path. Plan carriers at storyboard time.\n\n**Partial travel.** Scene pushes travel about 12% of the frame (about 230 px\nat 1920) with a quick fade, not a full-frame slide. Full-frame slides look\nlike a slideshow.\n\n## The joins, and the GoatEdit tool for each\n\n`list_cuts` shows every cut and which ones are still (`stillCuts`).\n`join_scenes` makes them flow. `auto` picks one and says why in `picked`.\n\n| Technique | Use for | GoatEdit |\n| --- | --- | --- |\n| **Push** (cut the curve) | the default scene change, in the film\'s current | `join_scenes` type `push`, `direction` = the current, `duration` 0.3\u20130.4 |\n| **Zoom-through** | going deeper: fly into one hero element, the next scene opens out of it | `join_scenes` type `zoomThrough`, `clipId` = that element. Never into one letter of a row |\n| **Inverse zoom** | the payoff arriving: outgoing shrinks away, incoming arrives oversized and settles | push-out camera keys with `set_keyframes`: out 1\u21920.8, in 1.25\u21921, expo-out, about 0.7 s total. Spend it once or twice per video |\n| **Match cut** | one layer becomes another in the same spot | `join_scenes` type `matchCut` with `fromClipId`/`toClipId` |\n| **Morph** | every layer grows out of its partner (Smart Animate) \u2014 the strongest join | `join_scenes` type `morph`; name partners with the same last word |\n| **Rack focus** | the one cut you want seen: same surface, new state | blur spike 8\u201312 px peak at the cut with a 1.06 scale breath (`set_clip_effect` blur keyframes); at most once every 8 s |\n| **Hard cut on a beat** | energy, music videos, reels | no join; cut exactly on the beat marker |\n\nBlur on zoom joins: about 10 px for text-sized subjects, 18\u201320 px for\nfull-frame surfaces. Use two or three join types per video and repeat them;\nvariety for its own sake reads as a template showcase.\n\n## Keeping a scene alive\n\nA scene that finishes its entrance with seconds left is a planning problem.\nFill it with story, not wobble. Idle loops on graphics (floating, breathing,\npulsing glow) read as "the video is waiting" \u2014 don\'t. Each stretch between\nentrance and exit belongs to one of these:\n\n- **Staged reveals** \u2014 hold content back and reveal it on the words that\n name it. The default when a scene has two or more ideas.\n- **Camera with intent** \u2014 start wide, travel, arrive on the subject. A slow\n push on a photo or footage (3\u20138% over the shot) counts; `animate_scene`\'s\n `hold` drift on pictures does this.\n A push through a scene with depth is not one zoom: split it into planes\n (backdrop, subject, props in front) and let each grow at its own rate \u2014\n near things grow faster than far ones. Everything on one null scaled\n equally reads flat. The direct way: switch each plane to 3D\n (`set_clip_effect` type `layer3d`, `posZ` 0 for the subject, 800\u20132000 for\n backdrops, negative for foreground props) and move one `set_camera`: a\n dolly (`z`), truck (`x`), orbit (`orbit` with `pivotZ` at the subject\'s\n depth) or lens pull (`focalLength`) moves every plane by its own depth.\n Keep nearer planes on higher tracks; layers stack by track, not depth.\n Scale a far plane up by its distance (posZ 1480 halves it) so it still\n fills the frame. `aperture` + `focus` racks focus between planes.\n- **The product doing its thing** \u2014 a progress bar fills, a count ticks, a\n highlight steps down a list.\n- **Acted-out beats** \u2014 a card files into a stack, an item is dragged, a\n result assembles.\n- **Cursor-led** \u2014 an oversized cursor walks to a button and its click\n triggers the next beat.\n\nTest: pause on any second. Something meaningful should be mid-flight.\n\n**Cause and effect.** Chain moves so each is launched by the last \u2014 click,\nsquash, release, flight, impact, recoil, reveal. A reaction starts on the\nframe of its cause, not "shortly after". Heavy things rebound slower; small\nthings snap.\n\n## Entrances\n\n- **Waterfall entry** for titles, openers and lists: words arrive from below\n one after another, each starting before the last settles, gaps shrinking,\n the last one snapping. Heavy words travel 60\u201380 px over 0.16\u20130.2 s, normal\n words 40\u201350 px over 0.13\u20130.16 s, small words 30\u201345 px over 0.1\u20130.13 s.\n Opacity cuts on rather than fading.\n- **One direction per cascade.** Never ease-in-out on an entrance.\n- **Text keeps its own animation.** A text layer gets a text preset\n (`set_text_animation`, letters or words, `delay` for its place in the\n cascade), never a block keyframe move.\n- **Text leaves the way it came.** `set_text_animation` with\n `exit: { preset, duration, stagger, order }` plays a preset out at the clip\n end, carrying on in its own direction (rises in, rises out). Exit alone,\n with no entrance, keeps the words on from frame one. For a typed line that\n deletes itself, `unit: "letter"` plus `exit: { preset: "typewriterCursor",\n stagger: 0.03 }`: last letter first, with a caret that blinks just before.\n Check the reply\'s `exitStartsAt` and any overlap warning; `exit: null`\n removes it. Kinetic presets and countUp cannot be exits.\n\n| Feel | Hero title | Text | Row of words | Picture hero | Support |\n| --- | --- | --- | --- | --- | --- |\n| smooth | `cinematicRise` | `riseFade` | `riseFade` | blurIn, zoomIn, maskReveal | fadeUp |\n| snappy | `maskRise` | `slideUp` | `maskRise` | popIn, slideIn, maskReveal | slideIn outward from the hero |\n| bouncy | `springUp` | `scaleIn` | `bounceDrop` | dropIn, popIn, spinIn | popIn |\n\nPick one feel for the whole video. `animate_scene` applies these by role\n(ground, hero, support, text, detail, follower) with `style` = the feel; use\n`dryRun: true` to see the plan, then hand-key only the hero move.\n\n## Kinetic typography\n\n- Time every word to the voice: `set_text_animation` with `syncToWords`, or\n cut each word on at its real start from `get_transcript`.\n- One to four words on screen at a time; the key word bigger, heavier or in\n the accent.\n- Vary scale and position with the rhythm of the line \u2014 a stressed word hits\n harder (`slamIn`, `focusPull`), a soft word drifts (`riseFade`).\n- Move the camera, not every word: a group of words can push or rotate as one\n (parent them to a null with `add_null` and `set_parent`).\n- Hand from line to line with a word-level push in the current\'s direction.\n\n## Stepped motion\n\nFor a hand-made, editorial or collage feel, step graphics at 12 fps inside a\n24\u201330 fps video (`set_clip_effect` `posterizeTime`). Keep camera moves and\nfootage smooth.\n\n## Workflow in GoatEdit\n\n1. Approved stills, one element per layer, layers named for their partners.\n2. `animate_scene` (`all: true` or per scene) in one feel.\n3. Hand-key the hero move with `set_keyframes` (times relative to the clip\n start; posX/posY are fractions of the frame).\n4. `list_cuts`, then `join_scenes` on each still cut, in the current.\n5. `lint_motion`; run each finding\'s `fix` calls one at a time; lint again\n until only judgement notes remain.\n6. `export_range` strips around every join and hero move, then fix what you\n see. A lint pass is not a watch.\n\nGoatEdit specifics: HTML clips crop at their box when moved \u2014 animate inside\nthem with CSS. 3D frames render slowly through the bridge, so keep strips\nshort. `describe_motion` returns the numbers `lint_motion` checks.\n',
22096
+ "digest": "sha256:e943cba5ddac5db9d265fcaa16e16a139ddffb65c893f5ddea82d1b7bdba1bc4"
22062
22097
  }
22063
22098
  ]
22064
22099
  },
@@ -22074,8 +22109,8 @@ var SKILLS = [
22074
22109
  {
22075
22110
  "path": "SKILL.md",
22076
22111
  "uri": "skill://goatedit/goatedit-video-director/SKILL.md",
22077
- "text": '---\nname: goatedit-video-director\ndescription: Start here for any GoatEdit video \u2014 reel, short, ad, explainer, product launch, tutorial, talking head, kinetic type, montage. The director\'s workflow (brief, references, script, storyboard, style frames, build, motion, sound, checks), which other GoatEdit skill to load for each step, the quality bar a finished video must clear, and the self-review that catches what lint cannot. Use before the first edit of a new video or a big change to one.\n---\n\n# GoatEdit video director\n\nYou are directing a video, not filling a timeline. Tools do the mechanics; this\nskill and its four siblings carry the taste. Load them as you reach each step:\n\n| Step | Load |\n| --- | --- |\n| Look: type, colour, layout, safe areas, choosing a look | `goatedit-visual-design` |\n| Motion: easing, timing, joins between scenes, kinetic type | `goatedit-motion-design` |\n| Story, cutting, B-roll, captions, sound, grade | `goatedit-editing-story` |\n| The playbook for the kind of video asked for | `goatedit-formats` |\n\nNo skill support in your app? Call `get_design_guide` \u2014 it serves the same\ntext by skill, section or keyword (`get_design_guide({ topic: "captions" })`).\n\n## Order of authority\n\n1. What the user asked for in this conversation.\n2. Their saved style (`get_style_profile`) and brand.\n3. These skills.\n\nA reference video the user gives beats every number here. Measure it\n(`begin_request` with `referenceMediaIds`) and match it.\n\n## The workflow\n\nNever skip ahead. Each step ends with something the user can approve.\n\n1. **Brief.** `begin_request` with the edit type and the user\'s style words,\n then `get_style_profile`. Write back, in three lines: who it is for, the\n one thing they should remember, the platform and length. Ask only what you\n cannot infer: platform, length, brand, whether there is a voiceover.\n2. **References.** Ask for one or two videos they like, or name two you will\n aim at ("a Vox explainer", "an Apple product film"). Say what you take from\n each: pacing, type, colour, motion feel.\n3. **Script and beat sheet.** For anything with words, write the script first.\n Split it into beats, one idea each, with a target duration. Spoken words run\n about 2.5 a second; a 30 s reel holds about 70 words. With a voiceover the\n voice is the clock: generate or record it, `transcribe`, and time every beat\n from real word timings, never from word counts.\n4. **Storyboard.** One line per beat: what is on screen, the hero element, the\n layout, what each element is built as (see Build map), the move into the\n next beat. Vary the layouts (full-bleed, split,\n type-only, close-up, data); never the same composition three beats running.\n Plan joins now: layers that become each other across a cut share a name\n ending ("S2 tag Price" then "S3 card Price") so `join_scenes` can morph them.\n5. **Animatic, then style frames.** For motion-graphics pieces, first build\n a rough draft of every section: black and white, plain type, flat shapes,\n one simple move each, timed to the voice or music. It proves the plan \u2014\n which idea goes in which section and when each move lands \u2014 before any\n polish. Then build two or three key frames as finished stills (the hook,\n the busiest beat, the end card), `render_preview_frame` each and show the\n user. Polish nothing until the plan and the look are approved. One element\n per layer.\n6. **Build.** Lay every beat on the timeline with its real duration. Plan\n tracks first (overlapping clips on one track replace each other): V1 main\n picture, V2 B-roll, V3 graphics, V4 captions; A1 voice, A2 music, A3\n effects. Mark beats with `set_scene`. Where the connector offers `run_tools`,\n send several edits as one call.\n7. **Motion.** `animate_scene` per scene in one feel for the whole video,\n hand-key only the hero move, then join the cuts (`list_cuts`, `join_scenes`).\n See `goatedit-motion-design`.\n8. **Sound.** Music bed, voice, effects only on visible actions, ducking,\n loudness. See `goatedit-editing-story`.\n9. **Check** (below). Fix, re-check, then hand over with the report.\n\nFor a quick edit (trim this, add captions, swap the music) skip to the step it\ntouches, but still run the checks that cover it.\n\n## Build map: what each element is made of\n\nDecide this per element at storyboard time and write it in the storyboard as\na "build as" column. The rule under every row: **anything the user might want\nto move, retime, recolour or swap is its own layer.**\n\n| Element | Build as | Not as |\n| --- | --- | --- |\n| Designed words \u2014 a headline, a kinetic line, a word that changes colour | text clips (`create_text_clip` + `set_text_animation`), one clip per line, or per word when that word moves on its own | words inside an HTML clip, or caption cards |\n| Spoken words, timed to the voice | captions (`generate_captions`), on their own track, one style | text clips placed by hand, words in HTML |\n| A word that turns into an icon or a picture | the word, the icon and the next word as separate clips; `join_scenes` `morph` or `matchCut` between them | one clip with everything baked in |\n| UI that behaves like UI \u2014 a typing field, chat bubbles arriving, a list scrolling, a toggle, a progress bar | one HTML clip per UI surface, CSS or WAAPI animation, no scripts. Text inside the UI stays in the HTML: it is part of the interface, not the film\'s type | a pile of text and shape clips pretending to be an app |\n| A moving backdrop \u2014 mesh gradient, soft glow blobs, grid, grain | one HTML clip on the lowest track, or a shape with effects | baked into a picture or into the scene\'s HTML |\n| A phone, laptop or monitor showing something | the device as its own layer; the screen content (HTML, footage, still) as another, masked to the screen with `set_mask` and parented to the device with `set_parent`; hands on top as a cut-out | one flat picture of a device with a screen |\n| A ring, globe, tunnel, orbit, fan or carousel of cards \u2014 pictures, clips or UI stills looping in 3D | `create_showcase` with the right template (the Presets panel\'s Showcase shelf), filled from the bin; tune it with `set_clip_effect` on its showcase effect | cards keyframed one by one round a null |\n| A product with words circling it | `create_showcase` with a product template (`productRing`, `productOrbit`\u2026) and the cut-out or 3D model | hand-built text on a path |\n| A few floating photos or cut-outs that each move on their own | one image clip each (`remove_background` for cut-outs), each with its own shadow, parented to a null (`add_null`) so the group drifts as one | a flattened collage image |\n| Props with depth \u2014 candy shapes, a tumbling object, a glass ring | `create_3d_shape` with one `material` family for the whole video | 3D for flat UI, body text or anything that must be read |\n| A logo with depth, a word as a solid | `create_3d_object` (text, or a transparent PNG or SVG) | \u2014 |\n| Logo reveal | the mark and the wordmark as separate layers so they can assemble | one image that fades in |\n| A scene change | `join_scenes` between the scenes | a transition drawn inside an HTML clip |\n\n**Text: designed or caption?** Ask: if the voice were deleted, would this text\nstill need to be on screen? Yes \u2014 it is designed type: a text clip, placed and\nanimated with the layout. No \u2014 it transcribes speech: a caption. A video can\nhave both; they never share a track or a style, and a designed headline never\ndoubles as the caption of the line it shows.\n\n**When HTML is the right call.** Something that behaves like a web page or an\napp, or motion that is trivial in CSS and miserable to keyframe (a ticker, a\ntyping cursor, a looping gradient). When it is wrong: the parts must animate\nseparately, morph into the next scene, be retimed by the user, or the text is\nthe hero. An HTML clip is one layer to everything else in GoatEdit. HTML clip\nrules: layout in px for the composition size, longhand font properties rather\nthan the `font` shorthand, class-styled divs rather than styled `b` or `span`,\nand animate inside the snippet \u2014 moving the clip crops it at its box.\n\n**When 3D earns its place.** One hero object or a handful of accents a scene,\nlit and finished the same way across the video (one material family, one\nlight direction). It renders slower than anything else, so keep it to the\nmoments that need depth: a logo, a product, props that burst or tumble past a\ndevice. Depth comes from scale, blur and parallax as much as from the model.\n\n**Track order, bottom to top:** backdrop; footage and devices; collage and 3D\nprops; designed type; UI overlays and cursor; captions; brand bug.\n\n**Breaking down a reference.** Watch it through, then for each section write:\ntime in and out, what is on screen, every element with its "build as" from\nthe table above, the move into the next section, and what the music does\nthere. That table is the storyboard; build from it, never from memory of the\nvideo.\n\n**Measure a reference shot before moving anything.** Thumbnails and contact\nsheets are too small to read perspective or depth; guesses from them are\nwrong. Pull full-resolution frames every ~0.1 s across the move (`ffmpeg`, or\n`preview_media` with `saveToDisk`) and measure a few things per frame: the\nsubject\'s width, where its top edge sits, how much that edge narrows (tilt).\nThose numbers tell a camera move (subject grows, edge barely moves) from a\nslide, give the starting tilt, and show *when* it moves \u2014 most moves happen in\na short burst and then hold. Match that timing with the eases; never spread a\nmove evenly because the reference "moves for a second". After every change,\nrender your frame and the reference at the same timestamps, side by side.\n\n## Tool habits that save rework\n\n- **Swap a picture, don\'t re-add it.** `replace_clip_media` changes what a\n clip plays and keeps its position, scale, effects, grade, keyframes and\n parent. Deleting and inserting starts the new clip from defaults. A picture\n of a different shape keeps the same scale \u2014 check the framing.\n- **Parent first, then animate the parent.** `set_parent` measures the child\n against the parent\'s pose when the child starts (or at `time`), not the\n playhead. Set the child\'s position and scale for the parent as it is at\n that moment. To follow a parent that is already animated, pass the `time`\n you laid the child out at.\n- **One effect on many clips.** Applying an effect with several clips\n selected adds it to each; in the editor, editing or removing it from the\n inspector changes all of them. Over MCP, `set_clip_effect` acts on the\n clip you name \u2014 call it per clip, or use `batch_edit`.\n- **Frames to disk.** Over the local connector `render_preview_frame` and\n `preview_media` write a full-resolution file by default and return its path;\n read it with your file tools. Over the cloud connector they come back\n inline, shrunk to fit. Contact sheets (`times`) are one image either way.\n- **Cut-outs keep their transparency through a colour grade and the CSS-type\n effects** (brightness, contrast, blur). Grade the cut-out to match the\n ground it sits on.\n- **3D limits today.** Each 3D layer has its own camera \u2014 fake a shared camera\n by giving near layers more scale growth than far ones. A 3D layer cannot be\n a parent: for a screen that tilts with a phone, nest the phone and its\n screen (`nest_clips`) and put the 3D layer on the nest. A `.glb` model\'s\n screen cannot show an image or video.\n\n## The quality bar\n\nA finished video clears all of these. Each is something a viewer notices.\n\n- **The first frame works as a thumbnail** and the first 2\u20133 seconds say what\n the video is about, even muted.\n- **One focal point per frame.** The hero is clearly bigger, brighter or\n sharper than everything else \u2014 about 2\u20133\xD7 the next element. If you squint\n and two things compete, one goes.\n- **Everything is readable.** Text holds on screen at least 0.3 s a word plus\n 0.5 s, sits inside the safe area, and has contrast of 4.5:1 or better\n (body) and 3:1 (large display type) against what is actually behind it.\n- **Nothing moves linearly, nothing moves for no reason.** Every move points\n the eye at what changed. No idle bobbing to fill time \u2014 add story instead.\n- **The cuts flow.** Every scene change is either a deliberate hard cut on a\n beat or a join where motion carries through.\n- **The layouts vary** and the look stays one look: one type family pairing,\n one palette, one motion feel, the same caption style throughout.\n- **Every picture earns its place.** B-roll shows the noun being said, at the\n moment it is said. No generic stock filler, no tiny UI floating in space.\n- **Sound is finished.** Voice clear and on top, music ducked under it, no\n clipped peaks, loudness near the platform target.\n- **It ends on purpose** \u2014 a payoff, a call to action, or a held end card \u2014\n never a fade to nothing mid-thought.\n\n## Checks before handing over\n\nRun them and say which ran and what they showed. A check not run is reported\nas not run, never as passed.\n\n1. `lint_timeline` and `lint_motion`; apply each fix one call at a time, lint\n again until only judgement notes remain.\n2. `list_cuts` \u2014 every cut intended; `stillCuts` joined or deliberate.\n3. `export_range` with 12\u201324 frames over each section (one tiled sheet), and\n a strip around every join (\u22120.3, \u22120.15, 0, +0.15, +0.35 s). Look for blank\n frames, flashes, text over faces, captions over the wrong shot.\n4. `render_preview_frame` at the first frame, the busiest frame, the end card,\n and behind every caption style.\n5. `probe_audio` over the whole video: voice present, `truePeak` at or below\n \u22121 dBTP, integrated loudness near the platform target.\n6. The self-review below.\n\n## Self-review: critique it like a hard client\n\nLook at the frames from step 3 and score each line 1\u201310. Anything under 7\ngets fixed before you hand over, and you say what you changed.\n\n- **Impact** \u2014 does the first frame stop a scroll? Is there one clear idea?\n- **Hierarchy** \u2014 one dominant element per frame, a clear reading order,\n weight and size contrast (not everything bold).\n- **Colour and type** \u2014 a deliberate palette (not default pure red, pure\n black, pure white), at most two families, sizes from one scale.\n- **Motion** \u2014 eases with character, staggered entrances, joins that carry\n momentum, no dead air and no wobble.\n- **Craft** \u2014 alignment to a grid, consistent margins, no clipped text, no\n stray layers, captions consistent.\n- **Story** \u2014 hook, build, payoff; every beat earns its seconds.\n\nThen name the single weakest frame and improve it. A lint pass is not a watch:\nyou cannot hear, so ask the user to watch for lip sync and clipped words.\n\n## Failure list \u2014 what makes a video look AI-made\n\n- The same centred title-over-background layout on every beat.\n- Small subjects floating in big empty frames; whole web pages shrunk to phone\n size.\n- Everything bold, everything the same size, everything the same colour.\n- Default palettes: pure #FF0000, #000000 and #FFFFFF together; rainbow\n accents; a different accent per scene.\n- Linear moves, everything entering at once, every element fading up the same\n way, crossfades between every scene.\n- Text that leaves before it can be read; captions that blink or jump styles.\n- Stock shots that only loosely match the words; AI stills used as B-roll;\n invented numbers or redrawn logos.\n- A music bed at full level over the voice, a whoosh on every cut.\n- Ending on a fade to black in the middle of a sentence.\n\n## Talking to the user\n\n- Before a long run of edits, say the plan in two or three lines, then work\n without stopping to ask.\n- Offer variants for open-ended requests (one sequence each: fast cut, story\n cut, minimal cut) and call `record_choice` when they pick, so GoatEdit\n learns their taste.\n- Never publish or post anything, never promise a video will go viral, never\n call a draft final \u2014 the user\'s review is the last gate.\n',
22078
- "digest": "sha256:2e7e3bbc86aeb1f37c50e77c898ca1e9af330fd7ee225a3a5cc2122e8f840d48"
22112
+ "text": '---\nname: goatedit-video-director\ndescription: Start here for any GoatEdit video \u2014 reel, short, ad, explainer, product launch, tutorial, talking head, kinetic type, montage. The director\'s workflow (brief, references, script, storyboard, style frames, build, motion, sound, checks), which other GoatEdit skill to load for each step, the quality bar a finished video must clear, and the self-review that catches what lint cannot. Use before the first edit of a new video or a big change to one.\n---\n\n# GoatEdit video director\n\nYou are directing a video, not filling a timeline. Tools do the mechanics; this\nskill and its four siblings carry the taste. Load them as you reach each step:\n\n| Step | Load |\n| --- | --- |\n| Look: type, colour, layout, safe areas, choosing a look | `goatedit-visual-design` |\n| Motion: easing, timing, joins between scenes, kinetic type | `goatedit-motion-design` |\n| Story, cutting, B-roll, captions, sound, grade | `goatedit-editing-story` |\n| The playbook for the kind of video asked for | `goatedit-formats` |\n\nNo skill support in your app? Call `get_design_guide` \u2014 it serves the same\ntext by skill, section or keyword (`get_design_guide({ topic: "captions" })`).\n\n## Order of authority\n\n1. What the user asked for in this conversation.\n2. Their saved style (`get_style_profile`) and brand.\n3. These skills.\n\nA reference video the user gives beats every number here. Measure it\n(`begin_request` with `referenceMediaIds`) and match it.\n\n## The workflow\n\nNever skip ahead. Each step ends with something the user can approve.\n\n1. **Brief.** `begin_request` with the edit type and the user\'s style words,\n then `get_style_profile`. Write back, in three lines: who it is for, the\n one thing they should remember, the platform and length. Ask only what you\n cannot infer: platform, length, brand, whether there is a voiceover.\n2. **References.** Ask for one or two videos they like, or name two you will\n aim at ("a Vox explainer", "an Apple product film"). Say what you take from\n each: pacing, type, colour, motion feel.\n3. **Script and beat sheet.** For anything with words, write the script first.\n Split it into beats, one idea each, with a target duration. Spoken words run\n about 2.5 a second; a 30 s reel holds about 70 words. With a voiceover the\n voice is the clock: generate or record it, `transcribe`, and time every beat\n from real word timings, never from word counts.\n4. **Storyboard.** One line per beat: what is on screen, the hero element, the\n layout, what each element is built as (see Build map), the move into the\n next beat. Vary the layouts (full-bleed, split,\n type-only, close-up, data); never the same composition three beats running.\n Plan joins now: layers that become each other across a cut share a name\n ending ("S2 tag Price" then "S3 card Price") so `join_scenes` can morph them.\n5. **Animatic, then style frames.** For motion-graphics pieces, first build\n a rough draft of every section: black and white, plain type, flat shapes,\n one simple move each, timed to the voice or music. It proves the plan \u2014\n which idea goes in which section and when each move lands \u2014 before any\n polish. Then build two or three key frames as finished stills (the hook,\n the busiest beat, the end card), `render_preview_frame` each and show the\n user. Polish nothing until the plan and the look are approved. One element\n per layer.\n6. **Build.** Lay every beat on the timeline with its real duration. Plan\n tracks first (overlapping clips on one track replace each other): V1 main\n picture, V2 B-roll, V3 graphics, V4 captions; A1 voice, A2 music, A3\n effects. Mark beats with `set_scene`. Where the connector offers `run_tools`,\n send several edits as one call.\n7. **Motion.** `animate_scene` per scene in one feel for the whole video,\n hand-key only the hero move, then join the cuts (`list_cuts`, `join_scenes`).\n See `goatedit-motion-design`.\n8. **Sound.** Music bed, voice, effects only on visible actions, ducking,\n loudness. See `goatedit-editing-story`.\n9. **Check** (below). Fix, re-check, then hand over with the report.\n\nFor a quick edit (trim this, add captions, swap the music) skip to the step it\ntouches, but still run the checks that cover it.\n\n## Build map: what each element is made of\n\nDecide this per element at storyboard time and write it in the storyboard as\na "build as" column. The rule under every row: **anything the user might want\nto move, retime, recolour or swap is its own layer.**\n\n| Element | Build as | Not as |\n| --- | --- | --- |\n| Designed words \u2014 a headline, a kinetic line, a word that changes colour | text clips (`create_text_clip` + `set_text_animation`), one clip per line, or per word when that word moves on its own | words inside an HTML clip, or caption cards |\n| Spoken words, timed to the voice | captions (`generate_captions`), on their own track, one style | text clips placed by hand, words in HTML |\n| A word that turns into an icon or a picture | the word, the icon and the next word as separate clips; `join_scenes` `morph` or `matchCut` between them | one clip with everything baked in |\n| UI that behaves like UI \u2014 a typing field, chat bubbles arriving, a list scrolling, a toggle, a progress bar | one HTML clip per UI surface, CSS or WAAPI animation, no scripts. Text inside the UI stays in the HTML: it is part of the interface, not the film\'s type | a pile of text and shape clips pretending to be an app |\n| A moving backdrop \u2014 mesh gradient, soft glow blobs, grid, grain | one HTML clip on the lowest track, or a shape with effects | baked into a picture or into the scene\'s HTML |\n| A phone, laptop or monitor showing something | the device as its own layer; the screen content (HTML, footage, still) as another, masked to the screen with `set_mask` and parented to the device with `set_parent`; hands on top as a cut-out | one flat picture of a device with a screen |\n| A ring, globe, tunnel, orbit, fan or carousel of cards \u2014 pictures, clips or UI stills looping in 3D | `create_showcase` with the right template (the Presets panel\'s Showcase shelf), filled from the bin; tune it with `set_clip_effect` on its showcase effect | cards keyframed one by one round a null |\n| A product with words circling it | `create_showcase` with a product template (`productRing`, `productOrbit`\u2026) and the cut-out or 3D model | hand-built text on a path |\n| A few floating photos or cut-outs that each move on their own | one image clip each (`remove_background` for cut-outs), each with its own shadow, parented to a null (`add_null`) so the group drifts as one | a flattened collage image |\n| Props with depth \u2014 candy shapes, a tumbling object, a glass ring | `create_3d_shape` with one `material` family for the whole video | 3D for flat UI, body text or anything that must be read |\n| A logo with depth, a word as a solid | `create_3d_object` (text, or a transparent PNG or SVG) | \u2014 |\n| Logo reveal | the mark and the wordmark as separate layers so they can assemble | one image that fades in |\n| A scene change | `join_scenes` between the scenes | a transition drawn inside an HTML clip |\n\n**Text: designed or caption?** Ask: if the voice were deleted, would this text\nstill need to be on screen? Yes \u2014 it is designed type: a text clip, placed and\nanimated with the layout. No \u2014 it transcribes speech: a caption. A video can\nhave both; they never share a track or a style, and a designed headline never\ndoubles as the caption of the line it shows.\n\n**When HTML is the right call.** Something that behaves like a web page or an\napp, or motion that is trivial in CSS and miserable to keyframe (a ticker, a\ntyping cursor, a looping gradient). When it is wrong: the parts must animate\nseparately, morph into the next scene, be retimed by the user, or the text is\nthe hero. An HTML clip is one layer to everything else in GoatEdit. HTML clip\nrules: layout in px for the composition size, longhand font properties rather\nthan the `font` shorthand, class-styled divs rather than styled `b` or `span`,\nand animate inside the snippet \u2014 moving the clip crops it at its box.\n\n**When 3D earns its place.** One hero object or a handful of accents a scene,\nlit and finished the same way across the video (one material family, one\nlight direction). It renders slower than anything else, so keep it to the\nmoments that need depth: a logo, a product, props that burst or tumble past a\ndevice. Depth comes from scale, blur and parallax as much as from the model.\n\n**Track order, bottom to top:** backdrop; footage and devices; collage and 3D\nprops; designed type; UI overlays and cursor; captions; brand bug.\n\n**Breaking down a reference.** Watch it through, then for each section write:\ntime in and out, what is on screen, every element with its "build as" from\nthe table above, the move into the next section, and what the music does\nthere. That table is the storyboard; build from it, never from memory of the\nvideo.\n\n**Measure a reference shot before moving anything.** Thumbnails and contact\nsheets are too small to read perspective or depth; guesses from them are\nwrong. Pull full-resolution frames every ~0.1 s across the move (`ffmpeg`, or\n`preview_media` with `saveToDisk`) and measure a few things per frame: the\nsubject\'s width, where its top edge sits, how much that edge narrows (tilt).\nThose numbers tell a camera move (subject grows, edge barely moves) from a\nslide, give the starting tilt, and show *when* it moves \u2014 most moves happen in\na short burst and then hold. Match that timing with the eases; never spread a\nmove evenly because the reference "moves for a second". After every change,\nrender your frame and the reference at the same timestamps, side by side.\n\n## Tool habits that save rework\n\n- **Swap a picture, don\'t re-add it.** `replace_clip_media` changes what a\n clip plays and keeps its position, scale, effects, grade, keyframes and\n parent. Deleting and inserting starts the new clip from defaults. A picture\n of a different shape keeps the same scale \u2014 check the framing.\n- **Parent first, then animate the parent.** `set_parent` measures the child\n against the parent\'s pose when the child starts (or at `time`), not the\n playhead. Set the child\'s position and scale for the parent as it is at\n that moment. To follow a parent that is already animated, pass the `time`\n you laid the child out at.\n- **One camera, not many keyframed layers.** For a 3D move across a layout,\n put the planes in 3D at their depths and animate `set_camera` once,\n instead of keying Z on every layer. The reply lists the layers it sees\n and warns when a far layer sits on a higher track than a near one.\n- **One effect on many clips.** Applying an effect with several clips\n selected adds it to each; in the editor, editing or removing it from the\n inspector changes all of them. Over MCP, `set_clip_effect` acts on the\n clip you name \u2014 call it per clip, or use `batch_edit`.\n- **Frames to disk.** Over the local connector `render_preview_frame` and\n `preview_media` write a full-resolution file by default and return its path;\n read it with your file tools. Over the cloud connector they come back\n inline, shrunk to fit. Contact sheets (`times`) are one image either way.\n- **Cut-outs keep their transparency through a colour grade and the CSS-type\n effects** (brightness, contrast, blur). Grade the cut-out to match the\n ground it sits on.\n- **3D limits today.** Each 3D layer has its own camera \u2014 fake a shared camera\n by giving near layers more scale growth than far ones. A 3D layer cannot be\n a parent: for a screen that tilts with a phone, nest the phone and its\n screen (`nest_clips`) and put the 3D layer on the nest. A `.glb` model\'s\n screen cannot show an image or video.\n\n## The quality bar\n\nA finished video clears all of these. Each is something a viewer notices.\n\n- **The first frame works as a thumbnail** and the first 2\u20133 seconds say what\n the video is about, even muted.\n- **One focal point per frame.** The hero is clearly bigger, brighter or\n sharper than everything else \u2014 about 2\u20133\xD7 the next element. If you squint\n and two things compete, one goes.\n- **Everything is readable.** Text holds on screen at least 0.3 s a word plus\n 0.5 s, sits inside the safe area, and has contrast of 4.5:1 or better\n (body) and 3:1 (large display type) against what is actually behind it.\n- **Nothing moves linearly, nothing moves for no reason.** Every move points\n the eye at what changed. No idle bobbing to fill time \u2014 add story instead.\n- **The cuts flow.** Every scene change is either a deliberate hard cut on a\n beat or a join where motion carries through.\n- **The layouts vary** and the look stays one look: one type family pairing,\n one palette, one motion feel, the same caption style throughout.\n- **Every picture earns its place.** B-roll shows the noun being said, at the\n moment it is said. No generic stock filler, no tiny UI floating in space.\n- **Sound is finished.** Voice clear and on top, music ducked under it, no\n clipped peaks, loudness near the platform target.\n- **It ends on purpose** \u2014 a payoff, a call to action, or a held end card \u2014\n never a fade to nothing mid-thought.\n\n## Checks before handing over\n\nRun them and say which ran and what they showed. A check not run is reported\nas not run, never as passed.\n\n1. `lint_timeline` and `lint_motion`; apply each fix one call at a time, lint\n again until only judgement notes remain.\n2. `list_cuts` \u2014 every cut intended; `stillCuts` joined or deliberate.\n3. `export_range` with 12\u201324 frames over each section (one tiled sheet), and\n a strip around every join (\u22120.3, \u22120.15, 0, +0.15, +0.35 s). Look for blank\n frames, flashes, text over faces, captions over the wrong shot.\n4. `render_preview_frame` at the first frame, the busiest frame, the end card,\n and behind every caption style.\n5. `probe_audio` over the whole video: voice present, `truePeak` at or below\n \u22121 dBTP, integrated loudness near the platform target.\n6. The self-review below.\n\n## Self-review: critique it like a hard client\n\nLook at the frames from step 3 and score each line 1\u201310. Anything under 7\ngets fixed before you hand over, and you say what you changed.\n\n- **Impact** \u2014 does the first frame stop a scroll? Is there one clear idea?\n- **Hierarchy** \u2014 one dominant element per frame, a clear reading order,\n weight and size contrast (not everything bold).\n- **Colour and type** \u2014 a deliberate palette (not default pure red, pure\n black, pure white), at most two families, sizes from one scale.\n- **Motion** \u2014 eases with character, staggered entrances, joins that carry\n momentum, no dead air and no wobble.\n- **Craft** \u2014 alignment to a grid, consistent margins, no clipped text, no\n stray layers, captions consistent.\n- **Story** \u2014 hook, build, payoff; every beat earns its seconds.\n\nThen name the single weakest frame and improve it. A lint pass is not a watch:\nyou cannot hear, so ask the user to watch for lip sync and clipped words.\n\n## Failure list \u2014 what makes a video look AI-made\n\n- The same centred title-over-background layout on every beat.\n- Small subjects floating in big empty frames; whole web pages shrunk to phone\n size.\n- Everything bold, everything the same size, everything the same colour.\n- Default palettes: pure #FF0000, #000000 and #FFFFFF together; rainbow\n accents; a different accent per scene.\n- Linear moves, everything entering at once, every element fading up the same\n way, crossfades between every scene.\n- Text that leaves before it can be read; captions that blink or jump styles.\n- Stock shots that only loosely match the words; AI stills used as B-roll;\n invented numbers or redrawn logos.\n- A music bed at full level over the voice, a whoosh on every cut.\n- Ending on a fade to black in the middle of a sentence.\n\n## Talking to the user\n\n- Before a long run of edits, say the plan in two or three lines, then work\n without stopping to ask.\n- Offer variants for open-ended requests (one sequence each: fast cut, story\n cut, minimal cut) and call `record_choice` when they pick, so GoatEdit\n learns their taste.\n- Never publish or post anything, never promise a video will go viral, never\n call a draft final \u2014 the user\'s review is the last gate.\n',
22113
+ "digest": "sha256:43c3ec584429bfed2025c96ae4fbf059fb5b414522bdb3888bc0349554e60805"
22079
22114
  }
22080
22115
  ]
22081
22116
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goatedit-mcp",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "Local MCP server for the GoatEdit video editor: drive your open editor tab from Claude Code or any MCP client",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",