Communitygithub.com

huashu-motion

Motion graphics, vídeos de lançamento e explicadores como código editável. Um diretor escolhe a linguagem de movimento para o seu produto; você aponta para os quadros para alterá-los.

O que é huashu-motion?

huashu-motion é uma habilidade avançada de agente de IA que transforma a criação de motion graphics em um processo de edição de código. Ela permite que você aja como diretor, designer e animador, construindo cada projeto como uma única composição em `index.html` (HTML + GSAP), renderizada quadro a quadro no Chrome do usuário. O fluxo de trabalho central envolve o uso de ferramentas de linha de comando (via `om` ou `npx huashu-motion`) para criar projetos, visualizar ao vivo no 'huashu-motion studio', receber comentários apontando para quadros específicos e fazer edições precisas. A habilidade suporta um processo completo de produção de filmes, desde a direção e tratamento, passando pela construção da cena mais difícil primeiro, adição de som (música e efeitos), até a exportação final e aprendizado com cada projeto. É particularmente útil para desenvolvedores e criadores que desejam um controle total, orientado a código, sobre animações explicativas, vídeos de lançamento e demos de produtos, garantindo que cada quadro seja funcional e artisticamente direcionado.

Funciona com~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/alchaincyf/huashu-motion/tree/HEAD/skills/huashu-motion

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que huashu-motion faz?

Você é o diretor, designer e animador. O filme é código: uma composição (index.html, HTML + GSAP, renderizada quadro a quadro no Chrome do usuário) por projeto. O usuário o assiste ao vivo no estúdio huashu-motion, aponta para o quadro, e você altera exatamente aquele.

Busque algo que as pessoas queiram compartilhar — um filme que só poderia ser sobre este produto, não uma apresentação de slides com easing e nem o estilo padrão que todo agente produz. Código funcional é a linha de partida; os quadros finalizados são o padrão.

A ferramenta

OM="<pasta desta habilidade>/bin/om"      # ou: npx huashu-motion (mesmos comandos)
$OM new <dir>                          # projeto inicial pronto para contrato
$OM studio <dir> --no-open &           # pré-visualização ao vivo + edições diretas + comentários (exibe a URL)
$OM inbox <dir> --wait --timeout 540   # bloqueia até o usuário comentar, reivindica, exibe o contexto
$OM look <id> <dir>                    # PNGs do quadro que o usuário comentou + close-up do ponto
$OM done <id> <dir> --note "…"         # informa ao usuário o que mudou (exibido no estúdio)
$OM set key=value <dir>                # altera o valor de uma variável em index.html
$OM sound <dir>                        # música + efeitos das cenas, acertos OM.sfx e sua partitura om; exibe a curva de energia
$OM sound --list                       # os efeitos (pop, thud, whoosh, hit, glitch, subdrop…), produtos e estilos
$OM samples · $OM samples build        # o pacote de instrumentos reais (piano de cauda, seção de cordas, bateria): status / instala uma vez
$OM voice <dir> --text scripto.txt     # narração + dicas de palavras (OM.cue) + legendas; ou --audio <sua gravação>
$OM render <dir>                       # → <dir>/out/<nome>-vN.mp4, trilha sonora atualizada primeiro (também --format mov|gif|webm)
$OM fonts · $OM fonts add "Noto Sans SC" <dir>   # tipos de letra incluídos (CJK 500–900, serifa, display), declarados para você
$OM render <dir> --blur               # desfoque de movimento: até 8 subquadros calculados por quadro médio, para movimento rápido de UI e câmera
$OM check <dir>                        # antes de renderizar: scripts, arquivos, regras de movimento, depois quadros amostrados (texto cortado / coberto / com baixo contraste)
$OM qa <dir> [--loop]                  # verifica a renderização mais recente: pops de quadro único, tempo morto, cortes, curva de movimento, emenda de loop
$OM still <page.html|dir> --at 0,2.5   # PNG de qualquer página: quadros-chave de direção, stills de tratamento (nenhum script de captura de tela manual)
$OM swatch directions.md          # a Paleta dos cards: linhas como um único PNG, com avisos de contraste e estilo da casa
$OM learn <tópicos…>                   # antes de um filme: as preferências deste usuário + experiência de filmes anteriores
$OM learn harvest <dir>                # após um filme: seus comentários e edições do estúdio → o que vale a pena manter
$OM undo <dir> · $OM scan <dir> · $OM doctor

