Communitygithub.com

stanglivideo

Remotion으로 모션 디자인 비디오를 코드로 제작하고, 음악에 맞춰 컷 편집하며, 프레임에 맞춰 사운드 효과를 적용합니다.

stanglivideo란 무엇인가요?

이 스킬은 코드로 모션 디자인 비디오를 제작하는 AI 에이전트(Claude Code, Cursor 등)용입니다. Remotion을 기반으로 하며, 사용자가 원하는 프로모션, 론칭 필름, 제품 비디오, 설명 영상, 소셜 컷, 랜딩 루프 등 모든 모션 디자인 비디오를 제작할 수 있습니다. 주요 기능으로는 먼저 환경을 점검하고(doctor), 사용자가 좋아하는 2~5개의 동영상을 분석(프레임, 스펙트로그램, 볼륨)하여 취향을 학습합니다. 이후 비주얼, 클레임, 음악, 스토리보드에 대한 사용자 승인을 받고, 제품의 디자인 시스템을 기반으로 제작합니다. 비디오는 오프라인에서 점수화되고, 동기화, 음량, 화질 게이트를 통과해야 완료됩니다. 선택적 모드로 참조 갤러리 재분석, Gemini를 이용한 사진/영상 루프 생성이 가능합니다. 모든 프레임은 시간의 순수 함수로, CSS 전환이나 키프레임 없이 순수 코드로 작성됩니다. Mac과 Windows를 지원하며, Node 18+, Python 3.10+, ffmpeg가 필요합니다.

지원 대상~Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/ilijachrchev/skills/tree/HEAD/skills/stanglivideo

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

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

문서

stanglivideo은(는) 무엇을 하나요?

제품이 직접 만든 듯한 영화, 비트에 맞춰 움직이고 소리가 정확히 프레임에 맞는 영화: 모든 사운드는 해당 프레임에, 모든 단어는 읽을 수 있을 만큼 충분히 화면에, 프레임 밖으로 나가는 것은 없습니다. 코드에서 Remotion으로 제작되어 항상 편집 가능합니다.

아래 경로는 영화 프로젝트 경로로 시작하지 않는 한 이 스킬의 폴더를 기준으로 합니다. $PY는 의사(doctor)가 출력하는 파이썬(스킬의 .venv)입니다.

모든 실행은 여기서 시작합니다

  1. 의사(Doctor). 첫 실행 시(이 폴더에 .venv 또는 taste.md가 없는 경우): node scripts/doctor.mjs --setup. .venv를 생성하고, requirements.txt를 설치하며 taste.example.md에서 taste.md를 만듭니다. 이후 실행: node scripts/doctor.mjs. Node 18+, Python 3.10+(numpy와 scipy 포함), 완전한 ffmpeg, 그리고 동반 스킬을 확인합니다. Node 자체가 없으면 의사가 실행될 수 없습니다: 그 사실을 알리고 아래 설치 명령어를 제공합니다.

  2. 사용자에게 누락된 것을 명확히 알립니다. 모든 실패(FAIL)에 대해 한 줄로: 무엇이 누락되었는지, 스킬에 왜 필요한지, 그리고 해당 시스템에서 해결하기 위한 정확한 명령어를 알립니다. 그런 다음 사용자가 완료했다고 말할 때까지 기다렸다가 의사를 다시 실행합니다.

    누락이유WindowsMac
    Node 18+영화 빌드 및 렌더링winget install --id OpenJS.NodeJS.LTS -ebrew install node
    Python 3.10 ~ 3.13사운드 점수 계산 및 검사 실행winget install --id Python.Python.3.12 -ebrew install [email protected]
    ffmpeg (전체 빌드)분석, 인코딩, 음량 검사winget install --id Gyan.FFmpeg -ebrew install ffmpeg
    동반 스킬Remotion API 규칙npx skills add remotion-dev/skills동일

    Node, Python 또는 ffmpeg 설치 후, 사용자는 새 터미널을 열어 PATH에 반영한 다음 node scripts/doctor.mjs --setup을 다시 실행해야 합니다. GEMINI_API_KEY는 선택사항입니다: 생성된 이미지 또는 루프가 실제로 필요할 때만 언급하세요.

  3. 동반 스킬 (필수). remotion-best-practices, Remotion의 공식 스킬입니다. 여기에 번들로 포함되지 않습니다. Remotion API 질문(미디어, 글꼴, 자막, 렌더링 옵션)에 사용합니다.

  4. 취향(Taste). references/base-rules.md와 taste.md(여전히 없으면 taste.example.md에서 생성)를 읽습니다. 이는 사용자의 고정 규칙입니다. 충돌 시 taste.md가 우선합니다.

