Communitygithub.com

Finderchangchang/promo-video-skill

저비용 LLM → 고급 세로형 홍보 영상을 Remotion으로 제작합니다. 소프트웨어/식품/이커머스/교육/뷰티/여행 업종을 지원하며, 한국어/중국어/영어를 포함한 다국어를 지원합니다. README에 업종별 예시 PNG가 포함되어 있습니다.

promo-video-skill란 무엇인가요?

이 스킬은 개발자가 AI 에이전트(Claude Code, Cursor, Codex 등)를 사용하여 프로그래밍 없이 고품질의 세로형 홍보 영상을 제작할 수 있도록 설계되었습니다. 사용자는 쇼트(숏폼) 선택과 텍스트 입력이라는 두 가지 작업만 수행하면 되며, 템플릿이나 스크립트 파일을 수정할 필요가 없습니다. 소프트웨어, 식품, 이커머스, 교육, 뷰티, 여행 등 다양한 업종을 위한 사전 정의된 규칙과 샷 라이브러리를 제공하며, 각 업종별로 최적화된 샷 조합과 규정 준수 가이드라인을 포함하고 있습니다. 핵심 워크플로우는 업종 및 언어 설정, 브리핑 분석, 스토리보드 JSON 파일 생성 (5-9개의 샷 선택 및 자막 작성), 로컬 검증 스크립트를 통한 오류 및 경고 확인, 최종 영상 렌더링으로 이루어집니다. 이 스킬은 Remotion을 기반으로 구축되어 일관된 출력 품질을 보장하며, 다국어(중국어, 영어)를 지원하고, 업종별 특수 규칙(예: 뷰티 산업의 'beforeAfter' 샷 사용 제한)을 자동으로 검증하여 규정 준수를 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Finderchangchang/promo-video-skill

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

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

문서

제품 홍보 영상 (promo-video)

당신은 샷 고르기와 텍스트 채우기만 하면 됩니다. 코드를 작성하지 않고, template/, scripts/, industries/ 디렉토리 내의 어떤 파일도 수정하지 않으며, 좌표, 프레임 번호, 색상 값을 전혀 입력하지 않습니다.

아래에서 <SKILL>은 이 파일이 있는 디렉토리를 의미합니다. 모든 명령은 Node 22 / Python 3.10으로 실행합니다. 영어 사용자나 영어 동영상이 필요한 경우에는 <SKILL>/SKILL.en.md를 대신 읽으십시오.

