jarvis-ai-framework 2.1.1 → 3.2.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.
Files changed (266) hide show
  1. package/AGENTS.md +14 -115
  2. package/agents/AGENTS.md +11 -23
  3. package/agents/README.md +27 -129
  4. package/agents/engineering/data/eng.data-engineer.agent.md +11 -34
  5. package/agents/engineering/eng.advisor.agent.md +56 -0
  6. package/agents/engineering/eng.agent.md +14 -24
  7. package/agents/engineering/eng.bug-hunter.md +7 -15
  8. package/agents/engineering/eng.dev-code-reviewer.md +1 -1
  9. package/agents/engineering/eng.frontend.agent.md +3 -7
  10. package/agents/engineering/eng.rpa.agent.md +2 -8
  11. package/agents/engineering/qa/eng.qa.quality-strategist.md +6 -11
  12. package/agents/engineering/qa/eng.qa.test-architect.md +8 -18
  13. package/agents/engineering/qa/eng.qa.test-planner.md +10 -14
  14. package/agents/engineering/qa/eng.qa.testing-engineer.md +91 -24
  15. package/agents/product/prod.discovery-interviewer.md +3 -3
  16. package/bin/README.md +142 -0
  17. package/bin/commands/docs-publish.js +105 -141
  18. package/bin/commands/docs-sync.js +66 -104
  19. package/bin/commands/info.js +7 -27
  20. package/bin/commands/init.js +23 -51
  21. package/bin/commands/install-rtk.js +9 -3
  22. package/bin/commands/list.js +5 -18
  23. package/bin/commands/map.js +20 -5
  24. package/bin/commands/qa-signoff.js +58 -55
  25. package/bin/commands/tokens.js +14 -17
  26. package/bin/commands/whoami.js +30 -26
  27. package/bin/jarvis.js +9 -163
  28. package/bin/lib/auth/session.js +20 -20
  29. package/bin/lib/cli/program.js +219 -0
  30. package/bin/lib/cli/shared-options.js +29 -0
  31. package/bin/lib/config/constants.js +59 -2
  32. package/bin/lib/config/ide-config.js +4 -8
  33. package/bin/lib/core/profile-filter.js +4 -1
  34. package/bin/lib/core/scanner.js +3 -29
  35. package/bin/lib/core/sync-engine.js +21 -14
  36. package/bin/lib/core/token-report.js +12 -2
  37. package/bin/lib/docs/fetch-file.js +39 -0
  38. package/bin/lib/docs/publish-file.js +194 -0
  39. package/bin/lib/docs/redis-cache.js +49 -0
  40. package/bin/lib/docs/validate-frontmatter.js +9 -39
  41. package/bin/lib/env-loader.js +11 -34
  42. package/bin/lib/flow-map/parse.js +11 -5
  43. package/bin/lib/flow-map/render.js +5 -2
  44. package/bin/lib/flow-map/tree.js +59 -10
  45. package/bin/lib/tasks/comment.js +40 -35
  46. package/bin/lib/utils/frontmatter.js +57 -0
  47. package/bin/lib/utils/git-parser.js +4 -6
  48. package/bin/lib/utils/npmrc-parser.js +6 -13
  49. package/bin/lib/utils/paths.js +2 -4
  50. package/bin/lib/utils/ui.js +3 -9
  51. package/bin/lib/vcs/api.js +25 -41
  52. package/bin/lib/vcs/create-issue.js +49 -33
  53. package/bin/lib/vcs/create-merge.js +47 -31
  54. package/bin/lib/vcs/fetch-raw.js +35 -23
  55. package/package.json +14 -5
  56. package/rules/engineering/eng-rules.md +1 -1
  57. package/rules/engineering/eng-security-rules.md +18 -16
  58. package/rules/engineering/eng.bump-rules.md +3 -2
  59. package/rules/engineering/eng.docs-scraping-rules.md +4 -4
  60. package/rules/engineering/eng.integrations-rules.md +6 -4
  61. package/rules/engineering/eng.skills-rules.md +1 -1
  62. package/rules/engineering/eng.specializations-rules.md +18 -4
  63. package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
  64. package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
  65. package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
  66. package/rules-on-demand/engineering/eng.pre-pr-rules.md +1 -1
  67. package/rules-on-demand/engineering/eng.start-rules.md +2 -0
  68. package/skills/AGENTS.md +52 -87
  69. package/skills/SKILLS-ROADMAP.md +47 -128
  70. package/skills/eng-ai/SKILL.md +270 -0
  71. package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
  72. package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
  73. package/skills/eng-ai/references/11-governanca-ia.md +24 -0
  74. package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
  75. package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
  76. package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
  77. package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
  78. package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
  79. package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
  80. package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
  81. package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
  82. package/skills/eng-ai/references/9-produto-ia.md +24 -0
  83. package/skills/eng-ai/references/especializacoes.md +17 -0
  84. package/skills/eng-automation/SKILL.md +290 -0
  85. package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
  86. package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
  87. package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
  88. package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
  89. package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
  90. package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
  91. package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
  92. package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
  93. package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
  94. package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
  95. package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
  96. package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
  97. package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
  98. package/skills/eng-automation/references/7-rpa.md +25 -0
  99. package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
  100. package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
  101. package/skills/eng-automation/references/especializacoes.md +18 -0
  102. package/skills/eng-backend-nestjs/SKILL.md +1 -1
  103. package/skills/eng-data/SKILL.md +271 -0
  104. package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
  105. package/skills/eng-data/references/10-ciencia-dados.md +24 -0
  106. package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
  107. package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
  108. package/skills/eng-data/references/2-modelagem-dados.md +24 -0
  109. package/skills/eng-data/references/3-bancos-dados.md +24 -0
  110. package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
  111. package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
  112. package/skills/eng-data/references/6-qualidade-dados.md +24 -0
  113. package/skills/eng-data/references/7-governanca-metadados.md +24 -0
  114. package/skills/eng-data/references/8-estatistica-analise.md +24 -0
  115. package/skills/eng-data/references/9-analytics-bi.md +24 -0
  116. package/skills/eng-data/references/especializacoes.md +20 -0
  117. package/skills/eng-frontend/SKILL.md +12 -5
  118. package/skills/eng-frontend/references/13-design-system.md +48 -0
  119. package/skills/eng-frontend/references/14-microfrontend.md +46 -0
  120. package/skills/eng-global-task-comment/SKILL.md +3 -3
  121. package/skills/eng-platform/SKILL.md +331 -0
  122. package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
  123. package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
  124. package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
  125. package/skills/eng-platform/references/12-finops-custos.md +24 -0
  126. package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
  127. package/skills/eng-platform/references/14-profiling-performance.md +23 -0
  128. package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
  129. package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
  130. package/skills/eng-platform/references/2-redes.md +23 -0
  131. package/skills/eng-platform/references/3-cloud.md +24 -0
  132. package/skills/eng-platform/references/4-iac-automacao.md +24 -0
  133. package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
  134. package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
  135. package/skills/eng-platform/references/7-observabilidade.md +24 -0
  136. package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
  137. package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
  138. package/skills/eng-platform/references/especializacoes.md +34 -0
  139. package/skills/eng-qa/SKILL.md +283 -0
  140. package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
  141. package/skills/eng-qa/references/10-confiabilidade.md +25 -0
  142. package/skills/eng-qa/references/11-seguranca.md +24 -0
  143. package/skills/eng-qa/references/12-acessibilidade.md +24 -0
  144. package/skills/eng-qa/references/13-dados-testes.md +24 -0
  145. package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
  146. package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
  147. package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
  148. package/skills/eng-qa/references/3-design-testes.md +25 -0
  149. package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
  150. package/skills/eng-qa/references/5-automacao-testes.md +25 -0
  151. package/skills/eng-qa/references/6-api-integracao.md +25 -0
  152. package/skills/eng-qa/references/7-contrato.md +24 -0
  153. package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
  154. package/skills/eng-qa/references/9-performance.md +24 -0
  155. package/skills/eng-qa/references/especializacoes.md +29 -0
  156. package/skills/eng-qa-planner/SKILL.md +264 -0
  157. package/skills/jarvis-context-detect/SKILL.md +1 -1
  158. package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
  159. package/skills/jarvis-create-specialization/SKILL.md +8 -0
  160. package/skills/jarvis-docs-central/README.md +31 -28
  161. package/skills/jarvis-docs-central/SKILL.md +5 -5
  162. package/skills/jarvis-init/SKILL.md +9 -8
  163. package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
  164. package/skills/jarvis-list-specializations/SKILL.md +30 -17
  165. package/skills/jarvis-report-issue/SKILL.md +1 -1
  166. package/taxonomy.md +4 -16
  167. package/templates/AGENTS.md +2 -0
  168. package/templates/ENV-template.md +20 -2
  169. package/templates/engineering/advisor-template.md +65 -0
  170. package/templates/engineering/architecture-template.md +52 -4
  171. package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
  172. package/workflows/AGENTS.md +3 -1
  173. package/workflows/README.md +0 -10
  174. package/workflows/engineering/data/data.new-pipeline.md +6 -5
  175. package/workflows/engineering/eng.bug-audit.md +4 -14
  176. package/workflows/engineering/eng.debug.md +4 -20
  177. package/workflows/engineering/eng.plan.md +4 -26
  178. package/workflows/engineering/eng.pr.md +13 -63
  179. package/workflows/engineering/eng.pre-pr.md +14 -51
  180. package/workflows/engineering/eng.review.md +7 -13
  181. package/workflows/engineering/eng.rpa.robot.md +3 -9
  182. package/workflows/engineering/eng.start.md +37 -32
  183. package/workflows/engineering/eng.work.md +17 -40
  184. package/workflows/engineering/qa/eng.qa-sprint-planning.md +1 -1
  185. package/workflows/product/prod.spec.discovery.md +2 -2
  186. package/workflows/warm-up.md +35 -63
  187. package/agents/engineering/eng.cybersecurity.agent.md +0 -486
  188. package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -112
  189. package/bin/lib/docs/fetch-file.sh +0 -41
  190. package/bin/lib/docs/publish-file.sh +0 -284
  191. package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
  192. package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
  193. package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
  194. package/skills/eng-ai-engineer/SKILL.md +0 -303
  195. package/skills/eng-data-bi/SKILL.md +0 -206
  196. package/skills/eng-data-debug/SKILL.md +0 -314
  197. package/skills/eng-data-engineer/SKILL.md +0 -266
  198. package/skills/eng-data-onboard/SKILL.md +0 -317
  199. package/skills/eng-data-orchestrator/SKILL.md +0 -433
  200. package/skills/eng-devops-performance-engineer/SKILL.md +0 -319
  201. package/skills/eng-frontend-design-system/SKILL.md +0 -155
  202. package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +0 -57
  203. package/skills/eng-frontend-design-system/references/2-tokens.md +0 -116
  204. package/skills/eng-frontend-design-system/references/3-componentes.md +0 -165
  205. package/skills/eng-frontend-design-system/references/4-storybook.md +0 -85
  206. package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +0 -76
  207. package/skills/eng-frontend-microfrontend/SKILL.md +0 -164
  208. package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +0 -109
  209. package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +0 -70
  210. package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +0 -73
  211. package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +0 -48
  212. package/skills/eng-frontend-microfrontend/references/5-event-bus.md +0 -59
  213. package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +0 -77
  214. package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +0 -45
  215. package/skills/eng-global-browser-extension-builder/SKILL.md +0 -392
  216. package/skills/eng-global-jira-comment/SKILL.md +0 -27
  217. package/skills/eng-qa-a11y-audit/SKILL.md +0 -276
  218. package/skills/eng-qa-bug-report/SKILL.md +0 -877
  219. package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
  220. package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +0 -148
  221. package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +0 -46
  222. package/skills/eng-qa-bug-report/references/3-bug-to-test.md +0 -45
  223. package/skills/eng-qa-cypress-e2e/SKILL.md +0 -184
  224. package/skills/eng-qa-dev-guide/SKILL.md +0 -173
  225. package/skills/eng-qa-e2e/SKILL.md +0 -407
  226. package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -329
  227. package/skills/eng-qa-exploratory/SKILL.md +0 -196
  228. package/skills/eng-qa-gate/SKILL.md +0 -377
  229. package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
  230. package/skills/eng-qa-graphql-contract/SKILL.md +0 -263
  231. package/skills/eng-qa-quality-report/SKILL.md +0 -419
  232. package/skills/eng-qa-test-plan/SKILL.md +0 -473
  233. package/skills/eng-qa-testsprite/SKILL.md +0 -332
  234. package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
  235. package/skills/eng-qa-unit-test/SKILL.md +0 -478
  236. package/skills/eng-scraper/SKILL.md +0 -260
  237. package/skills/eng-scraper/references/1-puppeteer.md +0 -140
  238. package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +0 -82
  239. package/skills/eng-scraper/references/3-anti-bot.md +0 -94
  240. package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +0 -137
  241. package/skills/eng-scraper-robot-builder/SKILL.md +0 -377
  242. package/skills/eng-security-cybersecurity/SKILL.md +0 -250
  243. package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +0 -331
  244. package/skills/eng-security-cybersecurity/references/2-secrets-management.md +0 -31
  245. package/skills/eng-security-cybersecurity/references/3-input-validation.md +0 -43
  246. package/skills/eng-security-cybersecurity/references/4-compliance.md +0 -20
  247. package/skills/eng-security-patch/SKILL.md +0 -388
  248. package/skills/eng-security-threat-model/SKILL.md +0 -171
  249. package/skills/eng-security-triage/SKILL.md +0 -276
  250. package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
  251. package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
  252. package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
  253. package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
  254. package/templates/engineering/qa/qa.quality-report-template.md +0 -130
  255. package/workflows/engineering/eng.security-audit.md +0 -319
  256. package/workflows/engineering/eng.security-incident.md +0 -281
  257. package/workflows/engineering/eng.security-pipeline.md +0 -219
  258. package/workflows/engineering/eng.security-review.md +0 -241
  259. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -57
  260. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -57
  261. package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -68
  262. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -209
  263. package/workflows/engineering/qa/eng.qa-quality-report.md +0 -85
  264. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
  265. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
  266. /package/templates/{CDD aplicado a Prompts.md → cdd-aplicado-a-prompts.md} +0 -0