불가침 규칙

  • 사용자의 디자인이 우선합니다. 색상, 서체, 컴포넌트, 로고, 음성 및 클레임은 제품에서 가져옵니다. 사용자의 디자인과 모순되는 다른 제품의 취향(이 스킬에 포함된 것까지)을 절대 가져오지 마십시오.
  • 모든 프레임은 시간의 순수 함수입니다. CSS 전환 또는 키프레임, 타이머, Date.now(), Math.random(시드된 rand 사용), 프레임 간에 유지되는 상태가 없습니다.
  • 하나의 타이밍 소스. 각 영화의 src/films/<film>/cues.json은 모든 큐 시간을 보유합니다. 영화의 TSX는 이를 가져오고 스코어는 읽습니다(sound/cues.py). 둘 중 어느 것도 리터럴 시간을 보유하지 않습니다.
  • 측정하세요, 추측하지 마세요. 오디오에서 비트, 디버그 오버레이에서 위치, 디코딩된 픽셀에서 색상을 가져옵니다.
  • 정직한 클레임. 제품이 실제로 하는 것만 보여줍니다. 금지 목록은 대본 작성 전에 사용자의 승인을 받습니다.
  • 커밋, 푸시 또는 게시 전, 그리고 모든 유료 API 호출 전에 먼저 물어보세요.
  • 모든 카피, 파일 또는 메시지에 em 또는 en 대시를 사용하지 마십시오.

워크플로우 및 승인 게이트

각 STOP은 하드 게이트입니다: 물어보고(AskUserQuestion), 기다린 후, 답변을 프로젝트의 BRAND.md에 기록합니다.

  1. 인테이크 (필수). 사용자가 좋아하는 2~5개의 동영상을 요청하고, 각각에 대해 무엇을 좋아하는지(사운드 포함) 한 줄씩 요청합니다. node scripts/intake/intake.mjs <project>/intake <videos...>를 실행하고 모든 시트를 읽습니다. references/intake.md를 참조하세요.
  2. 발견(Discovery). 제품 학습: 규칙 파일, 토큰(라이트 및 다크), 컴포넌트, 로고, 랜딩 페이지, 실제 스크린 및 카피, 클레임. references/discovery.md를 참조하세요.
  3. 인터뷰. 브리프와 재료. references/interview.md를 참조하세요. 그런 다음:
    • STOP: 라이트 또는 다크. 여러 영화가 있을 때 각 영화별로; 제품에 두 테마가 모두 있으면 세트가 둘 다 혼합합니다.
    • STOP: 금지된 클레임. 영화가 클레임할 내용과 절대 말해서는 안 되는 목록(코드, 사이트 및 사용자로부터)을 보여줍니다. 두 목록의 승인을 기다립니다.
  4. 브랜드 킷. templates/BRAND.md를 프로젝트에 채웁니다. 모든 규칙은 출처를 인용합니다.
  5. 음악. 후보를 조사하고 측정합니다. STOP: 음악 선택. references/music.md를 참조하세요.
  6. 스토리. templates/film-prompt.md를 채우고; 비트 계획을 cues.json으로 작성합니다. references/story.md 및 references/ingredients.md를 참조하세요.
  7. 프로젝트. node scripts/new-project.mjs <dir>, npm install. src/kit/에 하나의 킷; 영화당 하나의 폴더. references/engine.md를 참조하세요.
  8. 스토리보드. 장면을 빌드하고, 영화당 5~8개의 스틸을 렌더링하고(프로젝트에서: node scripts/stills.mjs), 타일로 배열합니다. STOP: 전체 렌더링 전에 스토리보드 승인. references/review.md를 참조하세요.
  9. 렌더링. 프로젝트에서: node scripts/render.mjs <Composition> out/<film>.mp4 (안전 장치 내장). 콘택트 시트, 확인, 수정.
  10. 스코어. 프로젝트에서: cues.json에서 sound/scores/<film>.py; $PY sound/render.py <film>. references/sound-rules.md를 참조하세요.
  11. 게이트 (필수). 프로젝트에서: $PY scripts/gate.py <film>. 통과할 때까지 완료로 간주되지 않습니다. references/render.md를 참조하세요.
  12. 전달. 경로, 길이, 음량, 피크, 게이트 결과, 변경 사항. 모든 버전을 보관합니다.

