recipes
레시피는 하나의 공개된 런치필름을 연구하고 기록하여, 에이전트가 다른 제품에 맞게 그 제작 기법을 재현할 수 있도록 한 것입니다.
레시피는 <studio>/src/recipes/<id>/ 디렉토리에 위치합니다:
| 파일 | 항상 있는가? | 제공하는 것 |
|---|---|---|
recipe.md | 예 | 사용 시기, 비트 시트(시간, 프레임, 화면, 카메라, 모션, 전환, 사운드), 기법 링크, 수정해야 할 사항, 주의점, 누락된 컴포넌트 |
recipe.json | 예 | 데이터로 표현된 동일 내용 (스키마 schemas/recipe.schema.json): structure[], techniques, audio, inputs, components, source |
Recipe.tsx + index.tsx | status: "built" 인 경우에만 | 바로 사용 가능한 코드: brand + content로 매개변수화된 컴포넌트, 데모 브랜드와 함께 등록됨 |
대부분의 레시피는 텍스트 전용(status: "studied")이며, 이것만으로도 제작이 가능합니다: 비트 시트를 바탕으로 스튜디오의 프리셋과 컴포넌트를 사용하여 장면을 작성합니다. 레시피는 원본 영상, 프레임, 또는 카피를 포함하지 않습니다. 소스 링크는 사용자가 참조 영상을 볼 수 있도록 하기 위한 것입니다.
명령어는 launch-video/ (사용자) 또는 studio/ (launchfilm 레포지토리)에서 실행합니다. recipes/와 schemas/는 하네스 루트(사용자 프로젝트의 launch-video/, launchfilm 레포지토리의 루트)에 위치합니다.
1. 필요한 것이 무엇인지 파악하세요 (BRIEF.md / STORYBOARD.md 참조)
검색하기 전에 다음을 기록하세요: 프리셋(들) (화면비), 목표 길이, 모드 (제품 영화 / 런치 영화 / 하이브리드), 테마 (brand.json의 dark/light), VO 유/무, 다뤄야 할 비트 (hook, feature, logo...), 사용자가 실제로 가지고 있는 입력값 (로고, 스크린샷, 화면 녹화, 재구성 가능한 UI, 통계, URL).
2. 검색
recipes/CATALOG.md를 훑어보거나 (레시피당 한 줄, 계열별 그룹화: 형식, 주요 기법, 입력값, 소스, 텍스트/코드), 다음을 검색합니다:
npx launchfilm ref search "statement vertical dark" # 제목, 요약, 태그, 기법에 대한 자유 텍스트 검색
npx launchfilm ref search "launch aspect:9:16 max:30 theme:dark" # 필터: family: aspect: tech: theme: max: min: status:
또는 recipes/index.json을 직접 필터링합니다 (필드: references/index-format.md):
node -e '
const idx=JSON.parse(require("fs").readFileSync("recipes/index.json","utf8")).recipes;
const want={aspect:"9:16",dur:30,techniques:["statement-sequence","end-card"],theme:"dark"};
for(const r of idx){const t=r.techniques.filter(x=>want.techniques.includes(x)).length;
if(r.format.aspect===want.aspect||t>0) console.log(r.id,r.format.aspect,r.format.duration_s+"s",r.theme,r.vo?"vo":"-",t,r.code?"code":"text");}'
인덱스가 없나요? src/recipes/*/recipe.json을 글로브하여 읽으세요.
3. 점수 매기기 및 1~3개 선택
| 기준 | 점수 |
|---|---|
format.aspect가 주요 프리셋의 화면비와 일치 | +3 (재구성은 가능하지만 작업 비용 발생) |
format.duration_s가 목표의 ±30% 이내 (또는 필요한 비트를 커버하는 레시피) | +2 |
| 스토리보드의 필요와 겹치는 각 기법 | +1 (최대 +4) |
필요한 모든 inputs 필드를 사용자가 가지고 있음 | +2; 만들 수 없는 누락된 입력이 하나라도 있음 |
theme이 brand.json theme과 일치 | +1 |
vo가 계획과 일치 | +1 |
code: true (Recipe.tsx 준비됨) 및 사용자가 서두르는 경우 | +1; status: "reviewed" |
render_cost가 높은데 사용자가 노트북을 사용하거나 서두르는 경우 | -1 |
텍스트 대 코드는 속도 보너스일 뿐, 품질 필터가 아닙니다: 브리프에 맞는 텍스트 레시피가 맞지 않는 코드 레시피보다 낫습니다. 전체 영화에는 최고 점수 1개, 다른 비트에는 최대 3개를 선택하세요 (A의 후크, B의 기능, C의 엔드 카드).
4. 선택 항목 보여주기
각 선택 항목에 대해 사용자에게 다음을 보여줍니다:
- 제목 (
id),text또는code여부; - 브리프에 왜 맞는지 한 줄 설명 (화면비, 길이, 커버하는 비트, 가지고 있는 입력값);
- 비트 시트를 3~6개의 짧은 행으로 요약 (
0–3.1 s hook: name blurs in word by word...), recipe.md에서 요약; - 소스 링크 (
source.url)로 원본을 직접 시청할 수 있도록 합니다. 호스팅된 미리보기는 없습니다.
참석 세션에서는 사용자가 선택하도록 합니다. 사용자가 "직접 결정하세요"라고 말한 경우, 최고 점수를 가져가고 한 줄로 알립니다.
5. 레시피 읽기
선택한 recipe.md 전체를 읽습니다: 비트 시트, 프레임 단위 모션 및 명명된 스프링, 전환, 각 이벤트의 사운드, "수정해야 할 사항", "주의점", "누락된 컴포넌트". recipe.json의 structure[], audio, inputs, components를 읽습니다. 이 숫자들이 재사용할 제작 기법이며, 화면과 카피는 사용자의 것이 됩니다.
6. 스캐폴딩
npx launchfilm new <slug> --recipe <id> --preset x-16x9 [--title "Product"] [--dry-run]
- 코드가 있는 레시피:
films/<slug>/Film.tsx는 하나의recipe장면을 가지며, 기본값으로 레시피의 컴포넌트를 렌더링합니다.contentprops (recipe.jsonparams)를 변경하고 브랜드를 전달합니다. - 텍스트 레시피:
film.json은 비트 시트의 행당 하나의 샷을 가지며 (레시피의 시간, 전환 및 SFX),Film.tsx는 각 샷에 대해 하나의TodoScene을 가지며, 그 행의 화면, 카메라, 모션 및 사운드가 주석으로 포함됩니다. CLI는 TODO 목록을 출력합니다. TodoScene은 레이블이 지정된 플레이스홀더를 렌더링하며, 하나라도 남아 있으면npx launchfilm qa가 실패합니다 (B1). - 둘 다
recipe.md를films/<slug>/RECIPE.md로 복사하고,STORYBOARD.md를 레시피의 행으로 미리 채웁니다. - 레시피 결합: 가장 많은 런타임을 차지하는 레시피로 스캐폴딩한 다음, 다른 레시피의 행을 샷으로 추가합니다 (코드가 있는 경우
Recipe컴포넌트를 장면으로, 그렇지 않으면 TodoScene으로).
7. 제작 (자세한 내용: references/remix.md)
- 먼저 뼈대를 사용자의 길이와 비트 그리드에 맞게 재조정합니다 (remix.md §3): 비트 순서와 비율을 유지하고, 모든 경계를 다운비트 또는 VO 구문에 스냅합니다.
film.json샷과 STORYBOARD 행을 업데이트합니다. 사용자는 장면이 제작되기 전에 스토리보드를 승인합니다 (게이트 3). - 브랜드:
useBrand()를 통해 brand.json을 모든 장면에 적용합니다 (코드 레시피의 경우brandprop). 레시피 폴더는 절대 편집하지 마세요. - 콘텐츠: 사용자의 제품 이름, 라인, 통계 및 UI. 절대 소스 영화의 카피나 데모 브랜드의 텍스트를 사용하지 마세요.
- 텍스트 레시피 장면: 각
TodoScene을src/presets와src/components로 제작된 장면으로 교체합니다 (먼저API.md를 읽으세요.scene-build스킬이 규칙을 소유합니다). 레시피.json이 나열하는 컴포넌트를 사용하고, 행의 명명된 스프링, 프레임 수, 스테거 및 전환 ID를 정확히 유지하세요. 모션 지속 시간은 필름 길이에 따라 조정되지 않습니다. 레시피가 "누락된 컴포넌트" 아래에 나열하는 컴포넌트는films/<slug>/scenes/에 사양에 따라 제작됩니다. - 사운드:
audio.sfx의 모든 이벤트와 각 행의sfx는 새 프레임에서 해당 사운드를 유지합니다 (접착 규칙, craft/02). - 렌더링 전에 모든 샷의 스틸을 확인하고 (scene-build 단계 4),
film-qa를 실행합니다.
규칙
- 레시피는 시작점일 뿐, 최종 결과물이 아닙니다: 필름은 사용자의 이야기를 담고 있습니다 (STORYBOARD가 먼저 승인됨).
- 소스의 어떤 것도 필름에 들어가지 않습니다: 소스 카피, 소스 브랜드, 소스 푸티지 없음. 소스 링크는 사용자가 시청하기 위한 것이며,
recipe.json과 메시지에 남아 있고, 절대 필름에는 포함되지 않습니다. - 누락된 컴포넌트는 레시피 폴더나 공유 프리셋이 아닌
films/<slug>/scenes/안에 제작합니다. - STORYBOARD.md에 어떤 레시피(들), 어떤 행, 스케일 팩터 및 매개변수를 기록하여 재실행이 가능하도록 합니다.