Communitygithub.com

Iwang-f/motion-reel

이 스튜디오에서 코드로 모션 비디오를 렌더링합니다 (canvas + window.seek(t), Playwright, ffmpeg, 합성 사운드). 사용자가 런치 비디오, 쇼릴, 릴스, TikTok 또는 스토리 콘텐츠, 애니메이션 설명 영상, 모션 광고를 요청하거나, 초안이나 캐러셀을 비디오로 전환하려 할 때, 또는 모션 스튜디오 저장소에서 '새로운 필름'을 원할 때 사용하세요; `/motion-reel build <film>` 명령어로 보드 승인된 필름을 빌드합니다.

motion-reel란 무엇인가요?

Motion Reel은 개발자가 브라우저 기반 캔버스와 `window.seek(t)` 함수를 사용하여 코드로 렌더링된 모션 비디오를 제작할 수 있는 AI 에이전트 스킬입니다. 주로 Playwright와 ffmpeg를 활용한 실제 제품 스크린샷, 로고 캡처 및 비디오 합성 과정을 포함하며, 음성 해설(ElevenLabs)과 배경 음악(합성 또는 제공된 트랙)을 통합합니다. 이 스킬은 사전 제작(브리핑, 스토리, 자산, 샷 리스트, 보드)과 빌드(코드 기반 모션 그래픽 렌더링)의 두 단계로 나뉘어 실행됩니다. 지원 플랫폼은 Claude Code 등 AI 코딩 에이전트이며, 디자인 시스템, 브랜드 가이드라인, 이전 프로젝트의 결정 사항을 참조하여 일관성을 유지합니다. 핵심 강점은 모든 모션을 결정론적 시간 함수로 구현하여 재현성을 보장하고, 컨텍스트 비용을 최적화하며, 사람의 승인(오너 리뷰)을 필수 게이트로 두어 창의적 의사 결정을 보존하는 데 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Iwang-f/motion-reel-skill/tree/HEAD/.claude/skills/motion-reel

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Motion reel

이 저장소 자체 엔진으로 새로운 필름을 빌드하세요. 사용자가 명시적으로 언급하지 않는 한 Remotion이나 HyperFrames로 전환하지 마세요; 저장소의 렌더링 계약은 CLAUDE.md에 있으며 이 파일보다 우선합니다.

필름은 두 세션으로 실행되며, 오너가 샷 목록과 보드를 함께 승인하는 시점에서 분할됩니다:

  • 사전 제작 (이 파일): 브리핑, 스토리, 자산, 음성, 비트 그리드, 샷 목록, 보드.
  • 빌드 (/motion-reel build <film>): build.md를 읽고 따르세요; 이 파일은 건너뜁니다.

분할 지점은 빌드를 새로운 컨텍스트에서 시작하게 합니다. 사전 제작은 창을 참고 자료, 테이크 및 보드 이미지로 채우며, 이후의 모든 턴은 그 비용을 부담합니다.

1. 브리핑 확정

오너의 초안에 대해 node tools/brief.mjs --in=<draft.md>를 실행하세요 (--film=<film>은 프로젝트가 존재할 때 사용: 포함된 base64 없이 brief/original.md를 작성합니다). 헤더, 예산 대비 VO 단어, 초안이 남겨둔 미결 사항을 출력합니다. 초안이 없으면 요청에 따라 docs/brief-template.md의 헤더 필드를 채우고 각 공백에 기본값을 제안하세요: 오너는 "oke" 하나 또는 수정 사항으로 답변합니다.

코드를 건드리기 전, 그리고 크레딧을 인용하기 전에 한 메시지로 여전히 열려 있는 사항을 물어보세요; brief/decisions.md에 이미 있는 답변은 유지됩니다. 도구가 볼 수 없는 다음을 추가하세요:

  • 중복: 동일 주제 또는 기둥에 대한 과거 필름 (projects.json). 어떤 것인지, 그리고 이 필름이 추가하는 내용을 말하세요. 리메이크는 기존 폴더를 그대로 두고 해당 decisions.md의 답변 중 어떤 것이 여전히 유효한지 물어보세요.
  • 제품 + URL (또는 주제). OpenView 필름의 경우, docs/content-map.md의 기둥과 공식.
  • 브랜드: OpenView 필름은 lib/brand.js를 사용합니다. 다른 브랜드: 색상, 글꼴, 하나의 악센트, 실제 로고.
  • 참고 자료: 프레임, 비디오 또는 이미지 폴더. 또는 "없음" (그렇다면 그렇게 말하세요; 기본 룩은 없습니다).
  • 음악: 제공된 트랙 (측정) 또는 "합성" (기본값).
  • 음성 해설: .env에 ELEVENLABS_API_KEY가 필요합니다. 비어 있으면 중단하고 변수 이름을 알리세요.

