---
name: reel-style-clone
description: >-
  Clona o ESTILO e a EDIÇÃO de um vídeo de referência para gerar um novo vídeo no
  Seedance que reproduz não só o look, mas o ritmo de corte, o movimento de câmera e
  a lógica de montagem. Use SEMPRE que o usuário enviar um vídeo de referência e quiser
  "o mesmo estilo", "a mesma pegada de edição", "o mesmo ritmo", "reproduzir o jeito
  que esse vídeo é cortado/montado", ou quando ele falar em transformar um roteiro em
  prompts de Seedance respeitando a estética de uma referência. Dispare mesmo que ele
  não diga "skill" — basta haver um vídeo de referência + intenção de reproduzir estilo/edição.
---

# Reel Style Clone

Pipeline agêntico que **analisa um vídeo de referência em duas camadas** e usa essa
análise pra gerar + montar um vídeo novo (Seedance) que reproduz o estilo E a edição.

## A ideia central: estilo = duas camadas, dois destinos

| Camada | O que é | Como se captura | Pra onde vai |
|---|---|---|---|
| **A — gramática editorial** | ritmo de corte, ASL, posição dos cortes, transições | **medição** (PySceneDetect) → número + timecode | vira a **timeline de montagem** (EDL) |
| **B — gramática semântica** | movimento de câmera, narrativa, mood, look | **descrição** (Gemini, vídeo nativo) → JSON | vira **prompt do Seedance** |

> Ponto-chave: o Seedance gera *planos*; a *edição* (camada A) é uma camada à parte.
> A camada B alimenta a GERAÇÃO de cada clipe; a camada A alimenta a MONTAGEM final.

## Arquitetura (dois trilhos que se juntam)

```
                 ┌─────────────── TRILHO DE ANÁLISE (roda 1x no vídeo de referência)
 vídeo ref ─────►│
                 │  analyze_rhythm.py  → rhythm.json + rhythm.edl   (camada A, objetiva)
                 │  extract_style.py   → style_guide.json           (camada B, interpretativa)
                 └───────────────────────────────────────────────────────────┐
                                                                              │
 roteiro ───────► TRILHO DE GERAÇÃO                                           │
                 │  1. injeta style_guide.json no contexto                    │
                 │  2. roteiro → prompts Seedance (1 por shot)                │
                 │  3. [GATE] gera stills → AskUserQuestion → usuário aprova  │
                 │  4. Seedance anima os stills aprovados → clipes            │
                 └───────────────────────────────────────────────────────────┤
                                                                              ▼
                  JUNÇÃO:  assemble_timeline.py  (clipes + rhythm.json → DaVinci Resolve)
                           monta a timeline no RITMO do vídeo de referência
```

## Quando usar / o que o usuário pede

- "faz no mesmo estilo desse vídeo" + anexa um vídeo
- "quero o mesmo ritmo de corte / a mesma montagem"
- "transforma esse roteiro em prompts de Seedance com a estética dessa referência"
- "analisa esse vídeo e reproduz o jeito que ele é editado"

## Passo a passo (o que Claude Code deve fazer)

### Fase 0 — Receber a referência e o roteiro
Confirme dois inputs: (a) o **vídeo de referência**, (b) o **roteiro** (timecodes/shots/arte).
Se faltar o roteiro, ele pode ser gerado depois; a análise do vídeo roda mesmo assim.

O **dashboard** (`approval_ui.py`, aba **Referência**) é o ponto de entrada: o usuário pode
**colar um link** (YouTube/Instagram/TikTok/X/qualquer site — baixa via `yt_dlp`) ou **fazer upload**
de um arquivo. O vídeo vai pra `<root>/input/ref.*`. O botão **"Rodar análise"** dispara a Fase 1.
Alternativa por CLI: salve o vídeo e rode os scripts manualmente (abaixo).

### Fase 1 — Trilho de análise (rode os dois scripts)
```bash
# Camada A — ritmo objetivo
python scripts/analyze_rhythm.py --input <root>/input/ref.mp4 --out <root>/saida

# Camada B — estilo interpretativo (precisa de GEMINI_API_KEY)
python scripts/extract_style.py --input <root>/input/ref.mp4 --out <root>/saida
```
Resultado: `saida/rhythm.json`, `saida/rhythm.edl`, `saida/style_guide.json`.
**Mostre ao usuário** o resumo (ou ele vê na aba **Ritmo** do dashboard): ASL, classe de ritmo,
movimento dominante, cápsula Seedance.