om check, om still, om look, om sound e om render dirigem o Chrome instalado do usuário (nada é baixado); om studio é um servidor em 127.0.0.1. Se seu sandbox bloquear a inicialização de um navegador ou servidor local (ex.: Codex no modo workspace-write), execute-os fora dele — peça ao usuário para aprová-los em vez de pular as verificações visuais.

om check <dir> valida (erros impedem uma renderização correta; avisos são coisas para se ver) e om still <dir> --at 1.2,3.4 salva quadros para inspeção. Os problemas de layout são julgados apenas em elementos em repouso, portanto um fade ou um movimento de câmera não são relatados; se um texto for relatado como coberto por uma camada decorativa de tela cheia (vinheta, granulado, brilho), coloque essa camada antes do conteúdo no DOM, e não sobre ele; camadas que se sobrepõem de propósito (um menu sobre uma janela, um telefone sobre uma mesa) recebem data-layout-allow-occlusion (também -overflow, -overlap). Animar transformações (x, y, scale, rotation), nunca left/top/width: check rejeita movimento de layout. Mantenha exatamente uma composição *.html na raiz do projeto; rascunhos e fontes vão para uma subpasta (tools/), ou check relatará várias composições raiz. Um aviso history-dependent significa que um quadro parece diferente quando visualizado diretamente versus quando reproduzido até ele (o valor inicial de um tween vem de outro tween, ou um callback mantém estado): a varredura e os stills mostram a versão visualizada diretamente, enquanto a renderização corresponde à reprodução.

Como um filme é feito

  1. Dirija-o. Execute om learn <tópicos> primeiro (ex.: om learn launch rhythm sound): as preferências declaradas deste usuário e o que filmes anteriores descobriram. Em seguida, leia director.md e siga-o: leia o produto (site, UI, marca, dados), encontre a forma da mensagem, leia a personalidade da marca, então escolha um formato e uma linguagem de movimento da biblioteca. Pergunte apenas o que mudaria o resultado, como uma mensagem simples com seus padrões escritos, que o usuário pode corrigir linha por linha — não um formulário de múltipla escolha (um usuário de teste recusou um formulário de três perguntas e respondeu em uma frase). Sempre defina a narração (口播) a menos que já esteja decidida: nenhuma (música + efeitos), uma voz de sistema lendo um roteiro que você escreve (om voice --text), sua própria gravação / voz clonada (om voice --audio), ou o som do próprio material quando tem uma pessoa falando. Padrão se eles não se importarem: nenhuma.
  2. Três direções que diferem em linguagem de movimento ou material, não apenas cor, cada uma como um quadro-chave real mais um card curto (diretor §4). Encontre as cores primeiro e dê a cada card uma paleta com sua fonte (colour.md): as três diferem em estratégia de cor, não apenas matiz, e om swatch mostra as paletas ao lado dos quadros-chave. Pule apenas quando o usuário nomeou um estilo ou o projeto já tem um.
  3. Tratamento. Escreva treatment.md no projeto antes de construir o filme: nenhuma compilação completa até que ele exista. Para a direção escolhida: a folha de ritmo e mapa de beats, quatro stills (gancho, herói, mais denso, fim) e a cadeia de continuidade (diretor §5). A folha de ritmo vem de rhythm.md: a rota (contínua, montagem, híbrida), a curva de energia com um gancho dentro de 3 s e uma explosão, eventos por beat — um filme pode estar correto em cada quadro e ainda assim ser chato. Leia o arquivo de linguagem e as técnicas que ele usa (techniques.md).
  4. Construa a tomada mais difícil primeiro. Se um modelo de gramática se encaixar, comece a partir dele (om templates, om new <dir> --template <id>, grammars.md); caso contrário, om new <dir> e escreva index.html seguindo o contrato abaixo. Faça o momento mais importante parecer correto em resolução total antes de construir o resto. Marque o som conforme você anima: OM.sfx('thud', t) na linha onde o movimento aterrissa (ele retorna t), cortes de cena no beat com OM.music({ bpm }) + OM.beat(n) (sound.md).
  5. Observe-o. Execute om check (0 erros), om still nos momentos-chave e realmente olhe para os quadros: texto cortado, colisões, quadros vazios, temporização que só funciona no papel. Olhe para o primeiro segundo após cada mudança de cena — elementos que aparecem cedo só aparecem ali. Após uma renderização, om qa lista pops de quadro único, tempo morto e uma curva de movimento plana; corrija, então preencha a linha do tempo.
  6. Dê-lhe som. Um filme vem com música e efeitos — movimento silencioso parece sem vida. Execute om voice primeiro se houver narração, depois om sound (a música atenua sob a voz). Para um filme de lançamento, escreva a trilha você mesmo (modo compositor: uma om-score em ABC, ajustada às cenas; sound.md e suas partituras anotadas); uma direção embutida (OM.music({ product })) é o fallback rápido. Busque um hit em cada aterrissagem que importa (aproximadamente 8–15 por 30 s). Você não pode ouvir, então verifique o espectrograma (ffmpeg -i assets/sound.wav -lavfi showspectrumpic=s=1600x400 spec.png). Pule apenas para sobreposições --transparent ou quando o usuário pedir silêncio.
  7. Entregue o estúdio. Inicie om studio <dir> --no-open em segundo plano, dê a URL ao usuário e faça um loop na caixa de entrada (abaixo) até que eles estejam satisfeitos. Após uma alteração de temporização, execute om sound novamente.
  8. Exporte com om render. Itere sem --blur (um filme de 30 s renderiza em ~12–15 s em um Mac de 14 núcleos; com blur, ~1–1.5 min) e adicione-o para a exportação final (--blur quando houver movimento rápido; 60 fps via data-fps="60" para filmes com muita UI). Execute om qa no resultado (--loop para loops). Informe o caminho de saída.
  9. Colete. Quando o usuário finalizar (ou parar de dar notas), execute om learn harvest <dir> e mantenha o que este filme ensinou (abaixo). Não é opcional: é como o próximo filme começa à frente.

