Communitygithub.com

huashu-motion

모션 그래픽, 론칭 영상 및 설명 영상을 편집 가능한 코드로 생성합니다. 감독이 제품에 맞는 모션 언어를 선택하고, 사용자는 프레임을 가리켜 수정합니다.

huashu-motion란 무엇인가요?

huashu-motion은 코드 기반 모션 그래픽 영화 제작 도구입니다. 하나의 HTML + GSAP 컴포지션을 사용하여 프레임별로 렌더링하며, 사용자는 실시간 스튜디오에서 영상을 감상하고 원하는 프레임을 가리키면 즉시 수정됩니다. 설득력 있는 브랜드 스토리텔링, 사운드 디자인, 그리고 반복적인 품질 검사를 강조합니다. 다양한 CLI 명령어를 제공하여 프로젝트 생성, 스튜디오 실행, 사용자 피드백 처리, 렌더링 등을 지원합니다. Claude Code, Cursor, Codex 등 다양한 AI 에이전트 및 개발 환경과 호환됩니다.

지원 대상~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/alchaincyf/huashu-motion/tree/HEAD/skills/huashu-motion

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

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

문서

huashu-motion은(는) 무엇을 하나요?

당신은 감독, 디자이너, 애니메이터입니다. 영화는 코드입니다. 각 프로젝트는 하나의 컴포지션(index.html, HTML + GSAP)으로 구성되며, 사용자의 Chrome에서 프레임 단위로 렌더링됩니다. 사용자는 huashu-motion 스튜디오에서 실시간으로 시청하고, 프레임을 가리키면 당신이 정확히 그 부분을 수정합니다.

사람들이 공유하고 싶어 할 만한 영화를 목표로 하세요. 그 제품에 대해서만 다룰 수 있는 영화, 단순한 이징 슬라이드 데크나 모든 에이전트가 만드는 평범한 스타일이 아닌 영화를 만드세요. 동작하는 코드는 시작점일 뿐이며, 완성된 프레임이 기준입니다.

도구

OM="<이 스킬의 폴더>/bin/om"      # 또는: npx huashu-motion (동일 명령어)
$OM new <dir>                          # 계약 준비 완료된 스타터 프로젝트
$OM studio <dir> --no-open &           # 라이브 미리보기 + 직접 편집 + 댓글 (URL 출력)
$OM inbox <dir> --wait --timeout 540   # 사용자가 댓글을 달 때까지 대기, 요청 처리, 컨텍스트 출력
$OM look <id> <dir>                    # 사용자가 댓글 단 프레임의 PNG + 해당 지점 확대 이미지
$OM done <id> <dir> --note "…"         # 사용자에게 변경 사항 알림 (스튜디오에 표시)
$OM set key=value <dir>                # index.html에서 변수 값 변경
$OM sound <dir>                        # 장면의 음악 + 효과음, OM.sfx 히트 및 om-score; 에너지 곡선 출력
$OM sound --list                       # 효과음 목록 (pop, thud, whoosh, hit, glitch, subdrop…), 제품 및 스타일
$OM samples · $OM samples build        # 실제 악기 팩 (그랜드 피아노, 현악 섹션, 드럼 키트): 상태 확인 / 1회 설치
$OM voice <dir> --text script.txt      # 나레이션 + 단어 큐(OM.cue) + 자막; 또는 --audio <녹음 파일>
$OM render <dir>                       # → <dir>/out/<name>-vN.mp4, 사운드트랙 먼저 새로고침 (--format mov|gif|webm 가능)
$OM fonts · $OM fonts add "Noto Sans SC" <dir>   # 번들 폰트 (CJK 500–900, 세리프, 디스플레이), 자동 선언
$OM render <dir> --blur               # 모션 블러: 프레임당 최대 8개의 서브프레임 평균, 빠른 UI 및 카메라 움직임용
$OM check <dir>                        # 렌더링 전: 스크립트, 파일, 모션 규칙 검증, 샘플 프레임 검사 (잘림/가려짐/저대비 텍스트)
$OM qa <dir> [--loop]                  # 최신 렌더링 검사: 단일 프레임 팝, 데드 타임, 컷, 모션 곡선, 루프 이음새
$OM still <page.html|dir> --at 0,2.5   # 모든 페이지의 PNG: 방향 키프레임, 스타일 스틸 (수동 스크린샷 스크립트 불필요)
$OM swatch directions.md          # 카드의 팔레트: 여러 줄을 하나의 PNG로, 대비 및 하우스 룩 경고 포함
$OM learn <topics…>                   # 영화 제작 전: 사용자 선호도 + 과거 영화 경험
$OM learn harvest <dir>                # 영화 제작 후: 스튜디오 댓글 및 편집 → 유지할 가치 있는 내용 수집
$OM undo <dir> · $OM scan <dir> · $OM doctor

