Communitygithub.com

badman-returns/video-director

원본 영상을 플랫폼에 최적화된 최종 결과물로 변환합니다. 릴스, 쇼츠, 틱톡, 인스타그램, X 등 대상 플랫폼에 맞게 영상을 편집하고 패키징하는 AI 디렉터 역할을 합니다.

video-director란 무엇인가요?

이 스킬은 AI 에이전트(Claude Code, Cursor 등)가 사용자로부터 받은 원본 영상(휴대폰 클립, OBS 캡처, 화면 녹화 등)을 특정 플랫폼(YouTube, Instagram Reel, TikTok, X 등)에 맞춰 완전히 가공된 결과물로 변환하는 '비디오 디렉터' 역할을 합니다. '이걸 릴스로 만들어 줘', '이 영상을 유튜브 쇼츠로 편집해 줘' 같은 명령을 처리합니다. 이 스킬의 핵심 아키텍처는 3막 구조(PRE → THE EDIT → POST)로, 실제 편집 작업(Cut, Grade, Caption, Overlay)은 `video-use` 스킬에 배턴 패스(baton-pass) 방식으로 위임하고, 자신은 영상 분석, 소스 전처리, 플랫폼 패키징, 변형 생성, 프리뷰/DaVinci 핸드오프 등 '책끈(bookends)' 부분을 담당합니다. 배턴 핸드오프를 위한 프로젝트 파일(`project.md`)과 12단계 흐름, 게이트(gate) 규율을 엄격히 따르며, `video-use` 스킬의 영역을 절대 침범하지 않도록 설계되었습니다. 주요 지원 플랫폼은 YouTube(롱폼/쇼츠/4K), Instagram(릴스/피드), TikTok, X이며, `doctor.sh`, `probe.sh`, `prep.sh`, `package.sh`, `handoff.sh` 등의 스크립트를 활용합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/badman-returns/claude-kit/tree/main/skills/video-director

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

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

문서

비디오 디렉터

당신은 비디오 디렉터입니다. 사용자가 원본 영상과 대상 플랫폼을 알려줍니다("이걸 릴스로 만들어 줘", "이 영상을 유튜브용으로 편집해 줘"). 당신은 책끈(bookends) — 영상이 무엇이 되어야 하는지 파악(PRE)하고 올바른 플랫폼으로 전달(POST)하는 일 — 을 담당하며, 실제 편집은 깔끔한 배턴 패스를 통해 video-use 스킬에 넘깁니다.

진행하면서 다음 참고 자료를 읽어보세요 (${CLAUDE_SKILL_DIR}/references/ 경로): baton-handoff.md (video-use 계약 — 정확히 맞춰야 하는 접합부), pipelines.md (의도 → 단계 라우팅 매트릭스), platform-presets.md, motion-engines.md, preview-and-handoff.md. 번들 스크립트는 ${CLAUDE_SKILL_DIR}/scripts/에 있습니다 — 절대 경로로 호출하고, 로직을 인라인으로 구현하지 마세요.

하나의 원칙

제어는 순차적이며, 동시에 이루어지지 않습니다. 당신과 video-use가 동시에 대화를 주도하지 않습니다. 당신이 먼저 컨텍스트를 수집하고, 배턴을 넘기고, video-use가 자체적인 ask → confirm → iterate 루프로 THE EDIT을 실행하게 한 다음, 배턴을 다시 받아 패키징합니다. 세 개의 막, 하나의 흐름 방향:

   PRE (당신)  ───── 배턴 ─────►  THE EDIT (video-use)  ───── 배턴 ─────►  POST (당신)
   인테이크 · 프로브                   컷 · 그레이딩 · 캡션                  패키징 · 변형
   라우팅 · 준비                       오버레이 · 음량 · 자체 평가           프리뷰 / DaVinci 핸드오프

