@intelli-ia/easyedit 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +25 -2
  4. package/bin/easyedit.mjs +6 -0
  5. package/package.json +12 -4
  6. package/payload/.easyedit/Spec.md +82 -0
  7. package/payload/.easyedit/TOOLS.md +113 -0
  8. package/payload/.easyedit/templates/Spec.md +125 -0
  9. package/payload/claude-section.md +5 -0
  10. package/payload/skills/easyedit-build/SKILL.md +78 -0
  11. package/payload/skills/easyedit-destaques/SKILL.md +49 -0
  12. package/payload/skills/easyedit-interviewer/SKILL.md +54 -0
  13. package/payload/skills/easyedit-legendas/SKILL.md +28 -0
  14. package/payload/skills/easyedit-log/SKILL.md +46 -0
  15. package/payload/skills/easyedit-log/scripts/campo.mjs +24 -0
  16. package/payload/skills/easyedit-log/scripts/registrar.mjs +34 -0
  17. package/payload/skills/easyedit-novo/SKILL.md +48 -0
  18. package/payload/skills/easyedit-novo/scripts/novo_video.mjs +43 -0
  19. package/payload/skills/easyedit-progress/SKILL.md +27 -0
  20. package/payload/skills/easyedit-progress/scripts/progress.mjs +39 -0
  21. package/payload/skills/easyedit-ritmo/SKILL.md +42 -0
  22. package/payload/skills/easyedit-ritmo/scripts/pausas.mjs +73 -0
  23. package/payload/skills/easyedit-setup/SKILL.md +31 -0
  24. package/payload/skills/easyedit-split-broll/SKILL.md +37 -0
  25. package/payload/skills/easyedit-takes/SKILL.md +52 -0
  26. package/payload/skills/easyedit-takes/scripts/takes.mjs +73 -0
  27. package/payload/skills/easyedit-vertical-trafego/SKILL.md +55 -0
  28. package/payload/skills/easyedit-vertical-trafego/references/playbook.md +37 -0
  29. package/payload/skills/easyedit-zonas-seguras/SKILL.md +73 -0
  30. package/payload/skills/easyedit-zonas-seguras/references/zonas.md +18 -0
  31. package/payload/skills/easyedit-zonas-seguras/scripts/detectar.swift +37 -0
  32. package/payload/skills/easyedit-zonas-seguras/scripts/verificar_zonas.mjs +159 -0
  33. package/payload/skills/easyedit-zonas-seguras/scripts/zonas.mjs +37 -0
  34. package/src/cli.mjs +45 -0
  35. package/src/delegar.mjs +10 -0
  36. package/src/doctor.mjs +56 -0
  37. package/src/install.mjs +62 -0
  38. package/src/paths.mjs +10 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0