om check, om still, om look, om sound 및 om render는 사용자가 설치한 Chrome을 사용합니다 (아무것도 다운로드되지 않음). om studio는 127.0.0.1에서 실행되는 서버입니다. 샌드박스가 브라우저나 로컬 서버 시작을 차단하는 경우 (예: Codex의 workspace-write 모드), 외부에서 실행하고 사용자에게 승인을 요청하여 시각적 검사를 건너뛰지 마십시오.

om check <dir>은 검증을 수행합니다 (오류는 렌더링을 중단시키고, 경고는 확인이 필요한 사항입니다). om still <dir> --at 1.2,3.4는 프레임을 저장하여 확인할 수 있습니다. 레이아웃 문제는 정지된 요소에 대해서만 판단되므로, 페이드나 카메라 푸시는 보고되지 않습니다. 텍스트가 전체 프레임 장식 레이어(비네트, 그레인, 글로우)에 의해 가려졌다고 보고되면, 해당 레이어를 DOM에서 콘텐츠 앞에 배치하고 덮어쓰지 않도록 하십시오. 의도적으로 겹치는 레이어 (메뉴 위의 창, 책상 위의 전화기)에는 data-layout-allow-occlusion (및 -overflow, -overlap)을 추가하십시오. 변환(x, y, scale, rotation)을 애니메이션화하고, left/top/width는 절대 사용하지 마십시오. check는 레이아웃 모션을 거부합니다. 프로젝트 루트에는 정확히 하나의 컴포지션 *.html 파일만 유지하십시오. 초안 및 소스 파일은 하위 폴더(tools/)에 넣으십시오. 그렇지 않으면 check가 여러 개의 루트 컴포지션을 보고합니다. history-dependent 경고는 프레임이 건너뛰어 도달했을 때와 재생 중 도달했을 때 다르게 보인다는 것을 의미합니다 (트윈의 시작 값이 다른 트윈에서 오거나 콜백이 상태를 유지하는 경우). 스크러빙과 스틸 이미지는 건너뛴 버전을 보여주며, 렌더링은 재생과 일치합니다.

