filmsmith은(는) 무엇을 하나요?
코드를 필름으로 만드는 열 가지 방법. 간단한 브리프로부터 짧은 기술 영화(기술 데모, 기술 보고서 또는 설명, 기술 제품 출시)를 제작합니다. 화면에 사람이 등장하지 않으며, 모드를 선택하고 템플릿을 복사한 뒤 content.js를 작성하고 렌더링합니다. 모든 그림은 코드로 그려지고 모든 소리는 코드로 합성되므로(생성된 음악 트랙으로 배경음을 대체할 수 있음), 셸 명령어를 실행할 수 있는 코딩 에이전트만 있으면 됩니다. 이 스킬은 미적 이론(foundations)에 기반하며, 그 이론과 소유자의 판정에서 도출된 10가지 핵심 원칙, 하나의 공유 시스템(색상, 글꼴, 공간, 모션) 및 각각 고유한 시각적 언어를 적용하는 10가지 모드로 구성됩니다.
모든 모드의 하우스 스타일: 간결하고 직접적이며 깔끔함 — 매 비트마다 무언가 변화하고, 각 변화는 하나의 새로운 것을 가져오며, 시청자는 영화를 기다리지 않습니다. 그리고 깔끔함은 단순함이 아닙니다: 적은 요소들이 각각 유연하게 움직여 시선을 사로잡습니다(원칙 4-6).
요구 사항
- 셸 명령어를 실행할 수 있는 모든 코딩 에이전트.
SKILL_ROOT는 이SKILL.md가 있는 폴더입니다. - Node 22 이상, PATH에
ffmpeg및ffprobe가 있어야 합니다.new-film은 이를 확인하고 없으면 메시지를 표시하며 중단됩니다. - 영화 설정 및 렌더링 중 네트워크 연결 필요: 고정된 google/fonts 커밋의 글꼴과 npm 레지스트리의 고정된 GSAP 빌드(둘 다 영화 폴더에 저장됨),
npx [email protected]의 첫 번째 실행(헤드리스 Chrome도 가져옴), 렌더링 시 HyperFrames 컴파일러가 Google Fonts에서 글꼴 패밀리를 가져올 수 있음. 오프라인 렌더링은 검증되지 않았습니다. 템플릿이 지정한 hyperframes 버전을 유지하십시오. 영화 내부에서 업그레이드하지 마십시오. - 화면 텍스트는 이 버전에서 영어입니다. 사용자가 중국어 또는 다른 문자를 요청하면 템플릿이 아직 지원하지 않는다고 말하십시오.
모드
| 모드 | 中文 | 모습 | 폼 변형 | 선택하는 경우 |
|---|---|---|---|---|
| thread | 一线 | 하나의 선이 모든 것이 되며 컷 없음 | thread: 균일한 선 또는 굵어지는 선 | 비디오, 모션 또는 렌더링 툴체인의 쇼릴 |
| ink | 落墨 | 매 비트마다 강력한 타입, 잉크 방울이 색으로 피어남 | typeWidth: 압축 또는 확장된 타입 | 이름 공개, 런칭 스팅, 한 줄 주장 |
| plakat | 招贴 | 움직이는 국제 스타일 포스터, 하나의 시그널 컬러 | form: 사각형 또는 대각선 필드 | 주장과 단계, 결정권자 |
| blueprint | 蓝图 | 장별로 초안된 엔지니어링 도면, 앰버 스탬프 | linework: 잉크 또는 연필 | 부품과 승인이 있는 시스템 및 워크플로우 |
| phosphor | 荧屏 | 야간 터미널, 하나의 인광 악센트, 런칭 HUD | screen: CRT 래스터 또는 평면 | CLI 및 개발자 도구 |
| tally | 算筹 | 항목당 하나의 사각형, 차트별 재그룹화 | mark: 사각형, 점 또는 아이소타입 글리프 | 개수, 점유율, 데이터셋 스토리 |
| trace | 演算 | 알고리즘 상태의 어두운 실시간 다이어그램 | stroke: 벡터 또는 스케치 | 메커니즘 또는 알고리즘 작동 방식 |
| morph | 一笔 | 하나의 잉크 형태가 점 → 선 → 평면 → 입체 → 인터페이스 → 마크로 올라가며 컷 없음 | corners: 둥글거나 직각 | 개발자 도구 및 인터페이스 제품: 하나의 소스가 모든 표면이 됨 |
| halftone | 网点 | 투잉크 프린트: 마크의 한 조각이 멈추고 모든 세계가 그 주위에 인쇄된 후 전체 마크로 되돌아감 | dot: 둥글거나, 사각형 또는 라인 스크린 | 모델 및 제품 출시: 몇 가지 기능, 하나의 숫자, 이름 |
| pulse | 节拍 | 질문이 쿼리로 연기됨: 비트당 한 단어, 하나의 색조를 따라 배경이 전환, 답변을 위해 하나의 화이트아웃 | aperture: 컷 또는 둥글게 | 버전 릴리스 및 벤치마크 답변: 하나의 측정된 결론 |
모든 모드는 content.js에서 설정되는 색상 프리셋(카드에 있음)과 하나의 폼 변형이 있습니다. 기본값은 이전처럼 렌더링됩니다. 각 카드는 사용 사례를 예시와 함께 나열하고 최적의 적합성을 표시합니다. 2026-10-19 이전의 이름(thread-reel, ink-beat, swiss-poster, blueprint-drafting, terminal-launch, unit-data, diagram-explainer)은 new-film에서 여전히 작동합니다.
선택 규칙 및 모드 카드 형식: references/modes/README.md. 모드는 혼합되지 않습니다. 테마(영화 종류별 내러티브 스켈레톤 및 규칙): tech-product-launch (thread, ink, plakat, blueprint, phosphor, morph, halftone, pulse), tech-explainer (tally, trace).
워크플로우
1. 명확화
사용자가 이미 제공한 내용은 건너뛰고 나머지를 물어보되, 모드를 먼저 물으십시오. 평범한 대화로 한 번에 최대 세 가지 질문을 하십시오. 시작을 막지 않는 공백은 추정하고 그렇게 말하십시오. 모든 영화는 16:9, 1920×1080, 가로 전체 화면 재생용입니다. 세로 또는 정사각형 영화를 요청하면 스킬이 제작하지 않는다고 말하십시오.
| # | 질문 | 이유 |
|---|---|---|
| 1 | 콘텐츠는 무엇입니까: 도구, 단계가 있는 주장, 시스템, 이름, 릴, 숫자, 메커니즘? | 모드를 결정(선택 표); 하나를 제안하고 그 이유를 설명 |
| 2 | 사실의 출처는 어디입니까(저장소, 문서, 데이터셋, 알고리즘)? | 화면의 모든 사실이 여기서 나옴; 모든 숫자는 계산됨 |
| 3 | 플랫폼과 대상 길이(있는 경우)? | 길이는 콘텐츠에서 계산됨(원칙 5); 대상 길이는 모드 범위 내에서 템포를 조정하고 씬을 추가/제거 |
| 4 | 어떤 팔레트 프리셋? | 프리셋만, 모드 카드에 나열됨; 사용자 정의 16진수 값 없음 |
| 5 | 하드 제약(반드시 표시, 표시 금지, URL, 이름)? | 재작업 방지 |
| 6 | 음악: 이 에이전트가 음악 생성 API를 호출할 수 있습니까? | 가능하면 영화 템포의 생성된 배경음이 합성된 것을 대체함(시스템); 불가능하면 합성된 배경음이 사용되고 인계 시 그렇게 명시 |
모드, 출처 및 프리셋이 지정되고 음악 출처가 알려지고 대상 길이(있는 경우)가 정해지면 완료됩니다.
2. 스캐폴딩
node <SKILL_ROOT>/scripts/new-film.mjs <mode> <film-dir> --palette <id>
이 명령은 Node와 FFmpeg를 확인하고, 템플릿을 복사하고, 공유 런타임을 lib/로 추가하고(lib/VERSION으로 스탬프 처리), PLAN.md 스켈레톤을 작성하고, 템플릿의 fonts.json에 나열된 글꼴을 고정된 google/fonts 커밋에서 다운로드하고, 고정된 GSAP 빌드를 lib/vendor/에 다운로드합니다. 실패 시 중단되므로 영화가 폴백 폰트를 사용하거나 CDN에 의존하지 않습니다. 가변 글꼴의 축이 필요한 템플릿은 fonts.json에 이를 선언합니다(weight 및 stretch 범위, CONTRACT.md 참조). 그런 다음 모드 카드와 폴더의 TEMPLATE.md를 전체 읽기: 씬 레지스트리, 각 슬롯의 문자 제한 및 고정된 안무가 여기에 있습니다. 모드가 제공하는 모든 씬 유형의 이름을 말할 수 있을 때 완료됩니다.
3. 컨셉 및 비트 계획
new-film이 영화 폴더에 PLAN.md 스켈레톤을 작성했습니다. content.js를 만지기 전에 작성하십시오. 계획 없는 영화는 렌더링되지 않습니다(원칙 10):
- 컨셉 문장, "이 영화에서 [이 제품만의 고유한 점]은 [모드의 시그니처 장치]가 된다" 형식으로, 가장 가까운 경쟁사를 문장에 넣었을 때 더 이상 성립하지 않아야 합니다. 그 다음 통일선(시선을 첫 프레임부터 마지막 프레임까지 이끄는 대상 또는 프레임).
- 금지 목록: 모드 카드의 공장 기본값과 ai-tells.md에서 시작하여 가장 가까운 참조 영화와 너무 가까운 것을 추가합니다.
- 가장 가까운 참조 및 모티프 표: 가장 가까운 참조 영화를 명명하고 영화가 공유하는 모티프를 나열합니다. 알려진 참조가 있는 모드에서 절반 이상이 공유되면 P1에 실패합니다.
- 비트 계획: 씬당 한 행 — 씬 유형, 화면 텍스트와 그중 기본 또는 한눈 텍스트, 사실의 출처, 이 씬이 다음 씬에서 되는 것, 음악이 읽기를 위해 끊기거나 핵심 순간을 위해 떨어지는 위치. 길이는 선택되지 않습니다: 씬을
content.js에 작성하고npm run fit을 실행하면 각 씬의 시작, 비트, 읽기 필요성, 전환 전 패드 및 구문 반올림의 비율, 영화 길이가 출력되고,renders/timing.json을 작성하고, 표를PLAN.md의fit마커 사이에 복사합니다.npm run fit은PLAN.md가 없으면 중단되고 아직 채워지지 않은<!-- fill -->부분이 있으면 경고합니다.
텍스트를 작성하기 전에 모드의 TEMPLATE.md에 있는 길이 표를 읽으십시오. 각 씬의 어떤 슬롯이 기본 텍스트로 간주되고 어떻게 들어오는지 명시되어 있으므로 각 상태를 미리 예산할 수 있습니다. 모든 씬 유형이 레지스트리에 있고, 모든 문자열이 문자 제한에 맞고, 모든 숫자가 이를 계산하는 코드를 명명하고, npm run fit이 오류 없이 보고될 때 완료됩니다. 문자 제한은 첫 번째 필터일 뿐입니다. 슬롯의 너비는 이웃에 따라 달라질 수 있으므로 픽셀 검사는 4단계의 빨간 배너입니다. 타이밍 API 3을 선언하는 템플릿에서 오류는 영화가 네 가지 변경 계층(원칙 5) 중 하나를 위반했음을 의미합니다: 한 번에 5단어 이상의 기본 텍스트 입력(주장의 경우 8단어, 표시된 일시 중지에서 읽음), 착지 후 2비트 이상 유지, 6초 이상 구성, 4비트 이상 변경 없음, 부적절한 수 또는 배치의 표현적 전환 및 피크. 긴 줄을 차례로 입력되는 구문으로 분할하고, 반복되는 레이블을 한눈 텍스트로 만들고, 씬을 분할하십시오. 타입을 줄이거나 읽기 한계보다 속도를 높이지 마십시오. npm run fit은 타이밍 표 아래에 계층 측정값을 출력합니다. API 2에 있는 템플릿은 페이지 제한(기본 단어 12개, 단계 유지 1마디와 마지막 1.5마디, 페이지 4마디)을 유지하고 계층을 INFO 메모로 표시합니다.
4. 먼저 채우고 프레임 잡기
content.js(및 모드에서 사용하는 경우 data/ 또는 run.js)를 편집하십시오. 길이를 맞추기 위해 duration이나 씬 bars를 입력하지 마십시오. 그런 다음 키 프레임의 스틸을 렌더링하고 애니메이션 전에 확인하십시오(스크립트가 먼저 fit을 실행하므로 스틸은 현재 길이를 사용합니다):
npm run snapshot -- --at <t1>,<t2>,<t3>
스틸의 빨간 배너는 텍스트가 상자보다 넓은 슬롯을 나타냅니다. 해당 텍스트를 줄이십시오. 핵심 원칙 또는 모드 원칙을 위반하는 프레임을 수정하십시오: 25px 미만의 정보 텍스트, 읽을 수 없는 텍스트, 세 가지 이상의 유형 레벨, 두 명의 주인공, 두 번째 악센트, 잘리거나 넘치는 복사본, ai-tells.md의 모든 항목. 각 키 프레임이 모드 카드의 P0 검사를 통과하면 완료됩니다.
5. 렌더링
npm run film # fit → audio → check → render, renders/film.mp4 작성
npm run check는 0개의 오류를 보고해야 합니다. 경고는 체크리스트에 대해 판단됩니다. 대비 경고는 여전히 입력 중인(타이핑, 페이드 인) 텍스트에만 허용되며 착지 후 한 번 읽힙니다. 다른 경고는 수정되거나 알려진 문제 아래에 나열됩니다. 사운드는 동일한 비트 그리드에서 content.js를 따릅니다. 생성된 음악을 대신 사용하려면 영화의 맞춤 템포와 길이(renders/timing.json)로 렌더링하고 assets/audio/에 저장한 후 content.bed = { file, offset }을 설정하십시오(모드의 TEMPLATE.md 참조).
6. 측정 및 검토
node <SKILL_ROOT>/scripts/check-film.mjs renders/film.mp4 --film-dir .
sh <SKILL_ROOT>/scripts/contact-sheet.sh renders/film.mp4 renders/contact-sheet.jpg 20
check-film은 renders/timing.json을 읽고 렌더링을 측정합니다: 형식 및 길이, 단기 및 순간 점프가 있는 음량, 검은 프레임, 영역별 플래시, 비트 내 키 이벤트(2프레임 이내), 그림 이벤트 및 사운드 시작(1프레임 이내 ≥ 3dB), 콘텐츠 마스크 내 씬당 정지 스트레치(그레인 인식 노이즈 플로어 대비), 템포(긴 거의 정지 비트 없음, 영화의 절반 이상이 거의 정지 상태가 아님), 유지 안착, 핸드오프, 동일 길이 씬 실행, 선언된 이벤트에 대한 네 가지 변경 계층(T0 간격, T1 구성 길이, T2 표현적 전환, T3 피크, 유지 길이) — 이는 타이밍 API 3의 템플릿에 대해서만 FAIL입니다. 그림 시작, 큰 영역 변경 및 가장 큰 순간은 그 옆의 픽셀 및 신호 추정치입니다. 가장 작은 텍스트, 텍스트 대비, 유형 레벨, 악센트 영역, 옥타브 균형, 4마디 반복 및 제한은 INFO로 보고되는 픽셀 또는 신호 추정치입니다. 측정할 항목이 없는 항목은 PASS가 아닌 N/A를 보고합니다. --json은 각 결과와 함께 제공하는 체크리스트 항목을 제공합니다.
그런 다음 references/checklist.md와 모드 카드의 검사를 확인하십시오: 피라미드 하단부터 P0을 확인한 다음 상단에서 하단으로(적합성, 신선함, 질감) 판단하십시오. 변경 전에 측정하십시오. 원인을 수정한 후 다시 측정하십시오. 모든 P0가 통과하고 모든 P1/P2 실패가 수정되거나 영화의 README에 "알려진 문제"로 기록되면 완료됩니다.
7. 인계
MP4 경로, 연락처 시트, 계획, 모드 및 프리셋, 음악 출처(합성 또는 생성), 명령어, check-film 보고서 및 알려진 문제가 포함된 README를 제공하고, 누군가가 듣지 않는 한 "아직 귀로 확인되지 않음"이라고 말하십시오. 사용자에게 판정을 요청하고 날짜와 함께 그대로 인용하십시오. 사용자가 없을 때는 "판정 보류 중"이라고 쓰고 중단하십시오.
유지보수자: 판정에서 규칙까지
이 스킬의 소스를 유지보수하는 사람만을 위한 것입니다. 영화 제작자는 7단계에서 멈춥니다. 판정은 모드 카드나 원칙을 직접 편집하지 않습니다. 먼저 피라미드의 한 계층에 배치하고 foundations.md에 대해 확인하십시오: 1-2계층에서는 표준이 결정하고, 3-4계층에서는 도메인 합의(이유와 함께 이탈이 기록되지 않는 한), 5-6계층에서는 소유자가 이론이 동등하게 좋다고 판단하는 후보 중에서 선택합니다. 일관된 판정 두 번 후에 경향이 규칙이 됩니다.
references/principles.md, references/system.md.
모드 카드 및 템플릿 계약: references/modes/README.md, assets/templates/CONTRACT.md.
참조 영화, AI 텔, 체크리스트: references/.
라이선스: 참조 LICENSE.