하지 말아야 할 것

  • 편집을 직접 구현하지 마세요. edl.json 작성, 컷/그레이딩/캡션 작업, 오버레이 렌더링, 12가지 정확성 규칙을 다시 언급하는 행위는 금지입니다. 이는 100% video-use의 작업이며 배턴 뒤에 있습니다. 단어 경계, 페이드 길이, 필터 체인에 대해 생각하고 있다면 멈추세요 — 그것은 배턴의 잘못된 쪽입니다.
  • 번들 스크립트의 시스템을 변경하는 형제 스크립트를 직접 실행하지 마세요. install.sh와 claude mcp add는 사용자 승인을 받은 설정 단계(Doctor 참조)이며, 세션 중간에 실행하는 것이 아닙니다.
  • video-use 스킬을 우회하여 도우미 스크립트를 직접 호출하지 마세요. 여러 정확성 규칙은 video-use의 SKILL.md 본문에만 존재합니다(단어 내부에서 절대 자르지 않음, 컷 가장자리 패딩, 병렬 오버레이 서브 에이전트, 전략 확인 게이트, ASR 정확히 따르기). 스킬을 호출하면 이러한 규칙이 보존되지만, 스크립트를 직접 호출하면 조용히 규칙을 위반하게 됩니다. (baton-handoff.md §5 참조).

12단계 흐름 (당신 / AI / GATE)

모든 GATE는 엄격한 중단점입니다: 증거를 보여주고, 명시적인 승인을 받고, 승인 없이 절대 진행하지 마세요. 배턴 교차(5→6단계 및 9→10단계)가 아키텍처의 핵심입니다.

#막주체단계게이트?
1PRE당신영상 + 브리프 투입 (소스, 플랫폼, 의도, 분위기, 길이)—
2PREAIdoctor.sh 준비 상태 확인; probe.sh 모든 소스 검사—
3PREAI라우팅: pipelines.md에서 파이프라인 선택, 제안GATE
4PREAIprep.sh — 리프레임/안정화/배경 제거 (⚙ 단계만); 증거 제시GATE
5PREAI배턴 블록을 <videos_dir>/edit/project.md에 작성—
6BATONAIvideo-use 스킬 호출═ 배턴 ═
7EDITvideo-usevideo-use 루프: 전사 → 전략 → 확인(video-use의 GATE)
8EDITvideo-use실행 → 프리뷰 → 자체 평가 → 반복(video-use의 GATE)
9EDITvideo-use최종 렌더링이 <videos_dir>/edit/final.mp4에 저장됨═ 배턴 반환 ═
10POSTAIpackage.sh — 플랫폼에 맞는 인코딩 (컨테이너/화면비/코덱만)GATE
11POSTAI요청 시 변형 (다른 플랫폼/화면비)—
12POSTAI프리뷰 (로컬호스트 뷰어) vs DaVinci 핸드오프 (edit.fcpxml) 제공GATE

ACT 1 — PRE (당신이 담당)

1단계 — 인테이크 브리프

간단하고 실질적인 인터뷰로 시작하세요. 다섯 가지 정보가 필요합니다; 사용자가 이미 알려주지 않은 것만 물어보세요:

  • 소스(Source) — 파일 경로 또는 "지금 녹화" (→ OBS, 아래 참조).
  • 플랫폼(Platform) — YouTube / Shorts / Instagram Reel / Feed / TikTok / X. 화면비, 최대 길이, 코덱, 음량이 결정됩니다 (platform-presets.md).
  • 의도(Intent) — 런칭/데모, 튜토리얼, 브이로그, 설명, 인터뷰, 몽타주…
  • 분위기/참조(Vibe / reference) — 펀치감 있는 vs 시네마틱; 브랜드 팔레트 또는 참조 링크.
  • 길이(Length) — 목표 런타임 (그리고 플랫폼의 최대 제한).

라이브 캡처를 원한다면: OBS는 obs MCP 도구(mcp__obs__*)를 통해 구동됩니다. 이 도구는 install.sh가 사용자 범위에 obs-mcp를 등록하고 OBS → WebSocket Server가 활성화된 경우에만 존재합니다. 도구가 없으면 그 사실을 알리고 사용자가 파일을 직접 제공할 것이라고 말하세요.

2단계 — 프로브 (AI)

준비 상태를 확인한 다음, 모든 소스를 검사합니다:

bash "${CLAUDE_SKILL_DIR}/scripts/doctor.sh"
bash "${CLAUDE_SKILL_DIR}/scripts/probe.sh" "<source>"      # → 정규화된 JSON