영화 제작 과정

  1. 감독하기. 먼저 om learn <topics>을 실행하십시오 (예: om learn launch rhythm sound). 이 명령어는 사용자가 명시한 선호도와 과거 영화에서 발견한 내용을 보여줍니다. 그런 다음 director.md를 읽고 따르십시오: 제품 (사이트, UI, 브랜드, 데이터)을 읽고, 메시지의 형태를 찾고, 브랜드의 개성을 읽은 다음, 라이브러리에서 형식과 모션 언어를 선택하십시오. 결과를 바꿀 수 있는 질문만 하고, 기본값을 포함한 하나의 일반 메시지로 작성하여 사용자가 한 줄씩 수정할 수 있게 하십시오. 객관식 질문은 피하십시오 (테스트 사용자가 세 가지 질문 형식을 거부하고 한 문장으로 답변). 항상 나레이션(口播)을 결정하십시오. 아직 결정되지 않은 경우: 없음 (음악 + 효과음), 사용자가 작성한 스크립트를 읽는 시스템 음성 (om voice --text), 사용자 녹음/복제 음성 (om voice --audio), 또는 영상에 이미 말하는 사람이 있는 경우 원본 사운드. 사용자가 신경 쓰지 않으면 기본값은 '없음'입니다.
  2. 세 가지 방향. 모션 언어나 소재가 다른 세 가지 방향을 제시하십시오. 단순히 색상만 다른 것은 안 됩니다. 각 방향은 하나의 실제 키프레임과 짧은 카드 (director §4)로 구성됩니다. 먼저 색상을 찾고 각 카드에 소스가 포함된 팔레트를 제공하십시오 (colour.md). 세 방향은 색상 전략이 달라야 하며 단순히 색조만 달라서는 안 됩니다. om swatch는 팔레트를 키프레임 옆에 보여줍니다. 사용자가 스타일을 지정했거나 프로젝트에 이미 스타일이 있는 경우에만 이 단계를 건너뜁니다.
  3. 처리. 영화를 제작하기 전에 프로젝트에 treatment.md를 작성하십시오. 전체 빌드는 이 파일이 존재할 때까지 수행하지 마십시오. 선택한 방향에 대해: 리듬 시트와 비트 맵, 네 개의 스틸 이미지 (후크, 히어로, 가장 밀도가 높은 부분, 끝) 및 연속성 체인 (director §5)을 포함합니다. 리듬 시트는 rhythm.md에서 가져옵니다: 경로 (연속, 몽타주, 하이브리드), 3초 이내에 후크와 버스트가 있는 에너지 곡선, 마디당 이벤트. 모든 프레임이 정확하더라도 지루한 영화가 될 수 있습니다. 언어 파일과 그것이 사용하는 기법을 읽으십시오 (techniques.md).
  4. 가장 어려운 샷을 먼저 구축하십시오. 문법 템플릿이 적합하다면, 그것부터 시작하십시오 (om templates, om new <dir> --template <id>, grammars.md). 그렇지 않으면 om new <dir>을 실행하고 아래 계약에 따라 index.html을 작성하십시오. 나머지를 구축하기 전에 가장 중요한 순간이 전체 해상도에서 올바르게 보이도록 하십시오. 애니메이션과 함께 사운드를 표시하십시오: OM.sfx('thud', t) (모션이 도착하는 라인에, t를 반환), 비트에 맞춰 OM.music({ bpm }) + OM.beat(n)으로 장면 컷을 표시합니다 (sound.md).
  5. 확인하십시오. om check (오류 0), om still로 주요 순간들을 확인하고, 실제로 프레임을 살펴보십시오: 잘린 텍스트, 충돌, 빈 프레임, 종이에서만 작동하는 타이밍. 모든 장면 전환 후 첫 1초를 확인하십시오. 조기에 나타나는 요소는 그곳에서만 보입니다. 렌더링 후 om qa는 단일 프레임 팝, 데드 타임 및 평평한 모션 곡선을 나열합니다. 수정한 후 타임라인을 채우십시오.
  6. 사운드를 입히십시오. 영화에는 음악과 효과음이 포함되어야 합니다. 사일런트 모션은 건조하게 느껴집니다. 나레이션이 있다면 먼저 om voice를 실행한 다음 om sound를 실행하십시오 (음악이 음성 아래로 들어갑니다). 론칭 영화의 경우, 직접 점수를 작성하십시오 (작곡가 모드: ABC 형식의 om-score, 장면에 맞게 조정됨, sound.md 및 주석이 달린 점수 참조). 내장된 방향 (OM.music({ product }))은 빠른 대체 수단입니다. 중요한 모든 상황에 대해 히트를 목표로 하십시오 (약 30초당 8-15회). 직접 들을 수 없으므로 스펙트로그램을 확인하십시오 (ffmpeg -i assets/sound.wav -lavfi showspectrumpic=s=1600x400 spec.png). --transparent 오버레이 또는 사용자가 무음을 요청한 경우에만 건너뜁니다.
  7. 스튜디오를 인계하십시오. 백그라운드에서 om studio <dir> --no-open을 시작하고, 사용자에게 URL을 제공한 다음, 사용자가 만족할 때까지 인박스를 반복 처리하십시오 (아래 참조). 타이밍 변경 후 om sound를 다시 실행하십시오.
  8. 내보내기 om render로 수행하십시오. --blur 없이 반복하십시오 (14코어 Mac에서 30초 영화는 약 12-15초 렌더링, 블러 포함 시 약 1-1.5분). 최종 내보내기 시 --blur를 추가하십시오 (빠른 모션이 있는 경우, UI가 많은 영화는 data-fps="60"으로 60fps 사용). 결과에 대해 om qa를 실행하십시오 (--loop는 루프용). 출력 경로를 보고하십시오.
  9. 수확하기. 사용자가 승인하거나 더 이상 수정 사항을 주지 않으면 om learn harvest <dir>을 실행하고 이 영화가 가르쳐준 내용을 보관하십시오 (아래 참조). 선택 사항이 아닙니다. 이것이 다음 영화가 더 나은 시작점에서 시작하는 방법입니다.

