O que filmsmith faz?
Dez maneiras de filmar seu código. Cria um curta-metragem técnico — uma demonstração de tecnologia, um relatório técnico ou explicador, um lançamento de produto técnico — a partir de um briefing, com duração calculada a partir do conteúdo, sem pessoas na tela: escolha um modo, copie seu template, preencha content.js e renderize. Cada imagem é desenhada em código e cada som é sintetizado em código (uma faixa de música gerada pode substituir a base), então um filme precisa apenas de um agente de código que possa executar comandos shell. A habilidade se baseia em uma teoria do gosto (fundamentos), dez princípios centrais derivados dela e das decisões do proprietário, um sistema compartilhado de cores, tipografia, espaço e movimento, e dez modos que os aplicam a uma linguagem visual cada.
O estilo padrão para todos os modos: rápido, direto e limpo — algo muda a cada batida aproximadamente, cada mudança traz uma coisa nova, e o espectador nunca espera pelo filme — e limpo não é simples: poucos elementos, cada um se movendo fluidamente o suficiente para prender o olhar (princípios 4–6).
Requisitos
- Qualquer agente de código que possa executar comandos shell.
SKILL_ROOTabaixo é a pasta que contém esteSKILL.md. - Node 22 ou mais novo,
ffmpegeffprobeno PATH.new-filmos verifica e para com uma mensagem se algum estiver faltando. - Rede durante a configuração e renderização do filme: fontes de um commit fixo do google/fonts e a versão fixa do GSAP do registro npm (ambos armazenados na pasta do filme), a primeira execução de
npx [email protected](que também busca seu Chrome headless) e, no momento da renderização, o compilador HyperFrames pode buscar faces de fonte do Google Fonts também. Renderização offline não é verificada. Mantenha a versão do hyperframes que os templates fixam; não a atualize dentro de um filme. - O texto na tela está em inglês nesta versão; quando o usuário pedir chinês ou outro idioma, diga que os templates ainda não o configuram.
Modos
| Modo | 中文 | Aparência | Variante de forma | Escolha para |
|---|---|---|---|---|
| thread | 一线 | Uma linha que se torna tudo, sem cortes | thread: linha uniforme ou alargada | Showreels de um pipeline de vídeo, movimento ou renderização |
| ink | 落墨 | Tipo pesado batendo em cada batida, um ponto de tinta que floresce em cor | typeWidth: tipo comprimido ou estendido | Revelações de nome, stings de lançamento, afirmações de uma linha |
| plakat | 招贴 | Pôsteres móveis de estilo internacional, uma cor de sinal | form: campos quadrados ou diagonais | Uma afirmação mais etapas e a pessoa que decide |
| blueprint | 蓝图 | Um desenho de engenharia desenhado folha por folha, carimbos âmbar | linework: tinta ou lápis | Sistemas e fluxos de trabalho com partes e aprovações |
| phosphor | 荧屏 | Terminal noturno, um acento fósforo, HUD de lançamento | screen: varredura CRT ou plana | Ferramentas CLI e de desenvolvedor |
| tally | 算筹 | Um quadrado por item, reagrupando gráfico a gráfico | mark: quadrado, ponto ou glifo Isotype | Contagens, ações, histórias de conjuntos de dados |
| trace | 演算 | Diagrama ao vivo escuro do estado de um algoritmo | stroke: vetor ou esboço | Como um mecanismo ou algoritmo funciona |
| morph | 一笔 | Uma forma de tinta subindo ponto → linha → plano → sólido → interface → marca, sem cortes | corners: arredondado ou cortado | Ferramentas de desenvolvedor e produtos de interface: uma fonte se torna todas as superfícies |
| halftone | 网点 | Impressão de duas tintas: uma parte da marca fica parada enquanto cada mundo é impresso ao redor dela, depois puxa de volta para a marca inteira | dot: tela redonda, quadrada ou de linha | Lançamentos de modelo e produto: alguns recursos, um número, o nome |
| pulse | 节拍 | Uma pergunta interpretada como uma consulta: uma palavra por batida, planos de fundo alternando ao longo de um matiz, um branco total para a resposta | aperture: corte ou redondo | Lançamentos de versão e respostas de benchmark: uma conclusão medida |
Cada modo tem predefinições de cor (em sua ficha) e uma variante de forma, ambas definidas em content.js; o padrão renderiza como antes. Cada ficha lista seus casos de uso com um exemplo trabalhado e marca a melhor adequação. Os nomes anteriores a 2026-10-19 (thread-reel, ink-beat, swiss-poster, blueprint-drafting, terminal-launch, unit-data, diagram-explainer) ainda funcionam em new-film.
Regras de escolha e formato da ficha do modo: references/modes/README.md. Modos não se misturam. Temas (esqueletos narrativos e regras por tipo de filme): tech-product-launch para thread, ink, plakat, blueprint, phosphor, morph, halftone e pulse, tech-explainer para tally e trace.
Fluxo de trabalho
1. Esclarecer
Pule o que o usuário já forneceu; pergunte o resto, o modo primeiro. Pergunte em conversa simples, no máximo três perguntas de cada vez; quando uma lacuna não bloquear o início, presuma e informe. Cada filme é 16:9, 1920×1080, para reprodução em tela cheia paisagem; quando solicitado um filme vertical ou quadrado, diga que a habilidade não o cria.
| # | Pergunta | Por quê |
|---|---|---|
| 1 | Qual é o conteúdo: uma ferramenta, uma afirmação com etapas, um sistema, um nome, um reel, números, um mecanismo? | Decide o modo (tabela de seleção); proponha um e diga por quê |
| 2 | De onde vêm os fatos (repositório, documento, conjunto de dados, algoritmo)? | Cada fato na tela vem dele; cada número é calculado |
| 3 | Plataforma e, se houver, duração alvo? | A duração é calculada a partir do conteúdo (princípio 5); um alvo move o tempo dentro do intervalo do modo, então cenas são cortadas ou adicionadas |
| 4 | Qual predefinição de paleta? | Apenas predefinições, listadas na ficha do modo; sem valores hexadecimais personalizados |
| 5 | Restrições rígidas (deve mostrar, não deve mostrar, URL, nome)? | Evita retrabalho |
| 6 | Música: este agente pode chamar uma API de geração de música? | Se sim, uma base gerada no tempo do filme substitui a sintetizada (sistema); se não, a base sintetizada é usada e a entrega informa isso |
Concluído quando o modo, a fonte e a predefinição são nomeados, a fonte da música é conhecida e a duração alvo, se houver.
2. Scaffold
node <SKILL_ROOT>/scripts/new-film.mjs <modo> <diretório-do-filme> --palette <id>
Isso verifica Node e FFmpeg, copia o template, adiciona o runtime compartilhado como lib/ (carimbado com lib/VERSION), escreve o esqueleto PLAN.md, baixa as fontes listadas no fonts.json do template de um commit fixo do google/fonts e a versão fixa do GSAP em lib/vendor/; ele para se algum falhar, então um filme nunca renderiza em uma face de fallback ou depende de uma CDN. Um template que precisa dos eixos de uma fonte variável os declara em fonts.json (intervalos weight e stretch, veja CONTRACT.md). Em seguida, leia a ficha do modo e o TEMPLATE.md da pasta por completo: o registro de cena, o limite de caracteres de cada slot e a coreografia fixa estão lá. Concluído quando você pode nomear cada tipo de cena que o modo oferece.
3. Conceito e plano de batidas
new-film escreveu um esqueleto PLAN.md na pasta do filme. Preencha-o antes de tocar em content.js; um filme sem plano não é renderizado (princípio 10):
- Frase de conceito, na forma "Neste filme, [algo que só este produto tem] se torna [o dispositivo de assinatura do modo]", e o teste rival: com o concorrente mais próximo na frase, ela não deve mais se sustentar. Em seguida, a linha condutora (o objeto ou quadro que carrega o olhar do primeiro ao último quadro).
- Lista de proibições: comece com os padrões de fábrica do modo e ai-tells.md; adicione qualquer coisa muito próxima ao filme de referência mais próximo.
- Referência mais próxima e tabela de motivos: nomeie o filme de referência mais próximo e liste os motivos que o filme compartilha com ele; em um modo com uma referência conhecida, mais da metade compartilhada falha P1.
- Plano de batidas: uma linha por cena — tipo de cena, cópia na tela e qual dela é texto primário ou de relance, a fonte do fato, o que esta cena se torna na próxima e onde a música pausa para leitura ou cai para o momento chave. Durações não são escolhidas: escreva as cenas em
content.jse executenpm run fit, que imprime o início, batidas, necessidade de leitura, a pausa antes de uma virada e sua parcela do arredondamento da frase, e a duração do filme, escreverenders/timing.jsone copia a tabela emPLAN.mdentre seus marcadoresfit.npm run fitpara enquantoPLAN.mdestiver faltando e avisa enquanto ainda tiver partes<-- fill -->não preenchidas.
Antes de escrever o texto, leia a tabela de Duração no TEMPLATE.md do modo: ela diz quais slots de cada cena contam como texto primário e como eles entram, para que cada estado possa ser orçado em vez de descoberto. Concluído quando cada tipo de cena está no registro, cada string cabe em seu limite de caracteres, cada número nomeia o código que o calcula e npm run fit não relata erros. Os limites de caracteres são apenas um primeiro filtro: a largura de um slot pode depender de seus vizinhos, então a verificação de pixel é a faixa vermelha na etapa 4. Em um template cujas regras declaram API de tempo 3, um erro significa que o filme quebra um dos quatro níveis de mudança (princípio 5): mais de cinco palavras de texto primário entrando de uma vez (oito para uma afirmação, lida em uma pausa marcada), uma pausa após um pouso por mais de duas batidas, uma composição acima de 6 s, uma lacuna de mais de quatro batidas sem mudança, ou o número ou posicionamento errado de transições expressivas e picos. Divida linhas longas em frases que entram uma após a outra primeiro, depois torne rótulos repetidos texto de relance, depois divida a cena; nunca encolha o tipo ou acelere acima do piso de leitura. Abaixo da tabela de tempo, npm run fit imprime as medidas de nível; um template ainda na API 2 mantém seus limites de página (doze palavras primárias, a pausa de uma etapa por um compasso e a última por um e meio, uma página por quatro compassos) e mostra os níveis como uma nota INFO.
4. Preencher e enquadrar primeiro
Edite content.js (e data/ ou run.js onde o modo os usar); nunca digite duration ou bars de cena para atingir uma duração. Em seguida, renderize stills dos quadros-chave e olhe para eles antes de animar (o script executa fit primeiro, então os stills usam a duração atual):
npm run snapshot -- --at <t1>,<t2>,<t3>
Uma faixa vermelha em um still nomeia um slot cujo texto é mais largo que sua caixa: encurte esse texto. Corrija qualquer quadro que falhe um princípio central ou um princípio do modo: texto de informação abaixo de 25 px, texto ilegível, mais de três níveis de tipo, dois protagonistas, um segundo acento, cópia recortada ou transbordando, qualquer coisa de ai-tells.md. Concluído quando cada quadro-chave passa nas verificações P0 da ficha do modo.
5. Renderizar
npm run film # fit → áudio → check → render, escreve renders/film.mp4
npm run check deve relatar 0 erros. Seus avisos são julgados contra a lista de verificação: um aviso de contraste é aceitável apenas em texto que ainda está entrando (digitando, aparecendo) e é lido uma vez pousado; qualquer outro aviso é corrigido ou listado em Problemas conhecidos. O som segue content.js na mesma grade de batidas; para usar música gerada, renderize-a no tempo e duração ajustados do filme (renders/timing.json), salve-a em assets/audio/ e defina content.bed = { file, offset } (veja o TEMPLATE.md do modo).
6. Medir e revisar
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 lê renders/timing.json e mede a renderização contra ele: formato e duração, volume com saltos de curto prazo e momentâneos, quadros pretos, flashes por área, eventos chave na batida (dentro de 2 quadros) com um evento de imagem e um início de som (≥ 3 dB dentro de 1 quadro), trechos parados por cena dentro da máscara de conteúdo contra um piso de ruído consciente de grão, o ritmo (nenhuma sequência longa de batidas quase paradas, não mais da metade do filme quase parado), pausas de pouso, entregas, sequências de cenas de igual duração e os quatro níveis de mudança nos eventos declarados (lacunas T0, comprimentos de composição T1, transições expressivas T2, picos T3, durações de pausa), que FALHAM apenas para templates na API de tempo 3; inícios de imagem, mudanças de área grande e o momento mais alto são estimativas de pixel e sinal ao lado. Texto menor, contraste de texto, níveis de tipo, área de acento, equilíbrio de oitava, repetição de quatro compassos e limitação são estimativas de pixel ou sinal, relatadas como INFO. Um item sem nada a medir relata N/A, não PASS; --json fornece cada resultado com o item da lista de verificação que ele serve.
Em seguida, percorra references/checklist.md e as verificações da ficha do modo: P0 da base da pirâmide para cima, depois julgue de cima para baixo (ajuste, frescor, textura). Meça antes de mudar qualquer coisa; corrija a causa, depois meça novamente. Concluído quando cada P0 passa e cada falha P1/P2 é corrigida ou escrita em "Problemas conhecidos" no README do filme.
7. Entregar
Forneça o caminho do MP4, a folha de contato e um README com o plano, o modo e a predefinição, a fonte da música (sintetizada ou gerada), comandos, o relatório check-film e problemas conhecidos; diga "ainda não confirmado de ouvido" a menos que alguém tenha ouvido. Peça o veredito do usuário e cite-o de volta textualmente com a data; quando o usuário não estiver disponível, escreva "veredito pendente" e pare.
Mantenedores: de veredito a regra
Apenas para quem mantém a fonte desta habilidade; o criador de um filme para na etapa 7. Um veredito não edita uma ficha de modo ou os princípios diretamente. Primeiro, coloque-o em uma camada da pirâmide e verifique-o contra foundations.md: nas camadas 1–2, o padrão decide; nas 3–4, consenso de domínio, a menos que um desvio seja escrito com sua razão; nas 5–6, o proprietário escolhe entre candidatos que a teoria julga igualmente bons. Uma tendência se torna uma regra após dois vereditos consistentes.