Video Reel Studio — 감독 하나, 엄격한 게이트
이 스킬은 직접 그리고 자르지 않습니다. 5개의 기존 스킬을 감독합니다:
| 스킬 | 감독이 사용하는 용도 |
|---|---|
video-ad-editor | 모든 스크립트(scripts/), 토킹 릴, 캡션, 커버 |
montage-video | 음악에 맞춰 대사 없는 클립 몽타주 |
podcast-video | 두 대의 카메라 → 릴 또는 16:9 에피소드 |
motion-video | 텍스트로 모션 필름 (motion/ 엔진) |
thumbnail-video | 릴 커버 및 YouTube 썸네일 |
스크립트 루트: .opencode/skills/video-ad-editor/ — 전체 경로를 전달하세요.
플랫폼: Windows 및 Mac
이 스킬은 두 플랫폼 모두에서 작동하도록 작성되었습니다. 차이점은 도구 호출 방식에만 있으며, 로직에는 없습니다:
| Windows | Mac | |
|---|---|---|
| Python | python | python3 |
.sh 스크립트 | & "C:\Program Files\Git\bin\bash.exe" … (⛔ 일반 bash = WSL 아님) | bash … |
| Chrome | C:\Program Files\Google\Chrome\Application\chrome.exe | /Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
| 3D | GL=gpu (ANGLE/D3D11) | Metal 자동 |
| 경로 | D:/work/x 또는 D:\work\x | /Users/you/work/x |
작업 시작 전, 세션당 한 번:
python scripts/preflight.py # Mac: python3
검사 항목: Python, ffmpeg/ffprobe, node, bash, Chrome, numpy/scipy, 하위 스킬, 폰트, 아이덴티티 폴더 — 각 시스템에 맞는 설치 명령어(winget on Windows, brew on Mac)를 출력합니다. 게이트 G-2.
스크립트 자체가 플랫폼을 감지합니다: _vision.py는 Mac에서는 Apple 도구를, Windows에서는 오픈소스 대안을 선택하고, _chrome_flags.js는 Mac에서는 Metal을, 그 외에는 SwiftShader를 선택하며, 31_device3d.js와 motion/render.js는 두 시스템의 경로에서 Chrome을 찾습니다.
워크플로우: 한 문장 → 완성된 파일
사용자가 파일이나 링크와 한 문장을 제공합니다. 당신이 모든 단계를 제어합니다. 명령을 내리지 말고, 스스로 확인할 수 있는 것은 묻지 마세요. 오직 하나의 질문만 하세요. 결정이 기술적이 아니라 취향에 달린 경우 (어떤 앵글, 어떤 후크, 어떤 문장을 제거할지).
이집트 아랍어 명령 — 사용자가 이렇게 말하면 이 모드입니다
| 사용자가 말하면 | 모드 |
|---|---|
| «منتج الفيديو ده» · «حوّله لريل» · «اقصّ السكتات» · «هات الكابشن» | talking-reel |
| «اعمل مونتاج من المقاطع دي» · «ركّبهم على الأغنية» | montage |
| «اعمل ريلات من الحلقة» · «عندي كاميرتين» · «الحلقة كاملة» | podcast |
| «اعمل فيديو موشن من النص ده» · «اشرح بالحركة» · «موشن جرافيكس» | motion |
| «اشرح الموقع ده بفيديو» · «ديمو للتطبيق» · «اللينك ده» | web-demo |
| «اعمل كوفر» · «ثمبنيل يوتيوب» · «صورة مصغرة» | cover-only |
| «عايز أعدّل بنفسي» · «اعمله كاب كت» · «افتح الاستوديو» | 기본 모드 + CapCut / Studio |
사용자가 모드를 언급하지 않아도 됩니다. 문장에 동사 + 파일이 있으면 이 표에서 모드를 유추하여 진행합니다.
빠른 파이프라인
| # | 단계 | 산출물 | 게이트 |
|---|---|---|---|
| -2 | 환경 점검: preflight.py (Windows/Mac) | 도구 보고서 | G-2 |
| -1 | 아이덴티티 (선택): 먼저 질문 — 저장됨 / 새로 만들기 / 기본값 | theme.json + brand.md | G-1 |
| 0 | 요청 읽고 brief.json 작성 | 약속 + 모드 + 길이 | G0 |
| 1 | 소스: 복사, 프레임 검사, 조명 | src.mov | G1 |
| 2 | 컷 + 전사 + 보정 + 캡션 | cut.json a.json caps.json | G2 · G3 · G3b |
| 3 | 디자인: 모션, 장면, 미리보기 | scenes*.js + sheet.jpg | G4b |
| 4 | 전체 렌더링 | out/ = duration×30 | G4 |
| 5 | 인코딩 + 마스터 + 번역 | ad-master.mp4 .srt | G5 |
| 6 | 커버 + 썸네일 + 모바일 미리보기 | cover.jpg … | G6 · G6b |
| 7 | 전달 보고서 | gates.md | G8 |
세부 사항 및 정확한 명령어 ← references/pipeline.md.
역할 및 에이전트에게 넘겨야 할 때 ← references/roles.md.
각 게이트 조건 및 한계 ← references/gates.md.
아트 방향: 첫 장면 전에 styles/pack.json(10개)에서 스타일 선택 — python scripts/style_pack.py apply "<work>" <id> — 스타일이 움직임과 질감을 결정하고, 브랜드가 색상을 결정 ← references/styles-adapted.md.
-1a) 에이전트 및 모델 — 아이덴티티 전에
ai.json은 어떤 작업보다 먼저 작성됩니다: 에이전트는 환경에서 알 수 있으므로(그 안에서 작업 중이므로), 묻지 마세요.
모델이 명확하지 않은 경우 단 하나의 질문만 하세요:
"어떤 모델로 작업할 건가요? 이름만 — 장면 크기와 리뷰 방식을 맞추려고요."
| 답변 | 즉시 효과 |
|---|---|
| 강력 + vision 모델 | 6–8 장면, 깊이 있는 순간, 하위 에이전트를 통한 시각 검토 |
| 강력 but vision 없음 | 4–6 장면, 숫자만 검토 + sheet.jpg에 대한 사용자 눈 |
| 빠름/저렴 | 검증된 패턴에서 3–5 장면, 미리보기 한 번, 게이트당 한 번 |
| 작은 컨텍스트 | 전사를 창으로 나누고, 전체 텍스트를 읽지 않음 |
- 에이전트:
opencode·claude-code·codex·cursor·gemini-cli—preflight.py가 프로젝트 마커를ai.json과 비교합니다. - 기능을 알 수 없으면
null로 남깁니다 → 스킬이 보수적으로 작동합니다 (숫자 + 눈). - 세부 사항 및 전체 매트릭스 ←
references/ai-fit.md.
-1b) 아이덴티티 — 선택적 온보딩 (강요하지 마세요)
첫 비디오 요청 시, 어떤 스크립트보다 먼저 하나의 질문만 하세요:
"시작하기 전에: 아이덴티티를 한 번 설정할까요 (5분: 색상, 폰트, 톤, 금지사항)? 아니면 저장된 아이덴티티를 사용할까요? 아니면 기본값으로 진행하고 나중에 변경할까요?"
| 사용자 응답 | 수행할 작업 |
|---|---|
| «저장된 아이덴티티 있음» | python scripts/onboard.py list ← 이름 언급 ← apply <work> <slug> |
| «설정할게요» | 7가지 질문 ← new ← card ← 카드 표시 ← apply |
| «기본값으로 진행» | 같은 프로젝트에서 다시 묻지 않음; 기본값 #0B0C0C · #F4F2EE · #19C3AE · Cairo · chunk |
| «바빠요» | 비디오 시작하고, 첫 전달 후 아이덴티티 제안 |
- 7가지 질문 (이름, 핸들, 대상 청중, 톤, 클 투 액션, 색상, 금지사항) ←
references/onboarding.md. - 이미지/로고가 있음? 추측 대신
scripts/00_theme_refs.py로 팔레트 추출. - G-1: ink/bg 대비 ≥ 4.5, acc/bg ≥ 3, onAcc/acc ≥ 4.5. 실패 시
onboard.py new가 저장을 거부. - 아이덴티티는
~/.config/opencode/brands/<slug>.json에 저장되며 이후 모든 프로젝트에서 사용됨.
⛔ 묻지 않고 온보딩을 시작하거나, 색상 때문에 프로젝트를 중단하거나, 7개 이상의 질문을 하지 마세요.
G0 — 브리프 (건너뛰지 마세요)
어떤 스크립트보다 먼저 <work>/brief.json을 작성하세요. 템플릿: assets/brief.template.json.
promise= 시청자가 처음 3초 안에 이해하는 것. 한 문장. 쓸 수 없으면 요청을 이해하지 못한 것입니다.mode는 6개 중 하나. 요청이 두 가지 모드에 모두 해당하면 사용자 의도에 가장 가까운 것을 선택하고 이해한 내용을 한 문장으로 말하세요.length_s= 현실적인 범위 (릴 45–90초; 긴 클립은 하나의 릴이 아닌 여러 릴).must_keep= 삭제하거나 변경할 수 없는 이름과 숫자.
Gate G0: 세 가지 모두 존재하는가? 아니오라면 하나의 질문을 하고 계속 진행하세요.
지휘: 누가 결정하는가
당신이 주도합니다. 각 단계마다 허락을 기다리지 말고, 당신을 관리하는 에이전트에게 작업을 넘기지 마세요.
- 스스로 확인하세요 모든 기술적 사항: 길이, 프레임, 오디오, 크기, 세이프 존.
- 판단만 위임하세요, 판단이 깨끗한 메모리로 더 나을 때: 아랍어 검토, 이미지 검토.
- 에이전트는 읽고 판단만 합니다 — 쓰거나 그리지 않습니다. 프롬프트 템플릿은
references/roles.md에 있습니다.
게이트: fail-closed
python scripts/gate_runner.py "<work>" --safe
- 테이블을 출력하고
gates.json+gates.md를 작성하며, blocker가 있으면 exit 1로 종료합니다. - blocker가 열려 있으면 전달하지 않습니다. "한번 해보고 보자" 없음.
- 게이트당 최대 2번 시도. 세 번째 = 원인을 이해하지 못한 것 → 스크린샷과 게이트 텍스트를 증거로 사용자에게 질문하고 중단.
- 게이트를 비활성화하거나
--maxmb를 올리거나 "작으니까" 경고를 무시하는 것은 금지입니다. 이는 조작입니다.
엄격한 규칙
- 캡션은 그의 말을 정확히 베낀 것 — 지어내지 말고, 이유 없이 단어를 삭제하지 말며, 보정 시 단어 수를 유지하세요.
- 세이프 존 우선 — y 0–150 또는 y 1620–1920 영역, 또는 오른쪽 버튼 열에 텍스트를 넣지 마세요.
theme.json의 색상만 사용; 사용자 동의 없이 이미지에 색상 보정을 전혀 하지 마세요.- 화면의 모든 숫자는
facts.md또는 그의 말에서 가져온 것 — 임의의 숫자 사용 금지. - 게시나 예약 없음. 파일만 전달.
- 커버는 필수 — 첫 프레임이며 모바일 화면 크기로 읽을 수 있어야 함 (
cover_phone.jpg). - 크기와 음량은 품질의 일부: ≤29MB, −14 LUFS, 피크 ≤ −1.0 dBTP.
작동 모드
- 토킹 릴 (기본값):
talking-reel— 전체 비디오가 전체 화면을 채우고, 그래픽은 상단 벨트 또는 그 뒤에 위치. - 대사 없는 클립:
montage— 10–20개 클립 + 오디오 트랙 필요. 같은 샷 재사용 금지. - 팟캐스트:
podcast— 두 대의 카메라. 작성된 후크 필수. - 모션 필름:
motion— 기본적으로 내레이션 없음 (audio.py --no-bed --lufs -20). 3D는GL=gpu필요. - 웹사이트/앱:
web-demo—27_web_capture.js후30_demo.js(또는31_device3d.js). - 커버 전용:
cover-only.
전달 보고서
두 줄, 그 다음 짧은 테이블:
길이 · 컷 수 · 크기 · 음량 · 피크
게이트 7/7 ✅ (또는 허용 가능한 경고 + 이유)
파일: mp4 · srt · txt · cover.jpg
아무것도 게시되지 않았습니다.
토큰 경제
- 단계당 하나의 명령어로, 41개의 개별 명령어가 아닙니다.
- 6개의 개별 이미지 대신 한 장의 시트 (
sheet.jpg). - 전체 파일을 읽지 마세요: 함수는
grep -n, 로그는tail -5. - 필요할 때만 참조 — 이 파일 + 단계에 적합한 참조 하나.
- 다른 방법으로 답할 수 없는 시각적 질문이 아니면 이미지를 표시하지 마세요.
예상되는 실패 (놀라지 마세요)
| 증상 | 원인 | 해결책 |
|---|---|---|
UnicodeEncodeError | Windows에서 utf-8 없이 쓰기 | PYTHONUTF8=1 설정 (스크립트는 수정되었지만 의존하지 마세요) |
| 3D 멈춤 | Chrome 경로 / /work 경로 | CHROME이 정확하고 GL=gpu 설정됨 (31_device3d에서 수정됨) |
| 캡션 지연/누락 | 캡션 생성 후 컷 변경 | 02_captions.py 재실행 후 G3 |
| 압축 후 높은 피크 | AAC가 피크를 상승시킴 | 커버 경로에 alimiter 또는 06c_loudfix.sh |
| 전사 환각 | 방언/영어 용어 | 02a_whisper_check.py --fix 실행 후 고정된 단어 수로 수정 |