### Fase 2 — Roteiro → prompts de Seedance
Para CADA shot do roteiro, monte um prompt como um **brief de filmagem** seguindo a Director Formula:
`Subject + Action + Scene + Camera + Lighting/Style + Audio + Constraints`
(Veja `references/seedance_director_formula.md` — inclui Mode Gate, Camera Contract e timing de 3 beats.)
- **Escolha o modo antes de escrever** (T2V / I2V / V2V / R2V / FLF2V) — cada um tem prioridade própria.
- Injete `style_guide.json` como contexto fixo: use `look` + `mood` + `movement.dominant_camera_movement`
  no Camera Contract de todos os prompts, e cole a `seedance_style_capsule` no slot Lighting/Style.
- **Preencha o slot Audio** (Seedance 2.0 = áudio nativo): cama ambiente, SFX ou silêncio.
- Use os timecodes do roteiro como cortes internos (ex.: `[0-3s]`) com a estrutura de 3 beats.
- **Anti-slop pass obrigatório** antes de enviar: rode `references/anti-slop-lexicon.md` e troque
  boosters vazios (`cinematic`, `8K`, `epic`, `masterpiece`) por detalhe observável.
- Referências do Seedance: `@Image1` = primeiro frame; `@Video1` = referência de câmera/movimento.
  (Veja também `references/seedance_prompt_structure.md`.)

### Fase 3 — GATE de aprovação (dashboard web)
Gere os stills (Flux/Nano Banana via fal MCP) salvando em `<root>/stills/`. O gate é **visual, na web**:
```bash
python scripts/approval_ui.py --root <root>   # abre http://localhost:8765
```
O dashboard mostra o **Ritmo** (rhythm.json + style_guide.json), a galeria de **Stills**
(Aprovar / Rejeitar / Regerar + nota) e os **Clipes** finais (após a Fase 4). As decisões são
gravadas em `<root>/approvals.json`. **Pare e avise o usuário pra aprovar na tela**; depois leia
o `approvals.json` e siga só com os `status: "approved"`. Regere os marcados como `"regenerate"`.

**Contrato do `approvals.json`:**
```json
{ "stills": { "stills/001_hero.png": {"status":"approved|rejected|regenerate|pending","note":""} },
  "clips":  { "clipes_seedance/001_hero.mp4": {"status":"approved|rejected","note":""} } }
```
> Este dashboard substitui o `AskUserQuestion` (que só faz menu de texto no terminal, sem preview).
> Mantenha o servidor rodando durante as Fases 3–5 pra revisar stills e clipes na mesma tela.

### Fase 4 — Geração no Seedance
Para cada still aprovado, dispare `bytedance/seedance-2.0/image-to-video` (ou `reference-to-video`)
via fal MCP, passando o still como primeiro frame. Salve os clipes numerados `001_*.mp4`, `002_*.mp4`…
(a ordem alfabética = ordem dos planos).
- **Regra I2V (siga `references/i2v-guide.md`)**: descreva SÓ o que a imagem não mostra — movimento,
  câmera, timing, luz, áudio e constraints de preservação. Re-descrever o still causa drift.
- Escolha **Hold mode** (a imagem é o momento: 3-4 micro-ações + locks) ou **React mode**
  (algo acontece: expanda uma emoção em sub-beats, ≥2s pra "aterrissar").
- Locks de preservação pra âncoras frágeis: `preserve face identity`, `preserve logo and label`,
  `preserve product geometry` — trave só o que precisa ficar estável.

### Fase 5 — JUNÇÃO: montar no ritmo extraído
```bash
python scripts/assemble_timeline.py --rhythm ./saida/rhythm.json --clips ./clipes_seedance \
    --timeline "Reel_Relancamento"
```
Isso cria uma timeline no DaVinci Resolve onde cada plano tem a duração do plano
correspondente do vídeo de referência — a cadência do original com seu material novo.
Alternativa sem API: importe `saida/rhythm.edl` direto no DaVinci (File > Import > Timeline).

## Fluxo B — Roteiro puro (sem vídeo de referência)