프로세스

  1. 업종 및 언어를 결정합니다.
    • meta.industry: software(기본값) / food(외식) / ecommerce(전자상거래 실물) / education(교육) / beauty(미용) / travel(여행/숙박). 업종을 잘못 선택하면 사용 가능한 샷과 규정 준수 규칙이 모두 틀리게 됩니다.
    • meta.lang: zh(기본값) / en. 동영상에 영어 자막이 필요하거나 사용자가 영어권 사용자이면 en으로 설정합니다(사용법은 5단계 참조).
    • 업종이 software가 아닌 경우 -> 먼저 <SKILL>/industries/<industry>/recipe.md를 읽으십시오 (영어 프로젝트는 recipe.en.md): 여기에는 해당 업종에 권장되는 샷 조합, brief-template.md (해당 업종의 브리핑에서 물어봐야 할 항목들), 그리고 test-brief.md/expected.md (규정 위반 예시)가 포함되어 있습니다. 이 단계를 건너뛰면 쉽게 차단될 수 있는 콘텐츠를 작성하게 됩니다.
  2. 브리핑을 읽습니다. 해당 brief-template.md의 항목을 이해합니다. '제품명 / 한 줄 핵심 가치 / 불편 상황 / 핵심 동작 / 2-4개의 핵심 기능' 등이 누락되면 먼저 질문하고, 데이터나 기능을 임의로 지어내지 마십시오.
    • meta.product는 브리핑의 제품명을 그대로 사용하며, 전체 영상(hook 캡슐, 엔드카드의 brand)에서 이 이름만 사용합니다. 엔드카드의 brand는 반드시 이 이름과 정확히 일치해야 합니다.
    • meta.action: 필수 입력 사항, 한 문장으로 '사용자가 무엇을 하면 -> 제품이 무엇을 제공하는지'를 설명합니다(예: '영수증 사진 찍기 -> 금액과 분류 자동 입력'). 화면에 표시되지 않습니다. 데모용 샷(chat/phone/mockApp/photoShot)의 화면 텍스트는 이 동작을 반영해야 하며, 검증 시 확인됩니다.
    • 브리핑의 '획득 방법'에 내용이 있으면 -> 그대로 meta.cta에 작성하고, 엔드카드의 cta도 이를 그대로 복사합니다. 브리핑에 '없음'으로 명시되면 -> 두 곳 모두 작성하지 않습니다. '앱스토어에서 XX 검색'과 같은 문구를 직접 만들어 쓰지 마십시오.
    • 브리핑에 없는 기능은 핵심 기능이나 엔드카드에 절대 포함시키지 마십시오.
    • 브리핑에 '숫자와 출처' 항목이 있으면 -> 각 항목을 meta.facts에 복사합니다. 형식은 [{"id":"f1","text":"원문..."}]입니다(순수 문자열 배열이 아닙니다). 화면에 표시되는 모든 단위를 포함한 숫자(시간, 백분율, 배수, 인원, 금액)는 여기서 동일한 숫자를 찾을 수 있어야 하며, 출처가 없는 것은 모두 오류로 처리됩니다(단순 경고가 아님). 데이터가 제공되지 않은 경우에는 정성적인 표현을 사용하고, 숫자를 지어내지 마십시오. 샷의 params.refs: ["f1"]은 특정 표현(예: '즉석 제조')을 특정 fact와 연결하여 업종 규칙 확인에 사용합니다.
    • 전체 영상에서 동일한 작업의 소요 시간은 하나의 숫자만 사용합니다: 카운터에 '3분'이라고 쓰면, 다른 곳에 '즉시 완료', '3초'라고 쓸 수 없습니다. 후크에 '반나절'이라고 쓰면, 카운터의 이전 값도 '반나절'이어야 합니다. 검증 시 오류가 발생합니다. compare 샷에서도 같은 열의 stat과 items가 모순되어서는 안 됩니다(예: 왼쪽 열에 '5분'과 '3일'이 같이 있음).
    • 기본 15-45초의 총 길이 범위를 벗어나야 하는 경우(예: 업종 권장 구조가 27초 이상 필요), meta.durationRange: [15, 60]와 같은 두 요소 배열을 작성합니다.
    • 하단에 상시 표시해야 하는 작은 글씨 안내(예: '한정 이벤트, 상품 상세페이지 기준')가 있으면 meta.notices에 문자열 배열로 작성합니다. 최대 3개까지 가능하며, 한 줄로 합쳐져 하단에 표시됩니다.
  3. 디렉토리 생성: promo/<영문 제품명>/ 디렉토리를 만들고, 스토리보드는 promo/<영문 제품명>/storyboard.json에 작성합니다. 사용자가 제공한 스크린샷, 동영상, 로고는 동일한 디렉토리에 복사합니다.
  4. 테마 선택(meta.theme):
    • 감성, 소셜, 생활 -> warm-emotion
    • 개발자, AI, 하드코어 도구 -> tech-dark
    • 건강, 학습, 가계부, 가벼운 도구 -> fresh-light
    • 업무, B2B, 생산성 -> business-blue
    • 명절, 프로모션, 신상품 -> festival-red
    • 고급, 미니멀, 디자인 -> mono-premium 브랜드 컬러가 있으면 meta.brandColor(#RRGGBB)를 작성합니다. 이 값은 강조 색상만 변경합니다.
  5. 5-9개의 샷을 선택합니다. (샷 설명은 <SKILL>/shots.md 참조. 상단에 18개 샷 요약표가 있습니다.) hook은 반드시 첫 번째 샷(2-3초)이어야 하고, endCard는 반드시 마지막 샷(4초)이어야 합니다. 핵심 동작을 보여주는 샷이 하나 이상 포함되어야 합니다 (2단계에서 작성한 meta.action). 검증 시 확인됩니다. chat은 messages + panel(질문 -> 답변)을 작성하거나, mockApp에 input(사용자 입력/질문) + 결과(dashboard의 stat, editor의 items, done)를 작성합니다. 스크린샷이 있으면 phone을 사용합니다. meta.industry에 따라 어떤 샷을 사용할 수 있는지 결정됩니다(industries/<industry>/rules.json의 enabledShots 참조, 또는 recipe.md에서 직접 확인). 허용되지 않은 샷을 선택하면 검증 시 오류가 발생합니다. 7개의 업종별 샷(software의 경우 기본적으로 비활성화):
    • photoShot 실제 사진/동영상(요리, 상품, 작품, 방, 공용 공간, 주방)
    • priceCard 가격표; storeCard 매장/지도/예약; reviewCard 실제 고객 리뷰(원문 그대로, 과장된 표현으로 수정 금지)
    • factSheet 사양표/개봉 목록/강의 계획서/시험 정보/색상표; credCard 자격/명예 카드
    • beforeAfter 전후 비교 슬라이더(미용 업종만 사용 가능, consent:true + retouched:false 필요) 중간에는 제품 유형에 따라 샷을 선택하고, 고정된 템플릿을 그대로 사용하지 마십시오. features 핵심 기능 카드는 필수가 아닙니다. 두 가지 하드 요구 사항(검증 시 알림):
    • 중간 부분에 최소 하나의 샷은 {compare, steps, phone, meter} 중에서 선택;
    • quickList와 counter는 동시에 사용할 수 없음 (둘 다 사용하면 영상이 hook -> quickList -> mockApp -> counter -> endCard로 모든 사람이 똑같은 템플릿이 됩니다). software 업종에서 선택 가능한 조합 (하나를 선택한 후 제품에 맞게 수정; 다른 업종은 industries/<industry>/recipe.md의 권장 구조를 직접 따름):
    • B2C 감성/소셜 (채팅, 감성, 동반): hook(bubble) -> chat 데모(2-3문장 자막으로 작성) -> meter 또는 compare로 '이 말의 무게' 전달 -> quickList 빠른 전환 -> endCard
    • 도구/효율성 (글쓰기, 가계부, 게시, 편집): hook(stat) -> compare로 '예전 vs 지금' 전달 -> mockApp editor/form 데모 '입력 -> 결과' -> steps로 사용 방법 설명 -> endCard; 또는 hook -> quickList로 불편함 전달 -> mockApp -> steps -> endCard
    • B2B 데이터/업무 (보고서, 회의, CRM): hook(icon) -> phone 스크린샷 강조 또는 mockApp dashboard에 input 포함 '질문 한 번 -> 데이터 출력' -> compare 또는 meter로 효과 전달 -> steps -> endCard; 브리핑에 소요 시간 숫자가 있는 경우에만 counter 사용(이 경우 quickList는 사용 불가) 총 길이는 20-30초가 가장 좋습니다(15-45초 또는 meta.durationRange의 사용자 정의 범위 허용). 동일한 유형의 샷을 연속해서 사용하지 마십시오. 인접한 두 샷의 mood 차이는 0.5를 넘지 않도록 합니다(중간에 전환용 샷을 하나 삽입). 그렇지 않으면 배경이 급격하게 전환됩니다.
  6. 자막 작성(각 샷의 caption): 샷 당 한 문장, TikTok 스타일의 큰 글씨로, 시청자에게 말하는 것처럼 작성하고, 화면이 어떻게 움직이는지 설명하지 마십시오. (❌ '카드가 하나씩 나오며, 그것이 무엇을 할 수 있는지 설명합니다'는 샷 설명이지 자막이 아닙니다).
    • 중국어: 최대 2줄, \n으로 줄바꿈; 각 줄은 12자(한자 기준) 이하 (알파벳/숫자는 반자로 계산). meta.lang: "en"일 때 영어 자막은 라틴 문자 수를 기준으로 계산(약 중국어 제한의 1.8배), 구체적인 숫자는 docs/shots/<type>.en.md 참조
    • {}로 가장 중요한 2-5자를 감싸서 강조 색상으로 변경; 샷 당 최대 1개
    • hook의 caption = 커버 타이틀, 사용자의 불편함 또는 반전 질문 작성
    • endCard에는 caption을 작성하지 않고, 슬로건은 params.slogan에 작성
    • 동일한 자막은 최대 5초까지만 표시 가능. 5초가 넘는 샷(예: 8-10초의 chat)의 경우, caption을 2-3개 문장의 배열로 작성하여 해당 샷의 시간을 균등하게 나눕니다: "caption": ["일단 보내지 마세요.\n상대방이 원하는 건 {당신의 관심}", "하나 골라서 입력창에 넣고\n보낼지는 {당신이 결정하세요}"]
    • 자막은 사용자의 상황이나 제품이 가져온 변화에 대해 이야기해야 하며, 앞뒤 샷과 연결되어야 합니다. 화면의 움직임은 컴포넌트의 역할이므로 작성하지 마십시오. 자막에서 「」로 묶인 단어는 해당 샷 또는 이전 샷의 화면에 반드시 등장해야 합니다 (검증 시 확인)
    • 자막에 수량( '이 4문장', '세 개의 답변')을 언급한 경우, 해당 샷의 항목 수와 일치해야 합니다 (검증 시 확인)
    • 만능 문장('세 가지, {그것이...}', '이 세 단계', '이런 순간들, 당신도...')을 사용하지 마십시오. 또한 examples, shots.md, spec의 자막과 매개변수를 그대로 복사하지 마십시오. 검증 시 알림을 주고 직접 채울 수 있는 문장 패턴을 제안합니다. 예시는 형식 참고용으로만 사용하십시오.
    • 단어 중복( '일정 일정'), 글자 수 맞추기 위한 무리한 축약( '목이 조이다'를 '목 조임'), 오타( '로그인'을 '로그인' 오기, 단, '상륙함/달 착륙'은 제외)를 하지 마십시오. 글자 수가 초과되면 문장 전체를 바꾸어 표현하십시오.
    • 절대적 표현('완전 해결', '깔끔하게 해결', '안전 걱정 없음', '100%')을 사용하지 마십시오: 제품이 구현하기 어려운 경우가 많습니다. 검증 시 알림을 주며, 적절한 표현으로 바꾸어야 합니다.
    • 줄바꿈은 하나의 백슬래시 \n만 사용; 자막에 인용 부호가 필요하면 「」를 사용하고, 영어 큰따옴표 "는 사용하지 마십시오.
  7. mood 작성(0-1): 불편함/긴장 0.8-1, 전환점 0.5, 제품 및 기능 0-0.3, 엔드카드 0. 배경 색상과 배경 음악이 이에 따라 변경됩니다.
  8. storyboard.json 작성, 형식은 문서 끝의 전체 예시를 참조하십시오. 시간은 dur(초)로 작성하며, 0.5의 배수로 작성합니다. 파일은 반드시 UTF-8 인코딩이어야 합니다. 중국어 Windows의 기본값은 GBK: 편집기/파일 쓰기 도구를 사용하여 직접 UTF-8로 작성; PowerShell을 사용하는 경우 [IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false))를 사용; Python을 사용하는 경우 open(p, "w", encoding="utf-8")을 사용. echo >, Out-File (5.1 버전)로 중국어를 작성하지 마십시오. chat 샷의 panel.replies는 제품이 **'저'**가 상대방에게 보내는 제안입니다. '저'의 입장에서 작성합니다 (나는 야근해야 한다고 말하는데, 제안 답변이 '더 이상 야근하지 말고, 나랑 있어줘'가 되어서는 안 됩니다 – 그것은 상대방의 어조입니다); panel이 있으면 typing을 작성하지 마십시오.
  9. 검증, 오류 메시지에 따라 하나씩 수정하여 통과할 때까지 반복:
    node <SKILL>/scripts/validate.mjs promo/<제품명>/storyboard.json
    
    오류 형식은 'N번째 샷(유형) 필드: 문제 -> 해결 방법'이며, '해결 방법'을 따릅니다. 결과는 세 가지 등급으로 나뉩니다:
    • 오류(errors): 반드시 수정해야 하며, 수정하지 않으면 영상이 생성되지 않습니다.
    • 경고(warnings): 가능하면 수정(문구 품질, 구조가 템플릿과 너무 비슷하지 않은지), 수정하지 않아도 영상은 생성되지만, 전달 시 사용자에게 왜 수정하지 않았는지 설명할 수 있어야 합니다.
    • 인적 검토 필요(human): 검증이 판단할 수 없는 사항(예: '이 리뷰가 정말 한 글자도 바꾸지 않았는지', '이 자격 사항이 실제로 브리핑에서 나온 것인지'), storyboard를 수정할 필요 없음, 원래대로 사용자에게 나열하여 사용자가 직접 확인하도록 합니다.
  10. 영상 생성(약 2분 소요, 자동으로 배경 음악 생성됨):
    node <SKILL>/scripts/make.mjs promo/<제품명>/storyboard.json --out promo/<제품명>
    
    --out은 필수 입력 사항입니다(테스트 시에는 --round <회차>로 대체, 결과물은 tests/<회차>/<제품명>/에 통합 저장. 동일 회차의 여러 영상은 같은 회차 이름을 사용하며, 초 단위 타임스탬프 디렉토리를 직접 생성하지 마십시오). 결과물: video.mp4, sheet.png(초당 한 프레임의 콜라주), check/(0번째 프레임 + 각 샷 종료 직전의 전체 크기 프레임), report.txt(텍스트 레이아웃 보고서 포함: 단어 분리, 너비 초과 여부), layout.json. 몇 프레임만 빠르게 확인하려면: --stills 0,3.5,8(초)을 추가하면 단일 프레임만 출력되고 전체 영상은 생성되지 않습니다.
  11. 먼저 report.txt의 마지막 부분 '기계 자체 점검', '텍스트 레이아웃 보고서', '레이아웃 자체 점검'을 확인합니다 (make.mjs가 자동 수행: 백슬래시, 제품명, 획득 방법, 자막 머무는 시간, 엔드카드 아이콘과 면책 조항 작은 글씨가 겹치는지, 단어 분리/너비 초과 행이 있는지 확인; 렌더링 시 각 텍스트 블록의 위치를 측정하여 텍스트가 카드에 의해 잘리거나, 두 텍스트 블록이 서로 겹치거나, 텍스트가 x150-930 범위를 벗어나는지 확인). ✗ 표시가 있으면 먼저 수정(레이아웃 ✗는 일반적으로 특정 필드에 너무 많은 내용을 작성한 경우: 항목을 삭제하거나 텍스트를 줄임). 그런 다음 sheet.png와 check/를 아래 체크리스트에 따라 자체 점검하고, 문제가 있으면 storyboard.json을 수정하여 9단계로 돌아갑니다.
  12. 전달: video.mp4 경로와 sheet.png 경로를 사용자에게 전달하고, '게시 전 자체 점검 체크리스트'(아래 참조)를 첨부합니다. 9단계의 '인적 검토 필요' 항목을 그대로 나열하여 사용자가 하나씩 확인하도록 하고, 사용자를 대신하여 판단을 내리지 마십시오.

