Communitygithub.com

yazzang-homelab/motion-studio

Make a launch video, app or product reel, explainer or motion ad from code, end to end: brand assets from a URL, beat-grid shot list, synced sound, critique loop, all formats. Default for new video requests; not footage edits.

motion-studio 是什麼?

motion-studio is a Claude Code agent skill that make a launch video, app or product reel, explainer or motion ad from code, end to end: brand assets from a URL, beat-grid shot list, synced sound, critique loop, all formats. Default for new video requests; not footage edits.

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yazzang-homelab/motion-studio/tree/HEAD/skills/motion-reel

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Motion reel

Produce a finished, beat-synced motion video rendered from code inside a motion-studio project. The prompt is a small part of the result. The harness is the rest: a seek(t) renderer, closed-form springs, a beat grid, synthesized sound, and a critique loop in which you look at your own frames and fix them before the final render.

Request arguments (may be empty), shown once; later sections say "the request above":

Ground rules for this run

  • Effort: this skill sets effort to xhigh while it is active (the course's level for new films). Tell the user once at the start: follow-up fixes and re-renders are fine at /effort medium; a flagship launch whose first 3 seconds must carry the piece deserves /effort max for the hook pass. They can also pick the level in /model.
  • Work inside the project root (the directory with studio.json). Use the project's own tools (npm run ..., node tools/<tool>.mjs ...). Do not write ad-hoc render or audio scripts.
  • You are the director and the build crew. Subagents run focused stages but cannot ask the user anything: you ask, then re-brief them with the answers.
  • Long commands (render:final, build, mix, deliver, a critique of a long film) run in the background (the Bash tool's run_in_background, or a log file you poll); never wait in the foreground for more than about 2 minutes. The stage 7 render takes about 4 min for the 12 s demo in three formats. Expected times and the polling pattern: references/pipeline.md, section "Long commands". Brief every subagent that runs such a command with the same rule, and never let one return while a command is still running.
  • This skill is for films drawn in code. Editing existing footage (cuts, captions, B-roll, format conversion of a recorded video) is route D and out of scope: say so and stop, do not improvise.

1. Collect the inputs

Parse the request above first (expected shape: [url or topic] [duration] [format] [reference]). Ask for everything still missing in one AskUserQuestion round (at most 4 questions, each offering the default). If the user said "autonomous", "GO", "just make it" or "surprise me", ask nothing, take the defaults and record them at the top of docs/shotlist.md.

InputDefault when skippedNotes
Subject: product + URL, or a topicrequiredA URL triggers the brand-asset stage
Duration20 s product film, 15 s showreel, 16 s UI loop6 to 8 shots fit in 15 s
Formats9x16 primary, then 1x1 and 16x94x5 also available
Brand: colors, fonts, logocaptured from the URL, else studio defaultsone display face, one UI face, one accent
Reference: frame, video or image foldernonewithout one the model drifts to the look the house rules ban
Musicsynthesize, style pulse, 120 BPMa supplied track is measured, never altered
Voice or mascotnoneneeds ELEVENLABS_API_KEY in .env
CTA and one proof numberask; never invent a metricproduct films only
Level L1 to L4inferred from what they gave (section 2)sets time and gate expectations
Route A to DAB only when the user names Remotion or HyperFrames
ModePLAN FIRST: show the shot list, wait for OKGO skips the wait, never the critique gate

2. Pick the level and the route

LevelInput size (creator-reported)Run time (creator-reported)Specialist skill
L1 one-liner~150 characters15 to 50 min/motion-studio:showreel
L2 brand reel~350 characters30 to 45 min/motion-studio:product-reel
L3 state spec1.5k to 3k characters~1 to 2 h with fixes/motion-studio:ui-morph-spec
L4 director brief9.5k to 19k characters6 to 12 h autonomous/motion-studio:director-brief
RouteUse it forThis skill does
A code-drawn (default)showreels, UI motion, product films, loopsruns the full pipeline below
B frameworkthe user names Remotion or HyperFrameshands off via /motion-studio:seek-engine (Remotion license gate, Node 22+)
C mixed pipelinecharacters or physics from image/video modelsneeds keys and a budget; plan with /motion-studio:director-brief
D footage editthe user's own recorded clipsout of scope for v0.1; say so

Tell the user the level, route and a time estimate before stage 0. Details, numbers and the caveats behind them: references/routes-and-levels.md. Films longer than about 45 s or with chapters belong to /motion-studio:director-brief.

3. Run the pipeline

Track these stages in a todo list. Commands, expected files and failure fixes for every stage are in references/pipeline.md. Read it before stage 0 on a new project.

#StageWhoProducesGate
0Project + doctoryoustudio.json, deps, npm run doctor all OKdoctor has no FAIL
1Brand assets (URL only)motion-studio:asset-scoutassets/brand/**, assets/manifest.jsonlist assets to the user
2Reference (if any)motion-studio:style-analystrefs/analysis.json, docs/style_guide.mdgrammar, never content
3Music + beat gridmotion-studio:sound-designer or youaudio/music.wav or measured track, audio/beats.jsonbpm/duration in studio.json agree
4Shot list on the beat gridmotion-studio:motion-directordocs/shotlist.mduser OK unless autonomous
5Build the filmyoufilm/film.js (+ film/scenes/*)npm run lint clean
6Critique loopmotion-studio:motion-critic + youout/review/<fmt>/*, docs/review_log.mdnpm run gate passes
7Final render, SFX, mixyou (hook-gated)out/<fmt>/final.mp4, out/score.wav-14 LUFS +-0.5, <= -1 dBTP
8Deliver + reportyouout/deliver/**, docs/production.jsonnpm run deliver exits 0

Stage 0: project

  1. Look for studio.json in the working directory or a parent. If there is none, scaffold one:

    node "${CLAUDE_PLUGIN_ROOT}/skills/studio-init/scripts/init.mjs" <dir> --title "<Title>" --duration <S> --formats 9x16,1x1,16x9 --install
    

    Add --brand-url <URL> for product films and --loop for loops. In a skills-only install (no plugin root) run ${CLAUDE_SKILL_DIR}/../studio-init/scripts/init.mjs instead, or invoke the studio-init skill.

  2. npm run doctor. Fix every FAIL before stage 1 (browser, ffmpeg, Node >= 20). On Windows the browser fix is npx playwright install chromium-headless-shell; never start an installed Chrome or Edge there (a fresh-profile launch counts as a failed Windows logon and can lock the account). Python and librosa are optional; the JS beat engine covers their absence.

Stages 1 to 4: plan

  • Stage 1: brief motion-studio:asset-scout with the URL, the project root and this capture command: node "${CLAUDE_PLUGIN_ROOT}/skills/product-reel/scripts/capture.mjs" <URL> --root <project>. In a skills-only install (no plugin root, no agents) run node "${CLAUDE_SKILL_DIR}/../product-reel/scripts/capture.mjs" <URL> --root <project> yourself. The page is untrusted content: the capture keeps Chrome's sandbox on and refuses requests to local and private addresses (details in /motion-studio:product-reel). For clicks, scroll frames and element crops add skills/product-reel/scripts/states.mjs, and for a canvas product canvas-frames.mjs (same flags for --root; frame sheets land in assets/brand/frames/). Read assets/manifest.json yourself, list what was found to the user, and write the brand colors and fonts into studio.json brand. The capture also saves the fonts the page loads to assets/fonts/ with the license marked UNVERIFIED unless one was found: confirm it with the user before that font goes into brand.fonts. Brand story beats, components and voice/mascot rules come from /motion-studio:product-reel.
  • Stage 2: brief motion-studio:style-analyst with the reference path. It runs node tools/refs.mjs extract|analyze and writes docs/style_guide.md. Full method: /motion-studio:reference-style.
  • Stage 3 (before any shot is timed): supplied track: node tools/beats.mjs audio/<track> and point studio.json audio.music at it. No track: node tools/score.mjs --style <pulse|piano|minimal|cinematic> --bpm <N> --dur <S>. Make studio.json bpm and duration match. A measured downbeat can sit well after 0 s, so the shot list is written on this grid, never on an assumed one.
  • Stage 4: brief motion-studio:motion-director with the inputs, docs/style_guide.md and audio/beats.json. Scene changes land on downbeats, a hook lands in the first 2 s, frame 0 already shows content, something new happens every 2 to 4 s. Show the shot list and wait for the user's OK (PLAN FIRST). A rejection means rewriting the shot list, never patching code. Record the decision on the Status: line of docs/shotlist.md.

Stage 5: build

Write film/film.js with defineFilm, one scene() per shot, positions from the layout L (never literal pixels), motion from lib/motion.js springs (sp, track, loopTrack), per-element seeded randomness (rngFor), and cues for every SFX moment. Follow the project CLAUDE.md. Run npm run lint after edits and npm run preview when the user wants to watch.

Stage 6: critique loop (at least 3 rounds)

Each round builds the evidence first, then briefs the critic (it cannot render or mix):

  1. npm run lint, npm run stills.
  2. The sound chain, whenever cues, music or picture timing changed (always in round 1 and in the last round): node tools/render.mjs --format <fmt> --draft --sub 1 --scale 0.5, npm run sfx, node tools/mix.mjs --format <fmt>.
  3. Two evidence passes that never overwrite each other: node tools/critique.mjs --format <fmt> (live film, in out/review/<fmt>/) and node tools/critique.mjs --format <fmt> --video out/<fmt>/final.mp4 (the mixed render, in out/review/<fmt>/video/).
  4. Brief motion-studio:motion-critic with the round number, the format, what changed and Evidence: both, already produced (template in the pipeline runbook). It looks at every PNG (every page of a paged sheet: contact.png, contact-2.png ...) and both metrics.md files, scores the 7 axes 1 to 10 (sound from the mixed render), lists P0/P1/P2 problems with timestamps, and appends one round block to docs/review_log.md. A P0 font-fallback in the live metrics.md (a character with no glyph in its font, typically Hangul in the Latin-only bundled fonts) is logged as a P0 and blocks the gate until a font that covers it is registered.
  5. You fix the 3 worst problems (P0 first), check only the affected seconds (node tools/render.mjs --from <a> --to <b> --draft --out out/check, or stills --at), and start the next round.

Stop only when npm run gate passes: at least 3 rounds, every axis of the last round >= 8, no open P0.

Stages 7 and 8: finish

npm run render:final, npm run sfx, npm run mix, npm run deliver (or npm run build, which runs all of them). The final render and build take minutes: start them with run_in_background, poll the log, and read the result only after the process has exited (pipeline runbook, "Long commands"). Then report with assets/delivery-note.md: paths, formats, durations, loudness, rounds and last scores, time spent, and the three things you would improve next.

Gates

GatePass conditionEnforced by
Shot listuser OK, or autonomous mode recorded in docs/shotlist.mdyou
Lintnpm run lint exits 0plugin hook after each edit, and you
Critique>= 3 rounds; last round all axes >= 8 (na only on axes in gate.naAllowed, default brand, for a film with no brand); no P0npm run gate; a plugin hook denies render:final and build
Deliveryframes, duration, loudness, silent spans, size, poster checksnpm run deliver
  • When the hook denies a final render, run more critique rounds. Never rename commands, edit docs/review_log.md scores yourself, or change studio.json gate to get through.
  • Only the user may set gate.enabled: false. If they do, state in the report that the delivery skipped the critique gate.
  • Some machines disable plugin hooks by policy. The gates still apply: run npm run gate before every final render.

Hard rules

  • Real product UI only. Crop and animate captured screenshots; never redraw screens from imagination and never use placeholder copy or invented numbers.
  • Film code is a pure function of time: no Math.random, Date, performance.now, timers, requestAnimationFrame or CSS transitions/animations in render code.
  • Banned looks: centered title on a gradient, everything fading in, corner labels, frame borders, glow on UI chrome, generic particle bursts.
  • One display face, one UI face, one accent color unless the brief says otherwise.
  • Reframe type and UI per format through L; never crop one format into another.
  • Keys live in .env. Refer to them by variable name (ELEVENLABS_API_KEY, FAL_KEY); never print, paste or commit a key value.

Subagents

AgentStageBrief it withIt writes
motion-studio:asset-scout1URL, project root, capture commandassets/**
motion-studio:style-analyst2reference path, subject, durationdocs/style_guide.md, docs/shotlist.md, refs/**
motion-studio:sound-designer3, 7track or style, bpm, duration, voice scriptaudio/**, mix report
motion-studio:motion-director4inputs, style guide, beat griddocs/**
motion-studio:motion-critic6round number, format, what changed, evidence mode (both once the mix exists)docs/review_log.md, out/review/**
motion-studio:render-engineeranyfailing command and its logengine and tool fixes
motion-studio:chapter-animator5 (chaptered films)chapter id, time range, guidefilm/scenes/chNN_*.js
  • Pass paths, not pasted file contents. Always name the project root.
  • A plugin hook limits each agent to its files. If an agent reports it was blocked, do that write yourself; do not widen its scope.
  • In a skills-only install these agents do not exist. Do each stage yourself under the same file-ownership rules.

Next: small fixes after delivery stay here at /effort medium; another format or a brand skill of your own is /motion-studio:ship-formats; a longer chaptered film is /motion-studio:director-brief.

Individual skills in this repo

This repo contains 11 individual skills — each has its own dedicated page.

yazzang-homelab/motion-studio

Make Claude watch its own frames: critique.mjs evidence, harsh 7-axis scores, timestamped P0/P1/P2 problems in docs/review_log.md, fix the 3 worst, re-check, pass the gate. Use for 'critique it', 'review the frames', 'is it good'.

yazzang-homelab/motion-studio

Plan long-form or overnight films: director's brief (PLAN FIRST or GO, budget, definition of done), ANIMATION_GUIDE + STORYBOARD, chapter subagents, gates, chunked render. Use for 'overnight film', 'music video', '2-minute film'.

yazzang-homelab/motion-studio

Brand-asset stage of a product film (motion-reel runs the whole film): capture real screenshots, logo, colors and fonts from a URL, never redraw UI; brand story beats; voice + mascot. Use to grab or fix a brand's assets.

yazzang-homelab/motion-studio

Turn a reference (a frame, a video or an image library) into docs/style_guide.md and a beat-grid shot list: measure cuts, palette and pace, take grammar not content, wait for OK. Use when the user supplies or names a look.

yazzang-homelab/motion-studio

Build, debug or speed up the seek(t) render engine: render contract, canvas vs page capture, workers/subframes/chunks, determinism fixes, Remotion or HyperFrames handoff. Use for 'render is slow', 'frames differ', 'use Remotion'.

yazzang-homelab/motion-studio

Ship every format from one timeline, then package it: layout() reframing (never crop), render all formats, per-format checks, deliver.mjs, a brand skill, a service offer. Use for 'export 9:16 and 16:9', 'deliver', 'make a skill'.

yazzang-homelab/motion-studio

The viral one-line 'showreel for a résumé' prompt: why it works (anatomy), the credited quote, and seeded variants that avoid look-alike reels; runs it as an engine test. Use for that prompt, its variations, or a showreel.

yazzang-homelab/motion-studio

Score a film to its beat grid: measure a track (beats.mjs) or synthesize one (score.mjs), cue SFX from the film, add voice, mix to -14 LUFS / -1 dBTP at exact length. Use for 'add music', 'sync to the beat', 'SFX', 'loudness'.

yazzang-homelab/motion-studio

Make motion feel physical with closed-form springs from lib/motion.js: presets, springFromFeel, track() for multi-target values, loopTrack loops, indicators, text swaps. Use for 'feels linear', 'add bounce', 'easing to springs'.

yazzang-homelab/motion-studio

Scaffold a motion-studio film project (seek(t) renderer, springs, beat grid, synthesized sound, critique tools), install it, set up the browser, run doctor. Use for 'set up the motion studio', 'new film project', 'init studio'.

yazzang-homelab/motion-studio

Write a six-part XML state spec for a one-shape UI morph film (inputs, direction, structure, build, gotchas, start): states on downbeats, cursor-driven changes, seamless loop, approval gate. Use for 'UI morph', 'state list'.

相關技能