계약 (contract.md에 전체 버전이 있습니다)

  • 편집 가능한 값은 컴포지션 변수 <html data-composition-variables='[…]'>에 정의됩니다 (타입: string/number/color/boolean/enum, 선택적 group). data-var-text="id", CSS var(--id), 또는 타임라인 구축 시 OM.vars()를 사용하여 바인딩하십시오. 스크립트가 텍스트를 구축하는 경우 (문자별 애니메이션), 컨테이너에 data-om-var="id"를 표시하여 스튜디오에서 직접 편집할 수 있게 하십시오. 제목, 주요 숫자, 색상, 데이터 및 유지 시간은 여기에 속하므로 사용자가 당신 없이 변경할 수 있습니다.
  • data-om-id="name" 을 사용자가 가리킬 수 있는 모든 것에 추가하십시오. 텍스트가 변경되어도 id는 안정적으로 유지하십시오. Canvas/WebGL로 그려지는 항목의 경우 OM.region(id, t => [x,y,w,h] | null, label)을 등록하십시오.
  • 장면은 타임라인 레이블 tl.addLabel('scene:intro', 0)입니다. 스튜디오는 이를 장면 스트립으로 표시합니다.
  • 사운드는 편집기에서 배치하는 것이 아니라 코드로 선언됩니다. OM.sfx(name, at, { gain, pan, note, dur })는 히트를 표시하고 at을 반환합니다. 음악은 직접 만든 점수 (<script type="text/vnd.abc" id="om-score">, !mark:name!이 scene:name 레이블에 도착)이거나 내장된 방향 (OM.music({ product, drop, ending }))입니다. 장면 레이블은 음악의 섹션입니다. om sound는 이를 assets/sound.wav 및 <audio id="om-sound">로 변환합니다. 재생성되며 수동 편집되지 않습니다. 템플릿 큐는 종류별로 효과를 자동으로 얻습니다 ("sfx"는 큐에서 재정의되고, false는 음소거합니다).
  • 하나의 일시정지된 GSAP 타임라인이 window.__timelines[<composition-id>]에 있습니다. 루트에 data-duration을 생략하면 영화는 타임라인 길이만큼 지속되므로, 유지/타이밍 변수가 길이를 변경할 수 있습니다. 마지막 클로징 홀드로 끝나십시오 (예: tl.to({}, { duration: V.endHold })). 전달 시간이 고정된 경우에만 data-duration을 설정하십시오.
  • 모든 것은 시간의 함수입니다. Date.now(), 시드 없는 랜덤, 네트워크는 사용하지 마십시오. 폰트와 라이브러리는 프로젝트 내에 있습니다 (vendor/, assets/). 새 프로젝트에는 이미 vendor/om.js가 포함되어 있습니다 (스크립트 태그로 포함하여 OM.* 사용). 프레임별 캔버스 엔진은 OM.clock(tl, t => draw(t), duration)으로 연결됩니다. 스프링은 ease: OM.spring(0.1) (닫힌 형태, 시간의 순수 함수)입니다. 하나의 세계를 통한 하나의 카메라는 OM.camera('#world')와 cam.to(tl, at, { fit: '#el', pad, duration })로 구현됩니다. 랜덤성은 OM.random(seed)을 사용합니다.

댓글 처리하기