자체 점검 체크리스트 (스프레드시트 이미지를 보고 각 항목을 화면과 대조하여 결론을 작성하고, 단순히 체크 표시만 하지 마십시오)

  • 0번째 프레임에 큰 제목 + 메인 비주얼이 있고, 빈 화면이나 반쪽짜리가 아닙니다. 커버에 \n, 백슬래시 같은 이상한 문자가 없습니다.
  • 각 샷에는 움직이는 주체(포인터, 숫자, 카드, 채팅 버블)가 하나씩 있고, 정적인 이미지만 있는 것은 아닙니다. '이미지가 줌인/줌아웃되는' 것으로 때우지 않았습니다.
  • 자막이 주제를 가리지 않고, 잘리지 않았으며, 단어가 분리되지 않았습니다(한 단어가 두 줄로 나뉨). 자막과 화면이 동일한 내용을 말하고 있으며, 앞뒤 샷의 이야기가 연결됩니다.
  • 자막은 시청자에게 하는 말이고, 샷 설명이 아닙니다('카드가 하나씩 나오는'과 같은 화면 동작 설명 문장이 없습니다).
  • 핵심 동작이 실제로 시연되었습니다('입력/질문 -> 결과'를 볼 수 있음). 기성 패널 이미지만 있는 것이 아닙니다.
  • 배경 색상이 감정에 따라 변합니다: 불편함 포인트는 붉은색 계열, 기능과 엔드카드는 차가운 계열.
  • 엔드카드의 제품명이 meta.product와 일치합니다. 획득 방법은 브리핑 원문이거나 표시하지 않습니다. URL, QR 코드가 없습니다.
  • 숫자 모순이 없습니다: 비교의 앞뒤 숫자를 직접 계산해 봅니다(30분 대 5초라면 결론을 '25분 절약'이라고 쓰면 안 됨). 화면의 숫자가 meta.facts에서 출처를 찾을 수 있습니다.
  • 오타, 글자 수를 맞추기 위해 글자를 지워서 만든 단어('자동 업로드'를 '자동 올'으로 쓰지 않음), 절대적 표현이 없습니다.
  • 업종 샷이 올바른 위치에 사용되었습니다: beforeAfter는 미용 업종에서만 사용; reviewCard의 인용은 원문 그대로이며, 과장되게 수정되지 않았습니다.