@@ -1,260 +0,0 @@
1
- ---
2
- name: eng-scraper
3
- description: >
4
- Especialista em web scraping, extração de dados, automação de browser e parsing de HTML/XML/PDF.
5
- Domina Puppeteer (principal), Playwright, Cheerio, anti-bot e pipelines ETL leves com NestJS e TypeScript.
6
- Trigger: Use para web scraping, headless browser, parsing de HTML/XML, extração de dados ou automação de navegação.
7
- license: AGPL-3.0
8
- compatibility: Designed for Claude Code (or similar products)
9
- allowed-tools: Read Write Edit Grep Glob Bash
10
- metadata:
11
- author: jarvis-team
12
- version: "1.0"
13
- area: scraper
14
- # Campos Claude Code-specific (não fazem parte da spec oficial agentskills.io):
15
- argument-hint: "[url|site|tarefa] [contexto]"
16
- disable-model-invocation: false
17
- ---
18
-
19
- # Eng Scraper - Especialista em Extração de Dados
20
-
21
- Você é um **especialista em web scraping e extração de dados** com domínio em browsers headless, parsing de conteúdo, contorno de mecanismos anti-bot e construção de pipelines de dados resilientes.
22
-
23
- ## Objetivo
24
-
25
- Extrair dados estruturados de fontes web de forma eficiente, resiliente e ética — desde scripts simples de coleta até pipelines completos de ETL leve.
26
-
27
- ## Entrada
28
-
29
- - `$ARGUMENTS` - URL alvo, site ou tarefa de extração (ex: `scraper-precos-ecommerce`, `extrair-tabela-pdf`, `monitorar-vagas`, `pipeline-noticias`)
30
-
31
- ## Recursos
32
-
33
- - **ENV**: `$IDE/ENV.md` (variáveis de ambiente do projeto)
34
- - **Saída**: scripts de scraping TypeScript como `@Injectable()` NestJS no repositório atual
35
-
36
- ---
37
-
38
- ## Pré-requisito
39
-
40
- Verificar robots.txt e Terms of Service do site alvo ANTES de qualquer implementação:
41
-
42
- ```bash
43
- # Verificar robots.txt
44
- curl -s "{url-alvo}/robots.txt"
45
- ```
46
-
47
- Se houver restrições legais ou éticas significativas, comunicar ao usuário antes de prosseguir.
48
-
49
- ---
50
-
51
- ## Quando Usar
52
-
53
- Use este skill quando:
54
- - Extrair dados de páginas web (preços, produtos, notícias, vagas, tabelas)
55
- - Automatizar navegação em browsers (preenchimento de formulários, login, screenshots)
56
- - Fazer parsing de HTML, XML, JSON ou PDFs
57
- - Construir pipelines de extração → transformação → carga (ETL leve)
58
- - Lidar com sites protegidos por mecanismos anti-bot
59
- - Monitorar mudanças em páginas ou conjuntos de dados web
60
-
61
- **NÃO usar quando:**
62
- - A extração pode ser feita via API oficial — sempre preferir API sobre scraping
63
- - O site proíbe scraping explicitamente e o caso de uso não é legítimo
64
- - A tarefa é de backend genérico sem extração de dados web
65
-
66
- ---
67
-
68
- ## Validação de Entrada
69
-
70
- Se $ARGUMENTS está vazio:
71
- → Solicitar ao usuário: URL ou site alvo, tipo de dado a extrair, formato de saída desejado
72
- → Verificar se existe API oficial antes de prosseguir com scraping
73
-
74
- ---
75
-
76
- ## Padrões Críticos
77
-
78
- ### Padrão 1: Escolher a Ferramenta Certa
79
-
80
- ```
81
- Site renderizado com JavaScript? → Puppeteer (padrão do projeto) ou Playwright
82
- Site com HTML estático? → Cheerio (mais rápido, menor overhead)
83
- APIs internas (XHR/fetch)? → Interceptar requests com Puppeteer → mais estável
84
- Dados em PDFs? → pdf-parse, pdfjs-dist
85
- Dados em XML/RSS? → fast-xml-parser, xml2js
86
- Dados em CSVs/planilhas? → csv-parse, xlsx
87
- ```
88
-
89
- ### Padrão 2: Resiliência por Padrão
90
-
91
- ```
92
- - Nunca confiar na estrutura do HTML → pode mudar a qualquer momento
93
- - Sempre verificar se elementos existem antes de extrair
94
- - Logar estruturas inesperadas para detectar mudanças de layout
95
- - Retry automático para falhas transitórias de rede
96
- - Timeout em todas as operações de rede e navegação
97
- ```
98
-
99
- ### Padrão 3: Responsabilidade com o Servidor Alvo
100
-
101
- ```
102
- - Rate limiting: mínimo 1-2 segundos entre requests
103
- - Randomizar delays para parecer mais orgânico
104
- - Não escalar paralelismo sem avaliar impacto
105
- - Identificar o scraper via User-Agent quando possível
106
- - Caching: não re-baixar dados que já foram coletados
107
- ```
108
-
109
- ---
110
-
111
- ## Árvore de Decisão
112
-
113
- ```
114
- Site tem API oficial? → Usar API (não scraping)
115
- HTML estático sem JS? → Cheerio / node-fetch
116
- HTML renderizado com JS? → Puppeteer (padrão) / Playwright
117
- Precisar fazer login? → Puppeteer + session/cookie management
118
- API interna interceptável? → Puppeteer request interception
119
- Dados em PDF? → pdf-parse / pdfjs-dist
120
- Dados em XML/RSS? → fast-xml-parser
121
- Site com anti-bot avançado? → Seção: Técnicas Anti-Bot
122
- Pipeline de múltiplas fontes? → Seção: Pipelines ETL
123
- ```
124
-
125
- ---
126
-
127
- ## Fluxo de Trabalho
128
-
129
- ### Ética e Aspectos Legais — Verificar Primeiro
130
-
131
- Antes de qualquer implementação, avaliar:
132
-
133
- ```
134
- 1. Existe API oficial? → Usar API sempre que disponível
135
- 2. robots.txt permite o acesso? → Verificar e respeitar
136
- 3. Terms of Service proíbem scraping? → Avaliar com o usuário
137
- 4. Os dados são públicos? → Dados pessoais exigem atenção especial (LGPD/GDPR)
138
- 5. Qual o impacto no servidor alvo? → Rate limiting generoso, nunca DDoS
139
- ```
140
-
141
- ```bash
142
- # Verificar robots.txt antes de começar
143
- curl -s "https://exemplo.com/robots.txt"
144
- ```
145
-
146
- > Se houver restrições legais ou éticas significativas, comunicar ao usuário antes de prosseguir.
147
-
148
- ### Referências (leia só o tema que a tarefa pedir)
149
-
150
- Leia **só** o arquivo do tema que a tarefa pedir; o restante fica fora do contexto.
151
-
152
- | Tema | Quando ler | Arquivo |
153
- |------|-----------|---------|
154
- | Puppeteer | A tarefa usar Puppeteer (ferramenta principal do projeto) para navegar e extrair dados | `references/1-puppeteer.md` |
155
- | Playwright, Cheerio e parsing de PDFs | A tarefa exigir Playwright, scraping de HTML estático com Cheerio ou extração de PDFs | `references/2-playwright-cheerio-pdf.md` |
156
- | Técnicas Anti-Bot | O site bloquear requests (403/429, captcha, fingerprint) | `references/3-anti-bot.md` |
157
- | Resiliência, ETL leve e monitoramento de mudanças | A tarefa precisar de retry, pipeline ETL leve ou monitoramento de mudanças no site | `references/4-resiliencia-etl-monitoramento.md` |
158
-
159
- ### Skills invocados durante a execução do skill
160
-
161
- | Passo | Skill | Condição |
162
- |-------|-------|----------|
163
- | — | Nenhuma — skill autocontida | — |
164
-
165
- ---
166
-
167
- ## Regras
168
-
169
- ### Nunca
170
- - Ignorar `robots.txt` sem avaliar o contexto de uso
171
- - Scraping agressivo (sem rate limiting) que possa causar impacto no servidor alvo
172
- - Coletar dados pessoais sem finalidade legítima e base legal (LGPD/GDPR)
173
- - Assumir que a estrutura do HTML é estável — sempre validar
174
- - Fazer login em contas de terceiros sem autorização explícita
175
- - Expor credenciais de proxy ou contas em código ou logs
176
-
177
- ### Sempre
178
- - Verificar `robots.txt` e Terms of Service antes de implementar
179
- - Preferir API oficial quando disponível
180
- - Rate limiting e delays aleatórios para não sobrecarregar o alvo
181
- - Validar dados extraídos para detectar mudanças de estrutura
182
- - Logging adequado para monitorar saúde do scraper
183
- - Tratar erros e implementar retry para falhas transitórias
184
- - Caching para não re-baixar dados já coletados
185
-
186
- ---
187
-
188
- ## Tratamento de Erros
189
-
190
- ### Site bloqueando requests (403/429)
191
- - Aumentar delay entre requests
192
- - Verificar e ajustar User-Agent
193
- - Considerar rotação de proxies
194
- - Se persistir, comunicar ao usuário — pode ser proteção legítima
195
-
196
- ### Estrutura HTML mudou (dados extraídos vazios ou incorretos)
197
- - Logar amostra do HTML recebido para inspecionar
198
- - Identificar novos seletores CSS ou XPath
199
- - Adicionar validação para detectar mudanças futuras automaticamente
200
-
201
- ### Timeout de navegação
202
- - Aumentar timeout da operação específica
203
- - Verificar se o site tem renderização lenta ou depende de recursos externos
204
- - Tentar com `waitUntil: 'domcontentloaded'` em vez de `'networkidle2'`
205
-
206
- ### PDF corrompido ou não parseável
207
- - Verificar se o arquivo está completo (não truncado)
208
- - Tentar biblioteca alternativa (pdfjs-dist vs pdf-parse)
209
- - Extrair como imagem e usar OCR se o PDF for escaneado
210
-
211
- ---
212
-
213
- ## Checklist de Conclusão
214
-
215
- - [ ] robots.txt e ToS verificados
216
- - [ ] API oficial descartada como alternativa
217
- - [ ] Ferramenta escolhida adequada (Puppeteer / Playwright / Cheerio / parser)
218
- - [ ] Rate limiting implementado
219
- - [ ] Retry com backoff exponencial
220
- - [ ] Validação dos dados extraídos
221
- - [ ] Detecção de mudança de estrutura
222
- - [ ] Formato de saída definido (JSON / CSV / NDJSON)
223
- - [ ] Testes com amostra real dos dados
224
-
225
- ---
226
-
227
- ## Output
228
-
229
- | Artefato | Descrição |
230
- |----------|-----------|
231
- | Scraper | Script de extração com retry, rate limiting e validação |
232
- | Parser | Lógica de parsing adaptada à estrutura da fonte |
233
- | Pipeline | ETL completo: extração → transformação → arquivo de saída |
234
- | Monitor | Script de detecção de mudanças com diff estruturado |
235
-
236
- ---
237
-
238
- ## Mensagem de Conclusão
239
-
240
- ```
241
- Scraper implementado!
242
-
243
- Fonte: {URL ou tipo de fonte}
244
- Ferramenta: {Puppeteer / Playwright / Cheerio / pdf-parse / xml-parser}
245
- Dados extraídos: {campos coletados}
246
- Rate limiting: {delay entre requests}
247
- Retry: {N tentativas com backoff exponencial}
248
-
249
- Saída: {JSON / CSV / NDJSON em path/to/output}
250
- Validação: {campos obrigatórios verificados}
251
-
252
- Próximo passo: {executar com amostra real / agendar com cron / integrar no pipeline}
253
- ```
254
-
255
- ---
256
-
257
- ## Recursos Adicionais
258
-
259
- - **Referências**: Veja [references/](references/) para links de documentação local
260
- - **Puppeteer docs**: https://pptr.dev (documentação oficial)
@@ -1,140 +0,0 @@
1
- # Puppeteer
2
-
3
- > Parte do skill `eng-scraper`. Leia este arquivo quando a tarefa usar Puppeteer (ferramenta principal do projeto) para navegar e extrair dados.
4
-
5
- ### Puppeteer — Ferramenta Principal (padrão do projeto)
6
-
7
- Puppeteer é a ferramenta padrão para scraping com browser headless. Todo código de scraping deve ser em TypeScript e, quando integrado ao sistema, implementado como `@Injectable()` NestJS.
8
-
9
- #### Setup básico
10
-
11
- ```typescript
12
- import puppeteer, { Browser, Page } from 'puppeteer'
13
-
14
- async function createBrowser(): Promise<Browser> {
15
- return puppeteer.launch({
16
- headless: true,
17
- args: [
18
- '--no-sandbox',
19
- '--disable-setuid-sandbox',
20
- '--disable-blink-features=AutomationControlled',
21
- ],
22
- })
23
- }
24
-
25
- // ✅ Sempre fechar browser após uso
26
- async function withBrowser<T>(fn: (browser: Browser) => Promise<T>): Promise<T> {
27
- const browser = await createBrowser()
28
- try {
29
- return await fn(browser)
30
- } finally {
31
- await browser.close()
32
- }
33
- }
34
- ```
35
-
36
- #### NestJS — ScraperService como @Injectable
37
-
38
- ```typescript
39
- import { Injectable, Logger } from '@nestjs/common'
40
- import puppeteer, { Browser, Page } from 'puppeteer'
41
-
42
- @Injectable()
43
- export class ScraperService {
44
- private readonly logger = new Logger(ScraperService.name)
45
-
46
- async scrapeProducts(url: string): Promise<Product[]> {
47
- const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] })
48
-
49
- try {
50
- const page = await browser.newPage()
51
- await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...')
52
-
53
- await page.goto(url, { waitUntil: 'networkidle2', timeout: 30_000 })
54
- await page.waitForSelector('[data-testid="product-card"]', { timeout: 10_000 })
55
-
56
- const products = await page.evaluate(() =>
57
- Array.from(document.querySelectorAll('[data-testid="product-card"]')).map((card) => ({
58
- name: card.querySelector('h2')?.textContent?.trim() ?? null,
59
- price: card.querySelector('[data-price]')?.getAttribute('data-price') ?? null,
60
- url: (card.querySelector('a') as HTMLAnchorElement)?.href ?? null,
61
- }))
62
- )
63
-
64
- const valid = products.filter((p) => p.name && p.price)
65
- if (valid.length < products.length) {
66
- this.logger.warn(`${products.length - valid.length} produtos com dados incompletos ignorados`)
67
- }
68
-
69
- return valid as Product[]
70
- } finally {
71
- await browser.close()
72
- }
73
- }
74
- }
75
- ```
76
-
77
- #### Interceptar chamadas de API interna
78
-
79
- ```typescript
80
- // ✅ Mais estável que scraping de HTML — dados estruturados direto da API interna
81
- async function interceptApiData(url: string, apiPattern: RegExp): Promise<unknown[]> {
82
- return withBrowser(async (browser) => {
83
- const page = await browser.newPage()
84
- const captured: unknown[] = []
85
-
86
- await page.setRequestInterception(true)
87
-
88
- page.on('request', (req) => req.continue())
89
-
90
- page.on('response', async (response) => {
91
- if (apiPattern.test(response.url()) && response.headers()['content-type']?.includes('json')) {
92
- try {
93
- captured.push(await response.json())
94
- } catch {
95
- // ignorar responses não-JSON
96
- }
97
- }
98
- })
99
-
100
- await page.goto(url, { waitUntil: 'networkidle2', timeout: 30_000 })
101
-
102
- return captured
103
- })
104
- }
105
-
106
- // Uso: interceptar chamadas de /api/products/*
107
- const data = await interceptApiData('https://loja.com/produtos', /\/api\/products/)
108
- ```
109
-
110
- #### Paginação automática
111
-
112
- ```typescript
113
- async function scrapeAllPages(baseUrl: string): Promise<unknown[]> {
114
- return withBrowser(async (browser) => {
115
- const page = await browser.newPage()
116
- const allItems: unknown[] = []
117
- let pageNum = 1
118
- let hasNextPage = true
119
-
120
- while (hasNextPage) {
121
- await page.goto(`${baseUrl}?page=${pageNum}`, { waitUntil: 'networkidle2' })
122
-
123
- const items = await page.evaluate(() =>
124
- Array.from(document.querySelectorAll('.item')).map((el) => ({
125
- title: el.querySelector('h3')?.textContent?.trim() ?? null,
126
- }))
127
- )
128
-
129
- allItems.push(...items)
130
-
131
- hasNextPage = (await page.$('[aria-label="Próxima página"]:not([disabled])')) !== null
132
- pageNum++
133
-
134
- await randomDelay(1000, 3000)
135
- }
136
-
137
- return allItems
138
- })
139
- }
140
- ```
@@ -1,82 +0,0 @@
1
- # Playwright, Cheerio e parsing de PDFs
2
-
3
- > Parte do skill `eng-scraper`. Leia este arquivo quando a tarefa exigir Playwright, scraping de HTML estático com Cheerio ou extração de PDFs.
4
-
5
- ### Playwright — Alternativa (quando necessário)
6
-
7
- Usar Playwright quando Puppeteer não resolver o caso de uso (ex: multi-browser testing, maior controle de contexto).
8
-
9
- ```typescript
10
- import { chromium } from 'playwright'
11
-
12
- // Mesma lógica do Puppeteer — API similar com pequenas diferenças:
13
- // page.goto(url, { waitUntil: 'networkidle' }) → sem o "2" no Playwright
14
- // page.$() → page.locator() é o padrão moderno no Playwright
15
- // page.evaluate() → idêntico
16
- ```
17
-
18
- ### Cheerio — Scraping de HTML Estático
19
-
20
- ```typescript
21
- import * as cheerio from 'cheerio'
22
-
23
- async function scrapeWithCheerio(url: string) {
24
- const response = await fetch(url, {
25
- headers: {
26
- 'User-Agent': 'Mozilla/5.0 (compatible; MyBot/1.0; +https://meusite.com/bot)',
27
- 'Accept-Language': 'pt-BR,pt;q=0.9',
28
- },
29
- })
30
-
31
- if (!response.ok) {
32
- throw new Error(`HTTP ${response.status}: ${url}`)
33
- }
34
-
35
- const html = await response.text()
36
- const $ = cheerio.load(html)
37
-
38
- // ✅ Extração com Cheerio
39
- const articles = $('article.post').map((_, el) => ({
40
- title: $(el).find('h2').text().trim() || null,
41
- date: $(el).find('time').attr('datetime') || null,
42
- url: $(el).find('a.read-more').attr('href') || null,
43
- summary: $(el).find('.excerpt').text().trim() || null,
44
- })).get()
45
-
46
- return articles.filter((a) => a.title && a.url)
47
- }
48
- ```
49
-
50
- ### Parsing de PDFs
51
-
52
- ```typescript
53
- import pdfParse from 'pdf-parse'
54
- import { readFileSync } from 'fs'
55
-
56
- async function extractTextFromPdf(filePath: string): Promise<string> {
57
- const buffer = readFileSync(filePath)
58
- const { text, numpages } = await pdfParse(buffer)
59
- console.log(`PDF processado: ${numpages} páginas`)
60
- return text
61
- }
62
-
63
- // ✅ Extrair tabela de texto de PDF (regex + heurística)
64
- function extractTableFromText(text: string, headers: string[]): Record<string, string>[] {
65
- const lines = text.split('\n').map((l) => l.trim()).filter(Boolean)
66
- const results: Record<string, string>[] = []
67
-
68
- for (const line of lines) {
69
- // lógica específica para o formato do PDF alvo
70
- const match = line.match(/(\w+)\s+([\d,.]+)\s+([\d,.]+)/)
71
- if (match) {
72
- results.push({
73
- [headers[0]]: match[1],
74
- [headers[1]]: match[2],
75
- [headers[2]]: match[3],
76
- })
77
- }
78
- }
79
-
80
- return results
81
- }
82
- ```
@@ -1,94 +0,0 @@
1
- # Técnicas Anti-Bot
2
-
3
- > Parte do skill `eng-scraper`. Leia este arquivo quando o site bloquear requests (403/429, captcha, fingerprint).
4
-
5
- ### Técnicas Anti-Bot
6
-
7
- #### Headers realistas
8
-
9
- ```typescript
10
- // ✅ Headers que imitam browser real
11
- const realisticHeaders = {
12
- 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
13
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
14
- 'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
15
- 'Accept-Encoding': 'gzip, deflate, br',
16
- 'Connection': 'keep-alive',
17
- 'Upgrade-Insecure-Requests': '1',
18
- }
19
- ```
20
-
21
- #### Rate limiting e delays aleatórios
22
-
23
- ```typescript
24
- // ✅ Delay com jitter para comportamento orgânico
25
- function randomDelay(minMs: number, maxMs: number): Promise<void> {
26
- const ms = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs
27
- return new Promise((resolve) => setTimeout(resolve, ms))
28
- }
29
-
30
- // ✅ Controle de concorrência (evitar sobrecarga no alvo)
31
- import PQueue from 'p-queue'
32
-
33
- const queue = new PQueue({
34
- concurrency: 2, // máximo 2 requests simultâneos
35
- intervalCap: 5, // máximo 5 requests
36
- interval: 10_000, // por 10 segundos
37
- })
38
-
39
- async function scrapeUrls(urls: string[]) {
40
- return Promise.all(
41
- urls.map((url) => queue.add(async () => {
42
- await randomDelay(500, 1500)
43
- return scrapeUrl(url)
44
- }))
45
- )
46
- }
47
- ```
48
-
49
- #### Puppeteer — reduzir fingerprint de automação
50
-
51
- ```typescript
52
- import puppeteer from 'puppeteer'
53
- import { executablePath } from 'puppeteer'
54
-
55
- // ✅ Ocultar sinais de automação via page.evaluateOnNewDocument
56
- async function createStealthPage(browser: Browser): Promise<Page> {
57
- const page = await browser.newPage()
58
-
59
- await page.setUserAgent(
60
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
61
- )
62
-
63
- await page.setViewport({ width: 1366, height: 768 })
64
-
65
- // Remover propriedades que identificam automação
66
- await page.evaluateOnNewDocument(() => {
67
- Object.defineProperty(navigator, 'webdriver', { get: () => undefined })
68
- Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3] })
69
- Object.defineProperty(navigator, 'languages', { get: () => ['pt-BR', 'pt', 'en'] })
70
- })
71
-
72
- return page
73
- }
74
- ```
75
-
76
- #### Rotação de proxies
77
-
78
- ```typescript
79
- // ✅ Pool de proxies com rotação
80
- const proxies = [
81
- 'http://user:pass@proxy1:8080',
82
- 'http://user:pass@proxy2:8080',
83
- 'http://user:pass@proxy3:8080',
84
- ]
85
-
86
- function getRandomProxy(): string {
87
- return proxies[Math.floor(Math.random() * proxies.length)]
88
- }
89
-
90
- const browser = await puppeteer.launch({
91
- headless: true,
92
- args: [`--proxy-server=${getRandomProxy()}`, '--no-sandbox'],
93
- })
94
- ```