언어, 음성, 길이, 비율, 주제 (티커 포함), 데이터 소스 (앱, 키트 또는 일러스트레이션) 및 에너지가 확정되면 브리핑이 확정됩니다. 이 중 하나라도 과거 필름의 첫 번째 테이크 이후 이동되면, mi-demo-40은 VO에 세 번 비용을 지불했습니다. 답변을 <project>/brief/decisions.md에 기록하세요.

다른 도구(스토리보드, zip, 핸드오프)의 패키지: 수정 없이 <project>/references/<tool>-<date>/에 복사하세요. 이 폴더는 커밋에서 제외되며, 해당 브리핑에 대해서만 tools/brief.mjs를 실행하세요. 결정에 해당 파일이 필요할 때만 다른 파일을 엽니다. 해당 샷 목록과 스크립트는 초안의 순서처럼 중요한 자료입니다.

제한 사항: 브리핑 또는 법적 규칙이 화면에서 금지하는 단어, 수치 또는 사실은 <src>/forbid.json에 넣습니다 (tools/forbid-lib.mjs): tools/vo.mjs는 크레딧을 사용하기 전에 거부하고, tools/check.mjs는 화면에 있을 때 실패 처리합니다. 패턴이 볼 수 없는 제한 (백분율을 표시하지 않는 이름)은 brief/decisions.md에 넣고, 모든 보드 및 검토 시트와 대조하여 읽습니다.

필름 슬러그([a-z0-9-]+)를 선택하세요. 아래 모든 것은 해당 슬러그로 이름이 지정됩니다: <film>.

프로젝트 레이아웃. 새 필름은 CONTENT 프로젝트 폴더 (CLAUDE.md "새 비디오 프로젝트 폴더")와 projects.json에 "<film>": "CONTENT/<n>. <제목> (<날짜>)" 줄을 받습니다; 그러면 도구가 해당 위치를 찾습니다 (tools/paths.mjs): 샷 목록과 브리핑은 <project>/brief/ (shotlist.md), 코드는 <project>/src/ (film.js, timeline.js, vo-lines.json, beats.json, sfx-<film>.mjs), 테이크와 미디어는 <project>/assets/, 보드, 시트 및 렌더링은 <project>/output/에 있습니다. 오래된 필름은 docs/<film>-shotlist.md, film/<film>/, assets/<film>/ 및 out/을 유지합니다. 아래에서 <shotlist>, <src>, <assets> 및 <output>은 해당하는 것을 의미합니다.