동기화 게이트

  • 휘파람 소리는 움직임의 가장 빠른 프레임에서 피크에 배치합니다(align="peak"; kit/speed.ts는 카메라 움직임의 가장 빠른 프레임을 찾습니다; E.out 입구는 시작 부분에서 가장 빠르고, E.exit 출구는 끝 부분에서 가장 빠릅니다).
  • 팝 소리는 요소가 착지하는 프레임에 배치합니다. 칭 소리는 최종 숫자가 표시되는 프레임에 배치합니다.
  • 라이저는 히트에서 끝납니다(align="end").
  • 모든 사운드는 화면상의 이벤트를 나타내는 레이블을 가지고 있습니다.
  • 모든 믹스 후: sound/check.py (화면 변경 전 사운드 없음), scripts/final-check.py (-14 LUFS ±1 LU 이내, 트루 피크 -2 dBFS 이하, 음량 범위 4 LU 이상, 무음 없음, 사일런트 렌더와 동일한 화면, 동일한 길이) 및 scripts/verify.py, 모두 scripts/gate.py에 의해 실행됩니다. 플래그는 사운드(또는 큐)를 이동하여 수정하며, 시트를 보지 않고 예외 처리하지 않습니다.

취향 메모리

  • references/base-rules.md는 스킬과 함께 제공됩니다: 실제 영화에서 얻은 교정 사항을 일반 규칙으로 정리합니다.
  • taste.md(git 무시됨, taste.example.md에서 생성)는 이 머신의 취향입니다. 사용자가 제공하는 모든 새로운 교정 사항은 영화를 수정하기 전에 일반 규칙으로 여기에 기록되며, 어떤 영화에서든 문제를 방지할 수 있었을 표현으로 작성됩니다. 모든 실행 시작 시 읽습니다.
  • 여러 영화에 걸쳐 유지되는 규칙은 이 스킬에 대한 풀 리퀘스트를 통해 base-rules.md로 승격될 수 있으며, 무음 편집으로는 승격될 수 없습니다.

안전 (스크립트에 내장)

templates/project/scripts/safety.mjs는 모든 번들 및 렌더링에서 사용됩니다: 먼저 사용 가능한 디스크 확인(최소 10GB), 최대 2개의 렌더링이 동시에 실행, 임시 번들은 모든 작업 후 삭제되고 오래된 번들은 그 전에 삭제됩니다. 메모리가 부족한 머신에서는 동시성 1로 렌더링합니다. 자신이 시작한 프로세스만 중지합니다.

