/browse — Chromium para agentes via playwright-cli (+ MCP na sessão principal)
O que existe
| Peça |
Onde |
Para quem |
playwright-cli 0.1.19 |
~/.local/bin/playwright-cli |
qualquer agente (só precisa de Bash). Caminho padrão para subagentes e forks. |
MCP playwright (0.0.80) |
escopo user, tools mcp__playwright__browser_* |
sessão principal, quando quiser screenshot voltando como imagem para o modelo. |
| Config compartilhado |
~/.claude/browse/config.json |
headless, 1366×800, pt-BR, America/Sao_Paulo, saída em ~/.claude/browse/out |
| Browser |
Chromium 1243 do Playwright (~/.cache/ms-playwright/chromium-1243) |
CLI e MCP usam o mesmo binário |
| Skill upstream completa |
~/.local/lib/node_modules/@playwright/cli/skills/playwright-cli/ (SKILL.md + references/) |
request-mocking, tracing, video, storage-state, test-generation — não duplicar aqui, ler lá |
Regra 1 — toda sessão tem nome
playwright-cli -s=<slug> open <url> --config=$HOME/.claude/browse/config.json
<slug> = nome curto da tarefa (main, spike-parse-brl, verify-kpi). Nunca omitir -s:
a sessão default é compartilhada e dois agentes em paralelo se atropelam.
- Um agente só fecha a sessão que abriu (
-s=<slug> close). close-all / kill-all só a
sessão principal, no fim do trabalho. list mostra o que está aberto.
- Subagente que recebe uma tarefa com browser cria a sua sessão, faz, fecha. Não herda a do pai.
Regra 2 — snapshot antes de screenshot
Snapshot é texto, barato e traz os refs para agir. Screenshot é imagem, caro, e só quando o
visual é a pergunta (layout quebrado, cor, alinhamento).
C=$HOME/.claude/browse/config.json
S=-s=<slug>
playwright-cli $S open http://localhost:3000 --config=$C
playwright-cli $S --raw snapshot # árvore acessível com [ref=eN]
playwright-cli $S --raw find "Salvar" # localizar um nó pelo texto
playwright-cli $S click e12 # agir pelo ref, não por seletor CSS
playwright-cli $S fill e5 "1.700.000,00" --submit
playwright-cli $S --raw eval "document.querySelector('#total').textContent"
playwright-cli $S --raw console # erros/warnings acumulados
playwright-cli $S --raw requests # rede desde o load (falhas 4xx/5xx)
playwright-cli $S screenshot --filename=$HOME/.claude/browse/out/<slug>-<passo>.png
playwright-cli $S close
--raw devolve só o resultado (sem status/snapshot) — bom para pipe e para diff de dois
snapshots (antes/depois de uma ação).
- Refs mudam quando a página muda: re-snapshot depois de navegar antes de clicar de novo.
- Sem
--raw, o CLI grava snapshot/console em arquivos em out/ e imprime o caminho —
preferir --raw para não acumular lixo.
Regra 3 — URL local: checar antes de abrir
curl -sI http://localhost:3000 | head -1 || echo "porta morta"
Se o dev server não estiver de pé, não abrir o browser numa porta morta: subir o server com
run_in_background, esperar a porta responder (loop curto de curl), e só então open.
Ao terminar, derrubar o que você subiu; não derrubar o que já estava rodando.
Login / SSO
- Sessão visível para o usuário logar (Wayland ativo, funciona):
playwright-cli -s=<slug> open <url> --headed --config=$C → o usuário loga na janela.
- Persistir:
playwright-cli -s=<slug> state-save $HOME/.claude/browse/state/<app>.json.
- Reaproveitar depois:
playwright-cli -s=<slug> open <url> --config=$C +
state-load $HOME/.claude/browse/state/<app>.json + reload.
- Alternativa: se o browser logado da
persona-audit estiver rodando (CDP em 9777),
playwright-cli -s=<slug> attach --cdp=http://localhost:9777 e detach ao final — nunca
close numa sessão attached, isso fecha o browser do outro.
Confidencialidade (guardrail Suno)
- Tudo roda local. Screenshots, snapshots,
state-save ficam em ~/.claude/browse/ — fora de
qualquer repo. Não copiar para o projeto, não publicar em artifact, não colar no chat
cookies/tokens que cookie-list/state-save revelam.
state/*.json de contas Suno contém sessão válida: tratar como credencial. Não commitar,
não mover, apagar quando não precisar mais (rm).
- Telas do Orbit mostram salário/ICP/dados de pessoas: screenshot só quando pedido, e o
destino é o usuário, não um relatório externo.
MCP (sessão principal)
Tools mcp__playwright__browser_navigate, browser_snapshot, browser_click, browser_type,
browser_take_screenshot, browser_console_messages, browser_network_requests… Mesmo
config, mesmo Chromium. Usar quando a imagem precisa voltar para o modelo (validar visual)
ou quando a interação é longa e o vai-e-volta de Bash atrapalha. Para subagentes paralelos,
preferir o CLI (sessões nomeadas). Remover se pesar no contexto:
claude mcp remove playwright -s user.
Integração com /spike
- Fase 3 (isolar/mockar): se a fatia tem UI, o mockup renderizável é aberto com
-s=spike-<slug> e validado por snapshot + console limpo — isso vira parte do gate 2.
- Fase 7 (propagar): após cada lote, smoke test das telas afetadas com
/browse antes de
seguir; falha visual = parar o lote, igual a teste vermelho.
Manutenção
- Zumbis:
playwright-cli kill-all mata daemons; pgrep -f chromium-1243 confere.
- Atualizar CLI e MCP juntos (compartilham
playwright-core): npm i -g @playwright/cli@<v>
e trocar a versão em claude mcp add; se o playwright-core novo pedir outra revisão de
Chromium, node ~/.local/lib/node_modules/@playwright/cli/node_modules/playwright-core/cli.js install chromium.
- Fallback para o Chromium do sistema (
/usr/bin/chromium): em config.json,
browser.launchOptions.executablePath. Não é o padrão porque quebra em update do pacman.
- Limpar
~/.claude/browse/out de vez em quando; nada ali é fonte de verdade.
1---2name: browse3description: Abre um Chromium real para navegar, inspecionar e testar uma URL — local (localhost, dev server, sandbox do /spike) ou de preview. Lê a página como snapshot acessível com refs, clica/preenche, lê console e requests, tira screenshot. Funciona para a sessão principal, subagentes e forks, em paralelo sem colisão. Use quando o pedido for "abre no browser", "testa a tela", "vê se renderiza", "navega em localhost:3000", "o que aparece no console", "screenshot da página", "valida o fluxo de login/formulário". NÃO use para fetch simples de HTML/JSON — aí é curl/WebFetch.4---56# /browse — Chromium para agentes via `playwright-cli` (+ MCP na sessão principal)78## O que existe910| Peça | Onde | Para quem |11|---|---|---|12| `playwright-cli` 0.1.19 | `~/.local/bin/playwright-cli` | **qualquer agente** (só precisa de Bash). Caminho padrão para subagentes e forks. |13| MCP `playwright` (0.0.80) | escopo user, tools `mcp__playwright__browser_*` | sessão principal, quando quiser screenshot voltando como imagem para o modelo. |14| Config compartilhado | `~/.claude/browse/config.json` | headless, 1366×800, `pt-BR`, `America/Sao_Paulo`, saída em `~/.claude/browse/out` |15| Browser | Chromium 1243 do Playwright (`~/.cache/ms-playwright/chromium-1243`) | CLI e MCP usam o mesmo binário |16| Skill upstream completa | `~/.local/lib/node_modules/@playwright/cli/skills/playwright-cli/` (SKILL.md + `references/`) | request-mocking, tracing, video, storage-state, test-generation — **não duplicar aqui, ler lá** |1718## Regra 1 — toda sessão tem nome1920```bash21playwright-cli -s=<slug> open <url> --config=$HOME/.claude/browse/config.json22```2324- `<slug>` = nome curto da tarefa (`main`, `spike-parse-brl`, `verify-kpi`). **Nunca** omitir `-s`:25 a sessão default é compartilhada e dois agentes em paralelo se atropelam.26- Um agente **só fecha a sessão que abriu** (`-s=<slug> close`). `close-all` / `kill-all` só a27 sessão principal, no fim do trabalho. `list` mostra o que está aberto.28- Subagente que recebe uma tarefa com browser cria a sua sessão, faz, fecha. Não herda a do pai.2930## Regra 2 — snapshot antes de screenshot3132Snapshot é texto, barato e traz os refs para agir. Screenshot é imagem, caro, e só quando o33**visual** é a pergunta (layout quebrado, cor, alinhamento).3435```bash36C=$HOME/.claude/browse/config.json37S=-s=<slug>38playwright-cli $S open http://localhost:3000 --config=$C39playwright-cli $S --raw snapshot # árvore acessível com [ref=eN]40playwright-cli $S --raw find "Salvar" # localizar um nó pelo texto41playwright-cli $S click e12 # agir pelo ref, não por seletor CSS42playwright-cli $S fill e5 "1.700.000,00" --submit43playwright-cli $S --raw eval "document.querySelector('#total').textContent"44playwright-cli $S --raw console # erros/warnings acumulados45playwright-cli $S --raw requests # rede desde o load (falhas 4xx/5xx)46playwright-cli $S screenshot --filename=$HOME/.claude/browse/out/<slug>-<passo>.png47playwright-cli $S close48```4950- `--raw` devolve só o resultado (sem status/snapshot) — bom para pipe e para `diff` de dois51 snapshots (antes/depois de uma ação).52- Refs mudam quando a página muda: **re-snapshot depois de navegar** antes de clicar de novo.53- Sem `--raw`, o CLI grava snapshot/console em arquivos em `out/` e imprime o caminho —54 preferir `--raw` para não acumular lixo.5556## Regra 3 — URL local: checar antes de abrir5758```bash59curl -sI http://localhost:3000 | head -1 || echo "porta morta"60```6162Se o dev server não estiver de pé, **não** abrir o browser numa porta morta: subir o server com63`run_in_background`, esperar a porta responder (loop curto de `curl`), e só então `open`.64Ao terminar, derrubar o que você subiu; não derrubar o que já estava rodando.6566## Login / SSO67681. Sessão visível para o usuário logar (Wayland ativo, funciona):69 `playwright-cli -s=<slug> open <url> --headed --config=$C` → o usuário loga na janela.702. Persistir: `playwright-cli -s=<slug> state-save $HOME/.claude/browse/state/<app>.json`.713. Reaproveitar depois: `playwright-cli -s=<slug> open <url> --config=$C` +72 `state-load $HOME/.claude/browse/state/<app>.json` + `reload`.734. Alternativa: se o browser logado da `persona-audit` estiver rodando (CDP em 9777),74 `playwright-cli -s=<slug> attach --cdp=http://localhost:9777` e `detach` ao final — nunca75 `close` numa sessão attached, isso fecha o browser do outro.7677## Confidencialidade (guardrail Suno)7879- Tudo roda local. Screenshots, snapshots, `state-save` ficam em `~/.claude/browse/` — **fora de80 qualquer repo**. Não copiar para o projeto, não publicar em artifact, não colar no chat81 cookies/tokens que `cookie-list`/`state-save` revelam.82- `state/*.json` de contas Suno contém sessão válida: tratar como credencial. Não commitar,83 não mover, apagar quando não precisar mais (`rm`).84- Telas do Orbit mostram salário/ICP/dados de pessoas: screenshot só quando pedido, e o85 destino é o usuário, não um relatório externo.8687## MCP (sessão principal)8889Tools `mcp__playwright__browser_navigate`, `browser_snapshot`, `browser_click`, `browser_type`,90`browser_take_screenshot`, `browser_console_messages`, `browser_network_requests`… Mesmo91config, mesmo Chromium. Usar quando a imagem precisa **voltar para o modelo** (validar visual)92ou quando a interação é longa e o vai-e-volta de Bash atrapalha. Para subagentes paralelos,93preferir o CLI (sessões nomeadas). Remover se pesar no contexto:94`claude mcp remove playwright -s user`.9596## Integração com `/spike`9798- Fase 3 (isolar/mockar): se a fatia tem UI, o mockup renderizável é aberto com99 `-s=spike-<slug>` e validado por snapshot + console limpo — isso vira parte do gate 2.100- Fase 7 (propagar): após cada lote, smoke test das telas afetadas com `/browse` antes de101 seguir; falha visual = parar o lote, igual a teste vermelho.102103## Manutenção104105- Zumbis: `playwright-cli kill-all` mata daemons; `pgrep -f chromium-1243` confere.106- Atualizar CLI e MCP **juntos** (compartilham `playwright-core`): `npm i -g @playwright/cli@<v>`107 e trocar a versão em `claude mcp add`; se o `playwright-core` novo pedir outra revisão de108 Chromium, `node ~/.local/lib/node_modules/@playwright/cli/node_modules/playwright-core/cli.js install chromium`.109- Fallback para o Chromium do sistema (`/usr/bin/chromium`): em `config.json`,110 `browser.launchOptions.executablePath`. Não é o padrão porque quebra em update do pacman.111- Limpar `~/.claude/browse/out` de vez em quando; nada ali é fonte de verdade.