Loading...
Loading...
Builds bespoke motion graphics for an edit, one animated clip per beat (HyperFrames + GSAP), each designed for its line and landing on the spoken word, then lays them on the footage through the style-edit render. Picks the beats that need motion (a count, a list, a flow, a before and after, a run, a mechanism), writes a brief per clip, runs one clip-builder agent per clip at once, gates every clip (lint, layout, render, a frame-to-frame motion check, contact sheets), and falls back to the template card for a clip that fails. Use when the user says "animation", "motion graphic", "animate this", "animate the part where I say X", "make a clip for", "build the animations", or when style-edit or visual-prep reaches the beats that need motion. Not for captions or zooms (style-edit), not for real screenshots and logos alone (overlays), not for a product demo film (product-video).
npx skill4agent add nextwork-projects/ai-video-editor-cooked motion${CLAUDE_SKILL_DIR}${CLAUDE_PLUGIN_ROOT}M="${CLAUDE_SKILL_DIR}/scripts/motion.py"python3pyvisuals.json (style-edit step 3) -> motion.py pick -> motion/<id>/{index.html, brief.md, beat.json}
-> one clip-builder agent per clip -> motion.py check (gates + render) -> motion.py place
-> visuals.json video_card beats -> plan.py -> stills -> render (the clip plays on its word)python3 "${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/setup.py" doctormotion clipspickAnimations fell back: ...python3 "$M" pick edits/<name>motion{"engine": "clips" | "templates", "amount": 0-1, "kinds": {"counter", "list", "flow", "before_after", "ui_demo", "curve", "logo": true|false}, "look": "default"}likesnotesflowside_by_sideprogressterminalchattoastscurvelogo_clusteramountnoteslikesflowside_by_sideedits/<name>/motion/<id>/beat.jsonbrief.mdreferences/looks.mddefaultreferences/shapes.mdmotion/<id>/brief.mdclip-builder${CLAUDE_PLUGIN_ROOT}/agents/clip-builder.mdreferences/clip-brief-card.mdindex.htmlmotion.py checkpython3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py" "$M" check edits/<name>/motion/<id>check_clip.pyhyperframes linthyperframes check --at-transitionscheck_motion.pycheck_composition.pymeasure_ink.pyrenders/sheet.pngrenders/strip.pnggates.jsonreferences/clip-brief-card.mdreferences/build-loop.mdreferences/visual-system.mdreferences/scenes.mdrenders/sheet.pngpython3 "$M" place edits/<name>video_cardimages/motion-<id>.mp4clip_motion.pystart_sfallbackpython3 "$M" strips edits/<name>/render.mp4 --at <t1>,<t2>,<t3>,<t4> --out edits/<name>/stills/motion-strips.png --safepython3 "$M" note edits/<name> "make the counter bigger" --at <note time>notes.mdclip-builderbrief.mdplaceedit.py patchpython3 "$M" save edits/<name>$AI_EDITOR_HOME/motion-library/<id>/pickstart.htmlcheckpython3 "$M" library [archive|unarchive|use <id>]motionamountkindslookdefaulteditorialeditorial-darkmonoposter-redposter-greenposter-blueengine: "templates"layout.mode: "split"50/50panelverify.mjsreferences/fifty-fifty.mdlayout.mode: "board"Motion designboardreferences/board.md| message | do |
|---|---|
| |
a clip still | leave it: place restores its template |
| the render path is wrong or the render failed: style-edit step 7 |
scripts/motion.pycheck_clip.pycheck_motion.pycheck_composition.pymeasure_ink.pyclip_motion.pydemotemplate/scripts/verify.mjsreferences/clip-brief-card.mdvisual-system.mdbuild-loop.mdscenes.mdlooks.mdfifty-fifty.mdboard.md