선택적 모드

  • 생성된 미디어. 코드가 그릴 수 없는 것에만 해당: 실제 사진, 사진 질감, 컷아웃, 촬영된 배경(실크, 액체, 빛)은 사용자가 실제 촬영된 느낌을 원할 때 사용합니다. scripts/gemini/image.mjs는 참조 이미지를 가져와 출력이 선택된 룩과 일치하도록 하고, 종횡비, 크기, 리사이즈 및 크로마 키를 처리합니다. scripts/gemini/video.mjs는 팔레트가 일치하는 첫 번째 프레임(또는 네이티브 루프)에서 Veo 클립을 만듭니다. 환경의 GEMINI_API_KEY에서만 키를 가져옵니다. 모든 호출은 비용을 출력하고 사용자의 승인 후에만 실행됩니다. references/gemini.md를 참조하세요.
  • 미디어 도구 (무료, 모든 클립). scripts/media/loop.py는 클립을 매끄러운 배경 루프(심 검색, 정확한 디졸브, 영화 FPS로 보간, 루프 + 포스터 + 스틸 시퀀스 + 경계 시트)로 변환합니다; 킷의 LoopBackground는 영화의 cues.json에서 모션 레이어 아래에 배치합니다. scripts/media/clip.py는 프로브하고, 프로젝트 형식으로 다시 인코딩하고, 가장자리를 자르고 스틸 또는 시트를 추출합니다. scripts/media/imgpost.py는 이미지를 키잉하고 크기를 조정합니다.
  • 갱신(Refresh). 사용자가 요청할 때: prompt-motion.com, skillry.dev 및 awesome-opus5-5-videos 리포지토리에서 새 항목을 다시 연구하고 PR로 참조 업데이트를 제안합니다. references/refresh.md를 참조하세요.

품질 기준 (항상)

  • 제품 자체의 표면, 색상, 테두리 및 음영만 사용합니다. 가상의 패널이나 틴트는 없습니다.
  • 전달 크기에서 읽을 수 있어야 합니다. 더 적은 단어가 더 작은 단어보다 낫습니다. 사람들이 읽어야 하는 줄은 단어당 약 0.2초에 나타나고 2초 이상 유지됩니다.
  • 모든 카드와 마침표는 모든 움직임의 모든 프레임 동안 프레임 내에 완전히 있어야 합니다.
  • 각 샷을 5~6초 동안 한 번의 느린 푸시로 유지합니다. 바쁘게 느껴지면 속도를 높이는 대신 화면을 잘라냅니다.
  • 텍스트는 커서나 칩에 의해 가려지지 않고, 다른 텍스트와 교차하지 않으며, 빌드되는 동안 다시 중앙에 배치되지 않습니다.
  • 모든 비트에 무언가 발생하고, 장면 경계는 마디에 위치하며, 루프의 마지막 프레임은 첫 번째 프레임과 같습니다.
  • 세트 내에서 두 영화가 동일한 구조를 공유하지 않습니다. 나란히 유지되는 모든 것은 정확히 중앙에 배치됩니다.
  • 제품의 언어가 사용하지 않는 효과는 없습니다: 글로우, 파티클, 클릭 링, 바운시 이징, 셰이더.

지식

실제 시간을 소모하는 함정

  • Remotion 스틸은 콘솔 로그를 전달하지 않습니다: 프레임에 측정값을 출력하세요(kit/debug.tsx).
  • npx remotion still은 모든 호출을 다시 번들링합니다: scripts/stills.mjs를 사용하세요(하나의 번들, 여러 프레임).
  • Remotion의 번들 ffmpeg에는 tmix, select 또는 tile이 없습니다: 의사가 확인한 시스템 ffmpeg를 사용하세요.
  • 색상 범위: 모든 전달물의 프레임 0을 디코딩하고 확인하세요(verify.py --bg); 제한된 범위의 마스터를 전체 범위로 읽으면 어두운 배경이 회색으로 올라갑니다.
  • interpolateColors는 color-mix()를 구문 분석할 수 없습니다: 애니메이션이 적용되는 항목에는 16진수를 사용하세요.
  • 비동기 이미지 컴포넌트는 프레임에서 빈 상태로 렌더링될 수 있습니다: Remotion <Img>를 사용하세요.
  • 시간에서 계산된 인덱스는 해당 섹션 직전에 -1입니다: 클램프하세요(safeIndex).
  • 카메라가 스케일하는 모든 것에 will-change를 적용하면 텍스트가 흐려집니다.
  • 단어 공개 마스크는 패딩 없이 마지막 글자를 자릅니다: kit/components.tsx의 WordReveal을 사용하세요.
  • 렌더링 내 비디오 디코딩은 신뢰할 수 없습니다: 루프를 이미지 시퀀스로 변환하세요.

Individual skills in this repo

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

관련 스킬