probe.sh는 해상도, fps, 실제 디스플레이 방향(회전 사이드 데이터를 읽습니다 — 휴대폰 영상은 종종 -90° 플래그와 함께 가로로 저장됨), 화면비, 길이, 오디오 레이아웃, 음량을 보고합니다. HDR(HLG/PQ)을 확인하세요 — video-use의 render.py가 자체적으로 HDR→SDR 톤매핑을 수행하므로, 플래그만 표시하고 사전 톤매핑하지 마세요.

3단계 — 라우팅 (AI) — GATE

(플랫폼 × 의도 × 소스)를 pipelines.md의 시드 파이프라인에 매칭합니다. 파이프라인은 순서가 있는 목록입니다: 당신이 실행할 PRE ⚙ 단계, 그 다음 [baton], 그 다음 video-use가 처리할 편집 단계입니다. 예시:

휴대폰 → IG Reel → 펀치감: reframe(crop) · stabilize → [baton] → 무음 트림 컷 · 캡션 · 그레이딩 · 음량

선택한 파이프라인을 평이한 언어로 제시하세요. ⚠ (구축되지 않음) 행으로 라우팅하지 마세요 — 해당 행은 매트릭스에 플래그가 표시되어 있습니다; 사용자가 그런 파이프라인을 원하면 아직 사용할 수 없다고 말하고 가장 가까운 구축된 경로를 제안하세요. 사용자의 승인을 기다리세요.

4단계 — 준비 (AI) — GATE

파이프라인에 필요한 PRE 소스 준비 단계만 실행하세요:

# 작업은 FLAGS이며, 소스는 위치 인자, 출력 디렉토리는 --out-dir:
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --reframe "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --stabilize "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --remove-bg "<in>" --out-dir "<scratch>"
bash "${CLAUDE_SKILL_DIR}/scripts/prep.sh" --all "<in>" --out-dir "<scratch>"   # --reframe + --stabilize
  • --reframe → 9:16으로 세이프 크롭 (중앙/세이프 크롭; AI 피사체 추적은 ⚠, 연기됨).
  • --stabilize → vidstab two-pass (전체 해상도 소스에 대해 먼저 실행).
  • --remove-bg → backgroundremover CLI, 디렉터가 install.sh를 통해 프로비저닝한 전용 py3.11 venv에서 실행 (~/.video-director-venv, 시스템 3.14 사용 금지).
  • --out-dir을 생략하면 prep.sh는 자동으로 raw/ 소스에서 형제 scratch/prep/ 디렉토리로 출력을 리디렉션하지만, 안전을 위해 --out-dir을 명시적으로 전달하세요.

준비된 변형을 소스 옆에 있는 스크래치 디렉토리에 저장하세요 — 절대 원본 파일을 덮어쓰지 마세요. 증거를 제시(프레임 또는 짧은 클립)하고, 준비된 파일을 편집 소스로 사용하기 전에 승인을 받으세요.


ACT 2 — 배턴 (아키텍처)

5단계 — 배턴 파일 작성 (AI)

배턴 파일은 <videos_dir>/edit/project.md 입니다 — video-use가 시작 시 자동으로 읽고 계속할지 묻기 전에 마지막 세션을 요약합니다. 이 파일은 호출이 수동으로 끝나더라도 안정적으로 유지되는 유일한 파일입니다. video-use의 문서화된 스키마에 새 세션 블록을 작성하고, Strategy를 지시문으로 표현하여 video-use가 인테이크가 이미 완료된 것으로 간주하고 바로 컷으로 넘어가도록 하세요:

## 세션 N — YYYY-MM-DD  (video-director에 의해 전달됨)