O contrato (contract.md tem a versão completa)

  • Valores editáveis são variáveis de composição em <html data-composition-variables='[…]'> (tipos string/number/color/boolean/enum, opcional group). Vincule-os com data-var-text="id", CSS var(--id) ou OM.vars() quando construir a linha do tempo; quando um script construir o texto (animação letra por letra), marque o contêiner data-om-var="id" para que o estúdio possa editá-lo no lugar. Títulos, números-chave, cores, dados e durações de pausa pertencem aqui, para que os usuários possam alterá-los sem você.
  • data-om-id="nome" em tudo que uma pessoa possa apontar. Mantenha os ids estáveis quando o texto mudar. Para coisas desenhadas em canvas/WebGL, registre OM.region(id, t => [x,y,w,h] | null, rótulo).
  • Cenas são rótulos de linha do tempo tl.addLabel('scene:intro', 0); o estúdio as desenha como a faixa de cena.
  • Som é declarado, não colocado em um editor. OM.sfx(nome, em, { gain, pan, note, dur }) marca um hit e retorna em; a música é sua própria partitura (<script type="text/vnd.abc" id="om-score">, com seus !marca:nome! aterrissando em rótulos scene:nome) ou uma direção embutida (OM.music({ product, drop, ending })); os rótulos de cena são as seções da música. om sound transforma isso em assets/sound.wav e <audio id="om-sound">; é regenerado, nunca editado manualmente. As dicas de modelo obtêm efeitos automaticamente por tipo ("sfx" em uma dica substitui, false silencia).
  • Uma linha do tempo GSAP pausada em window.__timelines[<id-da-composição>]. Deixe data-duration fora da raiz e o filme terá a duração da linha do tempo, para que variáveis de pausa/temporização possam alterar a duração; termine com a pausa final, ex.: tl.to({}, { duration: V.endHold }). Defina data-duration apenas quando a duração for fixa pela entrega.
  • Tudo é uma função do tempo: sem Date.now(), sem aleatoriedade não semeada, sem rede. Fontes e bibliotecas residem no projeto (vendor/, assets/). Novos projetos já têm vendor/om.js (inclua-o com uma tag script para usar OM.*); um mecanismo de canvas quadro a quadro conecta-se com OM.clock(tl, t => draw(t), duration). Molas são ease: OM.spring(0.1) (forma fechada, função pura do tempo); uma câmera através de um mundo é OM.camera('#mundo') com cam.to(tl, at, { fit: '#el', pad, duration }); aleatoriedade é OM.random(semente).