게시 전 자체 점검 체크리스트 (전달 시 사용자에게 첨부, 자신이 확인하는 것으로 끝내지 마십시오)

  1. '인적 검토 필요' 항목 모두 나열: 9단계 검증 결과의 human 목록을 사용자에게 그대로 복사합니다. 사용자를 대신하여 '괜찮을 것 같다'고 판단하지 마십시오. 일반적인 예: reviewCard/credCard의 인용이 브리핑 원문과 한 글자도 다르지 않은지, 플랫폼 규칙이 업데이트되었는지, 업종 자격 요건이 충족되는지.
  2. meta.industry가 올바르게 선택되었습니까? (잘못 선택하면 허용되는 샷과 규정 준수 규칙이 모두 틀리게 됩니다).
  3. 실제 사람 출연, 고객 리뷰, 전후 비교 사진과 관련된 경우, 당사자의 서면 동의를 받았습니까? (consent/retouched 같은 필드는 검증 요구 사항일 뿐이며, 실제 동의 획득은 사용자의 책임입니다. 검증이 대신 확인해 줄 수 없습니다).
  4. 동영상을 게시할 플랫폼(틱톡/웨이신 채널/샤오홍슈/해외)이 meta.platform과 일치하며, 해당 플랫폼의 고유 규칙(예: 쇼핑 카트에 가격 자막을 표시할 수 없음)을 확인했습니까?
  5. 다국어 프로젝트: 영어 자막을 원어민이 검토했습니까? 기계는 글자 수와 금지어만 확인했을 뿐, 어색한 표현은 찾아낼 수 없습니다.