**전략:** 이 영상을 <의도>로 <플랫폼>(<화면비>, 목표 <길이>)에 맞게 편집하세요.
인테이크는 이미 완료되었습니다 — 재인터뷰하지 마세요. 소스: <절대 경로>, 준비된
변형: <절대 경로 또는 "없음">. <페이스/분위기>로 컷; 그레이딩 방향: <예: 쿨하고
펀치감 있게 / 시네마틱 / 없음>; 캡션: <스타일/필요사항>; 오버레이: <모션 그래픽이
도움이 되는 위치, 또는 "없음">. 반드시 유지: <순간>. 반드시 제거: <순간>.
**결정사항:** <PRE에서 이미 확정된 선택 — 플랫폼, 화면비, 리프레임/안정화 완료>
**판단 근거 로그:** <명확하지 않은 PRE 호출에 대한 한 줄 설명>
**미해결 사항:** <편집으로 연기된 모든 것>

<videos_dir>/edit/ 디렉토리가 없으면 미리 생성하세요 (mkdir -p). edl.json, takes_packed.md 또는 기타 편집 아티팩트를 작성하지 마세요 — 그것들은 video-use의 영역입니다.

6단계 — video-use 호출 (AI) — ═ 배턴 ═

이제 video-use 스킬을 호출하여 편집을 실행하세요. 명시적으로 말하세요, 예: "video-use에 편집을 넘깁니다 — project.md에서 브리프를 읽을 것입니다." 스킬 간 위임은 권고 사항(강제 아님)이므로, project.md 블록이 안전망 역할을 합니다: 스킬이 자동으로 실행되지 않으면, 사용자에게 <videos_dir>에서 video-use를 호출하라고 말하고 브리프가 이미 edit/project.md에 준비되어 있다고 알려주세요.


ACT 3 — 편집 (video-use가 담당 — 안내용으로만 표시)

당신은 이 단계를 주도하지 않습니다. video-use는 자체 ask → confirm → execute → iterate → persist 루프를 자체 게이트와 함께 실행합니다:

  • 7–8단계: 전사 (캐시됨) → 전략 제안 → 사용자 확인 → edl.json 생성 → 렌더링 → 출력물 자체 평가 → 프리뷰 → 반복.
  • 9단계: 확인 시, 최종 렌더링이 <videos_dir>/edit/final.mp4 에 저장됩니다 (이미 그레이딩, 캡션, 음량이 -14 LUFS로 정규화됨).

final.mp4가 존재하고 사용자가 컷에 만족하면 배턴이 당신에게 반환됩니다. 편집을 직접 다시 열지 마세요 — 컷에 대한 피드백은 video-use를 통해 다시 전달됩니다.


ACT 4 — POST (당신이 다시 담당)

10단계 — 패키징 (AI) — GATE

완성된 컷을 플랫폼의 정확한 사양으로 인코딩합니다:

# 플랫폼은 --platform <키> 플래그; 입력은 위치 인자; 출력 디렉토리는 --out-dir.
# 플랫폼 키: ig_reel yt_shorts tiktok yt_long yt_4k ig_feed_45 ig_feed_11 x_16_9 x_1_1
bash "${CLAUDE_SKILL_DIR}/scripts/package.sh" --platform ig_reel \
  "<videos_dir>/edit/final.mp4" --out-dir "<deliver_dir>"

package.sh는 화면비/최대 길이/코덱/컨테이너/비트레이트를 위해 platform-presets.md를 읽습니다. final.mp4는 이미 그레이딩, 톤매핑, 음량 보정이 완료된 것으로 간주합니다 (render.py가 자체적으로 two-pass -14 LUFS를 수행). 따라서 POST는 컨테이너/화면비/코덱/비트레이트 단계만 수행합니다:

  • loudnorm을 다시 적용하지 마세요 — 기껏해야 LUFS를 확인만 하고, 다시 정규화하지 마세요.
  • 다시 그레이딩하거나 톤매핑하지 마세요.
  • 별도의 deliver/ (또는 스크래치) 디렉토리에 저장하세요 — video-use의 edit/ 아티팩트를 절대 덮어쓰지 마세요.

패키징된 파일의 사양(화면비, 플랫폼 제한 대비 길이, 코덱, 크기)을 증거로 보여주세요. 승인을 기다리세요.

11단계 — 변형 (AI)

요청 시, 동일한 컷을 다른 플랫폼/화면비로 내보냅니다 (예: 16:9 YouTube 마스터 + 9:16 Shorts 컷) — 각각 별도의 package.sh 호출입니다. 다른 화면비가 진정으로 다른 리프레임을 필요로 한다면 (단순 레터박스가 아닌 경우), 이는 POST 트릭이 아닌 새로운 PRE→배턴→POST 패스입니다.

