MÓDULO 2.2

🗺️ O actions.json

O arquivo de entrada do capture.mjs: URL, viewport e a lista de passos com seletores e narração. Rodar node capture.mjs actions.json gera os shots PNG + o steps.json.

7
Tópicos
~30
Minutos
Prático
Nível
Config
Tipo
actions.json URL · VIEWPORT · STEPS { } url viewport window steps[ ] do · target caption · narration capture.mjs executa passos shots/*.png 1 por estado steps.json bbox + caption node capture.mjs actions.json
1

🧱 Estrutura do actions.json

Um JSON com a configuração global e a lista de passos. É o roteiro que o capture.mjs executa de ponta a ponta.

Conceito Principal

O actions.json descreve toda a demo num arquivo: onde ir, em que tamanho, o que fazer em cada passo e o que falar. Um node capture.mjs actions.json e a captura sai pronta.

actions.json — exemplo real (cabeçalho)
{
"url": "http://localhost:8000/",
"viewport": [1280, 800],
"window": { "top": 96, "titleH": 52, "urlLabel": "localhost:8000" },
"eyebrow": "DEMONSTRAÇÃO · AutomationsAIIMG",
"ctaNarration": "Isso é conteúdo do AutomationsAI ponto CLUB...",
"steps": [ ... ]
}
🔗
url
onde ir
📺
viewport
tamanho fixo
🪟
window
moldura
📋
steps[]
os passos
2

📺 URL + viewport

Onde e em que tamanho. O viewport definido aqui é o espaço de coordenadas de todas as bboxes do vídeo.

📊 O que o capture.mjs faz com esses campos
url
Vira agent-browser open <url>. O app precisa estar no ar nesse endereço.
viewport [W,H]
Vira set viewport W H antes do open. Largura ≤ ~1280 para caber no 16:9.
💡
Mude o viewport aqui e mudou em todo o vídeo

Como o viewport é o espaço de coordenadas das bboxes, alterá-lo depois de capturar quebra o alinhamento do cursor. Decida o viewport antes de gerar os shots.

⚠️
Telas muito largas estouram o canvas

Acima de ~1280 de largura, o print sai espremido ou passa das bordas do canvas 1920×1080. Reduza o viewport na captura em vez de forçar.

3

📋 A lista de passos

O array steps em ordem: cada item é um estado da tela. 5–8 passos + CTA ≈ 35–50s.

O arco de uma demo
1
Tela inicial (intro:true)

O 1º passo apresenta o app, sem ação — só o screenshot do estado inicial.

2
Ações 1, 2, 3...

Cada passo executa um do, captura a tela e mede a bbox do target.

3
Resultado (zoom:true) + CTA

O último passo de conteúdo dá um zoom suave no resultado. A CTA do AutomationsAI vem do composition-template.

💡
Mantenha 5–8 passos

Além disso o vídeo cansa e a captura/edição vira trabalho grande. 5–8 passos + CTA dão um walkthrough de ~35–50s.

4

⚙️ O campo do:{type}

A ação executada antes do screenshot. Sem do, o passo só captura o estado atual.

do.type Campos O que faz
fillselector, valuePreenche input/textarea (CSS selector)
clickselectorClica (CSS selector)
clickTexttag, textClica o <tag> cujo texto === text
setValueselector, valueDefine value e dispara input/change
waitmsEspera (ex.: geração demorada)
Exemplo: clicar pelo texto do botão
{
"id": "gerar",
"do": { "type": "clickText", "tag": "button", "text": "Gerar" },
"target": { "tag": "button", "text": "Gerar" }, "click": true
}
💡
setValue para campos controlados por JS

Foi o caso do campo de altura: fill não bastava. O setValue dispara input+change para o framework reagir. (O fill nativo do Playwright é roadmap — módulo 2.4.)

5

🎯 O alvo / seletor de cada passo

O target é o que o cursor mira. Pode ser diferente do elemento que o do aciona.

✓ Formas de target
  • CSS selector: "textarea"
  • CSS por atributo: "input[name=height]"
  • Por texto: {tag:"button", text:"Gerar"}
  • O capture lê a bbox do target via eval
✗ Cuidados
  • Target sem match → bbox null + aviso no log
  • Evite @eN voláteis em telas que mudam
  • Texto com acento/espaço precisa bater exato
  • Não confunda o alvo do clique com o alvo da mira
💡
do ≠ target

Você pode preencher um campo (do) e mirar o botão de enviar (target). O cursor vai para o target; a ação acontece no do.

6

🗣️ Texto de narração por passo

caption é a legenda na tela; narration é a fala. Expanda números e siglas para a leitura sair natural.

Passo com narração (exemplo real)
{
"id": "size", "click": true,
"caption": "2 · Escolha o tamanho — 512²",
"narration": "Depois, escolha o tamanho. Vamos de quinhentos e doze."
}
📊 Expandir para a fala
"512"
→ "quinhentos e doze"
"768"
→ "setecentos e sessenta e oito"
"automationsai.net"
→ "inema ponto club"
💡
A narração vai para o steps.json → Kokoro

O texto de cada passo é escrito em assets/txt/sN.txt e o Kokoro (voz pf_dora, --speed 0.98) gera os WAVs. Texto fonético = voz natural.

7

📦 A saída: steps.json + os shots PNG

O capture.mjs gera os screenshots e o steps.json — a ponte entre captura (T2) e render (T3).

steps.json — saída (1 passo)
{ "shot": "01-prompt.png",
"target": {"x":129,"y":252,"w":482,"h":96},
"click": false, "caption": "1 · Escreva um prompt detalhado" }
📊 O que sai da captura
assets/shots/*.png
1 screenshot real por estado (00-home.png, 01-prompt.png...).
steps.json
viewport, window, eyebrow, CTA e os passos com bbox + flags + caption + narration.
💡
É o contrato com o render

O composition-template.mjs (T3) lê o steps.json e monta moldura + cursor + destaque + zoom + CTA, medindo os WAVs com ffprobe — timing único.

🎯 Resumo do módulo

  • actions.json = url + viewport + window + steps[] + CTA
  • viewport definido aqui é o espaço de coordenadas das bboxes
  • do.type: fill / click / clickText / setValue / wait
  • target = o que o cursor mira (CSS selector ou {tag,text})
  • saída: shots/*.png + steps.json (contrato captura→render)
Próximo módulo
2.3
🎯 Coordenadas, seletores & bounding boxes
Como a bbox vira a mira do cursor no canvas, seletores robustos e a região de zoom.
Ir para o módulo 2.3 →