4
+ - Suporte a Windows (e Linux): `doctor` funciona com `npx.cmd`, mostra o sistema e como instalar cada dependência por sistema.
5
+ - Verificador de zonas seguras: sem detecção automática (Windows/Linux), gera folhas de revisão visual com as zonas em vermelho e exige a conferência; `--manual 1` força o modo; `EASYEDIT_DETECTOR` aceita um detector externo.
6
+ - `TOOLS.md` agora é neutro quanto a sistema e caminhos.
7
+ - CI no GitHub Actions em ubuntu, macOS e Windows (Node 22 e 24).
8
+
9
+ ## 0.1.0
10
+ - Primeira versão: `install`, `update`, `doctor`, `novo`, `progress`.
11
+ - 13 skills `easyedit-*`, contrato `.easyedit/Spec.md` e template de spec.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Intelli
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,26 @@
1
- # Temporary Holding Version
1
+ # EasyEdit
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Especificação, entrevista e acompanhamento de edição de vídeo (HyperFrames) em forma de skills para agentes de código.
4
+
5
+ ## Instalar a CLI
6
+ npm install --global @intelli-ia/easyedit
7
+ # desenvolvimento: npm link nesta pasta
8
+
9
+ ## Usar num projeto
10
+ cd meu-projeto-de-video
11
+ easyedit install # skills em .claude/skills, contrato em .easyedit/, seção no CLAUDE.md
12
+ easyedit doctor # confere Node, FFmpeg, HyperFrames, whisper
13
+ easyedit update # atualiza; preserva specs e .easyedit/TOOLS.md
14
+
15
+ Depois abra uma sessão nova do agente e use `/easyedit-novo` → `/easyedit-interviewer` → `/easyedit-build`.
16
+
17
+ ## Requisitos
18
+ Node 22+, FFmpeg no `PATH` e HyperFrames no projeto (`npm i -D hyperframes`). Whisper.cpp (ou Parakeet) para transcrição. `easyedit doctor` diz o que falta e como instalar no seu sistema.
19
+
20
+ | | macOS | Windows |
21
+ | --- | --- | --- |
22
+ | CLI e skills | ✔ | ✔ |
23
+ | FFmpeg | `brew install ffmpeg` | `winget install Gyan.FFmpeg` |
24
+ | Detecção automática de rosto nas zonas seguras | ✔ (Vision) | revisão visual de folhas de contato (obrigatória no gate); `EASYEDIT_DETECTOR` aceita um detector próprio |
25
+ | Render | mais rápido (Apple Silicon) | ✔ |
26
+ O EasyEdit espera a estrutura `clientes/<cliente>/{raw,assets,projects,output}`.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../src/cli.mjs";
3
+ main(process.argv.slice(2)).catch((e) => {
4
+ console.error(`easyedit: ${e.message}`);
5
+ process.exit(1);
6
+ });
package/package.json CHANGED
@@ -1,6 +1,14 @@
1
1
  {
2
2
  "name": "@intelli-ia/easyedit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "Especificação, entrevista e acompanhamento de edição de vídeo com HyperFrames, em forma de skills para agentes.",
5
+ "license": "MIT",
6
+ "repository": { "type": "git", "url": "git+https://github.com/intelli-ia/easyedit.git" },
7
+ "homepage": "https://github.com/intelli-ia/easyedit#readme",
8
+ "bugs": { "url": "https://github.com/intelli-ia/easyedit/issues" },
9
+ "type": "module",
10
+ "bin": { "easyedit": "bin/easyedit.mjs" },
11
+ "files": ["LICENSE", "bin", "src", "payload", "CHANGELOG.md", "README.md"],
12
+ "engines": { "node": ">=22" },
13
+ "scripts": { "test": "node --test test/*.test.mjs" }
14
+ }
@@ -0,0 +1,82 @@
1
+ # EasyEdit · Contrato da especificação de vídeo
2
+
3
+ Regras comuns a todas as skills `easyedit-*`. Cada vídeo é um projeto isolado e tem **um único** `spec.md`, em `clientes/<cliente>/projects/<AAAA-MM-slug>/spec.md`. Ele é a fonte normativa do que foi especificado, implementado e alterado. Não crie `plan.md`, `tasks.md` nem outros relatórios paralelos.
4
+
5
+ O template está em `.easyedit/templates/Spec.md`. As ferramentas disponíveis estão em `.easyedit/TOOLS.md`.
6
+
7
+ ## Vertical
8
+
9
+ O campo `Vertical` do cabeçalho define o playbook: `trafego-meta` (criativo para anúncio na Meta, skill `easyedit-vertical-trafego`), `reels` (ainda sem playbook próprio) ou `a definir`.
10
+
11
+ ## Gravações do vídeo
12
+
13
+ Todas as gravações de um criativo ficam em `clientes/<cliente>/raw/<AAAA-MM-slug>/`. `easyedit-takes` ordena (nome numerado, depois data de criação), transcreve, resolve refações e entrega a sequência ao restante do fluxo.
14
+
15
+ ## Estados
16
+
17
+ O estado fica no campo `Status` do cabeçalho do `spec.md`. Não há pastas de estado, porque o projeto já é a unidade.
18
+
19
+ | Status | Significa | Quem avança |
20
+ | --- | --- | --- |
21
+ | `Draft` | Entrevista em andamento. | `easyedit-novo`, `easyedit-interviewer` |
22
+ | `Defined` | Ato I completo e aprovado pela pessoa (`Definition Gate: Passed`). | `easyedit-interviewer` |
23
+ | `In Progress` | Ato II em execução. | `easyedit-build` |
24
+ | `Review` | Render gerado e aguardando validação do cliente (`Delivery Gate: Pending`). | `easyedit-build` |
25
+ | `Completed` | Entregue e aprovado (`Delivery Gate: Passed`). | `easyedit-build` |
26
+
27
+ Mudança pedida depois de `Defined` é uma entrada no Registro de mudanças (Ato III). Quando altera o escopo, o Ato I também é editado e o `Definition Gate` volta a `Pending`.
28
+
29
+ ## Três atos
30
+
31
+ 1. **Ato I · Especificação:** o que o vídeo deve ser.
32
+ 2. **Ato II · Implementação:** como e com o quê foi feito, tarefas e evidências.
33
+ 3. **Ato III · Registro:** mudanças (adicionado, ajustado, alterado, removido), feedbacks e entrega.
34
+
35
+ ## IDs
36
+
37
+ Nunca reutilize nem renumere. `RV-001` requisito de vídeo · `AC-001` critério de aceite · `T-001` tarefa · `CH-001` mudança · `FB-001` feedback.
38
+
39
+ Cada `RV` precisa de pelo menos um `AC` que declare `Cobre: RV-xxx`. Cada tarefa aponta os `RV` que entrega.
40
+
41
+ ## Contrato de perguntas (uma por vez)
42
+
43
+ Usado por toda skill com `Modo de interação: perguntas`. As perguntas são feitas **uma por vez**: faça a pergunta, espere a resposta, grave, reavalie e só então faça a próxima. Nunca envie uma lista de perguntas.
44
+
45
+ **Formato fixo de cada pergunta**
46
+
47
+ ```
48
+ Pergunta N · <tema curto>
49
+ <a pergunta, em uma ou duas frases, com o contexto que a pessoa precisa para decidir>
50
+
51
+ 1. <opção técnica> (sugestão)
52
+ 2. <opção técnica>
53
+ 3. <opção técnica>
54
+ 4. Gerar outras opções
55
+ 5. Avançar sem responder
56
+ ```
57
+
58
+ - **1 a 3:** respostas técnicas reais e distintas, com os efeitos relevantes (custo, risco, resultado) em poucas palavras. Marque com `(sugestão)` a que você recomenda, em regra a primeira.
59
+ - **4 · Gerar outras opções:** descarte as três e proponha três novas, diferentes das anteriores, no mesmo formato. Pode ser pedido mais de uma vez.
60
+ - **5 · Avançar sem responder:** a pessoa adia a decisão. Se houver sugestão, aplique-a e registre em `Suposições` do spec como default aceito. Se não houver default seguro (oferta, CTA, destino), registre o item como pendência na seção 8 e siga adiante; **o spec não passa para `Defined` com pendência aberta**.
61
+ - **Resposta livre:** a pessoa pode responder com um texto no lugar de um número. Trate-o como uma opção nova e confirme o entendimento em uma linha.
62
+ - **Sem pergunta aberta:** quando não houver opções técnicas plausíveis (por exemplo, o nome da oferta), faça a pergunta com opções de exemplo ou formatos de resposta, mantendo 4 e 5.
63
+
64
+ **Regras**
65
+
66
+ - Pergunte só o que muda o resultado: formato, mensagem, estilo, entrega (a duração do vídeo é livre e não é perguntada). Não repita o que já está no `CLAUDE.md` do cliente nem no `spec.md`, e não repita pergunta respondida.
67
+ - Ordene as perguntas pelo impacto: primeiro as que bloqueiam o trabalho seguinte (ordem dos takes, autorização de modelo), depois objetivo, oferta, público e CTA, depois estilo.
68
+ - Registre apenas respostas confirmadas. Nunca invente.
69
+ - Reavalie o spec depois de cada resposta; feche a entrevista quando as seções 1 a 7 estiverem preenchidas.
70
+ - Aprovações (de plano, de spec, de descarte) usam o mesmo formato: `1. Aprovar (sugestão)`, `2. Ajustar` e `3. Refazer`, mais 4 e 5.
71
+ - **Nunca peça permissão para iniciar uma etapa.** A skill começa assim que é acionada ou chamada por outra. Perguntas servem para decisões e para ações sensíveis, não para "posso começar?".
72
+
73
+ ## Handoff entre skills
74
+
75
+ Anuncie `Transição automática: $origem → $destino — motivo — resultado esperado` e carregue a skill de destino sem pedir confirmação, inclusive para iniciar a entrevista. Ações sensíveis (apagar arquivos, sobrescrever render aprovado, publicar) exigem autorização específica.
76
+
77
+ ## Regras de projeto
78
+
79
+ - Nunca edite `raw/`. Insumos novos entram em `assets/` do cliente.
80
+ - Renders finais vão para `clientes/<cliente>/output/` com o nome `<slug>-vN.mp4`. Não sobrescreva uma versão enviada ao cliente: gere `vN+1`.
81
+ - Toda mudança de arquivo de composição durante `In Progress` é registrada com `easyedit-log` (script `registrar.mjs`).
82
+ - Pergunte antes de baixar modelos grandes, instalar pacotes ou iniciar Docker.
@@ -0,0 +1,113 @@
1
+ # EasyEdit · Ferramentas de edição de vídeo
2
+
3
+ Referência das ferramentas usadas neste repositório. É o equivalente do `STACK.md` do Specsfy: as skills do EasyEdit leem este arquivo para saber **o que existe, para que serve e como invocar**.
4
+
5
+ Levantado com `npx hyperframes doctor` e `--help` de cada comando. Este arquivo é criado uma vez pelo `easyedit install` e não é sobrescrito no `update`: ajuste-o à sua máquina. Para ver o que está instalado agora, rode `easyedit doctor`.
6
+
7
+ **Sistemas:** macOS e Windows são suportados. No macOS o verificador de zonas seguras detecta rostos automaticamente (Vision); no Windows (e Linux) ele gera folhas de revisão visual e a camada declarada (`elementos.json`) continua exata.
8
+
9
+ ## 1. Motor principal: HyperFrames
10
+
11
+ | Item | Valor |
12
+ | --- | --- |
13
+ | O que é | Framework open-source (Apache-2.0) da HeyGen que transforma HTML + CSS + animações em vídeo determinístico. Inspirado no Remotion, mas com HTML puro em vez de React. |
14
+ | Versão instalada | `hyperframes@0.8.141` (devDependency do repositório; chamar com `npx hyperframes …`) |
15
+ | Fontes | https://github.com/heygen-com/hyperframes · https://hyperframes.heygen.com (Quick start, Catalog) |
16
+ | Princípio | A composição é um `index.html`. O tempo é declarado com `data-*`; a animação precisa ser *seekable* (pausada e controlada por timeline). O renderizador posiciona cada frame no Chrome headless e o FFmpeg codifica. Mesma entrada produz os mesmos frames. |
17
+ | Atributos-chave | `data-composition-id`, `data-start`, `data-duration`, `data-track-index`, `class="clip"`. Timelines GSAP registradas em `window.__timelines`. |
18
+ | Pacotes internos | `core` (parser, linter, runtime, adapters) · `engine` (captura Puppeteer + FFmpeg) · `producer` (captura, encode, mix de áudio) · `studio` · `player` · `shader-transitions` · `aws-lambda` |
19
+ | Extras | Catálogo de blocos e componentes (~400: transições, overlays, legendas, gráficos, mapas) · `frame.md` (camada de design system para vídeo) · Studio (editor no navegador e app desktop) |
20
+
21
+ ### Comandos da CLI (agrupados pelo uso no fluxo)
22
+
23
+ | Etapa | Comando | Função |
24
+ | --- | --- | --- |
25
+ | Criar | `init <nome>` | Cria o projeto. |
26
+ | Criar | `add <bloco>` · `catalog` | Instala ou busca blocos e componentes do registro. |
27
+ | Criar | `capture <url>` | Captura um site como material de vídeo. |
28
+ | Insumos | `transcribe <arquivo>` | Transcrição com timestamp por palavra. Também importa `.json`, `.srt` e `.vtt`, e exporta com `--to srt\|vtt`. |
29
+ | Insumos | `beats` | Detecta batidas da música e grava `beats/<áudio>.json`. |
30
+ | Insumos | `tts` | Gera fala local (Kokoro-82M). |
31
+ | Insumos | `remove-background` | Remove o fundo de vídeo ou imagem (saída transparente). |
32
+ | Insumos | `models install parakeet` | Baixa modelos on-device. |
33
+ | Insumos | `normalize-audio` | Iguala o loudness (LUFS) entre dois clipes. |
34
+ | Insumos | `media-treatment` | Aplica tratamentos determinísticos a um elemento de mídia. |
35
+ | Validar | `lint` | Erros comuns de composição. |
36
+ | Validar | `check` | Gate único: lint + validação de runtime + inspeção de layout. `validate`, `inspect` e `layout` são aliases antigos. |
37
+ | Validar | `snapshot` | PNGs de frames-chave. |
38
+ | Validar | `keyframes` | Diagnóstico de keyframes (onion-shot). |
39
+ | Validar | `compare` | Folha comparativa de variantes. |
40
+ | Validar | `grade-compare` | Compara color grades num frame. |
41
+ | Inspecionar | `info` · `compositions` · `timeline [--json]` | Metadados, lista de composições, trilhas e clipes. |
42
+ | Histórico | `history` | Lista, desfaz e restaura mudanças registradas. |
43
+ | Rever | `preview` | Studio com live reload. |
44
+ | Rever | `present` | Modo apresentação (decks). |
45
+ | Entregar | `render` | Veja a tabela abaixo. |
46
+ | Entregar | `publish` | Sobe para uma URL estável (privada por padrão). |
47
+ | Entregar | `cloud` · `lambda` · `cloudrun` | Render remoto: HeyGen Cloud, AWS Lambda e Google Cloud Run. |
48
+ | Ambiente | `doctor` · `browser` · `upgrade` · `skills` · `clean` · `benchmark` | Diagnóstico, gestão do Chrome, atualizações e limpeza. |
49
+
50
+ ### `render`: opções que importam
51
+
52
+ | Opção | Efeito |
53
+ | --- | --- |
54
+ | `-o`, `--output` | Caminho de saída (padrão `renders/<nome>.mp4`). **No EasyEdit, o destino é `clientes/<cliente>/output/`.** |
55
+ | `-f`, `--fps` | 24, 25, 30, 50, 60 (e racionais como `30000/1001`). Padrão: o `data-fps` da raiz, senão 30. |
56
+ | `-q`, `--quality` | `draft` · `looks` (padrão, CRF 16) · `delivery` (alta). |
57
+ | `--format` | `mp4` (padrão) · `webm` e `mov` (com transparência) · `gif` · `png-sequence` · `hls`. |
58
+ | `-w`, `--workers` | Chromes paralelos. Cada um usa cerca de 256 MB de RAM. |
59
+ | `--docker` | Render determinístico em container. |
60
+ | `--strict`, `--strict-all` | Falha em erros de lint (ou também em avisos). |
61
+ | `--variables`, `--variables-file` | Injeta variáveis na composição (ótimo para lotes por cliente). |
62
+ | `-c`, `--composition` | Renderiza uma composição específica. |
63
+ | `--video-frame-format png` | Use em gravações de tela ou de UI sensíveis a cor. |
64
+ | `--crf`, `--video-bitrate`, `--gpu`, `--hdr`/`--sdr` | Ajuste fino de codificação. |
65
+
66
+ ## 2. Skills HyperFrames instaladas (`~/.claude/skills`)
67
+
68
+ Instaladas globalmente. Atualizar com `npx hyperframes skills update`.
69
+
70
+ | Skill | Quando usar |
71
+ | --- | --- |
72
+ | `hyperframes` | **Porta de entrada obrigatória.** Roteia o pedido para o workflow certo e retoma o estado do projeto. |
73
+ | `hyperframes-core` | Contrato da composição: estrutura, `data-*`, trilhas, sub-composições, variáveis, regras de determinismo. Ler antes de escrever HTML. |
74
+ | `hyperframes-cli` | Loop de desenvolvimento e diagnóstico de falhas de build ou render. |
75
+ | `hyperframes-animation` | Regras de movimento, blueprints de cena, transições e os 7 adapters (GSAP padrão, Lottie, Three.js, Anime.js, CSS, WAAPI, TypeGPU). |
76
+ | `hyperframes-keyframes` | Punch-in, zoom, reframe, Ken Burns e câmera. |
77
+ | `hyperframes-creative` | Direção criativa: paletas, tipografia, narração, beats, `frame.md` e `design.md`. |
78
+ | `hyperframes-audio` | Mix de áudio: fade, ganho, ducking, EQ, compressor e reverb. |
79
+ | `hyperframes-registry` | Buscar e instalar blocos do catálogo **antes** de construir um efeito do zero. |
80
+ | `hyperframes-studio` | Trabalho no Studio: se o pedido exige mudança, plano e storyboard, layout da timeline e zonas seguras de legenda. |
81
+ | `media-use` | Resolve BGM, SFX, imagem, ícone, logo, voz e LUT para arquivo local com registro. Também faz TTS, transcrição, legendas e remoção de fundo. |
82
+ | `talking-head-recut` | Overlays gráficos (títulos, lower-thirds, citações, PiP) sobre talking-head, entrevista ou podcast. O vídeo-base não é alterado. |
83
+
84
+ Workflows que o roteador instala sob demanda, ainda não presentes na máquina: `/embedded-captions`, `/general-video`, `/motion-graphics`, `/faceless-explainer`, `/product-launch-video`, `/pr-to-video`, `/music-to-video`, `/slideshow`, `/remotion-to-hyperframes`.
85
+
86
+ ## 3. Ferramentas de sistema
87
+
88
+ | Ferramenta | Versão / caminho | Papel no pipeline |
89
+ | --- | --- | --- |
90
+ | Node.js | ≥ 22 | Roda a CLI e os scripts. |
91
+ | FFmpeg / FFprobe | no `PATH` (macOS: `brew install ffmpeg` · Windows: `winget install Gyan.FFmpeg` ou `choco install ffmpeg`) | Codifica o vídeo, faz mux e mix de áudio, corte, conversão e extração de frames. O FFprobe lê metadados (duração, fps, codec, resolução) dos arquivos brutos. |
92
+ | Chrome headless-shell | baixado e gerenciado por `hyperframes browser` (cache do usuário) | Renderiza cada frame da composição. Gerenciado por `hyperframes browser`. |
93
+ | whisper.cpp (`whisper-cli`) | no `PATH` (macOS: `brew install whisper-cpp` · Windows: binário do release do whisper.cpp, ou use o Parakeet) | Transcrição local. Modelos: `tiny.en`, `base.en`, `small.en` (padrão), `medium.en`, `large-v3`. Os `.en` são só inglês; **para português use `-l pt` com `large-v3`** ou o Parakeet. |
94
+ | Parakeet (opcional) | `hyperframes models install parakeet` | Alternativa de ASR, mais rápida e precisa. Com `--engine auto` ela é preferida quando instalada e cobre o idioma. |
95
+ | GSAP | embutido via adapter | Biblioteca de animação em JavaScript: movimento, easing e timelines. Fica pausada e é controlada por seek. |
96
+ | Docker | opcional; só para `--docker` | Render determinístico opcional (`--docker`). |
97
+ | Kokoro TTS | **não instalado** (opcional) | Voz local. `pip install kokoro-onnx soundfile`. |
98
+ | MusicGen | **não instalado** (opcional) | Música local. `pip install transformers torch soundfile numpy`. |
99
+ | yt-dlp | não instalado | Não faz parte do fluxo atual. |
100
+
101
+ ## 4. Convenções do repositório que o EasyEdit herda
102
+
103
+ - Clientes ficam em `clientes/<cliente>/` (kebab-case). Projetos de vídeo: `projects/AAAA-MM-<slug>/`.
104
+ - `raw/` é somente leitura. Renders finais vão para `output/`. Assets reutilizáveis ficam em `assets/`.
105
+ - Ciclo: `init` → insumos (`transcribe`, `beats` etc.) → `lint`/`check` → `snapshot`/`preview` → `render`.
106
+
107
+ ## 5. Fontes consultadas
108
+
109
+ - https://github.com/heygen-com/hyperframes (README)
110
+ - https://hyperframes.heygen.com (landing)
111
+ - Saída local de `hyperframes --help`, `render --help`, `transcribe --help` e `doctor`
112
+ - Notícias de lançamento: https://www.noqta.tn/en/blog/heygen-hyperframes-html-to-mp4-ai-agent-video-2026 · https://themenonlab.blog/blog/heygen-hyperframes-video-as-code
113
+ - whisper.cpp: https://huggingface.co/datasets/echodict/whisper.cpp/blob/main/examples/cli/README.md
@@ -0,0 +1,125 @@
1
+ # {{TITULO}}
2
+
3
+ | Campo | Valor |
4
+ | --- | --- |
5
+ | ID | VID-{{SLUG}} |
6
+ | Slug | {{SLUG}} |
7
+ | Cliente | {{CLIENTE}} |
8
+ | Vertical | {{VERTICAL}} |
9
+ | Status | Draft |
10
+ | Definition Gate | Pending |
11
+ | Delivery Gate | Pending |
12
+ | Criado em | {{DATA}} |
13
+ | Atualizado em | {{DATA}} |
14
+
15
+ ---
16
+
17
+ # Ato I · Especificação
18
+
19
+ ## 1. Objetivo
20
+
21
+ - **Mensagem central:** <!-- o que o espectador deve entender ou sentir -->
22
+ - **Ator (público):** <!-- quem assiste -->
23
+ - **Resultado esperado:** <!-- ação ou percepção desejada -->
24
+ - **Tipo de vídeo:** <!-- legenda em vídeo existente · overlays em talking-head · motion graphic · explicativo · outro -->
25
+
26
+ ## 2. Plataforma e formato
27
+
28
+ - **Plataformas:** <!-- Reels/TikTok/Shorts · YouTube · site -->
29
+ - **Resolução e proporção:** <!-- 1080x1920 (9:16) · 1920x1080 (16:9) · 1080x1080 -->
30
+ - **FPS:** <!-- 30 · 60 -->
31
+ - **Duração:** livre (sem meta ou limite); registre aqui a duração final depois do render.
32
+
33
+ ## 3. Insumos
34
+
35
+ | Insumo | Caminho | Observação |
36
+ | --- | --- | --- |
37
+ | Gravações (takes) | `../../raw/{{SLUG}}/` | Várias gravações do mesmo criativo; ordem definida por `easyedit-takes`. |
38
+ | Imagens e b-roll | `../../assets/…` | |
39
+ | Música | `../../assets/music/…` | |
40
+ | Fontes e marca | `../../assets/fonts/`, `../../assets/brand/` | |
41
+
42
+ Takes (preenchido por `easyedit-takes`):
43
+
44
+ | Ordem | Arquivo | Duração | Uso |
45
+ | --- | --- | --- | --- |
46
+
47
+ ## 4. Estrutura e roteiro
48
+
49
+ | Cena | Tempo | Conteúdo (fala/texto) | Visual |
50
+ | --- | --- | --- | --- |
51
+ | 1 | 0:00–0:03 | | |
52
+
53
+ ## 5. Estilo
54
+
55
+ - **Marca:** <!-- cores, logo, tom (ver CLAUDE.md do cliente) -->
56
+ - **Legendas:** <!-- estilo, posição, destaque de palavras, idioma -->
57
+ - **Motion:** <!-- ritmo, transições, intensidade -->
58
+ - **Áudio:** <!-- música, volume, ducking sobre a voz, SFX -->
59
+
60
+ ## 6. Requisitos de vídeo
61
+
62
+ | ID | Requisito (verificável) | Prioridade |
63
+ | --- | --- | --- |
64
+ | RV-001 | | Must |
65
+
66
+ ## 7. Critérios de aceite
67
+
68
+ | ID | Cobre | Critério (Given/When/Then ou checagem observável) |
69
+ | --- | --- | --- |
70
+ | AC-001 | RV-001 | |
71
+
72
+ ## 8. Fora de escopo e suposições
73
+
74
+ - **Fora de escopo:**
75
+ - **Suposições** (defaults reversíveis aceitos na entrevista):
76
+
77
+ ---
78
+
79
+ # Ato II · Implementação
80
+
81
+ ## 9. Plano técnico
82
+
83
+ - **Workflow HyperFrames:** <!-- /embedded-captions · /talking-head-recut · /general-video · /motion-graphics … -->
84
+ - **Skills e ferramentas:** <!-- ver .easyedit/TOOLS.md -->
85
+ - **Pasta do projeto:** `.`
86
+ - **Comando de render:** <!-- npx hyperframes render -o ../../output/{{SLUG}}-v1.mp4 -f 30 -q delivery -->
87
+
88
+ ## 10. Tarefas
89
+
90
+ | ID | Tarefa | Entrega | Status |
91
+ | --- | --- | --- | --- |
92
+ | T-001 | | RV-001 | Pending |
93
+
94
+ Status das tarefas: `Pending` · `Doing` · `Done` · `Dropped`.
95
+
96
+ ## 11. Evidências
97
+
98
+ | Etapa | Comando | Resultado | Data |
99
+ | --- | --- | --- | --- |
100
+ | lint/check | `npx hyperframes check` | | |
101
+ | snapshot | `npx hyperframes snapshot` | | |
102
+ | render | `npx hyperframes render …` | | |
103
+
104
+ ---
105
+
106
+ # Ato III · Registro
107
+
108
+ ## 12. Registro de mudanças
109
+
110
+ Tipos: `adicionado` · `ajustado` · `alterado` · `removido`. Origem: `interno` · `cliente`.
111
+
112
+ <!-- easyedit:changes -->
113
+ | ID | Data | Tipo | O que mudou | Motivo | Origem | Afeta |
114
+ | --- | --- | --- | --- | --- | --- | --- |
115
+ <!-- /easyedit:changes -->
116
+
117
+ ## 13. Feedbacks
118
+
119
+ | ID | Data | Quem | Feedback | Resolvido em |
120
+ | --- | --- | --- | --- | --- |
121
+
122
+ ## 14. Entrega
123
+
124
+ | Versão | Arquivo | Data | Enviado a | Status |
125
+ | --- | --- | --- | --- | --- |
@@ -0,0 +1,5 @@
1
+ ## EasyEdit (especificação e acompanhamento por vídeo)
2
+ Cada vídeo tem um `projects/<AAAA-MM-slug>/spec.md` (fonte única: especificado → implementado → alterado). Contrato em `.easyedit/Spec.md`, ferramentas em `.easyedit/TOOLS.md`, skills em `.claude/skills/easyedit-*`.
3
+ Gravações do vídeo: `clientes/<cliente>/raw/<AAAA-MM-slug>/` (vários arquivos; `/easyedit-takes` ordena e junta). Verticais: `trafego-meta` (`/easyedit-vertical-trafego`); `reels` pendente. Apoio: `/easyedit-ritmo`, `/easyedit-destaques`, `/easyedit-split-broll`, `/easyedit-legendas`, `/easyedit-zonas-seguras`.
4
+ Fluxo: `/easyedit-novo` → `/easyedit-interviewer` (Draft→Defined) → `/easyedit-build` (In Progress→Review→Completed). Mudanças: `/easyedit-log`. Panorama: `/easyedit-progress`.
5
+
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: easyedit-build
3
+ description: "Use quando o spec.md do vídeo está Defined (ou In Progress) e o usuário pede para montar, editar, ajustar, corrigir ou renderizar o vídeo. Planeja o Ato II, executa com as skills e a CLI do HyperFrames, valida, renderiza para output/ e mantém tarefas, evidências e registro de mudanças. Sem spec Defined, use easyedit-interviewer."
4
+ ---
5
+
6
+ # Montar e renderizar o vídeo
7
+
8
+ ## Preparação obrigatória
9
+
10
+ Antes de executar esta skill, carregue `$easyedit-setup`. Confirme que o `spec.md` está em `Defined`, `In Progress` ou `Review` (ajuste pedido pelo cliente). Se estiver em `Draft`, anuncie `Transição automática: $easyedit-build → $easyedit-interviewer` e retome depois.
11
+
12
+ ## Modo de interação
13
+
14
+ Modo de interação: `sem perguntas`. Dúvida que muda o resultado volta para `$easyedit-interviewer`. Perguntas só para ações sensíveis (instalar pacote, baixar modelo, iniciar Docker, sobrescrever render).
15
+
16
+ ## Planejar (Ato II)
17
+
18
+ 1. Escolha o workflow HyperFrames pela seção 1 do spec: legendas em vídeo existente → `/embedded-captions`; overlays em talking-head → `/talking-head-recut`; motion curto → `/motion-graphics`; demais → `/general-video`. Em caso de dúvida, comece por `/hyperframes`, que roteia. Registre a escolha na seção 9.
19
+ 2. Quebre o trabalho em tarefas `T-001…` na seção 10, cada uma apontando os `RV` que entrega.
20
+ 3. Marque `Status: In Progress`:
21
+
22
+ ```bash
23
+ node .claude/skills/easyedit-log/scripts/campo.mjs <spec.md> Status "In Progress"
24
+ ```
25
+
26
+ ## Executar
27
+
28
+ Se `Vertical` for `trafego-meta`, siga a ordem de trabalho de `$easyedit-vertical-trafego` (takes → ritmo → destaques → tela dividida e legendas → áudio → zonas seguras → render por variante). Com mais de um arquivo em `raw/<slug>/`, comece sempre por `$easyedit-takes`, depois `$easyedit-ritmo`, antes de qualquer legenda ou destaque, porque eles dependem da linha do tempo final.
29
+
30
+ Carregue as skills conforme a necessidade; os papéis estão em `.easyedit/TOOLS.md`:
31
+
32
+ | Necessidade | Skill ou comando |
33
+ | --- | --- |
34
+ | Estrutura da composição, `data-*`, trilhas | `/hyperframes-core` |
35
+ | Transcrição, legendas, TTS, BGM, SFX, logo | `/media-use`, `npx hyperframes transcribe` |
36
+ | Movimento, transições | `/hyperframes-animation`, `/hyperframes-keyframes` |
37
+ | Efeito nomeado (glitch, grain, gráfico) | `/hyperframes-registry` **antes** de construir à mão |
38
+ | Paleta, tipografia, `frame.md` | `/hyperframes-creative` |
39
+ | Mix de áudio | `/hyperframes-audio` |
40
+ | Loop de CLI e falhas | `/hyperframes-cli` |
41
+ | Várias gravações de um mesmo vídeo | `$easyedit-takes` |
42
+ | Pausas e respiros | `$easyedit-ritmo` |
43
+ | Palavras-chave e inserções | `$easyedit-destaques` |
44
+ | Tela dividida com b-roll | `$easyedit-split-broll` |
45
+ | Legendas de vertical | `$easyedit-legendas` |
46
+ | Zonas cinzentas da Meta | `$easyedit-zonas-seguras` |
47
+
48
+ Durante o trabalho:
49
+ - Leia a marca em `clientes/<cliente>/CLAUDE.md` e aplique-a. Faça referência a `assets/` por caminho relativo.
50
+ - Marque cada tarefa `Doing` → `Done` na seção 10 ao concluir.
51
+ - Cada mudança de escopo ou de execução (adicionar cena, trocar música, remover trecho, ajustar timing) gera um registro com `$easyedit-log`.
52
+
53
+ ## Validar e renderizar
54
+
55
+ 1. `npx hyperframes check` (lint, runtime e layout). Corrija até passar.
56
+ 2. Em vídeo 9:16 de vertical (tráfego/Reels), rode as três verificações de `$easyedit-zonas-seguras` (inclui `verificar_zonas.mjs` num render `-q draft`) e corrija até **0 erros**. Sem detecção automática (Windows/Linux), o gate inclui a **revisão visual das folhas** que o verificador gera, com o resultado registrado em Evidências.
57
+ 3. `npx hyperframes snapshot` e confira os frames-chave contra os `AC`. Veja os PNGs antes de declarar pronto.
58
+ 4. Renderize para a saída do cliente, sem sobrescrever versões anteriores:
59
+
60
+ ```bash
61
+ npx hyperframes render -o ../../output/<slug>-vN.mp4 -f <fps> -q delivery
62
+ ```
63
+
64
+ 5. Confira o arquivo com `ffprobe` (resolução e fps) contra a seção 2 e registre a duração final; a duração não tem limite nem meta.
65
+ 6. Rode `verificar_zonas.mjs` também sobre o render final (`delivery`) quando for vertical, e confirme 0 erros (e a revisão visual das folhas, em Windows/Linux).
66
+ 7. Registre as evidências na seção 11 (comando, resultado, data) e a versão na seção 14.
67
+ 8. Marque `Status: Review` e `Delivery Gate: Pending`. Informe o caminho do render e quais `AC` foram verificados, e quais não puderam ser.
68
+
69
+ ## Feedback e fechamento
70
+
71
+ - Feedback do cliente: registre em 13 (`FB-xxx`), crie as mudanças correspondentes com `$easyedit-log` e gere `vN+1`. Volte `Status` para `In Progress` e depois para `Review`.
72
+ - Aprovação do cliente: `Delivery Gate: Passed`, `Status: Completed`. Acrescente o aprendizado reutilizável ao `CLAUDE.md` do cliente (regras, preferências, histórico).
73
+
74
+ ## Limites
75
+
76
+ - Nunca edite `raw/`. Nunca apague um render já enviado.
77
+ - Não declare `Completed` sem aprovação do cliente informada pelo usuário.
78
+ - Não diga que um `AC` passou sem ter visto a evidência.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: easyedit-destaques
3
+ description: "Use para analisar a transcrição e o tema do vídeo e decidir em quais palavras ou frases marcantes inserir um reforço visual: imagem, vídeo curto em tela cheia, legenda especial, ícone, zoom ou SFX. Produz um plano de destaques para aprovação antes de montar. Não monta a composição; execução fica com easyedit-build."
4
+ ---
5
+
6
+ # Planejar destaques sobre a fala
7
+
8
+ ## Preparação obrigatória
9
+
10
+ Antes de executar esta skill, carregue `$easyedit-setup`. Use a transcrição já remapeada pelo `$easyedit-ritmo` (`transcript.cut.json`) quando houver corte; senão `transcript.json`.
11
+
12
+ ## Modo de interação
13
+
14
+ Modo de interação: `perguntas`, uma única pergunta de aprovação do plano, no formato do `Contrato de perguntas (uma por vez)` de `.easyedit/Spec.md`: 1. Aprovar (sugestão), 2. Ajustar itens, 3. Refazer o plano, 4. Gerar outras abordagens, 5. Avançar sem aprovar (aplica o plano como rascunho).
15
+
16
+ ## Passos
17
+
18
+ 1. Leia a transcrição inteira, o tema (seção 1 do spec), a marca do cliente e o inventário de `assets/broll/`, `assets/images/`.
19
+ 2. Identifique as **palavras-âncora**: aquelas que carregam o argumento ou o gancho. Procure:
20
+ - números, preços, prazos e porcentagens;
21
+ - benefício principal, dor, objeção e prova ("garantia", "sem mensalidade", "aprovados");
22
+ - nome do produto, do cliente ou do lugar;
23
+ - verbos de ação e CTA ("matricule", "clique", "garanta");
24
+ - palavras de contraste ou virada ("mas", "só que", "na verdade").
25
+ 3. Para cada âncora escolha **uma** ação e justifique em poucas palavras:
26
+
27
+ | Ação | Quando |
28
+ | --- | --- |
29
+ | Imagem (pop-in) | Substantivo concreto: lugar, objeto, pessoa. |
30
+ | Vídeo curto em tela cheia (0,8–2 s) | Cena ou prova que ilustra a frase inteira. |
31
+ | Legenda especial | Número, preço, palavra de impacto: maior, cor da marca, animação própria. |
32
+ | Ícone | Conceito abstrato ou lista (check, cifrão, relógio, escudo). |
33
+ | Zoom / punch-in | Ênfase na fala sem ilustração disponível (`/hyperframes-keyframes`). |
34
+ | SFX | Acompanha a ação de maior impacto, nunca todas. |
35
+
36
+ 4. Respeite o **teto de densidade** da vertical (tráfego: um destaque a cada 2–4 s; Reels: a cada 3–5 s) e evite ações iguais seguidas. A primeira ação deve cair nos primeiros 3 s (gancho).
37
+ 5. Procure o material em `assets/` primeiro; se faltar, liste o que precisa ser pedido ao cliente ou gerado com `/media-use`. Não use logo ou imagem de terceiros sem origem.
38
+ 6. Apresente o plano em tabela, com tempos da linha do tempo final:
39
+
40
+ | # | Tempo | Palavra/frase | Ação | Material | Motivo |
41
+ | --- | --- | --- | --- | --- | --- |
42
+
43
+ Grave o plano no spec (seção 4, coluna Visual, e tarefas na seção 10) e em `destaques.json` na pasta do projeto. Peça aprovação ou ajustes; cada ajuste vira entrada do `$easyedit-log`.
44
+
45
+ ## Limites
46
+
47
+ - Todo elemento visual (imagem, ícone, legenda especial, rosto em vídeo curto) obedece às zonas de `$easyedit-zonas-seguras` e entra em `elementos.json`.
48
+ - Não invente afirmações: o destaque reforça o que foi dito, nunca acrescenta promessa.
49
+ - Imagem ou vídeo ainda inexistente não entra no plano como "pronto".
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: easyedit-interviewer
3
+ description: "Use quando um vídeo precisa de entrevista para definir como deve ser: objetivo, público, formato, insumos, roteiro, estilo, requisitos e critérios de aceite; ou quando o cliente pedir uma mudança no escopo depois da definição. Preenche o Ato I do spec.md com respostas confirmadas e promove Draft para Defined. Não executa edição de vídeo nem renderiza; para isso use easyedit-build."
4
+ ---
5
+
6
+ # Entrevistar para especificar o vídeo
7
+
8
+ ## Preparação obrigatória
9
+
10
+ Antes de executar esta skill, carregue `$easyedit-setup`. Não prossiga se o vídeo não tiver `spec.md`; nesse caso use `$easyedit-novo`.
11
+
12
+ ## Modo de interação
13
+
14
+ Modo de interação: `perguntas`. Aplique o `Contrato de perguntas (uma por vez)` de `.easyedit/Spec.md`: uma pergunta por vez, em múltipla escolha de 1 a 5 (1–3 opções técnicas, 4 gerar outras opções, 5 avançar sem responder).
15
+
16
+ **Inicie a entrevista imediatamente** ao ser acionada, sem perguntar se pode começar.
17
+
18
+ ## Conduzir a entrevista
19
+
20
+ 1. Leia o spec e o `CLAUDE.md` do cliente. Tudo que já estiver respondido ali deve ser reaproveitado, nunca perguntado de novo.
21
+ 2. Se o campo `Vertical` for `trafego-meta`, anuncie `Transição automática: $easyedit-interviewer → $easyedit-vertical-trafego` para aplicar as perguntas e os padrões da vertical, e retome aqui. Se houver gravações em `raw/<slug>/` e ainda não existir `takes.json`, carregue `$easyedit-takes` para inventariar e entender a sequência, e use isso na seção 4.
22
+ 3. Siga as seções do Ato I, escolhendo a **única** lacuna que mais muda o resultado e fazendo uma pergunta por vez. Temas por seção:
23
+
24
+ | Seção | Perguntas típicas |
25
+ | --- | --- |
26
+ | 1 Objetivo | Qual a mensagem? Quem assiste? O que a pessoa deve fazer depois? É legenda em vídeo existente, overlays, motion ou vídeo novo? |
27
+ | 2 Formato | Plataforma, proporção e fps. Não pergunte meta de duração: ela é livre; só registre a duração final. |
28
+ | 3 Insumos | Qual vídeo bruto em `raw/`? Há b-roll, música, logo e fontes em `assets/`? O que falta pedir ao cliente? |
29
+ | 4 Roteiro | Cenas e tempos; o que é fala e o que é texto na tela. |
30
+ | 5 Estilo | Legenda (estilo, posição, destaque), ritmo do motion, música e volume. |
31
+ | 6–7 | Derive `RV` verificáveis e `AC` a partir das respostas; confirme com a pessoa. |
32
+
33
+ 4. Depois de cada resposta, grave **só o que foi confirmado** na seção correspondente. Registre defaults aceitos em `Suposições`.
34
+ 5. Verifique ferramentas: se algo pedido exigir uma capacidade ausente (por exemplo voz TTS, música gerada ou Docker), diga isso consultando `.easyedit/TOOLS.md` e ofereça alternativa.
35
+ 6. Quando as seções 1 a 8 estiverem preenchidas, sem placeholders, e cada `RV` tiver pelo menos um `AC`, mostre um resumo e peça a aprovação explícita.
36
+ 7. Com a aprovação:
37
+
38
+ ```bash
39
+ node .claude/skills/easyedit-log/scripts/campo.mjs <spec.md> "Definition Gate" Passed
40
+ node .claude/skills/easyedit-log/scripts/campo.mjs <spec.md> Status Defined
41
+ ```
42
+
43
+ Anuncie `Transição automática: $easyedit-interviewer → $easyedit-build — motivo: spec Defined — resultado esperado: Ato II planejado e executado`.
44
+
45
+ ## Mudança de escopo depois de `Defined`
46
+
47
+ Edite o Ato I, volte `Definition Gate` para `Pending`, registre a mudança com `$easyedit-log` (origem `cliente` ou `interno`) e repita o fechamento. Mudança que só afeta a execução (ajuste fino de timing, por exemplo) não reabre o gate: use apenas `$easyedit-log`.
48
+
49
+ ## Limites
50
+
51
+ - Não invente respostas, métricas de marca ou textos do cliente.
52
+ - Não edite o Ato II nem render aqui.
53
+ - Não pergunte duas vezes a mesma coisa e não envie mais de uma pergunta por mensagem.
54
+ - Não peça permissão para começar nem para chamar outra skill.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: easyedit-legendas
3
+ description: "Use para criar legendas palavra a palavra com destaque em vídeo vertical para Reels ou anúncio da Meta, com estilo definido pela vertical e posição dentro da área útil. Parte da transcrição com timestamps. Para legenda simples sem estilo de vertical, o workflow /embedded-captions do HyperFrames também serve; para ícones/imagens sobre palavras use easyedit-destaques."
4
+ ---
5
+
6
+ # Legendas para vertical
7
+
8
+ ## Preparação obrigatória
9
+
10
+ Antes de executar esta skill, carregue `$easyedit-setup` e `$easyedit-zonas-seguras`.
11
+
12
+ ## Modo de interação
13
+
14
+ Modo de interação: `sem perguntas`. O estilo vem da seção 5 do spec e do `CLAUDE.md` do cliente.
15
+
16
+ ## Passos
17
+
18
+ 1. Use `transcript.cut.json` (após `$easyedit-ritmo`) ou `transcript.json`. Corrija erros de transcrição óbvios (nomes próprios, marca) com a pessoa, nunca por suposição.
19
+ 2. Agrupe em blocos de 2–4 palavras, quebrando em pausas e fim de frase. Idioma e acentuação como na fala.
20
+ 3. Posicione o bloco na **área útil**, no terço inferior dela (y ≈ 900–1200 px), centralizado, com largura máxima menor que a área útil em x. Nada pode entrar no rodapé de 35%.
21
+ 4. Estilo base: fonte da marca em `assets/fonts/` (ex.: Poppins 700), caixa alta opcional, contorno ou fundo com contraste de pelo menos 4,5:1, palavra atual em cor de destaque da marca.
22
+ 5. A **legenda especial** das âncoras de `$easyedit-destaques` (números, preço, palavra de impacto) usa tamanho maior, cor própria e entrada animada; é exceção, não regra.
23
+ 6. Valide com `$easyedit-zonas-seguras` (registre a faixa da legenda em `elementos.json`) e `npx hyperframes check`; registre com `$easyedit-log`.
24
+
25
+ ## Limites
26
+
27
+ - Legenda nunca cobre rosto, produto ou o CTA.
28
+ - Não use mais de duas linhas por bloco.