Quando o usuário escolhe **só roteiro** (aba **Roteiro** do dashboard → grava `<root>/brief.json`,
`mode: "script-only"`), **não há Fase 0/1 de análise de referência**. A AI cria o estilo e o ritmo.

**O dashboard faz isso sozinho** (não precisa do Claude): o botão **🎬 Gerar agora** chama
`POST /api/generate` — o backend usa o **Gemini** (GEMINI_API_KEY) pra montar a shot list e o
**fal REST** (FAL_KEY) pra gerar. Modo `i2v`: gera stills (Flux) → você aprova na aba Stills →
botão **✨ Animar aprovados** (`POST /api/animate`) anima via Seedance I2V. Modo `t2v`: gera os
clipes direto (text-to-video), sem gate de stills.
> Pra geração autônoma, suba o servidor com as chaves no ambiente:
> `FAL_KEY=... GEMINI_API_KEY=... python scripts/approval_ui.py --root <root>`
> (sem `FAL_KEY` no env, o backend tenta lê-la de `~/.claude.json`). Modelos: `fal-ai/flux/schnell`
> (stills), `bytedance/seedance-2.0/fast/{image,text}-to-video` (vídeo).

O passo a passo abaixo descreve a mesma lógica caso o Claude faça manualmente (ou pra ajustar):

`brief.json`: `{ roteiro, style, rhythm: auto|frenetic|dynamic|measured|slow, aspect, genmode: i2v|t2v }`

O que o Claude faz ao ler o brief:
1. **Shot list** — quebre o roteiro em planos (use os timecodes do texto; se não houver, defina-os).
2. **Ritmo** — em vez de PySceneDetect, **derive a cadência**: se `rhythm != auto`, use o ASL-alvo do
   preset (frenetic ~0.8s, dynamic ~1.8s, measured ~3.5s, slow ~6s); se `auto`, escolha pela pegada do
   roteiro. Gere um `saida/rhythm.json` sintético (mesmo schema) pra Fase 5 montar igual.
3. **Estilo** — monte um `saida/style_guide.json` a partir do campo `style` (look/mood/movimento). Sem Gemini.
4. **Prompts** — Fase 2 normal (Director Formula + anti-slop), injetando o style_guide sintético.
5. **Geração** — se `genmode: i2v`, gere stills → gate na aba Stills → anime (I2V). Se `t2v`, gere direto
   text-to-video por shot (`bytedance/seedance-2.0/text-to-video`), pulando o gate de stills.
6. **Junção** — Fase 5 igual, usando o `rhythm.json` sintético (ou os timecodes do roteiro).

> Resumo: Fluxo A (referência) **mede** ritmo+estilo de um vídeo; Fluxo B (roteiro) **inventa** ritmo+estilo
> a partir do texto+presets. Da Fase 2 em diante os dois fluxos convergem.

## Dois caminhos pro "estilo de movimento"

1. **Descrever** (recomendado p/ consistência entre vários shots): Gemini → `style_guide.json`
   → injeta no prompt. Mais controlável e reutilizável.
2. **Passar o vídeo direto** pro Seedance como `@Video1` ("aplique o movimento de @Video1"):
   mais fiel ao movimento original, menos controlável. Bom pra copiar UM movimento específico.

Pode combinar: descrição como base + `@Video1` nos shots que precisam copiar um movimento.

## Arquivos desta skill

- `scripts/analyze_rhythm.py` — camada A (PySceneDetect → rhythm.json + EDL)
- `scripts/extract_style.py` — camada B (Gemini → style_guide.json)
- `scripts/assemble_timeline.py` — junção (clipes + ritmo → timeline no Resolve)
- `references/seedance_prompt_structure.md` — estrutura oficial de prompt do Seedance + @-reference
- `references/gemini_style_extraction_prompt.md` — o prompt de extração (editável)
- `README.md` — instalação, variáveis de ambiente, quickstart

## Caveats
- Verifique a string do modelo Gemini (`--model`) — nomes mudam; o Pro descreve melhor.
- O `assemble_timeline.py` exige Resolve aberto + External scripting = Local (Studio p/ headless).
- Clipes mais curtos que o slot são usados inteiros (o slot encolhe) — gere com folga de duração.
- A camada A só mede cortes/duração; transições complexas (dissolves longos) podem precisar de ajuste manual.
