원테이크은(는) 무엇을 하나요?
모든 것을 한 번에 물어보세요. 그런 다음 전체 영화, 모든 포맷을 검사하여 추가 질문 없이 제작합니다.
이 기술은 오케스트레이션을 수행하며, HyperFrames가 렌더링을 담당합니다. hyperframes, hyperframes-core, hyperframes-animation 기술이 필요하며, hyperframes-registry, hyperframes-keyframes, media-use, figma 및 humanizer가 함께 있으면 더 좋습니다. hyperframes-core가 없으면 중단하고 설치 명령어(npx skills add heygen-com/hyperframes)를 제공하세요.
아래 SKILL_DIR은 이 기술의 폴더를 의미합니다. 스크립트는 일반 Node(≥ 22)와 ffmpeg를 사용하며, 별도 설치는 필요 없습니다.
계약 사항
- 한 번의 인테이크 라운드. 먼저 감지(detect)한 후, 한 번만 질문합니다(Phase 1). 답변을 받은 후에는 더 이상 질문하지 않습니다. 유일한 예외는 기본값으로 처리할 수 없는 하드 블로커(예: 존재하지 않는 파일, 로딩을 거부하는 사이트)가 있을 때입니다. 그때는 해당 질문 하나만 정확히 묻고 계속 진행합니다.
- 인테이크 답변은 렌더링을 승인합니다. 사용자가 명시적으로 이름을 지정하지 않은 게시, 업로드, 포스팅, 푸시 또는 다운로드를 승인하지 않습니다. 이러한 작업은 보고서 이후에 별도로 요청하세요.
- 사실은 계산되며, 절대 입력되지 않습니다. 화면에 표시되는 모든 숫자는
facts.json또는 사용자가 제공한 출처에서 가져옵니다. 통계, 인용문, 로고 또는 사용후기를 절대 임의로 만들지 마세요. - 화면이 소리를 결정합니다. 청취 가능해야 하는 모든 모션은 해당 순간에
T.cue()를 호출합니다. 스코어는 이러한 큐로부터 빌드되므로 사운드와 화면이 어긋나지 않습니다. - 완료는 QA 통과를 의미합니다.
qa.mjs가 통과하거나, 두 번의 수정 시도로도 해결할 수 없는 실패 사유가 보고서에 기록된 경우에만 파일이 전달됩니다.
Phase 0: 감지 (질문 전, 무음)
node SKILL_DIR/scripts/detect.mjs <대상 경로…> --out /tmp/one-take-detect.json
- 현재 저장소와 사용자가 언급한 모든 경로 또는 사이트에서 실행합니다.
- 출처별로 README 제목 및 태그라인, git 기간 및 커밋 수, 로고, 글꼴 파일 및 패밀리, 색상 토큰을 반환합니다. 또한 도구 체인(node, ffmpeg, 캐시된
hyperframes버전, Chrome, heygen CLI, 음악 API 키 설정 여부)도 반환합니다. - 대상 프로젝트에 이미
take.json이 있으면 재개(resume)로 간주합니다. 이를 읽고 인테이크를 건너뛴 후, 출력이 누락된 첫 번째 단계부터 계속 진행합니다.
Phase 1: 인테이크 (한 메시지, 한 라운드)
references/intake.md를 읽으세요. 한 메시지에서:
-
인테이크 시트를 보여줍니다: 감지 결과나 권장 기본값으로 미리 채워진 각 필드를 한 줄씩 표시합니다. 사용자는 잘못된 부분만 수정합니다.
-
AskUserQuestion을 한 번 호출하여 작업을 가장 많이 변경하는 네 가지 결정 사항(포맷(다중 선택), 길이, 사운드, 음성/자막)을 묻습니다. 질문 텍스트에는 시트 변경 사항이 있으면 답변에 메모로 추가하라고 안내합니다.
AskUserQuestion을 사용할 수 없으면 동일한 네 가지를 시트 끝에 번호 선택 항목으로 넣고 한 번의 답변을 요청합니다.
그런 다음 다시 묻지 않고:
take.json을 작성합니다(스키마:references/take-json.md). 언어 코드, 포맷 ID, 슬러그 및output.name은[a-z0-9][a-z0-9._-]{0,63}패턴(대소문자 구분 없음,..없음)과 일치해야 하며, 그렇지 않으면 실행이 중단됩니다. 사용자가 요청하지 않는 한hyperframes는 포함하지 마세요. 기본 버전은scripts/lib/platforms.mjs(HF_VERSION, 0.8.223)에 고정되어 있습니다.workflow: general-video,flow: automation,storyboard: no가 포함된 HyperFramesBRIEF.md를 작성합니다. 이는 이후/hyperframes호출이 재인터뷰 대신 이 프로젝트를 재개함을 의미합니다.- BRIEF.md 본문에 답변(포맷, 사운드, 자막, 플랫폼 제한)을 기록합니다.
Phase 2: 출처
- Git 사실.
node SKILL_DIR/scripts/facts.mjs --repo <경로> [--repo …] [--since …] --out <프로젝트>/facts.json을 실행합니다. 커밋, 기간, 활동 일수, 최장 연속 활동 일수, 가장 바쁜 날, 언어별 라인 수, 추가 및 제거된 라인, 주요 커밋 단어, 첫 번째 및 마지막 커밋 제목을 수집합니다. 작성자 이름과 이메일은 기록되지 않습니다. 사용자가 허용한 사실만 사용하세요. - 사이트. 표시할 URL이 있으면
npx hyperframes capture <url> -o <프로젝트>/src/assets/cap을 실행합니다.ok:false또는BLOCKED.md가 반환되면 중단합니다. 그것은 블로커입니다. - 참고 자료. 각 참고 자료에 대해 STORYBOARD.md에 한 줄씩 무엇을 가져올지(페이스, 유형, 색상, 전환) 기록합니다. Figma 링크인 경우 먼저
/figma를 실행합니다. - 브랜드. 로고 SVG와 글꼴 파일을
src/assets/brand및src/assets/fonts에 복사하고,take.jsonfonts에 선언하며, 템플릿의:root에 색상 토큰을 추가합니다.
Phase 3: 방향 설정 및 스토리보드
시각적인 것을 작성하기 전에 references/direction.md를 읽으세요. STORYBOARD.md를 작성합니다:
- 방향 설정, 한 문단: 하나의 아이디어, 시그니처 무브, 유형 페어링, 팔레트, 각 선택이 나온 참고 자료.
- 템포 먼저. 대상 길이가 정수 배수(4/4)가 되도록 bpm을 선택합니다. 그런 다음 각 장면에 길이(마디),
energy(0–1, 스코어 편곡을 결정), 진입 방식(in)을 지정합니다. - 장면 테이블: id, 마디, 에너지, 화면에 표시될 내용, 모션, 큐, 카피.
- 마지막 장면은 엔드 카드이며,
end: true로 표시하고, 3초 이상 완전히 유지할 수 있을 만큼의 마디를 가집니다. - 컷다운에 사용할 수 있는 장면은
optional(1–9, 높을수록 우선)로 표시합니다.
- 마지막 장면은 엔드 카드이며,
- 카피는
copy/<lang>.json에 키당 한 줄의 텍스트로 저장합니다. 사용 가능하면/humanizer를 실행합니다. 헤드라인은 화면에 표시되는 시간 내에 두 번 읽을 수 있을 만큼 짧게 유지합니다.
Phase 4: 빌드
SKILL_DIR/templates/index.html을<프로젝트>/src/index.html로 복사하고 스토리보드의 장면으로 다시 작성합니다.references/kit.md(T.*API)와hyperframes-core의 필수 규칙을 읽으세요. 모션에 대해서는hyperframes-animation규칙과 청사진을 읽으세요. 명명된 효과를 수동으로 빌드하기 전에hyperframes-registry를 검색하세요.
모든 포맷과 QA를 정확하게 유지하는 규칙:
- 장면은 최상위
<section class="clip scene" data-scene="id">이며, 절대 중첩되지 않고, 인라인style을 사용하지 않습니다. - 디자인 px 단위의 크기는
--u(짧은 쪽의 1%)를 통해 지정합니다. 읽을 수 있는 텍스트는--t-min(3.4u ≈ 1080에서 37px) 아래여서는 안 됩니다. - 읽을 수 있는 텍스트는 해당 포맷의 플랫폼 UI 영역인
.safe안에 유지합니다. - 하나의 레이아웃을 확장하는 대신
.f-tall,.f-wide,.f-square,.f-portrait규칙을 사용하여 포맷별로 재배치합니다. - 다음 장면의 전환이 이를 덮기 전에 현재 장면의 단어를 지웁니다(
s.end근처에서T.sink/T.leave). 리빌 아래의 텍스트는 레이아웃 검사에 실패합니다. - 모든 장면은 움직입니다: 장면 전체에
T.drift카메라를 적용합니다. 엔드 카드 전에는 아무것도 정지해 있지 않습니다. - 엔드 카드가 완료되는 순간
T.endCard(t)를 호출합니다. 마지막 프레임은 여전히 엔드 카드를 표시해야 합니다: 홀드 동안 페이드 아웃하지 마세요. - 들려야 하는 모든 것에 큐를 지정합니다(
references/sound.md에 카테고리 나열). 대부분의 키트 헬퍼는 기본적으로 큐를 지정합니다. 특정 순간을 무음으로 유지하려면cue: false를 전달합니다. - 숫자는
T.facts또는 카피에서 가져옵니다.T.count는 유한한 숫자가 필요하며, 없으면 예외를 발생시킵니다. 따라서 누락된 사실이 화면에 임의의 숫자를 표시하는 대신 프로브를 중단시킵니다. - 스크립트를
window.__timelines["main"] = T.done();으로 종료합니다.T.done()은 모든 트윈이 추가된 후 타임라인을 한 번 등록하며, 템플릿이 해당 줄에서 이를 반복합니다. 모든 트윈을 먼저 빌드하고, font-ready 또는 다른 비동기 콜백 내부가 아닌 곳에서 빌드하세요: HyperFrames lint는 조기 등록을 거부합니다.
Phase 5: 드래프트 패스
node SKILL_DIR/scripts/run.mjs <프로젝트> --draft
이것은 포맷 × 언어별로 다음을 실행합니다: 빌드 → 프로브(헤드리스 Chrome에서 큐, 텍스트 크기, 엔드 카드 마크) → 스코어 → hyperframes check → 드래프트 렌더 → 인코딩 → QA → REPORT.md.
HyperFrames는 scripts/lib/platforms.mjs(HF_VERSION, 0.8.223)에 고정된 버전 또는 take.json의 hyperframes에서 실행됩니다. 첫 번째 실행은 npx로 가져오고, 빌드는 GSAP 3.14.2를 jsDelivr에서 ~/.cache/one-take/로 한 번 가져옵니다. GSAP 파일은 다운로드 후 및 캐시에서 읽을 때마다 고정된 sha256에 대해 확인됩니다. 일치하지 않는 파일은 절대 사용되지 않습니다: 잘못된 다운로드는 캐시되지 않으며, 잘못된 캐시 파일은 삭제되고 빌드가 중단됩니다. 새 복사본을 가져오려면 다시 실행하세요.
그런 다음:
- 모든
*.sheet.jpg콘택트 시트를 열고 살펴봅니다. REPORT.md를 읽습니다.- 실패 및 잘못된 부분(겹침, 잘림, 데드 프레임, 너무 작은 텍스트, 맞지 않는 컷)을 수정합니다.
최대 두 번의 수정 패스가 허용됩니다. 각 패스는 run.mjs --draft를 다시 실행하며, 변경된 부분만 다시 실행하려면 --only <포맷>-<언어>를 사용합니다.
Phase 6: 최종
node SKILL_DIR/scripts/run.mjs <프로젝트>
이것은 모든 출력물의 전체 품질 렌더링입니다. 전달물은 renders/(또는 output.dir)에 저장됩니다. 각 출력물은 다음을 얻습니다:
<name>.mp4: x264 CRF 12, AAC 320k, faststart.cover.jpg: 엔드 카드.sheet.jpg.qa.json
스코어 스템과 marks.json은 out/<포맷>-<언어>/score/에 보관됩니다.
Phase 7: 보고서
다음과 함께 응답합니다:
REPORT.md의 출력물 테이블(파일, 크기, 길이, 판정)- 주요 포맷의 콘택트 시트
- 사운드에 대한 한 줄
- 미해결 항목(있는 경우)
다음 단계를 수행하지 않고 제안합니다: 카피 게시, 더 많은 언어, 컷다운, 퍼블리싱. 사용자가 요청하지 않는 한 아무것도 게시되거나 푸시되지 않습니다.
사운드 모드
sound.mode | 설명 |
|---|---|
score (기본값) | score.mjs가 장면 에너지를 기반으로 마디 그리드에 맞춰 배드, 밴드 및 드럼을 합성합니다: mood와 key의 코드 진행, 킥에 사이드체인, 모든 리프트에 라이저, 각 도착에 임팩트. fx 스템은 큐로부터 빌드되며, 각 큐 아래의 코드에 맞춰 조정되고 화면에서 발생하는 위치에 따라 팬됩니다. 믹싱, 리미팅 후 lufs(기본값 −14)로 투 패스 loudnorm, 트루 피크 −1.5. 오리지널이므로 라이선스가 필요 없습니다. |
track | 사용자의 파일. score.mjs --analyze <file>(또는 npx hyperframes beats)로 bpm과 첫 비트를 얻고, bpm을 설정하고 해당 마디에 장면을 배치합니다. fx 스템이 그 위에서 재생됩니다. |
library | /media-use resolve --type bgm(heygen CLI 필요) 또는 해당 생성기. 결과는 track으로 사용되며, 라이선스는 sound.licence에 기록됩니다. |
none | 오디오 요소가 전혀 없습니다. |
음성 해설의 경우, npx hyperframes tts의 Kokoro 또는 사용자 녹음을 통해 src/assets/audio/vo.wav에 배치합니다. 스코어는 그 아래의 음악을 조정합니다(duckDb, 기본값 −9). 자막의 경우, npx hyperframes transcribe vo.wav --model <모델>에서 시간을 지정합니다. 번인 자막은 .safe 내부에 --t-cap 이상의 크기로 배치된 장면 텍스트입니다. 사이드카 자막의 경우, 동일한 트랜스크립트에서 각 출력물 옆에 <name>.srt를 작성합니다.
파일
scripts/detect.mjs,facts.mjs: 무엇이 있는지, 숫자scripts/build.mjs: 하나의 소스 →out/<포맷>-<언어>/HyperFrames 프로젝트. 크기, 안전 영역 및 장면 타이밍을 채우고,TAKE(카피, 사실, 장면)를 인라인하고, 키트와 GSAP 3.14.2(sha256 확인됨)를 벤더링하고, 컷다운을 위해 장면을 드롭합니다.scripts/probe.mjs: 시간 경과에 따른 큐, 텍스트 크기 및 위치, 마크를 읽는 헤드리스 Chrome 패스scripts/score.mjs: 합성 스코어, 스템, 믹스, 마스터,marks.json; 트랙의 템포를 위한--analyzescripts/encode.mjs,qa.mjs,report.mjs,run.mjs: 전달, 검사, 보고서 및 전체 실행scripts/selftest.mjs: 도구 체인을 확인한 후, 실패하도록 제작된 파일에 대해 QA가 실패함을 증명합니다.scripts/lib/: 공유 헬퍼(git,HF_VERSION및 이름 확인이 포함된 플랫폼, WAV, DSP)kit/take.js: 모션 키트(references/kit.md)templates/index.html: 시작 스테이지references/:intake.md,take-json.md,direction.md,sound.md,formats.md,qa.md,kit.md