jarvis-ai-framework 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +416 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/agents/AGENTS.md +234 -0
- package/agents/README.md +309 -0
- package/agents/engineering/data/eng.data-engineer.agent.md +309 -0
- package/agents/engineering/eng.agent.md +303 -0
- package/agents/engineering/eng.bug-hunter.md +386 -0
- package/agents/engineering/eng.cybersecurity.agent.md +503 -0
- package/agents/engineering/eng.dev-code-reviewer.md +148 -0
- package/agents/engineering/eng.docs-writer.md +152 -0
- package/agents/engineering/eng.frontend.agent.md +117 -0
- package/agents/engineering/eng.rpa.agent.md +215 -0
- package/agents/engineering/eng.tech-analyst.agent.md +102 -0
- package/agents/engineering/eng.ux-designer.agent.md +193 -0
- package/agents/engineering/qa/eng.qa.cypress-specialist.md +109 -0
- package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +85 -0
- package/agents/engineering/qa/eng.qa.quality-strategist.md +111 -0
- package/agents/engineering/qa/eng.qa.test-architect.md +400 -0
- package/agents/engineering/qa/eng.qa.test-planner.md +477 -0
- package/agents/engineering/qa/eng.qa.testing-engineer.md +339 -0
- package/agents/product/prod.pm-checker.md +52 -0
- package/bin/commands/docs-publish.js +184 -0
- package/bin/commands/docs-sync.js +139 -0
- package/bin/commands/info.js +87 -0
- package/bin/commands/init.js +237 -0
- package/bin/commands/install-rtk.js +90 -0
- package/bin/commands/list.js +48 -0
- package/bin/commands/qa-signoff.js +112 -0
- package/bin/commands/whoami.js +43 -0
- package/bin/jarvis.js +159 -0
- package/bin/lib/auth/session.js +56 -0
- package/bin/lib/config/constants.js +123 -0
- package/bin/lib/config/ide-config.js +233 -0
- package/bin/lib/core/scanner.js +124 -0
- package/bin/lib/core/sync-engine.js +551 -0
- package/bin/lib/docs/fetch-file.sh +41 -0
- package/bin/lib/docs/publish-file.sh +284 -0
- package/bin/lib/docs/validate-frontmatter.js +157 -0
- package/bin/lib/env-loader.js +198 -0
- package/bin/lib/tasks/comment.js +131 -0
- package/bin/lib/utils/git-parser.js +145 -0
- package/bin/lib/utils/logger.js +104 -0
- package/bin/lib/utils/npmrc-parser.js +106 -0
- package/bin/lib/utils/paths.js +55 -0
- package/bin/lib/utils/ui.js +59 -0
- package/bin/lib/vcs/api.js +312 -0
- package/bin/lib/vcs/create-issue.js +43 -0
- package/bin/lib/vcs/create-merge.js +43 -0
- package/bin/lib/vcs/fetch-raw.js +30 -0
- package/bin/postinstall.js +41 -0
- package/members.md +25 -0
- package/package.json +55 -0
- package/rules/AGENTS.md +205 -0
- package/rules/engineering/data/data-rules.md +200 -0
- package/rules/engineering/eng-rules.md +243 -0
- package/rules/engineering/eng-security-rules.md +186 -0
- package/rules/engineering/eng.breakdown-subtasks-rules.md +585 -0
- package/rules/engineering/eng.bump-rules.md +27 -0
- package/rules/engineering/eng.docs-scraping-rules.md +64 -0
- package/rules/engineering/eng.downstream-flow-rules.md +297 -0
- package/rules/engineering/eng.integrations-rules.md +73 -0
- package/rules/engineering/eng.plan-rules.md +333 -0
- package/rules/engineering/eng.pr-rules.md +359 -0
- package/rules/engineering/eng.pre-pr-rules.md +103 -0
- package/rules/engineering/eng.start-rules.md +246 -0
- package/rules/engineering/eng.tech-spec-rules.md +968 -0
- package/rules/engineering/eng.work-rules.md +312 -0
- package/rules/engineering/frontend/eng.frontend-rules.md +147 -0
- package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +259 -0
- package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +137 -0
- package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +181 -0
- package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +120 -0
- package/rules/engineering/rpa/eng.rpa-rules.md +230 -0
- package/rules/product/README.md +24 -0
- package/rules/product/prod-rules.md +151 -0
- package/rules/rtk-rules.md +68 -0
- package/skills/AGENTS.md +290 -0
- package/skills/SKILLS-ROADMAP.md +333 -0
- package/skills/churn-audit/SKILL.md +385 -0
- package/skills/context-detect/SKILL.md +399 -0
- package/skills/context-detect/assets/context-profile-template.md +127 -0
- package/skills/docs-central/README.md +310 -0
- package/skills/docs-central/SKILL.md +423 -0
- package/skills/docs-index/SKILL.md +377 -0
- package/skills/eng-ai-engineer/SKILL.md +296 -0
- package/skills/eng-arch-c4/SKILL.md +358 -0
- package/skills/eng-arch-c4/assets/example-code.md +189 -0
- package/skills/eng-arch-c4/assets/example-component.md +105 -0
- package/skills/eng-arch-c4/assets/example-container.md +104 -0
- package/skills/eng-arch-c4/assets/example-context.md +81 -0
- package/skills/eng-backend/SKILL.md +776 -0
- package/skills/eng-browser-extension-builder/SKILL.md +385 -0
- package/skills/eng-cybersecurity/SKILL.md +645 -0
- package/skills/eng-data-bi/SKILL.md +199 -0
- package/skills/eng-data-debug/SKILL.md +307 -0
- package/skills/eng-data-engineer/SKILL.md +256 -0
- package/skills/eng-data-onboard/SKILL.md +310 -0
- package/skills/eng-data-orchestrator/SKILL.md +426 -0
- package/skills/eng-design-system/SKILL.md +619 -0
- package/skills/eng-docs-write/SKILL.md +312 -0
- package/skills/eng-frontend/SKILL.md +913 -0
- package/skills/eng-jira-comment/SKILL.md +17 -0
- package/skills/eng-microfrontend/SKILL.md +602 -0
- package/skills/eng-ms-trace/SKILL.md +469 -0
- package/skills/eng-nestjs/SKILL.md +791 -0
- package/skills/eng-performance-engineer/SKILL.md +312 -0
- package/skills/eng-pr/SKILL.md +339 -0
- package/skills/eng-qa-a11y-audit/SKILL.md +269 -0
- package/skills/eng-qa-bug-report/SKILL.md +1088 -0
- package/skills/eng-qa-bug-report/TASK_MANAGERS.md +138 -0
- package/skills/eng-qa-cypress-e2e/SKILL.md +177 -0
- package/skills/eng-qa-dev-guide/SKILL.md +164 -0
- package/skills/eng-qa-e2e/SKILL.md +400 -0
- package/skills/eng-qa-e2e-spec-writer/SKILL.md +322 -0
- package/skills/eng-qa-exploratory/SKILL.md +188 -0
- package/skills/eng-qa-gate/SKILL.md +370 -0
- package/skills/eng-qa-gate/assets/checklist-validacao.md +291 -0
- package/skills/eng-qa-graphql-contract/SKILL.md +256 -0
- package/skills/eng-qa-quality-report/SKILL.md +412 -0
- package/skills/eng-qa-test-plan/SKILL.md +466 -0
- package/skills/eng-qa-test-plan/assets/test-coverage-template.md +92 -0
- package/skills/eng-qa-test-plan/assets/test-patterns.md +178 -0
- package/skills/eng-qa-testsprite/SKILL.md +325 -0
- package/skills/eng-qa-testsprite/references/testsprite-mcp.md +224 -0
- package/skills/eng-qa-unit-test/SKILL.md +471 -0
- package/skills/eng-rabbitmq/SKILL.md +661 -0
- package/skills/eng-scraper/SKILL.md +683 -0
- package/skills/eng-scraper-robot-builder/SKILL.md +370 -0
- package/skills/eng-security-patch/SKILL.md +378 -0
- package/skills/eng-security-triage/SKILL.md +266 -0
- package/skills/eng-task-comment/SKILL.md +60 -0
- package/skills/eng-tech-analyst/SKILL.md +529 -0
- package/skills/eng-threat-model/SKILL.md +161 -0
- package/skills/init-jarvis/SKILL.md +1304 -0
- package/skills/init-jarvis/assets/mcp-configs.md +389 -0
- package/skills/init-jarvis/assets/onboarding-checklist.md +104 -0
- package/skills/init-jarvis/assets/setup-guide.md +360 -0
- package/skills/lovable-prompt-generator/SKILL.md +304 -0
- package/skills/prod-roadmap-report/README.md +303 -0
- package/skills/prod-roadmap-report/SKILL.md +198 -0
- package/skills/prod-roadmap-report/commands/status.compiled.single.team.md +23 -0
- package/skills/prod-roadmap-report/commands/status.list.projects.md +17 -0
- package/skills/prod-roadmap-report/commands/status.memory.md +192 -0
- package/skills/prod-roadmap-report/commands/status.roadmap.preview.md +94 -0
- package/skills/prod-roadmap-report/references/detailed-guide.md +236 -0
- package/skills/prod-roadmap-report/rules/detailed-guide.md +237 -0
- package/skills/prod-roadmap-report/rules/status-report-rules.md +44 -0
- package/skills/prod-roadmap-report/templates/template-multiple-teams-compiled-status.md +53 -0
- package/skills/prod-roadmap-report/templates/template-projects-list.md +23 -0
- package/skills/prod-roadmap-report/templates/template-single-team-compiled-status.md +60 -0
- package/skills/prod-roadmap-report/templates/template-single-team-status.md +49 -0
- package/skills/prod-specs/SKILL.md +108 -0
- package/skills/prod-specs/references/prod.spec.clarify.md +176 -0
- package/skills/prod-specs/references/prod.spec.epic.md +107 -0
- package/skills/prod-specs/references/prod.spec.frd.md +135 -0
- package/skills/prod-specs/references/prod.spec.issue.md +145 -0
- package/skills/prod-specs/references/prod.spec.prd.md +118 -0
- package/skills/prod-specs/rules/prod-spec-rules.md +186 -0
- package/skills/prod-specs/templates/prod-breakdown-template.md +136 -0
- package/skills/prod-specs/templates/prod-epic-template.md +76 -0
- package/skills/prod-specs/templates/prod-frd-template.md +172 -0
- package/skills/prod-specs/templates/prod-issue-template.md +68 -0
- package/skills/prod-specs/templates/prod-prd-full-template.md +159 -0
- package/skills/prod-specs/templates/prod-prd-template.md +173 -0
- package/skills/prod-specs-update/SKILL.md +272 -0
- package/skills/report-issue/SKILL.md +156 -0
- package/taxonomy.md +270 -0
- package/templates/AGENTS.md +189 -0
- package/templates/CDD aplicado a Prompts.md +182 -0
- package/templates/ENV-template.md +187 -0
- package/templates/engineering/AGENTS-template.md +71 -0
- package/templates/engineering/ARD-template.md +193 -0
- package/templates/engineering/CONTACTS-template.md +135 -0
- package/templates/engineering/PR-template.md +40 -0
- package/templates/engineering/RFC-Playbook.md +325 -0
- package/templates/engineering/RFC-template.md +199 -0
- package/templates/engineering/architecture-template.md +277 -0
- package/templates/engineering/breakdown-subtasks-template.md +582 -0
- package/templates/engineering/c4-model-template.md +516 -0
- package/templates/engineering/data-contract-template.md +135 -0
- package/templates/engineering/data-pipeline-template.md +163 -0
- package/templates/engineering/plan-template.md +255 -0
- package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +311 -0
- package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +249 -0
- package/templates/engineering/qa/qa.cypress-test-template.md +172 -0
- package/templates/engineering/qa/qa.exploratory-session-template.md +148 -0
- package/templates/engineering/qa/qa.quality-report-template.md +130 -0
- package/templates/engineering/qa/qa.release-signoff-template.md +54 -0
- package/templates/engineering/qa/qa.sprint-plan-template.md +49 -0
- package/templates/engineering/swagger-template.md +145 -0
- package/templates/engineering/tech-spec-template.md +497 -0
- package/templates/engineering/work-progress-template.md +155 -0
- package/workflows/AGENTS.md +240 -0
- package/workflows/README.md +160 -0
- package/workflows/all-tools.md +11 -0
- package/workflows/engineering/data/data.contract.md +202 -0
- package/workflows/engineering/data/data.new-pipeline.md +234 -0
- package/workflows/engineering/eng.breakdown-subtasks.md +420 -0
- package/workflows/engineering/eng.bug-audit.md +591 -0
- package/workflows/engineering/eng.build-tech-spec.md +1116 -0
- package/workflows/engineering/eng.create-ard-from-code.md +259 -0
- package/workflows/engineering/eng.create-ard.md +382 -0
- package/workflows/engineering/eng.create-rfc.md +245 -0
- package/workflows/engineering/eng.debug.md +479 -0
- package/workflows/engineering/eng.docs.md +40 -0
- package/workflows/engineering/eng.light-arch.md +84 -0
- package/workflows/engineering/eng.plan.md +213 -0
- package/workflows/engineering/eng.pr.md +466 -0
- package/workflows/engineering/eng.pre-pr.md +167 -0
- package/workflows/engineering/eng.review.md +185 -0
- package/workflows/engineering/eng.rpa.robot.md +342 -0
- package/workflows/engineering/eng.security-audit.md +312 -0
- package/workflows/engineering/eng.security-incident.md +275 -0
- package/workflows/engineering/eng.security-pipeline.md +210 -0
- package/workflows/engineering/eng.security-review.md +235 -0
- package/workflows/engineering/eng.start.md +494 -0
- package/workflows/engineering/eng.work.md +558 -0
- package/workflows/engineering/frontend/eng.frontend-component.md +190 -0
- package/workflows/engineering/frontend/eng.frontend-perf-audit.md +375 -0
- package/workflows/engineering/frontend/eng.frontend-review.md +185 -0
- package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +51 -0
- package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +51 -0
- package/workflows/engineering/qa/eng.qa-exploratory-session.md +60 -0
- package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +202 -0
- package/workflows/engineering/qa/eng.qa-quality-report.md +83 -0
- package/workflows/engineering/qa/eng.qa-refinement-entry.md +83 -0
- package/workflows/engineering/qa/eng.qa-release-signoff.md +170 -0
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +100 -0
- package/workflows/engineering/ta/eng.ta.atendimento.md +93 -0
- package/workflows/product/prod.roadmap.preview.md +110 -0
- package/workflows/product/prod.spec.breakdown.md +163 -0
- package/workflows/product/prod.spec.clarify.md +178 -0
- package/workflows/product/prod.spec.epic.md +154 -0
- package/workflows/product/prod.spec.frd.md +96 -0
- package/workflows/product/prod.spec.issue.md +145 -0
- package/workflows/product/prod.spec.md +60 -0
- package/workflows/product/prod.spec.prd.md +100 -0
- package/workflows/taxonomy.md +92 -0
- package/workflows/warm-up.md +574 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eng-scraper-robot-builder
|
|
3
|
+
description: >
|
|
4
|
+
Converte descrição de passos em linguagem natural (feitos pelo produto/dev manualmente no site)
|
|
5
|
+
em código Playwright TypeScript pronto para produção. Usa Stagehand para explorar a página real,
|
|
6
|
+
descobrir seletores via observe() e gerar automação resiliente.
|
|
7
|
+
Trigger: Use quando precisar criar um robô de automação a partir de um fluxo descrito manualmente,
|
|
8
|
+
converter passo a passo do produto em código, ou gerar scripts Playwright sem escrever seletores.
|
|
9
|
+
license: AGPL-3.0
|
|
10
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
11
|
+
allowed-tools: Read Write Edit Grep Glob Bash
|
|
12
|
+
metadata:
|
|
13
|
+
author: jarvis-team
|
|
14
|
+
version: "1.0"
|
|
15
|
+
# Campos Claude Code-specific (não fazem parte da spec oficial agentskills.io):
|
|
16
|
+
argument-hint: "[url-alvo] [descrição do fluxo]"
|
|
17
|
+
disable-model-invocation: false
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Eng Scraper Robot Builder - Gerador de Automação Playwright
|
|
21
|
+
|
|
22
|
+
Você é um **especialista em automação de browsers** que transforma descrições em linguagem natural de fluxos manuais em código Playwright TypeScript limpo e resiliente, usando Stagehand como ferramenta exploratória.
|
|
23
|
+
|
|
24
|
+
## Objetivo
|
|
25
|
+
|
|
26
|
+
Receber o passo a passo que o produto ou dev fez manualmente em um site e gerar código Playwright pronto para produção — sem precisar inspecionar o HTML manualmente.
|
|
27
|
+
|
|
28
|
+
**Stagehand é exploratório aqui**: ele roda os passos na página real, descobre os seletores via `observe()`, e o output final é **Playwright puro** — sem dependência de LLM em runtime.
|
|
29
|
+
|
|
30
|
+
## Entrada
|
|
31
|
+
|
|
32
|
+
- `$ARGUMENTS` - URL do site alvo + descrição do fluxo a automatizar
|
|
33
|
+
- Exemplo: `https://app.exemplo.com "fazer login, ir para pedidos, filtrar por status pendente, exportar CSV"`
|
|
34
|
+
|
|
35
|
+
## Recursos
|
|
36
|
+
|
|
37
|
+
- **Referência**: https://docs.stagehand.dev
|
|
38
|
+
- **Saída**: script TypeScript em `scripts/robots/{nome-do-robo}.ts` ou no repositório atual
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Pré-requisito
|
|
43
|
+
|
|
44
|
+
### Dependências necessárias no projeto
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install @browserbasehq/stagehand playwright zod dotenv
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Variáveis de ambiente
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# .env
|
|
54
|
+
BROWSERBASE_API_KEY=... # Chave da Browserbase (cloud) — OU rodar local
|
|
55
|
+
BROWSERBASE_PROJECT_ID=... # ID do projeto na Browserbase
|
|
56
|
+
OPENAI_API_KEY=... # Modelo padrão para observe/act (ou ANTHROPIC_API_KEY)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> Se não tiver conta Browserbase, usar `env: "LOCAL"` no Stagehand — roda com Chromium local.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Quando Usar
|
|
64
|
+
|
|
65
|
+
Use este skill quando:
|
|
66
|
+
- Produto ou dev descreveu um fluxo manual que precisa virar automação
|
|
67
|
+
- Precisar criar um robô sem conhecer os seletores CSS/XPath do site
|
|
68
|
+
- O site tem UI dinâmica onde seletores manuais seriam frágeis
|
|
69
|
+
- Quiser gerar um script Playwright como ponto de partida para edição
|
|
70
|
+
|
|
71
|
+
**NÃO usar quando:**
|
|
72
|
+
- O fluxo já tem seletores conhecidos e estáveis → usar `eng-scraper` diretamente
|
|
73
|
+
- A automação precisa rodar em produção com LLM em runtime → avaliar `eng-qa-e2e`
|
|
74
|
+
- O objetivo é extração de dados estruturados → usar `eng-scraper` com `extract()`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Validação de Entrada
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Se $ARGUMENTS está vazio:
|
|
82
|
+
→ Solicitar: URL do site alvo e descrição do fluxo passo a passo
|
|
83
|
+
→ Exemplo: "https://site.com 'login → ir para relatórios → exportar últimos 30 dias'"
|
|
84
|
+
|
|
85
|
+
Se apenas URL fornecida:
|
|
86
|
+
→ Perguntar: "Descreva o passo a passo que você fez manualmente no site"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Padrões Críticos
|
|
92
|
+
|
|
93
|
+
### Padrão 1: Stagehand é exploratório — Playwright é o output
|
|
94
|
+
|
|
95
|
+
O processo tem duas fases distintas:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
Fase 1 — EXPLORAÇÃO (Stagehand)
|
|
99
|
+
→ Recebe passos em linguagem natural
|
|
100
|
+
→ Executa cada passo com act() na página real
|
|
101
|
+
→ Usa observe() para descobrir seletores XPath reais
|
|
102
|
+
→ Coleta: selector + description + method para cada interação
|
|
103
|
+
|
|
104
|
+
Fase 2 — GERAÇÃO (Playwright)
|
|
105
|
+
→ Converte seletores descobertos em código Playwright
|
|
106
|
+
→ Substitui linguagem natural por chamadas determinísticas
|
|
107
|
+
→ Output: arquivo .ts sem dependência de LLM
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Padrão 2: Converter observe() → Playwright
|
|
111
|
+
|
|
112
|
+
`observe()` retorna `Action[]` com seletores XPath reais. Use esses seletores para gerar Playwright:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Stagehand observe() retorna:
|
|
116
|
+
// { selector: "/html/body/main/button[@type='submit']", method: "click", description: "botão enviar" }
|
|
117
|
+
|
|
118
|
+
// Converter para Playwright:
|
|
119
|
+
await page.locator("xpath=/html/body/main/button[@type='submit']").click()
|
|
120
|
+
// Ou XPath mais legível descoberto:
|
|
121
|
+
await page.locator("//button[@type='submit']").click()
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Padrão 3: Roteiro de exploração comentado
|
|
125
|
+
|
|
126
|
+
O script de exploração Stagehand deve ter um comentário por passo, mapeando linguagem natural → ação:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Passo 1 (produto): "faça login com usuário admin"
|
|
130
|
+
await stagehand.act("preencha o campo de email com admin@empresa.com")
|
|
131
|
+
await stagehand.act("preencha o campo de senha com a senha")
|
|
132
|
+
await stagehand.act("clique no botão de entrar")
|
|
133
|
+
|
|
134
|
+
// Passo 2 (produto): "vá para a seção de pedidos"
|
|
135
|
+
await stagehand.act("clique no menu de pedidos")
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Fluxo de Trabalho
|
|
141
|
+
|
|
142
|
+
### 1. Coletar o passo a passo do produto/dev
|
|
143
|
+
|
|
144
|
+
Perguntar ao usuário (se não fornecido nos argumentos):
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Descreva cada passo que você fez manualmente, em ordem:
|
|
148
|
+
|
|
149
|
+
Exemplo:
|
|
150
|
+
1. Acessei https://app.exemplo.com
|
|
151
|
+
2. Fiz login com email e senha
|
|
152
|
+
3. Cliquei em "Relatórios" no menu lateral
|
|
153
|
+
4. Selecionei o período "Últimos 30 dias"
|
|
154
|
+
5. Cliquei em "Exportar CSV"
|
|
155
|
+
6. O download começou automaticamente
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 2. Gerar script de exploração Stagehand
|
|
159
|
+
|
|
160
|
+
Criar `scripts/robots/explore-{nome}.ts` — script temporário para descoberta:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
import "dotenv/config";
|
|
164
|
+
import { Stagehand } from "@browserbasehq/stagehand";
|
|
165
|
+
|
|
166
|
+
// Script de EXPLORAÇÃO — não vai para produção
|
|
167
|
+
// Objetivo: descobrir seletores reais para gerar Playwright
|
|
168
|
+
|
|
169
|
+
async function explore() {
|
|
170
|
+
const stagehand = new Stagehand({
|
|
171
|
+
env: "LOCAL", // ou "BROWSERBASE" se tiver conta
|
|
172
|
+
verbose: 2, // logs detalhados para ver o que está descobrindo
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
await stagehand.init();
|
|
176
|
+
const page = stagehand.context.pages()[0];
|
|
177
|
+
|
|
178
|
+
// ─────────────────────────────────────────────
|
|
179
|
+
// PASSO 1: {descrição do passo em português}
|
|
180
|
+
// ─────────────────────────────────────────────
|
|
181
|
+
await page.goto("{url-alvo}");
|
|
182
|
+
|
|
183
|
+
// Descobrir elementos disponíveis para entender a estrutura
|
|
184
|
+
const loginElements = await stagehand.observe("encontre os campos de login e botão de entrar");
|
|
185
|
+
console.log("Elementos de login:", JSON.stringify(loginElements, null, 2));
|
|
186
|
+
|
|
187
|
+
// Executar a ação
|
|
188
|
+
await stagehand.act("{passo em linguagem natural}");
|
|
189
|
+
|
|
190
|
+
// ─────────────────────────────────────────────
|
|
191
|
+
// PASSO N: {próximo passo}
|
|
192
|
+
// ─────────────────────────────────────────────
|
|
193
|
+
const nextElements = await stagehand.observe("{o que procurar neste passo}");
|
|
194
|
+
console.log("Próximos elementos:", JSON.stringify(nextElements, null, 2));
|
|
195
|
+
|
|
196
|
+
await stagehand.act("{próximo passo}");
|
|
197
|
+
|
|
198
|
+
await stagehand.close();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
explore().catch(console.error);
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### 3. Executar o script de exploração
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
npx tsx scripts/robots/explore-{nome}.ts 2>&1 | tee scripts/robots/explore-{nome}.log
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Analisar o output do `console.log` para coletar os seletores reais retornados pelo `observe()`.
|
|
211
|
+
|
|
212
|
+
### 4. Gerar o script Playwright final
|
|
213
|
+
|
|
214
|
+
Com os seletores descobertos, gerar `scripts/robots/{nome}.ts`:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import { chromium, Browser, Page } from "playwright";
|
|
218
|
+
|
|
219
|
+
// ─────────────────────────────────────────────────────────────
|
|
220
|
+
// Robô: {nome do robô}
|
|
221
|
+
// Origem: fluxo manual descrito por {produto/dev}
|
|
222
|
+
// Seletores descobertos via Stagehand em {data}
|
|
223
|
+
// ─────────────────────────────────────────────────────────────
|
|
224
|
+
|
|
225
|
+
async function run{NomeRobo}() {
|
|
226
|
+
const browser: Browser = await chromium.launch({ headless: true });
|
|
227
|
+
const context = await browser.newContext({
|
|
228
|
+
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
|
|
229
|
+
});
|
|
230
|
+
const page: Page = await context.newPage();
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
// Passo 1: {descrição original do produto}
|
|
234
|
+
await page.goto("{url}", { waitUntil: "networkidle" });
|
|
235
|
+
|
|
236
|
+
// Passo 2: {descrição}
|
|
237
|
+
await page.locator("{seletor-descoberto-pelo-stagehand}").click();
|
|
238
|
+
await page.waitForLoadState("networkidle");
|
|
239
|
+
|
|
240
|
+
// Passo N: {descrição}
|
|
241
|
+
await page.locator("{seletor}").fill("{valor}");
|
|
242
|
+
|
|
243
|
+
// Validação: confirmar que o fluxo funcionou
|
|
244
|
+
await page.waitForSelector("{seletor-de-confirmação}", { timeout: 10_000 });
|
|
245
|
+
|
|
246
|
+
} finally {
|
|
247
|
+
await browser.close();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
run{NomeRobo}().catch((err) => {
|
|
252
|
+
console.error("Robô falhou:", err);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 5. Validar o script gerado
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
# Rodar em modo não-headless para visualizar
|
|
261
|
+
npx tsx scripts/robots/{nome}.ts
|
|
262
|
+
|
|
263
|
+
# Com Playwright test runner (se integrado ao projeto)
|
|
264
|
+
npx playwright test scripts/robots/{nome}.ts
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Árvore de Decisão
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
Produto tem conta Browserbase? → env: "BROWSERBASE" (browser gerenciado em nuvem)
|
|
273
|
+
Sem conta Browserbase? → env: "LOCAL" (Chromium local, grátis)
|
|
274
|
+
Passos envolvem login com 2FA? → Coletar cookies/session manualmente e injetar
|
|
275
|
+
Fluxo tem upload de arquivo? → Usar page.setInputFiles() no Playwright final
|
|
276
|
+
Fluxo precisa de múltiplas abas? → Usar context.newPage() para cada aba
|
|
277
|
+
Site usa iframes? → Stagehand suporta nativamente, Playwright: page.frameLocator()
|
|
278
|
+
Seletor XPath muito longo/frágil? → Simplificar para seletor semântico equivalente
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Regras
|
|
284
|
+
|
|
285
|
+
### Nunca
|
|
286
|
+
- Manter dependência do Stagehand no script final de produção
|
|
287
|
+
- Hardcodar credenciais no script — sempre usar variáveis de ambiente
|
|
288
|
+
- Usar seletores baseados em posição (ex: `(//div)[15]`) — frágeis demais
|
|
289
|
+
- Ignorar `waitForLoadState` ou `waitForSelector` após navegações
|
|
290
|
+
- Gerar script sem comentários mapeando os passos originais do produto
|
|
291
|
+
|
|
292
|
+
### Sempre
|
|
293
|
+
- Adicionar comentário no script final indicando que os seletores foram descobertos via Stagehand
|
|
294
|
+
- Usar `try/finally` para garantir que o browser fecha mesmo em erros
|
|
295
|
+
- Validar o resultado ao final (confirmar que o fluxo funcionou)
|
|
296
|
+
- Preferir seletores semânticos (texto, role, aria) sobre XPath absolutos quando possível
|
|
297
|
+
- Documentar no script qual foi o passo original descrito pelo produto
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Tratamento de Erros
|
|
302
|
+
|
|
303
|
+
### Stagehand não conseguiu executar um passo
|
|
304
|
+
- Verificar se a página carregou (`waitForLoadState`)
|
|
305
|
+
- Reformular a instrução natural — ser mais específico (ex: "clique no botão azul 'Enviar' no formulário de contato")
|
|
306
|
+
- Usar `observe()` primeiro para ver o que está disponível na página
|
|
307
|
+
|
|
308
|
+
### Seletor descoberto não funciona no Playwright
|
|
309
|
+
- Simplificar o XPath retornado pelo `observe()`
|
|
310
|
+
- Tentar equivalente com `page.getByRole()`, `page.getByText()`, `page.getByLabel()`
|
|
311
|
+
- Inspecionar manualmente o elemento no DevTools como fallback
|
|
312
|
+
|
|
313
|
+
### Site usa autenticação OAuth / SSO
|
|
314
|
+
- Fazer login manual uma vez, exportar cookies: `context.storageState({ path: "auth.json" })`
|
|
315
|
+
- Reutilizar o estado: `browser.newContext({ storageState: "auth.json" })`
|
|
316
|
+
|
|
317
|
+
### Script falha em CI (headless)
|
|
318
|
+
- Adicionar `--no-sandbox` no `chromium.launch({ args: ['--no-sandbox'] })`
|
|
319
|
+
- Verificar timeouts — ambientes CI podem ser mais lentos
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Checklist de Conclusão
|
|
324
|
+
|
|
325
|
+
- [ ] Passo a passo coletado do produto/dev (em linguagem natural)
|
|
326
|
+
- [ ] Script de exploração Stagehand criado e executado
|
|
327
|
+
- [ ] Seletores reais coletados do output do `observe()`
|
|
328
|
+
- [ ] Script Playwright final gerado sem dependência do Stagehand
|
|
329
|
+
- [ ] Comentários mapeando passos originais → código
|
|
330
|
+
- [ ] Credenciais em variáveis de ambiente (nunca hardcoded)
|
|
331
|
+
- [ ] `try/finally` para fechar o browser
|
|
332
|
+
- [ ] Validação ao final do fluxo
|
|
333
|
+
- [ ] Script testado rodando localmente
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Output
|
|
338
|
+
|
|
339
|
+
| Artefato | Descrição |
|
|
340
|
+
|----------|-----------|
|
|
341
|
+
| `scripts/robots/explore-{nome}.ts` | Script temporário de exploração com Stagehand (não vai a prod) |
|
|
342
|
+
| `scripts/robots/{nome}.ts` | Script final Playwright gerado com seletores reais |
|
|
343
|
+
| `scripts/robots/explore-{nome}.log` | Log da exploração com seletores descobertos |
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Mensagem de Conclusão
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
Robô gerado!
|
|
351
|
+
|
|
352
|
+
Fluxo: {descrição do fluxo automatizado}
|
|
353
|
+
Site alvo: {URL}
|
|
354
|
+
Passos automatizados: {N passos}
|
|
355
|
+
Seletores descobertos via: Stagehand observe()
|
|
356
|
+
|
|
357
|
+
Arquivos:
|
|
358
|
+
- scripts/robots/explore-{nome}.ts ← script de exploração (pode descartar)
|
|
359
|
+
- scripts/robots/{nome}.ts ← robô Playwright pronto para produção
|
|
360
|
+
|
|
361
|
+
Próximo passo: executar com `npx tsx scripts/robots/{nome}.ts`
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Recursos Adicionais
|
|
367
|
+
|
|
368
|
+
- **Stagehand docs**: https://docs.stagehand.dev
|
|
369
|
+
- **Skill relacionado**: `$IDE/skills/eng-scraper/SKILL.md` — para scraping/extração de dados
|
|
370
|
+
- **Skill relacionado**: `$IDE/skills/eng-qa-e2e/SKILL.md` — para testes E2E com linguagem natural
|