하드 규칙 (검증 시 차단됨)

  • 첫 번째 샷은 반드시 hook이어야 합니다. endCard는 마지막에 배치합니다.
  • 총 길이는 15-45초(또는 meta.durationRange의 사용자 정의 범위). 각 샷 유형에는 자체 길이 범위가 있습니다(shots.md 참조).
  • 각 필드에는 글자 수 제한이 있으며, 초과하면 문장 전체를 더 짧은 표현으로 바꾸어야 합니다. 단어의 글자를 지워서 글자 수를 맞추지 말고, 영어로 대체하지도 마십시오 (meta.lang: "en"일 때 영어는 자체 문자 수 제한이 있으며, 해당 필드 설명 참조).
  • shots.md에 나열된 필드, 허용 값 및 아이콘 이름만 사용할 수 있습니다. 철자가 틀리거나 필드가 추가되면 오류가 발생합니다.
  • 최소 하나의 샷은 meta.action을 시연해야 합니다(5단계 참조). 동일한 자막은 최대 5초까지만 표시할 수 있습니다.
  • 엔드카드 brand = meta.product; 엔드카드 cta = meta.cta (브리핑에 없으면 모두 작성하지 않음).
  • 화면 텍스트에 백슬래시가 포함될 수 없습니다 (JSON에서 \\n으로 작성하면 그대로 화면에 표시됨).
  • 화면에 URL, QR 코드, '스캔', @계정, 'XX번호: 이름', '팔로우/검색 XX' 등이 나타날 수 없습니다. 제품 자체의 카테고리 용어(예: '공식 계정' 레이아웃 도구)는 트래픽 유도로 간주되지 않습니다: 해당 단어를 meta.allowWords에 추가하고, 검증을 통과하기 위해 제품명을 변경하지 마십시오.
  • 「광고법」 극한 금칙어 사용 금지: 가장, 최고, 유일무이, 최초, 첫 번째 선택, 독점, 최상급, 절대적, 100%, 전 네트워크, 압도적으로 앞서는... ('최근/마지막/첫 번째 단계' 등은 해당되지 않음). 확실한 근거가 있는 경우에만 meta.allowWords에 기록합니다.
  • 단위를 포함한 숫자(시간/백분율/배수/인원/금액)는 반드시 meta.facts에서 동일한 숫자를 찾을 수 있어야 합니다. 없으면 지어낸 것으로 간주하여 무조건 오류 처리합니다.
  • 업종 규칙은 세 가지 등급: block은 무조건 차단(예: 의료 미용 효능 주장, 할인 가격에 근거 없음, 실제 리뷰에 월 표시 없음); warn은 경고만 하고 차단하지 않음; human은 검증이 판단할 수 없으므로 전달 시 사용자에게 나열(위의 '게시 전 자체 점검 체크리스트' 1번 항목 참조)
  • 리소스 경로는 storyboard.json이 있는 디렉토리를 기준으로 하며, 파일이 반드시 존재해야 합니다. 스크린샷은 png/jpg/webp를 지원하고, 동영상은 mp4를 지원합니다.

