O que Filme de demo faz?
scripts/demo filma uma aplicação web e escreve seu corpus em
~/demo-reels-out/<workspace>/ (DEMO_OUT_ROOT move o
pai, DEMO_OUT nomeia o diretório de uma execução): por cena um mp4 com narração, um poster, stills retina, além de
full-tour.mp4, manifest.json e index.html. Tudo local. O mecanismo é executado
a partir desta skill; nada é instalado no aplicativo que está sendo filmado.
Não negociáveis
Cada um desses custa uma execução ou a paciência de um usuário.
- Uma build fixada, nunca um servidor de desenvolvimento. Seu grafo de módulos pertence a quem
estiver editando o código-fonte. Copie-o para algum lugar privado e verifique sua base de API
lendo o bundle. Uma URL sem um repositório por trás é modo
site; uma URL em localhost é um servidor de desenvolvimento e nunca é filmada. - No modo
build, simule todas as requisições em processo e fixe o relógio. Um corpus é publicado, e uma conta real publica endereços de pessoas reais. O modositeabre mão de ambos conscientemente: apenas páginas públicas. - Possua sua porta e diretório de saída. O estúdio se recusa a adotar um servidor
que não iniciou. Nunca use
pkillpor padrão. - Vídeo 1080p60, stills 2x. São configurações separadas. Vídeo 4K treme porque a taxa de transferência é um orçamento fixo de pixels por segundo.
- Faça o gesto, depois narre enquanto amplia o resultado. Um assunto por linha. Nunca narre antes do assunto existir. Onde o aplicativo tem seu próprio temporizador — uma janela de desfazer, um toast — o gesto acontece dentro dele e as palavras depois, ou o filme mostra uma funcionalidade que não funciona.
- Uma cena, depois pare e pergunte (passo 8). Isso pegou quatro defeitos antes de mais vinte e seis cenas serem filmadas.
- Leia o PNG, toda vez. Uma cena que passa enquanto enquadra a coisa errada é uma falha, e apenas um olho no still a detecta.
- Nada é final até que eles digam. Qualquer observação sobre as palavras, o enquadramento, o ritmo, o que é coberto ou a voz é uma refilmagem, não uma negociação: mude e filme novamente. Eles não podem ver o que você pode, então "muito longo", "aproxime mais" e "pare de aproximar tanto" são instruções completas, e uma cena é barata de filmar duas vezes.
Fluxo de trabalho
- Escolha o modo a partir do que foi fornecido. Não pergunte. Uma URL http(s) em
um host público é
site, workspace~/.shipdemo/<host>/. Uma URL em localhost ou um endereço privado é um servidor de desenvolvimento: encontre o repositório por trás dele e trate a solicitação como aquele repositório. Sem URL significa o repositório em que você está, então suba e procure por um aplicativo web (umpackage.jsoncom um script de build ao lado de uma configuração Vite, React Router, Next, Astro, SvelteKit ou Remix). Exatamente um ébuild; vários, pergunte qual; nenhum, peça uma URL ou um caminho. Um workspace cujo.originjá nomeia este repositório é reutilizado, não recriado. Diga o modo e o caminho do workspace em uma linha e prossiga. scripts/doctor.sh, depois prepare-se antes de pedir qualquer outra coisa ao usuário. Eles instalaram uma skill; eles não se inscreveram para executar três scripts. Diga o que está faltando em uma linha, diga o que você propõe instalar e aproximadamente o tamanho, e execute assim que eles concordarem.scripts/install.shcobre o mecanismo e o Chromium (cerca de 250MB) e também instala ffmpeg onde um gerenciador de pacotes permite;scripts/install-voice.shé a voz (~350MB), e filmar sem som é uma resposta aceitável se eles preferirem. Nunca instale nada sem perguntar, e nunca entregue a eles um relatório do doctor para interpretar. Duas coisas que ele não fará, e nem você deve: atualizar o Node deles, porque saber qual ferramenta o gerencia é responsabilidade deles, e executarsudo, porque um prompt de senha em um script que ninguém está assistindo apenas trava. Em ambos os casos o script imprime o comando único e você o repassa.- Descubra, sem escrever nada.
site: abra a URL e leia-a, para saber do que se trata a página, as três coisas que valem a pena mostrar e o que é estável o suficiente para apontar. Se ela cair em uma tela de login, pare: um aplicativo logado é filmado a partir do seu repositório, então peça por ele ou por uma URL pública.build: o comando de build copiado literalmente depackage.json; o diretório de saída da configuração do framework; qualquer host de API absoluto em.env*(vai embuild.forbid); a chave que o script de tema lê; uma API de fixture existente ou handlers MSW; densidade dedata-testid; rotas sem credencial. scripts/scaffold.mjs <appRoot>, ouscripts/scaffold.mjs --site <url>. Nenhum deles escreve nada no aplicativo.- Preencha o
demo.config.tsdo workspace. Um campo obrigatório ainda desconhecido significa que a descoberta não está completa. config.md - Apenas
build: escrevamock.tseseed/. Reutilize as próprias fixtures de dados do repositório onde ele as tiver, mas nunca um arquivo que importe@playwright/test: duas cópias em uma execução é um erro que o Playwright se recusa, e ele falha em todo o corpus em vez da única cena que o causou. EntãoDEMO_VOICE=0 scripts/demo --grep smoke. Reutilize a API de fixture do repositório se ele tiver uma (mocking.md). Leia o still: logado, dados semeados, tema correto, nenhuma página de login. Leia a linha de captura. Corrija até que ambos estejam corretos, então escrevademo/ui.tsapenas com o que a execução smoke provou. - Escreva o roteiro primeiro. Preencha o
profile.jsondo workspace (copietemplate/profile.json; produto, público, linha de encerramento, palavras proibidas), depois escreva cada linha de acordo com script.md: gancho, passos, recompensa, encerramento. O gancho também vai emhooks.jsonpara as variantes. Filme o que foi solicitado, no escopo que foi solicitado. Uma funcionalidade nomeada é uma cena: escreva-a, filme-a, entregue-a. Não responda "grave a pesquisa na página inicial" com uma proposta de dez cenas, e não alargue silenciosamente o pedido porque o produto tem mais conteúdo. Apenas quando a solicitação é o produto inteiro você propõe 6 a 10 cenas, cada uma com um título e uma descrição de uma linha na ordem do tour, e pergunta qual filmar primeiro. - PARE. Filme aquela única cena com voz. Verifique se a contagem falada corresponde
às chamadas
say, nada excedeu, a taxa se manteve. Leia cada still. Dê ao usuário o caminho do mp4 e pergunte sobre o registro da escrita, a escala de zoom, o ritmo e a voz. Não escreva mais nada até que eles respondam. - Depois, lotes de três ou quatro via
--grep; o manifesto faz merge. Leia os stills após cada lote.DEMO_BUILD=0 scripts/demopula a reconstrução enquanto itera em uma cena — vinte segundos em vez de quatro minutos; remova-o para a execução que produz o corpus. - Execução completa com
DEMO_CAPTIONS=1 DEMO_TRACE_FRAMES=1, depoisscripts/check.mjs <out>e abra<out>/index.html. Relate a tabela de captura, quaisquer clipes lentos e todas as bandeiras que as verificações levantarem. - Variantes. Pergunte quais eles querem, a menos que eles tenham dito:
reel,wide-phone,wide-laptop,wide-laptop-zoom,webouall(scripts/variants.mjs --listdescreve cada uma). Entãoscripts/variants.mjs <out> --only <list>. Presets de telefone usam gravações em retrato e presets de laptop em paisagem, então filme ambos os tamanhos quando eles quiserem ambos. Leia um poster por variante antes de entregá-los.
Uma cena
scene('tasks', { title: 'Suas tarefas, ao lado do seu calendário', blurb: '...' },
async ({ actor, page, shot }) => {
await actor.click(page.getByRole('radio', { name: 'Hoje' }));
await actor.settle();
await actor.spotlight(
row('Enviar o feedback para Sam'),
'E esta é de ontem que eu nunca consegui fazer, então está sinalizada.',
{ scale: 1.8, stay: true }
);
await shot('atrasada');
await actor.unfocus();
});
spotlight recebe a marca de narração, então move a câmera e o cursor sobre as
palavras iniciais da linha. Escala por assunto: painel ~1.4, linha ~1.7, controle único ~2.
Uma linha sobre a tela inteira recebe um say simples e sem zoom. unfocus é uma
dica em vez de um movimento: a câmera só sai quando algo precisa
estar amplo, então batidas consecutivas sobre a mesma região deslizam em vez de saltar.
scenes.md · narration.md
Nunca
Cloud TTS (o filme é de dados privados).
Playwright's recordVideo (sem controle de taxa, tamanho ou início; o gravador
substitui). 4K como padrão. Música, cartões de introdução ou cross-fades. Cenas
geradas a partir de um rastreamento de rotas: uma cena é uma coreografia com um propósito. Tentativas:
uma cena repetida é um filme diferente.
Legendas, verificações e variantes
Legendas estão ativadas para qualquer coisa destinada a ser postada (DEMO_CAPTIONS=1): .srt,
.vtt, .lines.json e um .captioned.mp4, cortado do próprio roteiro, para
que correspondam à voz palavra por palavra. Legendas fixadas ficam na parte inferior, elevadas
acima dos controles do player (DEMO_CAPTION_MARGIN substitui; nunca no topo).
scripts/check.mjs executa três verificações: voz (cada linha transcrita e
comparada com seu roteiro), tela (a cada meio segundo lido em busca de palavras do
neverOnScreen do perfil, depois qualquer coisa desenhada em vermelho) e quadros
(lacunas lentas). Uma ferramenta faltando é ignorada com o comando para instalá-la
(scripts/install-checks.sh). Vermelho que pertence ao lugar, como um emblema de
atraso, também é listado: leia a lista, não o conte.
scripts/variants.mjs lê variants/presets.json. Uma nova variante é uma nova entrada
lá: canvas, onde o aplicativo se senta, onde o gancho e as legendas vão, e
zoom se deve aproximar nos destaques. Nada é refilmado; os originais nunca são
tocados.
Também
DEMO_VOICE_VARIANTS=am_michael,bf_emma mistura a mesma tomada em mais vozes
(<scene>.<voice>.mp4), para audicionar uma voz sem refilmar.
capture.md antes de alterar qualquer número de captura.
runs.md para builds, isolamento e o manifesto.
troubleshooting.md quando uma execução morre ou um shot
parece errado. O mecanismo é executado a partir desta skill, então uma correção em engine/
alcança todos os projetos na máquina de uma vez: edite-o lá, e nada precisa
ser propagado.