flowchart TD
A[Claude Code recebe prompt] --> B{Skill 'visual-eyes' relevante?}
B -->|sim| C[Lê SKILL.md]
B -->|não| Z[Comportamento normal]
C --> D[Spawn Playwright via subprocess]
D --> E[Chromium headless]
E --> F[Navega para URL]
F --> G[Screenshot]
G --> H[Imagem retornada para Claude]
H --> I[Claude analisa visualmente]
I --> J[Sugere/aplica mudanças]
J --> K[Repete se necessário]
A “alma” da skill. Documento markdown que o Claude lê quando relevante, contendo:
Veja skills/visual-eyes/SKILL.md no repo.
install.sh — instala a skill em ~/.claude/skills/ ou .claude/skills/uninstall.sh — removetests/sanity.sh — smoke testtests/validate.sh — validação pós-installnpx playwright) — controle de browser headlessSKILL.md para entender comandosnpx playwright codegen --target=javascript http://localhost:3000
# ou
node -e "
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
await page.goto('http://localhost:3000');
await page.screenshot({ path: 'screenshot.png' });
await browser.close();
})();
"
LSP entende código, não pixels. Inspeção DOM diz “div com classe X”, não “esse div está cobrindo o botão de checkout”. Para tarefas visuais reais, screenshots > DOM.
Browsers headless já são padrão de mercado, gratuitos, com APIs ricas. Não há razão pra reinventar a roda.
A skill executa código em browser headless local. Você controla:
./screenshots/)Em CI, considere isolar com containers.