금지 사항

  • template/, scripts/, industries/ 디렉토리 내의 어떤 파일도 수정하지 않습니다. 좌표, 픽셀, 프레임 번호, 색상 값, CSS를 작성하지 않습니다.
  • 사용자가 제공하지 않은 데이터나 출처를 지어내지 않습니다. 화면의 숫자는 meta.facts에서 찾을 수 있어야 하며, 출처가 없으면 '예시 데이터이며, 실제와 다를 수 있습니다'라고 작성합니다.
  • 타사 앱의 이름, 로고 또는 브랜드 색상(예: 특정 채팅 앱의 녹색 말풍선)이 나타날 수 없습니다. '상대방', '동료', '고객'과 같은 표현을 사용합니다.
  • 실제 사람 이름, 전화번호, 계정을 작성하지 않습니다.
  • bgm 필드를 사용하지 않습니다(make.mjs가 자동으로 채움).
  • 업종 규정의 회색 지대 문제(예: '이 문장이 의료 용어로 간주되는가')를 스스로 판단하지 않습니다: 검증이 차단하면 수정하고, 검증이 통과했지만 확실하지 않으면 '인적 검토 필요'에 포함시켜 사용자에게 넘기고, 스스로 '괜찮을 것이다'라고 결론 내리지 마십시오.

일반적인 오류 및 해결 방법