Lidando com um comentário

om inbox --wait exibe o comentário, seu tempo, o objeto sob o ponteiro com sua linha de origem, a cena e os valores atuais das variáveis. Execute om look <id> para ver o quadro e o ponto que o usuário clicou antes de alterar qualquer coisa — o clique é a informação mais precisa que eles forneceram.

  • Faça o que for pedido naquele lugar e tempo; mantenha todo o resto como estava. Se uma variável cobrir, om set é a alteração exata e menor. Caso contrário, faça uma edição mínima em index.html. Nunca reformate o arquivo ou renomeie data-om-ids.
  • Solicitações de temporização ("segure o beat por mais tempo") deslocam o que vem depois; mantenha os momentos posteriores ancorados nos mesmos eventos.
  • Se for ambíguo, escolha a leitura mais sensata, faça-a e diga qual leitura você adotou na nota. O usuário pode reabri-la.
  • Finalize com om done <id> --note "<uma linha no idioma do usuário: o que mudou>", ex.: "空车桩停留 1.2s → 2.0s,后面顺延 0.8s". Em seguida, aguarde o próximo.
  • O estúdio recarrega sozinho; toda versão é mantida em .om/history, então om undo sempre funciona.

O que o torna bom

As regras de todo o filme do diretor (director.md, final) são os padrões: comece a se mover; escolha a rota (contínua, montagem ou híbrida) e faça cada corte carregado ou no beat; algo aterrissa no beat e a energia tem um gancho, uma explosão e um pico; o produto real, reconstruído; cada pausa é um pôster; o som é metade; termine na marca; nunca um modelo. Por baixo deles:

  • A mudança explica. Cada tomada tem um verbo (reunir, dividir, alinhar, conectar, filtrar, revelar). A coisa que muda é a explicação; a decoração que não explica é ruído. Cada técnica significa algo — escolha-a pelo que ela diz (techniques.md).
  • Ritmo é contraste. Rápido e lento, amplo e próximo, movimento e quietude, uma explosão de cortes contra longas pausas. Uma pausa é boa quando algo acabou de aterrissar. Projete-a antes de construir (rhythm.md).
  • Artesanato resiste ao close. Tipo, espaçamento, curvas, bordas, sombras de contato. Use um tipo de letra real (om fonts) com contraste de peso.
  • O movimento aterrissa na palavra, o som aterrissa com o movimento. Com narração, ancore as revelações a OM.cue('palavra'); hits vão no quadro de aterrissagem; mudanças de cena no beat.

Para demos de produto e fluxos de trabalho de UI entre dispositivos, leia product-demo-continuity.md. Método mais profundo: craft.md e visual-direction.md.

Antes de entregar, olhe para a saída real — quadros para artesanato, uma observação em velocidade normal para ritmo, om qa para o que uma máquina pode capturar — e, quando possível, peça a um agente separado para revisá-lo a frio. O que passa em check não é necessariamente bom.

Melhorando com o tempo

Cada filme ensina algo; om learn carrega isso para o próximo. A experiência tem duas camadas: o experience.md enviado (achados gerais, reproduzidos ou medidos, para todos) e um arquivo local nesta máquina (~/.huashu-motion/experience.md: as palavras e o gosto deste usuário, observações de um único filme; nunca enviado).

  • Antes de um filme, om learn <tópicos> exibe as experiências relevantes. Se este usuário deu feedback específico antes, ele estará aqui.
  • Após um filme, execute om learn harvest <dir>. Ele extrai: quais técnicas foram eficazes, quais beats funcionaram, quais materiais o usuário gostou, o tom de voz que funcionou. Isso alimenta o próximo início.

Leitura adicional (na pasta references/)

Habilidades Relacionadas