2. 사전 제작

  1. 자산. <assets>/에 넣고, 애니메이션 전에 나열하세요.

    • OpenView 로고 및 심볼: lib/brand.js를 통해서만 그립니다; SVG를 필름에 직접 복사하지 마세요.
    • OpenView 마스코트: lib/mascot/의 코드 리그 (API는 lib/mascot/index.js의 헤더와 내보내기에 있음).
    • OpenView Market Intel: 최신 origin/main의 수치와 이름, 코드로 Market Intel UI 키트를 사용하여 그림을 그립니다. 브리핑이 실제 앱을 요청할 때만 실행 중인 앱을 캡처하세요; 그런 다음 CLAUDE.md의 "Market Intel source"를 따르세요; capture_mi.mjs --review에서 밴드를 선택하고 lib/proof.js로 그립니다.
    • URL이 있는 다른 제품: Playwright로 실제 스크린샷, 로고, 색상, 글꼴을 캡처하세요.
  2. 시각적 세계. REFERENCES/motion/visual-grammar-2026-10.md를 읽은 다음, <shotlist> 상단에 ## World를 샷보다 먼저 작성하세요: 한 장소, 그 객체, 그 안에 서 있는 사람, 빛이 하는 일, 브리핑의 각 인물과 관계가 가리킬 수 있는 것이 되는 방법. lib/world.js로 그리세요. 디자인 시스템은 제품 자체 화면에 남아 있습니다. 스타일 가이드. 참고 자료가 있으면 먼저 측정하세요: uv run --python 3.11 --with librosa --with numpy tools/ref_probe.py refs/<film>/ref.mp4 refs/<film>/analysis.json 그런 다음 docs/<film>-style_guide.md를 작성하세요: 팔레트 (hex), 타입, 샷 길이, 전환, 카메라 움직임, 텍스처, 텍스트 진입 및 종료 방식. 문법은 취하되 내용은 취하지 마세요. 기본 룩은 CLAUDE.md "Look"과 docs/motion-vocab.md입니다; 다른 필름의 스타일 가이드는 해당 필름을 기록하며 기본 룩을 기록하지 않습니다.

  3. 스토리. story.md를 읽고, 주제를 Topic 사다리에 통과시키고, <shotlist> 상단에 스크립트보다 먼저 스파인 테이블을 작성하세요. 모든 행이 채워지고 해당 파일 끝의 스크립트 테스트가 첫 번째 줄과 개요를 통과하면 스파인이 완료됩니다; 초안의 순서는 여기서 중요한 자료이지 스크립트가 아니며, 초안의 ALUR CERITA 및 KANDIDAT HOOK (docs/brief-prompt.md)은 첫 번째 버전입니다. VO 인용문과 함께 스파인을 보여주세요: 필름을 변경하기에 가장 저렴한 순간입니다. 초안에서, 동일한 메시지는 초안이 다루고 스크립트가 생략하는 내용을 두 단어 수와 함께 명명합니다: pandu-supra-80은 첫 번째 필름 후 "ga selengkap draft"로 돌아왔으며, 확장은 세 번의 추가 세션이 걸렸습니다.

  4. 음성 해설 (브리핑에 VO가 있는 경우): CLAUDE.md의 "Voice-over"를 따르세요. 스파인에서 조사자 음성(story.md "The viewer")으로 스크립트를 작성하되, 단어 예산까지, 숫자가 말해지는 대로 계산하세요: 인도네시아어 1,7은 6개 필름이 1.12 (1,65–1,75 단어/필름-초)로 실행되었으므로, 전체 예산은 브리핑의 초에 가깝게 도달합니다. character 기본값은 calm, fair narrator, talking to one person입니다. 그런 다음 <src>/vo-lines.json과 story.md의 마지막 섹션을 tools/script.mjs가 통과할 때까지 진행하세요; credits 줄이 견적입니다. tools/vo.mjs로 생성하고 --check를 전달하세요. 정의 및 법적 용어는 다른 수치와 마찬가지로 references/sources.md에 출처가 필요합니다; R-120은 등록 이름을 화면에서 제외하지만, 소스 파일에서 제외하지는 않습니다. 테이크는 장면 길이를 설정합니다: <src>/timeline.js는 lib/vo-clock.js의 장면 목록입니다 (sceneTimeline; 모델: iata-55), 그리고 node tools/prepare.mjs --film=<film>은 테이크를 확인하고 클록을 beats.json에 씁니다.

  5. 비트 그리드. 제공된 트랙: BPM/비트/다운비트/히트를 측정하여 (librosa) <src>/beats.json에 넣습니다. 합성: BPM을 선택하고 <src>/sfx-<film>.mjs를 작성하세요. lib/synth.mjs의 큐 목록 (모델: iata-55의 src/sfx-iata-55.mjs)으로, beats.json과 <output>/<film>-audio.wav를 -14 LUFS로 출력합니다.

  6. 샷 목록. 비트 그리드에 <shotlist>를 작성하세요: 모든 샷의 프레임, 카메라, 화면 텍스트, SFX, 스파인 비트, 사용된 docs/motion-vocab.md의 효과, 다음 샷으로의 컷 이유 (다음 단계, 같은 위치, 원인과 결과, 시간 점프, 콜백, 크기 변화). 컷 이유가 없는 샷은 카메라 움직임으로 다음 샷에 합쳐집니다. 제품으로의 진입 경로를 하나의 움직임으로 계획하세요. 세계 객체가 화면이 되어 컷 양쪽의 샷에서 이름이 지정됩니다: 이로 인해 delisting-18-80 (45–50초)의 빌드에서 오너의 유일한 창의적 수정이 발생했습니다. 여기서 장면별로 밀도를 계획하세요: 각 움직임이 담을 내용, 최근 모든 필름의 첫 번째 빌드가 밀도에서 4–5점을 받고 추가하는 라운드를 소비했기 때문입니다. 오너의 승인이 필요한 결정을 나열하세요. 여기서 멈추지 마세요: 샷 목록은 보드와 함께 오너에게 전달됩니다.

  7. 보드. 먼저 <src>/film.js에서 필름의 가장 넓은 샷과 가장 가까운 샷을 그립니다 (board: [{ t, shot, note }] 내보내기) 그리고 그 쌍만 살펴보세요 (node tools/board.mjs --film=<film> --only=<wide>,<close>, 그 -view.jpg): 세계가 얼마나 많은 것을 담아야 하는지와 그 형상이 클로즈업에서도 살아남는지 보여주며, 다시 그리는 데는 두 샷이 소요됩니다. 그런 다음 샷당 하나의 스틸을 그립니다. node tools/board.mjs --film=<film>을 실행하세요. 그 텍스트는 기계적 검토입니다: 모든 warn … mid-move 줄 (t를 확정된 프레임으로 이동)과 모든 layout 발견 사항 (안전 영역 외부, 캡션 밴드 내, 겹침, 너무 작음)을 수정한 다음, 텍스트가 깨끗한지 확인하기 위해 한 번 더 실행하세요. 보드의 -view.jpg 개요만 읽거나, 18샷 이상인 경우 출력하는 pages를 각각 한 번씩 읽어 룩을 확인하세요: 한 번에 잘못 읽힌 것을 수정하고, 룩-패치-재렌더 루프나 장면별 시트 없이 (--scenes는 이 검토가 아닌 오너를 위해 존재합니다). 해당 개요의 룩 테스트: 음소거하고 그림만으로 스토리를 따라가세요; 낯선 사람은 장소, 사람, 사물을 보며 슬라이드가 아닙니다. 캡션 외에 샷은 객체에 최대 6단어를 보유합니다; 브리핑이 전체를 요구하는 증명 판과 줄만 예외입니다. 실패 시 텍스트를 자르는 것이 아니라 샷을 다시 그리는 것을 의미합니다.

  8. 오너 검토 (유일한 게이트). 샷 목록과 보드(<output>/<film>-board.png)를 함께 보여주고, 승인이 필요한 결정과 함께, 단일 승인을 기다리세요. 그 전에는 모션이나 사운드가 없습니다.

  9. 핸드오프. 오너가 검토를 승인하면, <shotlist> 상단에 ## Build brief 섹션을 작성하세요: 승인된 사항, 여전히 열려 있는 사항, 빌드에 필요한 파일 (필름 모듈, 테이크, 비트, sfx 스크립트). 그런 다음 새 컨텍스트에서 빌드를 시작하세요:

    • 데스크톱 앱: 새 컨텍스트로 새 세션 시작 (포크 아님), 프롬프트 /motion-reel build <film>.
    • 터미널: 오너에게 /clear 실행을 지시한 다음 /motion-reel build <film>.

    사전 제작은 여기서 끝납니다: 샷 목록과 보드에 대한 오너의 승인이 완료 기준이며, 빌드는 새 세션에 속합니다.