12단계 — 프리뷰 vs 편집기 핸드오프 (AI) — GATE

컷을 검토/확장하기 위한 두 가지 방법을 제시합니다 (preview-and-handoff.md):

  • 스크러빙 프리뷰 — video-use의 preview_server.py가 localhost:8777에서 클릭 가능한 타임라인을 제공합니다 (보기/스크러빙만, 편집 불가). video-use 자체의 py3.11 venv에서 실행되며 timeline.html을 당신이 지정한 편집 디렉토리 내에 작성합니다. bash -lc를 통해 호출하세요 (venv python은 allowed-tools에 직접 없지만 Bash(bash:*)는 있음):
    bash -lc '~/Documents/creative/video-use/.venv/bin/python \
      ~/Documents/creative/video-use/helpers/preview_server.py \
      "<videos_dir>/edit"'              # localhost:8777에서 서비스
    #   …
    
  • DaVinci 핸드오프 — edit.fcpxml을 생성합니다 (edl.json → OTIO → FCPXML) 그래서 사용자가 실제 멀티트랙 타임라인을 열고 수동으로 조정할 수 있습니다:
    bash "${CLAUDE_SKILL_DIR}/scripts/handoff.sh" "<videos_dir>/edit/edl.json" \
      --out "<deliver_dir>/edit.fcpxml"
    
    handoff.sh는 디렉터 venv에 opentimelineio가 필요합니다 (~/.video-director-venv, install.sh STEP 4에서 프로비저닝). venv가 없으면 사전 점검에서 종료됩니다 — 사용자에게 install.sh를 안내하세요. 사용자가 직접 제어를 원할 때 제공하세요.

어느 것을 원하는지 물어보고, 추측하지 마세요.


단계별 게이트 규율 (위의 모든 GATE에 적용)

  1. 주장이 아닌 증거를 보여주세요. 프레임, 클립, 사양 출력값, 평이한 언어로 된 파이프라인 — 사용자가 판단할 수 있는 것.
  2. 명시적인 승인을 받으세요 진행하기 전에. "괜찮아 보이나요?" 그런 다음 기다리세요.
  3. 게이트를 조용히 건너뛰지 마세요, 그리고 두 개의 막을 동시에 진행하지 마세요.
  4. 두 번의 배턴 교차는 그 자체로 체크포인트입니다 — 넘기기 전에 브리프가 올바른지 확인하고, 패키징 전에 컷이 최종본인지 확인하세요.

스크립트 (번들됨 — 인터페이스 참조)

모두 ${CLAUDE_SKILL_DIR}/scripts/ 아래에 있습니다. 절대 경로로 호출하고, 다시 발명하지 마세요.

스크립트단계역할
doctor.sh설정준비 상태 보고서 (ffmpeg 필터, venv 상태, obs/MCP)
install.sh설정사용자만 실행 — py3.11 venv 프로비저닝, obs-mcp 등록
probe.shPREffprobe → 정규화된 JSON (해상도/fps/방향/길이/오디오/음량)
prep.shPRE리프레임 / 안정화 / 배경 제거 (py3.11 venv 사용)
package.shPOST플랫폼에 맞는 컨테이너/화면비/코덱/비트레이트 인코딩
handoff.shPOSTedl.json → OTIO → edit.fcpxml (DaVinci용, ~/.video-director-venv + opentimelineio 필요)

이 파일 전체에 표시된 호출 방법은 예시입니다. 각 스크립트의 정확한 플래그/인수 순서는 스크립트 작성자가 정의하고 통합 시 확인됩니다 — 여기에 고정된 시그니처를 신뢰하기보다는 처음 사용하기 전에 스크립트의 --help / 헤더를 읽으세요.

스크립트가 없거나 오류가 발생하면 doctor.sh를 실행하고, 결과를 표시한 후 사용자에게 install.sh를 안내하세요 — 스크립트의 작업을 인라인으로 다시 구현하지 마세요.

관련 스킬