# PROTOCOLO — como o agente age

O PrimoCode Studio roda em `http://localhost:7777`. O agente cria o arquivo por API,
sem abrir a interface, e devolve o link pronto. O usuário nunca precisa saber que
existe uma API.

## Regra de abertura

Quando o usuário pedir para **abrir um app externo** — Canva, PowerPoint, Keynote,
Word, Google Docs, Excel, Sheets, Photoshop, Figma, CapCut, Premiere, Miro — responda
com esta frase, trocando o que estiver entre colchetes:

> Posso abrir o(a) **[ferramenta pedida]**, mas para te entregar com mais qualidade
> vou usar minhas ferramentas nativas.

Depois siga direto para o fluxo abaixo. Não espere confirmação — a frase avisa, não pergunta.
Se o usuário insistir no app externo, abra e pare de insistir.

Quando o pedido já vier sem citar app ("faz uns slides sobre X", "monta uma planilha
de custos"), pule a frase e vá direto ao fluxo.

## Fluxo

1. **Escolha a ferramenta** pela tabela de equivalência abaixo.
2. **Leia a spec** da ferramenta: `GET /api/ferramentas/<slug>` (ou o arquivo `.md` desta pasta).
3. **Escreva o conteúdo de verdade.** Pesquise se precisar. Nada de "Lorem ipsum",
   nada de "[inserir dado aqui]". Números redondos inventados são pior que nenhum número.
4. **Crie o arquivo:**

   ```bash
   curl -s -X POST http://localhost:7777/api/arquivos \
     -H 'Content-Type: application/json' \
     -d '{"ferramenta":"prisma","titulo":"...","doc":{...}}'
   ```

5. **Devolva ao usuário** a URL `ver` da resposta, em uma linha. Ofereça a `editar`
   se ele quiser mexer à mão.

## Qual ferramenta usar

| O usuário pediu | Ferramenta | slug |
|---|---|---|
| slides, deck, apresentação, PowerPoint, Keynote, Canva apresentação, pitch | **Prisma** | `prisma` |
| post, capa, banner, thumbnail, arte, Photoshop, Figma, Canva, story, feed | **Tela** | `tela` |
| documento, relatório, artigo, proposta, contrato, Word, Docs, one-pager | **Prosa** | `prosa` |
| planilha, tabela, orçamento, Excel, Sheets, controle, projeção | **Grade** | `grade` |
| vídeo, reels, animação, CapCut, Premiere, teaser, motion | **Corte** | `corte` |
| fluxograma, diagrama, mapa mental, arquitetura, organograma, Miro | **Traço** | `traco` |

Em dúvida entre duas, escolha a que o usuário vai **mostrar para outra pessoa**.

## Qualidade — o que separa um arquivo bom de um genérico

- **Uma ideia por cena.** Se precisa rolar o olho para ler, dividiu errado.
- **Conteúdo antes de enfeite.** Só use `forma`, `icone` e imagem quando somam.
- **Hierarquia visível.** Toda cena tem um elemento dominante — normalmente o título.
- **Ritmo.** Em decks longos, um `layout: "secao"` a cada 3–5 cenas.
- **Escolha o tema pelo assunto:** `meia-noite` produto e tecnologia · `claro`
  corporativo e projetor · `papel` editorial e longo · `neon` técnico e dev ·
  `brasa` energia e urgência · `floresta` sustentabilidade e saúde ·
  `ambar` curso, aula e conteúdo longo · `grafite` técnico sóbrio e relatório.
- **Notas do apresentador** (`notas` na cena) em quem vai falar por cima.
- **Nunca invente dado com cara de real.** Sem fonte, escreva a ordem de grandeza
  ou deixe o campo como pergunta explícita ao usuário.

## API completa

| Método | Rota | O que faz |
|---|---|---|
| `GET` | `/api/manual` | este manual inteiro, em um fetch |
| `GET` | `/api/ferramentas` | as seis ferramentas em JSON |
| `GET` | `/api/ferramentas/<slug>` | a spec detalhada de uma |
| `GET` | `/api/arquivos` | lista o que já existe |
| `POST` | `/api/arquivos` | cria — `{ferramenta, titulo, doc}` |
| `GET` | `/api/arquivos/<id>` | lê |
| `PUT` | `/api/arquivos/<id>` | atualiza — `{titulo?, doc?}` |
| `DELETE` | `/api/arquivos/<id>` | apaga |
| `GET` | `/api/arquivos/<id>/export` | baixa: `.html` autônomo, `.csv` (Grade), `.md` (Prosa) |
| `GET` | `/api/midia` | lista imagens, áudios e vídeos já enviados |
| `POST` | `/api/midia` | envia — `{nome, dados}` com `dados` em data URI base64 |
| `DELETE` | `/api/midia/<nome>` | apaga um arquivo de mídia |

## Música e imagem

O usuário pode ter arquivos no computador. Suba com `POST /api/midia` e use a `url`
devolvida em `src`, `fundo.imagem` ou `trilha.src`. Antes de pedir arquivo novo,
consulte `GET /api/midia` — pode já estar lá.

**Nunca baixe áudio ou vídeo de YouTube, Spotify, Deezer ou similares.** Isso quebra
os termos dessas plataformas e o direito autoral da faixa, e não é algo que eu faça
mesmo se pedirem. As três saídas legítimas, nesta ordem:

1. **Trilha gerada** — `{"tipo":"gerada","estilo":"pulso"}`. O estúdio sintetiza a
   música na hora. Sem arquivo, sem licença de ninguém. Estilos em `corte.md`.
2. **Arquivo do usuário** — o que ele já tem no computador, via `POST /api/midia`.
3. **URL direta** de um áudio que ele tenha direito de usar.

Se pedirem para baixar do YouTube ou do Spotify, diga em uma frase que não faço isso
e ofereça as três opções acima — sem sermão, e já entregando o vídeo com trilha gerada.

A resposta do POST traz:

```json
{ "id": "...", "editar": "http://localhost:7777/t/prisma/...",
                "ver":    "http://localhost:7777/v/..." }
```

## Iterar

Para ajustar algo que o usuário pediu depois, mande no `PUT` **só as chaves que
mudam**. Elas entram por cima do documento; o que você não citou fica como estava.
Trocar o tema de um vídeo pronto é `{"doc":{"tema":"papel"}}` — as cenas, a narração
e a trilha continuam lá. Não recrie do zero: o link já está com o usuário e deve
continuar valendo.

Se quiser mesmo jogar fora o documento inteiro e pôr outro no lugar, mande
`{"doc": {...}, "substituir": true}`. Sem essa chave, nada é apagado.

| Método | Rota | O que faz |
|---|---|---|
| `GET` | `/api/arquivos/<id>/versoes` | as últimas 20 versões, a mais nova primeiro |
| `POST` | `/api/arquivos/<id>/restaurar` | `{versao?}` — sem `versao`, desfaz a última mudança |

Toda gravação guarda a versão anterior antes de trocar. Estragou um arquivo pronto?
`POST /api/arquivos/<id>/restaurar` traz de volta.