오류해결 방법
N행... 자, 각 행 최대 12자줄이거나, 의미상 구분되는 부분에서 \n을 사용하여 두 행으로 나눕니다.
2개의 {} 강조 표시 사용가장 중요한 한 곳만 남깁니다.
{} 쌍이 맞지 않음각 {에는 }가 있어야 하며, 여러 행에 걸쳐 있을 수 없습니다.
「광고법」 극한 금칙어 '가장' 포함증명 가능한 표현으로 변경: '가장 빠른' -> '3초 만에 결과 출력'
첫 번째 샷은 반드시 hook이어야 함맨 앞에 hook을 추가합니다.
endCard 이 샷에는 자막을 쓸 수 없음caption을 삭제하고, 큰 글자는 params.slogan에 작성합니다.
알 수 없는 필드가 있음오류의 '사용 가능한 필드'를 확인하고 철자를 수정합니다(예: mockApp은 variant가 아니라 kind 사용).
'xx'라는 이름의 아이콘이 없음shots.md 상단의 아이콘 목록에서 선택합니다.
총 길이 ...가 15-45초 사이여야 함샷을 추가/삭제하거나 dur을 수정합니다.
리소스 파일을 찾을 수 없음경로를 확인합니다. storyboard.json이 있는 디렉토리를 기준으로 합니다.
JSON 구문 분석 실패: N행해당 행을 확인합니다: 쉼표 누락, 끝 쉼표 초과, 자막에 영어 큰따옴표 사용(「」로 변경).
이 문장이 화면에 N초 동안 표시됨caption을 2-3개 문장의 배열로 작성하거나, 이 샷을 두 개로 나눕니다.
전체 영상에 핵심 동작을 시연하는 샷이 없음chat(질문 -> panel 답변) 또는 mockApp(input + 결과)을 추가합니다.
엔드카드 제품명이 meta.product와 일치하지 않음brand를 meta.product와 정확히 일치하도록 변경합니다.
cta를 작성했지만 meta.cta가 비어 있음브리핑에 획득 방법이 있으면 meta.cta에 작성한 후 복사합니다. 없으면 cta를 삭제합니다.
리터럴 \n이 있음JSON에서 줄바꿈은 하나의 백슬래시만 사용합니다.
플랫폼명 '공식 계정' 포함 (경고)제품 자체의 카테고리 용어: meta.allowWords에 추가; 트래픽 유도: 삭제.
필수 필드 meta.action 누락'사용자가 무엇을 하면 -> 제품이 무엇을 제공하는지' 한 문장을 작성합니다.
숫자가 meta.facts에서 출처를 찾을 수 없음브리핑에 해당 숫자가 있으면 원문 그대로 meta.facts에 복사합니다({"id":"f1","text":"…"} 형식). 없으면 구체적인 숫자를 정성적 표현으로 대체합니다.
자막에 샷 설명어 포함(예: '카드가 하나씩 나옴')이것은 시청자에게 보여주는 자막이지 편집자에 대한 설명이 아닙니다. 사용자 관점의 한 문장으로 변경합니다.
'상륙'은 오타, 올바른 표현은 '로그인''로그인'으로 변경합니다('상륙함/달 착륙' 등은 해당되지 않음).
'깔끔하게 해결'은 절대적 약속적절한 표현으로 변경합니다(예: '핵심 정보를 확인할 수 있음').
'XX' 업종이 샷 'YY'를 허용하지 않음해당 업종에서 허용하는 다른 샷으로 변경하거나, meta.industry가 잘못 선택되었는지 확인합니다.
[B-xxx] 업종 규정 위반오류 메시지의 '해결 방법'을 따릅니다. 확실한 근거가 있는 극한 금칙어인 경우에만 meta.allowWords를 고려합니다(warn 수준에만 유효, block 수준은 반드시 삭제).

실제 스크린샷이 없을 때

우선 mockApp 샷(움직임이 있음)을 사용합니다. 만약 반드시 '휴대폰에서 여기를 클릭하는' 장면을 연출해야 한다면, 먼저 mockApp을 렌더링하여 스크린샷으로 만든 후 phone 샷에 사용합니다:

cd <SKILL>/template
npx remotion still src/index.ts Screen <스토리보드 디렉토리 절대 경로>/screen.png --frame=145 --props=<스토리보드 디렉토리 절대 경로>/screen-props.json

screen-props.json은 {"type":"mockApp","theme":"<테마>","dur":5,"params":{...mockApp의 params...}} 형식으로 작성하며, <SKILL>/examples/_src/screen-props.json을 참조합니다. 그런 다음 phone 샷에 "src": "screen.png"를 작성하고, meta.disclaimer에 '데모 화면이며, 내용은 시뮬레이션입니다'라고 작성합니다.

추가 예시 (구조가 각각 다르므로 '제품 유형'에 따라 선택하고, 자막을 그대로 복사하지 마십시오)

  • <SKILL>/examples/jev.json: B2C 감성, software 업종 (채팅 데모 2문장 자막 -> 계기판 -> 빠른 전환 -> 엔드카드; 획득 방법 '공식 홈페이지에서 안드로이드 버전 다운로드')
  • <SKILL>/examples/ledger.json: 도구 효율성, software 업종 (불편함 빠른 전환 -> 비교 -> mockApp 영수증 촬영 결과 -> 숫자 -> 엔드카드; 브리핑에 획득 방법이 없어 엔드카드에 cta 없음)
  • <SKILL>/examples/meeting.json: B2B 업무, software 업종 (스크린샷 강조 표시 -> 시뮬레이션 인터페이스 -> 숫자 -> 단계 -> 엔드카드; 획득 방법 '공식 홈페이지에서 무료 체험 신청')
  • <SKILL>/examples/en-focus.json: meta.lang: "en"의 영어 예시 (가상 앱, 영어 자막 작성 방법 보여줌)
  • 기타 업종(food/ecommerce/education/beauty/travel)의 규정 준수 예시는 industries/<industry>/test-brief.md + expected.md에 있습니다: test-brief는 샘플 브리핑이고, expected는 이 브리핑을 바탕으로 작성된 스토리보드의 어떤 부분이 차단되고 그 이유를 명확히 설명합니다. 새로운 업종의 첫 번째 영상을 만들 때는 이 두 문서를 먼저 보는 것이 좋습니다.