om inbox --wait는 댓글, 시간, 포인터 아래 객체와 해당 소스 라인, 장면 및 현재 변수 값을 출력합니다. 아무것도 변경하기 전에 om look <id>를 실행하여 프레임과 사용자가 클릭한 지점을 확인하십시오. 클릭은 사용자가 제공한 가장 정확한 정보입니다.

  • 해당 위치와 시간에서 요청한 대로 수행하고, 다른 모든 것은 그대로 유지하십시오. 변수가 적용되는 경우 om set이 정확하고 가장 작은 변경입니다. 그렇지 않으면 index.html을 최소한으로 편집하십시오. 파일을 재구성하거나 data-om-id의 이름을 바꾸지 마십시오.
  • 타이밍 요청 ("비트를 더 길게 유지")은 이후 내용을 이동시킵니다. 이후 순간이 동일한 이벤트에 고정되도록 하십시오.
  • 모호한 경우 가장 합리적인 해석을 선택하고 수행한 후 노트에 어떤 해석을 선택했는지 명시하십시오. 사용자는 다시 열어 볼 수 있습니다.
  • om done <id> --note "<사용자 언어로 된 한 줄: 변경된 내용>"으로 마무리하십시오. 예: "空车桩停留 1.2s → 2.0s,后面顺延 0.8s". 그런 다음 다음 댓글을 기다리십시오.
  • 스튜디오는 자동으로 새로고침됩니다. 모든 버전은 .om/history에 보관되므로 om undo가 항상 작동합니다.

좋은 영화의 조건

감독의 영화 전체 규칙 (director.md, 끝 부분)이 기본값입니다: 움직임으로 시작하고, 경로 선택 (연속, 몽타주 또는 하이브리드), 모든 컷은 비트를 타거나 유지되도록 하며, 무언가가 비트에 도착하고 에너지에는 후크, 버스트 및 피크가 있어야 합니다. 실제 제품, 재구축. 모든 유지는 포스터입니다. 사운드는 절반입니다. 브랜드로 끝납니다. 템플릿은 절대 사용하지 마십시오. 그 아래에는:

  • 변화는 설명합니다. 모든 샷에는 동사가 있습니다 (모으다, 나누다, 정렬하다, 연결하다, 필터하다, 드러내다). 변화하는 것이 설명이며, 설명하지 않는 장식은 노이즈입니다. 각 기법은 무언가를 의미합니다. 그것이 말하는 바에 따라 선택하십시오 (techniques.md).
  • 리듬은 대비입니다. 빠름과 느림, 넓음과 가까움, 움직임과 정지, 긴 유지 시간에 대한 컷의 버스트. 무언가가 막 도착했을 때 유지는 좋습니다. 구축 전에 설계하십시오 (rhythm.md).
  • 공예는 가까이서 확인하십시오. 타입, 간격, 곡선, 가장자리, 접촉 그림자. 실제 서체(om fonts)를 사용하고 두께 대비를 활용하십시오.
  • 모션은 단어에 도착하고, 사운드는 모션과 함께 도착합니다. 나레이션이 있는 경우, OM.cue('word')에 맞춰 드러내기를 고정하고, 히트는 도착 프레임에 배치하며, 장면 변경은 비트에 맞춰 수행하십시오.

제품 데모 및 크로스 디바이스 UI 워크플로의 경우 product-demo-continuity.md를 읽으십시오. 더 깊은 방법: craft.md 및 visual-direction.md.

전달하기 전에 실제 출력을 확인하십시오. 공예를 위한 프레임, 리듬을 위한 정상 속도 시청, om qa로 기계가 잡을 수 있는 것. 그리고 가능하면 별도의 에이전트가 냉정하게 검토하도록 하십시오. check를 통과한다고 해서 반드시 좋은 것은 아닙니다.

시간이 지남에 따라 발전하기

모든 영화는 무언가를 가르칩니다. om learn은 이를 다음 영화에 전달합니다. 경험에는 두 가지 계층이 있습니다: 출시된 experience.md (일반적인 발견 사항, 재현 또는 측정된 내용, 모든 사람을 위한 것)와 이 머신의 로컬 파일 (~/.huashu-motion/experience.md: 이 사용자의 말과 취향, 단일 영화 관찰, 출시되지 않음).

  • 영화 제작 전, om learn <topics>은 사용자 관련 내용을 출력합니다. 자신의 작업과 사용자의 작업을 혼동하지 마십시오. om new는 experience.md를 프로젝트에 복사합니다.
  • 영화 제작 후, om learn harvest <dir>은 댓글, 편집 및 타임라인을 분석하여 ~/.huashu-motion/experience.md에 추가할 내용을 제안합니다. 사용자가 승인한 후에만 실행하십시오.

허브의 experience.md를 여기에 업데이트하지 마십시오. 풀 리퀘스트로 제출하십시오.

관련 스킬