Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 39 additions & 17 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ Este projeto opera sob **Modo Akita** (regras universais do Dudu, ver `~/.claude

---

## Visão V0
## Visão V0 (reframe 2026-04-30)

Editor que aceita material de vídeo + uma de três entradas (decupagem doc estruturada, briefing casual, ou XML pronto) e devolve sequência montada no Adobe Premiere Pro 2026. Suporte a 1 câmera e multicam.
**AUTOEDIT é ferramenta pessoal do Dudu, não produto pra vender.** Objetivo: Claude controla Premiere Pro 2026 ao vivo via MCP, igual controla Blender (3D) ou After (motion).

**Dudu interage via chat com Claude Code (Max20).** Claude usa Adobe_Premiere_Pro_MCP (97 tools sobre Premiere) + helpers Python locais (transcrição, parsing, sync).
Editor aceita material de vídeo + decupagem doc estruturada e devolve sequência montada no Premiere Pro 2026 aberto.

**V0 mínimo:** Modo 1 (decupagem doc) + Modo 3 (XML direto, trivial). 1 câmera.
**V0.5:** Modo 2 (briefing casual).
**V1:** Multicam.

**Dudu interage via chat com Claude Code (Max20).** Claude usa Adobe_Premiere_Pro_MCP (~97 tools sobre Premiere) + helpers Python locais (transcrição, parsing, sync).

**Métrica única de sucesso:** Dudu monta vídeo 10-30min em <50% do tempo sem AUTOEDIT. Sem isso, projeto não está pronto — não importa quantas specs aprovadas.

---

Expand Down Expand Up @@ -75,19 +83,19 @@ Editor que aceita material de vídeo + uma de três entradas (decupagem doc estr

---

## Modos de input (V0)
## Modos de input

### Modo 1 — Decupagem doc estruturada
### Modo 1 — Decupagem doc estruturada (V0)
Dudu manda PDF/DOCX/MD com decisões editoriais. Sistema parseia + monta.

### Modo 2 — Briefing casual
Dudu fala em texto livre ("monta corte de 90s focando momentos sobre X"). Sistema transcreve material, mapeia briefing↔segmentos, propõe cortes.

### Modo 3 — XML direto
### Modo 3 — XML direto (V0, trivial)
Dudu já tem xmeml pronto. Sistema só ingere e aplica via MCP.

### Multicam (transversal aos 3 modos)
audalign sincroniza câmeras → LLM decide switching → sequência multicam.
### Modo 2 — Briefing casual (V0.5, adiado)
Dudu fala em texto livre ("monta corte de 90s focando momentos sobre X"). Sistema transcreve material, mapeia briefing↔segmentos, propõe cortes. Adiado até V0 estar confiável.

### Multicam (V1, adiado)
audalign sincroniza câmeras → LLM decide switching → sequência multicam. Problema de pesquisa, alta complexidade. Adiado até dor real.

---

Expand Down Expand Up @@ -191,13 +199,14 @@ AUTOEDIT/

---

## Riscos ativos (V0)
## Riscos ativos (V0 reframe)

1. **Multicam V0 = 70% chance virar V1** — complexidade alta, problema de pesquisa
2. **3 modos paralelos = QA explode** — alta probabilidade um modo virar V1
3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe, mitigação via OTIO fallback
1. ~~Multicam V0 = 70% chance virar V1~~ → resolvido: saiu de V0 pra V1
2. ~~3 modos paralelos = QA explode~~ → resolvido: V0 = Modo 1 + Modo 3 trivial
3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe, mitigação via OTIO fallback (FCPXML offline igual buttercut)
4. **qwen3:14b limite** em transcrições longas (30min+) — chunking + Haiku fallback
5. **Estimativa V0**: 6-8 semanas otimista, 10-12 realista
5. **MCP pode falhar mid-edit** — sempre salvar estado intermediário em FCPXML antes de aplicar
6. **Estimativa V0 reframe**: 1-2 semanas pra F2+F3 (F0+F1 já prontos)

---

Expand All @@ -209,9 +218,22 @@ ADRs ficam em `specs/arquitetura/ADR-NNN-titulo.md`. Cada uma documenta:
- Decisão + justificativa
- Consequências

ADR-001: MCP-first vs CLI próprio → MCP-first (97 tools prontas)
ADR-001: MCP-first vs CLI próprio → MCP-first (~97 tools prontas)
ADR-002: LLM local + Haiku Max20 → ver `feedback_llm_strategy.md` em memory
ADR-003: xmeml (FCP7 XML) via OTIO como fallback → Premiere não importa FCPXML moderno direto
ADR-004: Buttercut como referência, não fork → buttercut faz FCPXML offline; AUTOEDIT precisa controle MCP ao vivo. Estudar arquitetura, implementar próprio.
ADR-005: ExtendScript V0 + UXP V1 → Adobe oficializou EOL ExtendScript Setembro 2026 (Nov/2025). hetpatel-11 MCP usa ExtendScript. V0 entrega valor antes da deadline (5 meses). V1 migra pra UXP (já em Premiere 25.6+) ou forka MCP UXP-based.

---

## Prior art / referências

| Projeto | URL | Status | Por quê |
|---------|-----|--------|---------|
| buttercut | github.com/barefootford/buttercut | Referência | Claude Code + WhisperX → FCPXML offline. Falta controle MCP ao vivo. |
| claude-code-video-toolkit | github.com/digitalsamba/claude-code-video-toolkit | Descartado | Gera vídeo do zero (Remotion/AI), não edita footage real. |
| Monet | mindstudio.ai | Descartado V0 | NLE novo agente-first; migrar workflow é caro, Premiere já é tooling do Dudu. |
| Adobe Media Intelligence | nativo Premiere 26 | Descartado V0 | Avaliado 2026-04-30: hetpatel-11 MCP só wrappa ExtendScript. AI features (MI, Object Mask, Generative Extend, Speech-to-Text) não expostos. Parser próprio segue necessário. |

---

Expand Down
99 changes: 99 additions & 0 deletions scripts/spec-007-harness.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/usr/bin/env bash
# Harness pra SPEC-007 (Modo 1 end-to-end).
# Valida pré-condições + smoke tests. SKIPs viram PASS quando implementação chegar.

set -euo pipefail

REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"

PASS=0
FAIL=0
SKIP=0

ok() { echo " ✓ $1"; PASS=$((PASS+1)); }
fail() { echo " ✗ $1"; FAIL=$((FAIL+1)); }
skip() { echo " ⊙ SKIP: $1"; SKIP=$((SKIP+1)); }

echo "=== SPEC-007 harness — Modo 1 end-to-end ==="
echo

echo "[1/5] Spec + fixture existem"
SPEC_FILE="specs/modos/SPEC-007-modo1-decupagem-end-to-end.md"
FIXTURE_FILE="tests/fixtures/decupagens/exemplo-modo1.md"
if [ -f "$SPEC_FILE" ]; then ok "spec existe: $SPEC_FILE"; else fail "spec faltando: $SPEC_FILE"; fi
if [ -f "$FIXTURE_FILE" ]; then ok "fixture existe: $FIXTURE_FILE"; else fail "fixture faltando: $FIXTURE_FILE"; fi

echo
echo "[2/5] Helpers de dependência (SPEC-003, SPEC-006)"
for f in helpers/parse_decupagem.py helpers/xml_export.py helpers/schemas.py; do
if [ -f "$f" ]; then ok "dep existe: $f"; else fail "dep faltando: $f"; fi
done

echo
echo "[3/5] Implementação Modo 1 (skipa até existir)"
if [ -f "helpers/modo1.py" ]; then
ok "helpers/modo1.py existe"
if command -v uv >/dev/null 2>&1; then
if uv run python -c "from helpers import modo1" 2>/dev/null; then
ok "helpers.modo1 importável"
else
fail "helpers.modo1 não importa (erro de sintaxe ou deps)"
fi
else
skip "uv não disponível pra testar import"
fi
else
skip "helpers/modo1.py ainda não implementado (esperado durante F2)"
fi

echo
echo "[4/5] Smoke test parse_decupagem em fixture"
if command -v uv >/dev/null 2>&1 && [ -f "$FIXTURE_FILE" ]; then
set +e
PARSE_OUTPUT=$(uv run python helpers/parse_decupagem.py "$FIXTURE_FILE" 2>&1)
PARSE_EXIT=$?
set -e
if [ $PARSE_EXIT -eq 0 ]; then
if echo "$PARSE_OUTPUT" | grep -q '"cuts"'; then
ok "parse_decupagem produz JSON com 'cuts' pra fixture"
else
fail "parse_decupagem rodou mas output não tem campo 'cuts'"
fi
else
skip "parse_decupagem retornou erro (esperado se LLM local indisponível em CI)"
fi
else
skip "uv ou fixture não disponível"
fi

echo
echo "[5/5] Smoke test FCPXML fallback (skipa até modo1.py existir)"
if [ -f "helpers/modo1.py" ] && command -v uv >/dev/null 2>&1; then
set +e
AUTOEDIT_MCP=off uv run python helpers/modo1.py "$FIXTURE_FILE" 2>&1 | tail -5
M1_EXIT=$?
set -e
if [ $M1_EXIT -eq 0 ]; then
XML_COUNT=$(find outputs -maxdepth 1 -name "modo1_*.xml" -newer "$SPEC_FILE" 2>/dev/null | wc -l | tr -d ' ')
if [ "$XML_COUNT" -ge 1 ]; then
ok "modo1 fallback gerou FCPXML em outputs/"
else
fail "modo1 rodou mas nenhum modo1_*.xml em outputs/"
fi
else
fail "modo1 fallback retornou erro $M1_EXIT"
fi
else
skip "modo1.py não implementado — smoke test FCPXML adiado"
fi

echo
echo "================================="
echo " PASS: $PASS FAIL: $FAIL SKIP: $SKIP"
echo "================================="
if [ $FAIL -gt 0 ]; then
echo "✗ SPEC-007 harness FAILED"
exit 1
fi
echo "✓ SPEC-007 harness OK (SKIPs viram PASS quando F2 implementar modo1.py)"
78 changes: 78 additions & 0 deletions scripts/spec-009-harness.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/usr/bin/env bash
# Harness pra SPEC-009 (Modo 3 XML direto).
# Valida pré-condições + smoke tests. SKIPs viram PASS quando implementação chegar.

set -euo pipefail

REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"

PASS=0
FAIL=0
SKIP=0

ok() { echo " ✓ $1"; PASS=$((PASS+1)); }
fail() { echo " ✗ $1"; FAIL=$((FAIL+1)); }
skip() { echo " ⊙ SKIP: $1"; SKIP=$((SKIP+1)); }

echo "=== SPEC-009 harness — Modo 3 XML direto ==="
echo

echo "[1/4] Spec + fixture existem"
SPEC_FILE="specs/modos/SPEC-009-modo3-xml-direto.md"
FIXTURE_FILE="tests/fixtures/decupagens/exemplo-modo3.xml"
if [ -f "$SPEC_FILE" ]; then ok "spec existe: $SPEC_FILE"; else fail "spec faltando: $SPEC_FILE"; fi
if [ -f "$FIXTURE_FILE" ]; then ok "fixture existe: $FIXTURE_FILE"; else fail "fixture faltando: $FIXTURE_FILE"; fi

echo
echo "[2/4] Fixture xmeml válido (parse XML)"
if command -v python3 >/dev/null 2>&1 && [ -f "$FIXTURE_FILE" ]; then
if python3 -c "import xml.etree.ElementTree as ET; t = ET.parse('$FIXTURE_FILE'); r = t.getroot(); assert r.tag == 'xmeml', f'root not xmeml: {r.tag}'; print('OK')" 2>/dev/null | grep -q "OK"; then
ok "fixture xmeml parse OK + root é <xmeml>"
else
fail "fixture xmeml parse falhou"
fi
else
skip "python3 não disponível"
fi

echo
echo "[3/4] Implementação Modo 3 (skipa até existir)"
if [ -f "helpers/modo3.py" ]; then
ok "helpers/modo3.py existe"
if command -v uv >/dev/null 2>&1; then
if uv run python -c "from helpers import modo3" 2>/dev/null; then
ok "helpers.modo3 importável"
else
fail "helpers.modo3 não importa"
fi
else
skip "uv não disponível"
fi
else
skip "helpers/modo3.py ainda não implementado (esperado durante F2)"
fi

echo
echo "[4/4] OTIO + otio-fcp-adapter disponíveis"
if command -v uv >/dev/null 2>&1; then
if uv run python -c "import opentimelineio; import opentimelineio_fcp_adapter" 2>/dev/null; then
ok "OTIO + otio-fcp-adapter importáveis"
elif uv run python -c "import opentimelineio" 2>/dev/null; then
ok "OTIO importável (otio-fcp-adapter pode estar faltando — verificar pyproject)"
else
skip "OTIO não instalado (rodar uv sync)"
fi
else
skip "uv não disponível"
fi

echo
echo "================================="
echo " PASS: $PASS FAIL: $FAIL SKIP: $SKIP"
echo "================================="
if [ $FAIL -gt 0 ]; then
echo "✗ SPEC-009 harness FAILED"
exit 1
fi
echo "✓ SPEC-009 harness OK (SKIPs viram PASS quando F2 implementar modo3.py)"
Loading
Loading