전체 예시 (examples/ledger.json, 검증 통과 가능)

{
  "meta": {
    "title": "편리한 가계부 홍보 영상 (불편함 -> 제품 -> 3가지 핵심 기능 -> 엔드카드)",
    "product": "편리한 가계부",
    "theme": "fresh-light",
    "disclaimer": "데모 화면이며, 데이터는 예시입니다",
    "action": "영수증 촬영 -> 금액과 분류 자동 입력",
    "facts": [
      {"id": "f1", "text": "체험 사용자는 이번 달에 지난달보다 약 1,260원을 더 저축했습니다 (예시 데이터)"},
      {"id": "f2", "text": "데모 가계부 예시 항목: 배달음식 ₩8,600, 밀크티/커피 ₩3,260, 해지하지 않은 자동 결제 ₩980, 심야 택시 ₩4,100 (예시 데이터)"},
      {"id": "f3", "text": "수동 기록 한 건 평균 약 5분 소요; 이 제품으로 사진 촬영 기록 한 건 약 10초 소요 (예시 데이터)"},
      {"id": "f4", "text": "데모 인식 결과: 점심 ₩38,500, 이번 달 식비 예산 62% 사용 (예시 데이터)"}
    ]
  },
  "shots": [
    {
      "type": "hook",
      "dur": 2.5,
      "caption": "월급은 받았는데,\n월말이면 {바닥나요}",
      "mood": 0.85,
      "params": {"visual": "stat", "text": "₩ 0", "sub": "이번 달 돈 어디 갔지", "badge": "영수증 한 장이면 기록 완료", "tone": "bad"}
    },
    {
      "type": "quickList",
      "dur": 3.5,
      "caption": "돈이 어디로 갔는지\n{하나도 기억 안 나요}",
      "mood": 0.8,
      "params": {
        "title": "이번 달 사용처 불명",
        "items": [
          {"text": "배달음식", "tag": "₩8,600", "tone": "bad", "icon": "bell"},
          {"text": "밀크티/커피", "tag": "₩3,260", "tone": "warn", "icon": "heart"},
          {"text": "해지 안 한 자동 결제", "tag": "₩980", "tone": "bad", "icon": "calendar"},
          {"text": "심야 택시", "tag": "₩4,100", "tone": "warn", "icon": "clock"}
        ]
      }
    },
    {
      "type": "compare",
      "dur": 4.5,
      "caption": "가계부 쓰기,\n{더 이상 의지에 맡기지 마세요}",
      "mood": 0.45,
      "params": {
        "mode": "lr",
        "left": {"title": "수동 가계부", "items": ["매 건 수동 입력", "분류는 감에 의존", "결국 포기"], "tone": "bad", "icon": "doc", "stat": "5분", "level": 8},
        "right": {"title": "편리한 가계부", "items": ["영수증 사진 자동 인식", "자동 분류", "월말 한 번에 정리"], "tone": "good", "icon": "bolt", "stat": "10초", "level": 2},
        "meterLabel": "번거로움 정도",
        "verdict": "한 건 기록에 단 10초"
      }
    },
    {
      "type": "mockApp",
      "dur": 4.5,
      "caption": "영수증만 찍으면,\n{금액과 분류가 다 입력돼요}",
      "mood": 0.25,
      "params": {
        "kind": "editor",
        "title": "기록하기",
        "source": "예시 데이터, 실제 사용자 청구서 아님",
        "input": "촬영: 점심 영수증",
        "button": "인식",
        "items": [
          {"text": "점심 ₩38,500"},
          {"text": "상점: 1층 국수집"},
          {"text": "분류: 식비 (자동)"},
          {"text": "이번 달 식비 62% 사용"}
        ],
        "highlight": 3,
        "done": "기록 완료"
      },
      "note": "핵심 동작 시연: 사용자가 영수증을 찍으면 -> 제품이 금액, 상점, 분류를 제공"
    },
    {
      "type": "counter",
      "dur": 3,
      "caption": "월말에 확인해 보니,\n{저축이 늘었네요}",
      "mood": 0.1,
      "params": {"to": 1260, "prefix": "₩", "label": "지난달보다 이번 달에 더 저축한 금액", "sub": "예시 데이터이며, 개인차가 있을 수 있습니다", "icon": "money", "tone": "good"}
    },
    {
      "type": "endCard",
      "dur": 4,
      "mood": 0,
      "params": {
        "brand": "편리한 가계부",
        "slogan": "나가는 모든 돈,\n{하나하나 파악해요}",
        "points": ["영수증 찍으면 자동 기록", "가계부는 내 휴대폰에만 저장"],
        "icon": "money"
      }
    }
  ]
}

관련 스킬