3. 엄격한 규칙

  • 순수 시간 함수: seek(t)만 사용합니다. Math.random, 타이머, CSS 전환, 렌더 모드의 requestAnimationFrame, 프레임 간 상태는 없습니다.
  • -view.jpg 미리보기를 엽니다; 전체 해상도 이미지는 하나의 세부 사항에 대한 --crop으로만 사용합니다. 이미지는 룩을 위한 것입니다; 기계적 검사는 도구의 숫자입니다 (node tools/check.mjs --film=<film>: seek 스윕, 결정론, 글꼴 px, 레이아웃 린트).
  • 컨텍스트가 비용이며, 턴이 이를 증폭시킵니다: 300k에서의 턴 하나는 100k에서 세 턴의 비용과 같으며, 최근 메시지의 2/3는 하나의 도구를 수행했습니다. 단계의 모든 독립적인 읽기, 검색 및 편집을 한 메시지로 보내세요. 도구는 읽는 것이 아니라 실행합니다 (--help가 사용법을 제공함); 편집은 Edit로 하되 전체 파일을 다시 쓰지 마세요; 긴 명령은 백그라운드에서 실행되며 알림을 기다리되, sleep이나 폴링 루프는 사용하지 마세요.
  • 다른 필름의 소스는 템플릿이 아닙니다: 필름은 코드의 3–16%만 공유합니다. 필요한 하나의 함수를 찾아서 (Grep, 또는 오프셋/제한으로 읽기) 해당 film.js는 닫아 두세요.
  • 상태는 파일에 저장됩니다: brief/decisions.md, references/sources.md, <shotlist>, docs/review_log.md. 프로젝트는 250k에서 자동 압축되므로, 대화에만 유지된 사실은 필름 중간에 사라질 수 있습니다.
  • 비밀은 .env에서만 가져옵니다. 키를 절대 출력, 로그 또는 붙여넣지 마세요.
  • 브랜드당 하나의 세션: 엔진, 합성 및 내보내기 파이프라인은 재사용되며 다시 빌드되지 않습니다.

관련 스킬