@brunosps00/dev-workflow 0.0.3 → 0.0.6
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/README.md +42 -42
- package/bin/dev-workflow.js +6 -4
- package/lib/constants.js +42 -40
- package/lib/init.js +66 -19
- package/package.json +1 -1
- package/scaffold/en/commands/{analyze-project.md → dw-analyze-project.md} +69 -40
- package/scaffold/en/commands/{brainstorm.md → dw-brainstorm.md} +31 -4
- package/scaffold/en/commands/{bugfix.md → dw-bugfix.md} +63 -19
- package/scaffold/en/commands/{code-review.md → dw-code-review.md} +38 -15
- package/scaffold/en/commands/{commit.md → dw-commit.md} +25 -0
- package/scaffold/en/commands/{create-prd.md → dw-create-prd.md} +24 -10
- package/scaffold/en/commands/{create-tasks.md → dw-create-tasks.md} +11 -4
- package/scaffold/en/commands/{create-techspec.md → dw-create-techspec.md} +38 -11
- package/scaffold/en/commands/{deep-research.md → dw-deep-research.md} +18 -17
- package/scaffold/en/commands/{fix-qa.md → dw-fix-qa.md} +20 -3
- package/scaffold/en/commands/dw-functional-doc.md +276 -0
- package/scaffold/en/commands/{generate-pr.md → dw-generate-pr.md} +20 -5
- package/scaffold/en/commands/dw-help.md +309 -0
- package/scaffold/en/commands/{refactoring-analysis.md → dw-refactoring-analysis.md} +50 -26
- package/scaffold/en/commands/{review-implementation.md → dw-review-implementation.md} +25 -6
- package/scaffold/en/commands/{run-plan.md → dw-run-plan.md} +21 -6
- package/scaffold/en/commands/{run-qa.md → dw-run-qa.md} +32 -13
- package/scaffold/en/commands/{run-task.md → dw-run-task.md} +17 -7
- package/scaffold/en/references/playwright-patterns.md +136 -0
- package/scaffold/en/references/refactoring-catalog.md +167 -0
- package/scaffold/en/templates/brainstorm-matrix.md +44 -0
- package/scaffold/en/templates/functional-doc/case-matrix.md +5 -0
- package/scaffold/en/templates/functional-doc/e2e-runbook.md +3 -0
- package/scaffold/en/templates/functional-doc/features.md +3 -0
- package/scaffold/en/templates/functional-doc/overview.md +21 -0
- package/scaffold/en/templates/functional-doc/playwright.spec.ts.tpl +19 -0
- package/scaffold/en/templates/pr-bugfix-template.md +28 -0
- package/scaffold/en/templates/qa-test-credentials.md +37 -0
- package/scaffold/en/templates/tasks-template.md +1 -1
- package/scaffold/en/templates/techspec-template.md +1 -1
- package/scaffold/pt-br/commands/{analyze-project.md → dw-analyze-project.md} +94 -44
- package/scaffold/pt-br/commands/{brainstorm.md → dw-brainstorm.md} +32 -5
- package/scaffold/pt-br/commands/{bugfix.md → dw-bugfix.md} +73 -16
- package/scaffold/pt-br/commands/{code-review.md → dw-code-review.md} +80 -17
- package/scaffold/pt-br/commands/{commit.md → dw-commit.md} +45 -1
- package/scaffold/pt-br/commands/{create-prd.md → dw-create-prd.md} +25 -10
- package/scaffold/pt-br/commands/{create-tasks.md → dw-create-tasks.md} +24 -17
- package/scaffold/pt-br/commands/{create-techspec.md → dw-create-techspec.md} +40 -13
- package/scaffold/pt-br/commands/{deep-research.md → dw-deep-research.md} +19 -11
- package/scaffold/pt-br/commands/{fix-qa.md → dw-fix-qa.md} +30 -1
- package/scaffold/pt-br/commands/dw-functional-doc.md +276 -0
- package/scaffold/pt-br/commands/{generate-pr.md → dw-generate-pr.md} +61 -6
- package/scaffold/pt-br/commands/dw-help.md +248 -0
- package/scaffold/pt-br/commands/{refactoring-analysis.md → dw-refactoring-analysis.md} +49 -25
- package/scaffold/pt-br/commands/{review-implementation.md → dw-review-implementation.md} +53 -5
- package/scaffold/pt-br/commands/{run-plan.md → dw-run-plan.md} +100 -12
- package/scaffold/pt-br/commands/{run-qa.md → dw-run-qa.md} +93 -18
- package/scaffold/pt-br/commands/{run-task.md → dw-run-task.md} +35 -10
- package/scaffold/pt-br/references/playwright-patterns.md +133 -0
- package/scaffold/pt-br/references/refactoring-catalog.md +166 -0
- package/scaffold/pt-br/templates/brainstorm-matrix.md +44 -0
- package/scaffold/pt-br/templates/functional-doc/case-matrix.md +5 -0
- package/scaffold/pt-br/templates/functional-doc/e2e-runbook.md +3 -0
- package/scaffold/pt-br/templates/functional-doc/features.md +3 -0
- package/scaffold/pt-br/templates/functional-doc/overview.md +21 -0
- package/scaffold/pt-br/templates/functional-doc/playwright.spec.ts.tpl +19 -0
- package/scaffold/pt-br/templates/pr-bugfix-template.md +28 -0
- package/scaffold/pt-br/templates/qa-test-credentials.md +37 -0
- package/scaffold/pt-br/templates/tasks-template.md +2 -2
- package/scaffold/pt-br/templates/techspec-template.md +1 -1
- package/scaffold/rules-readme.md +3 -3
- package/scaffold/scripts/functional-doc/generate-dossier.mjs +821 -0
- package/scaffold/scripts/functional-doc/run-playwright-flow.mjs +275 -0
- package/scaffold/skills/agent-browser/SKILL.md +750 -0
- package/scaffold/skills/agent-browser/references/authentication.md +303 -0
- package/scaffold/skills/agent-browser/references/commands.md +295 -0
- package/scaffold/skills/agent-browser/references/profiling.md +120 -0
- package/scaffold/skills/agent-browser/references/proxy-support.md +194 -0
- package/scaffold/skills/agent-browser/references/session-management.md +193 -0
- package/scaffold/skills/agent-browser/references/snapshot-refs.md +219 -0
- package/scaffold/skills/agent-browser/references/video-recording.md +173 -0
- package/scaffold/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/scaffold/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/scaffold/skills/agent-browser/templates/form-automation.sh +62 -0
- package/scaffold/skills/humanizer/README.md +143 -0
- package/scaffold/skills/humanizer/SKILL.md +488 -0
- package/scaffold/skills/humanizer/WARP.md +53 -0
- package/scaffold/skills/remotion-best-practices/SKILL.md +61 -0
- package/scaffold/skills/remotion-best-practices/rules/3d.md +86 -0
- package/scaffold/skills/remotion-best-practices/rules/animations.md +27 -0
- package/scaffold/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/scaffold/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/scaffold/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/scaffold/skills/remotion-best-practices/rules/assets.md +78 -0
- package/scaffold/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/scaffold/skills/remotion-best-practices/rules/audio.md +169 -0
- package/scaffold/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
- package/scaffold/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/scaffold/skills/remotion-best-practices/rules/charts.md +120 -0
- package/scaffold/skills/remotion-best-practices/rules/compositions.md +154 -0
- package/scaffold/skills/remotion-best-practices/rules/display-captions.md +184 -0
- package/scaffold/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/scaffold/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/scaffold/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/scaffold/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/scaffold/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/scaffold/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/scaffold/skills/remotion-best-practices/rules/gifs.md +141 -0
- package/scaffold/skills/remotion-best-practices/rules/images.md +134 -0
- package/scaffold/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/scaffold/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/scaffold/skills/remotion-best-practices/rules/lottie.md +70 -0
- package/scaffold/skills/remotion-best-practices/rules/maps.md +412 -0
- package/scaffold/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/scaffold/skills/remotion-best-practices/rules/measuring-text.md +140 -0
- package/scaffold/skills/remotion-best-practices/rules/parameters.md +109 -0
- package/scaffold/skills/remotion-best-practices/rules/sequencing.md +118 -0
- package/scaffold/skills/remotion-best-practices/rules/sfx.md +26 -0
- package/scaffold/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/scaffold/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/scaffold/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/scaffold/skills/remotion-best-practices/rules/timing.md +179 -0
- package/scaffold/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/scaffold/skills/remotion-best-practices/rules/transitions.md +197 -0
- package/scaffold/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/scaffold/skills/remotion-best-practices/rules/trimming.md +51 -0
- package/scaffold/skills/remotion-best-practices/rules/videos.md +171 -0
- package/scaffold/skills/remotion-best-practices/rules/voiceover.md +99 -0
- package/scaffold/skills/security-review/LICENSE +22 -0
- package/scaffold/skills/security-review/SKILL.md +312 -0
- package/scaffold/skills/security-review/infrastructure/docker.md +432 -0
- package/scaffold/skills/security-review/languages/javascript.md +388 -0
- package/scaffold/skills/security-review/languages/python.md +363 -0
- package/scaffold/skills/security-review/references/api-security.md +519 -0
- package/scaffold/skills/security-review/references/authentication.md +353 -0
- package/scaffold/skills/security-review/references/authorization.md +372 -0
- package/scaffold/skills/security-review/references/business-logic.md +443 -0
- package/scaffold/skills/security-review/references/cryptography.md +329 -0
- package/scaffold/skills/security-review/references/csrf.md +398 -0
- package/scaffold/skills/security-review/references/data-protection.md +378 -0
- package/scaffold/skills/security-review/references/deserialization.md +410 -0
- package/scaffold/skills/security-review/references/error-handling.md +436 -0
- package/scaffold/skills/security-review/references/file-security.md +457 -0
- package/scaffold/skills/security-review/references/injection.md +259 -0
- package/scaffold/skills/security-review/references/logging.md +433 -0
- package/scaffold/skills/security-review/references/misconfiguration.md +435 -0
- package/scaffold/skills/security-review/references/modern-threats.md +475 -0
- package/scaffold/skills/security-review/references/ssrf.md +415 -0
- package/scaffold/skills/security-review/references/supply-chain.md +405 -0
- package/scaffold/skills/security-review/references/xss.md +336 -0
- package/scaffold/skills/vercel-react-best-practices/AGENTS.md +3648 -0
- package/scaffold/skills/vercel-react-best-practices/README.md +123 -0
- package/scaffold/skills/vercel-react-best-practices/SKILL.md +146 -0
- package/scaffold/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/scaffold/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/scaffold/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/scaffold/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/scaffold/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/scaffold/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/scaffold/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/scaffold/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/scaffold/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/scaffold/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/scaffold/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/scaffold/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/scaffold/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/scaffold/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/scaffold/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/scaffold/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/scaffold/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/scaffold/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/scaffold/skills/webapp-testing/SKILL.md +133 -0
- package/scaffold/skills/webapp-testing/assets/test-helper.js +56 -0
- package/scaffold/en/commands/help.md +0 -289
- package/scaffold/pt-br/commands/help.md +0 -226
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
2
|
Você é um assistente IA especializado em Quality Assurance. Sua tarefa é validar que a implementação atende todos os requisitos definidos no PRD, TechSpec e Tasks, executando testes E2E, verificações de acessibilidade e análises visuais.
|
|
3
3
|
|
|
4
|
+
## Quando Usar
|
|
5
|
+
- Use para validar que a implementação atende todos os requisitos do PRD, TechSpec e Tasks por meio de testes E2E, verificações de acessibilidade e análise visual
|
|
6
|
+
- NÃO use quando apenas testes unitários/integração são necessários (use o test runner do projeto diretamente)
|
|
7
|
+
- NÃO use quando os requisitos ainda não foram definidos (crie o PRD primeiro)
|
|
8
|
+
|
|
9
|
+
## Posição no Pipeline
|
|
10
|
+
**Antecessor:** `/dw-run-plan` ou `/dw-run-task` | **Sucessor:** `/dw-fix-qa` (se bugs) ou `/dw-code-review`
|
|
11
|
+
|
|
4
12
|
<critical>Utilize o Playwright MCP para executar todos os testes E2E</critical>
|
|
5
13
|
<critical>Verifique TODOS os requisitos do PRD e TechSpec antes de aprovar</critical>
|
|
6
14
|
<critical>O QA NÃO está completo até que TODAS as verificações passem</critical>
|
|
@@ -8,11 +16,19 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
8
16
|
<critical>Valide integralmente cada requisito com cenários de happy path, edge cases, regressões e fluxos negativos quando aplicável</critical>
|
|
9
17
|
<critical>NÃO aprove QA com cobertura parcial, implícita ou assumida; se um requisito não foi exercitado ponta a ponta, ele deve constar como não validado e o QA não pode ser aprovado</critical>
|
|
10
18
|
|
|
19
|
+
## Skills Complementares
|
|
20
|
+
|
|
21
|
+
Quando disponíveis no projeto em `./.agents/skills/`, use estas skills como apoio operacional sem substituir este comando:
|
|
22
|
+
|
|
23
|
+
- `agent-browser`: apoio para navegação operacional, auth persistente, screenshots adicionais, inspeção de requests e debugging de sessão
|
|
24
|
+
- `webapp-testing`: apoio para estruturar fluxos de teste, retestes, screenshots e logs quando complementar ao Playwright MCP
|
|
25
|
+
- `vercel-react-best-practices`: use apenas se o frontend sob teste for React/Next.js e houver indicação de regressão relacionada a renderização, fetching, hidratação ou performance percebida
|
|
26
|
+
|
|
11
27
|
## Variáveis de Entrada
|
|
12
28
|
|
|
13
29
|
| Variável | Descrição | Exemplo |
|
|
14
30
|
|----------|-----------|---------|
|
|
15
|
-
| `{{PRD_PATH}}` | Caminho da pasta do PRD |
|
|
31
|
+
| `{{PRD_PATH}}` | Caminho da pasta do PRD | `.dw/spec/prd-minha-feature` |
|
|
16
32
|
|
|
17
33
|
## Objetivos
|
|
18
34
|
|
|
@@ -29,7 +45,9 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
29
45
|
- PRD: `{{PRD_PATH}}/prd.md`
|
|
30
46
|
- TechSpec: `{{PRD_PATH}}/techspec.md`
|
|
31
47
|
- Tasks: `{{PRD_PATH}}/tasks.md`
|
|
32
|
-
- Rules do Projeto:
|
|
48
|
+
- Rules do Projeto: `.dw/rules/`
|
|
49
|
+
- Credenciais de Teste QA: `.dw/templates/qa-test-credentials.md`
|
|
50
|
+
- Padrões Playwright: `.dw/references/playwright-patterns.md`
|
|
33
51
|
- Pasta de evidências QA (obrigatória): `{{PRD_PATH}}/QA/`
|
|
34
52
|
- Relatório de Saída: `{{PRD_PATH}}/QA/qa-report.md`
|
|
35
53
|
- Bugs encontrados: `{{PRD_PATH}}/QA/bugs.md`
|
|
@@ -38,6 +56,17 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
38
56
|
- Scripts de teste Playwright: `{{PRD_PATH}}/QA/scripts/`
|
|
39
57
|
- Checklist consolidado: `{{PRD_PATH}}/QA/checklist.md`
|
|
40
58
|
|
|
59
|
+
## Contexto Multi-Projeto
|
|
60
|
+
|
|
61
|
+
Identifique os projetos com frontend testável via Playwright verificando a configuração do projeto. Setups comuns incluem:
|
|
62
|
+
|
|
63
|
+
| Projeto | URL Local | Framework |
|
|
64
|
+
|---------|-----------|-----------|
|
|
65
|
+
| Frontend web | `http://localhost:3000` | (verificar config do projeto) |
|
|
66
|
+
| Frontend admin | `http://localhost:4000` | (verificar config do projeto) |
|
|
67
|
+
|
|
68
|
+
Consulte `.dw/rules/` para URLs e frameworks específicos do projeto.
|
|
69
|
+
|
|
41
70
|
## Etapas do Processo
|
|
42
71
|
|
|
43
72
|
### 1. Análise de Documentação (Obrigatório)
|
|
@@ -51,6 +80,7 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
51
80
|
- edge cases
|
|
52
81
|
- fluxos negativos/erros, quando existirem
|
|
53
82
|
- regressões ligadas ao requisito
|
|
83
|
+
- Se o requisito depender de estado histórico, séries, permissões, responsividade, dados vazios ou erros de API, esses cenários devem ser incluídos na matriz
|
|
54
84
|
|
|
55
85
|
<critical>NÃO PULE ESTA ETAPA - Entender os requisitos é fundamental para o QA</critical>
|
|
56
86
|
<critical>QA sem matriz de cenários por requisito está incompleto</critical>
|
|
@@ -62,11 +92,13 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
62
92
|
- `{{PRD_PATH}}/QA/screenshots/`
|
|
63
93
|
- `{{PRD_PATH}}/QA/logs/`
|
|
64
94
|
- `{{PRD_PATH}}/QA/scripts/`
|
|
95
|
+
- Ler `.dw/templates/qa-test-credentials.md` e escolher o usuário/perfil apropriado para o cenário
|
|
65
96
|
- Verificar se a aplicação está rodando em localhost
|
|
66
97
|
- Usar `browser_navigate` do Playwright MCP para acessar a aplicação
|
|
67
98
|
- Confirmar que a página carregou corretamente com `browser_snapshot`
|
|
99
|
+
- Se sessão persistente, import de auth, inspeção de rede além do MCP ou reprodução browser-first forem necessários, complementar com `agent-browser`
|
|
68
100
|
|
|
69
|
-
###
|
|
101
|
+
### 3. Verificação de Páginas do Menu (Obrigatório — Executar ANTES dos testes de RF)
|
|
70
102
|
|
|
71
103
|
<critical>ANTES de testar RFs individuais, verificar que CADA item do menu do módulo leva a uma página FUNCIONAL e ÚNICA. Esta verificação é bloqueante — se falhar, o QA NÃO pode ser aprovado.</critical>
|
|
72
104
|
|
|
@@ -88,7 +120,22 @@ Para cada item do menu do módulo:
|
|
|
88
120
|
- Página sem nenhum componente de dados (tabela, lista, formulário, gráfico)
|
|
89
121
|
- Página que não faz nenhuma chamada de API
|
|
90
122
|
|
|
91
|
-
|
|
123
|
+
**Se stub/placeholder detectado:**
|
|
124
|
+
- Reportar como **BUG ALTA severidade** em `QA/bugs.md`
|
|
125
|
+
- RFs associados àquela página devem ser marcados como **FALHOU**
|
|
126
|
+
- Capturar screenshot com sufixo `-STUB-FAIL.png`
|
|
127
|
+
- QA NÃO PODE ter status APROVADO enquanto páginas stub existirem no menu
|
|
128
|
+
|
|
129
|
+
**Fluxo de Decisão da Verificação de Menu:**
|
|
130
|
+
```dot
|
|
131
|
+
digraph menu_check {
|
|
132
|
+
"Check Menu Items" -> "All functional?" [shape=diamond];
|
|
133
|
+
"All functional?" -> "Proceed to RF tests" [label="yes"];
|
|
134
|
+
"All functional?" -> "Report STUB BUG\nFAIL QA" [label="no"];
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 4. Testes E2E com Playwright MCP (Obrigatório)
|
|
92
139
|
|
|
93
140
|
Utilize as ferramentas do Playwright MCP para testar cada fluxo:
|
|
94
141
|
|
|
@@ -101,7 +148,7 @@ Utilize as ferramentas do Playwright MCP para testar cada fluxo:
|
|
|
101
148
|
| `browser_fill_form` | Preencher múltiplos campos de uma vez |
|
|
102
149
|
| `browser_select_option` | Selecionar opções em dropdowns |
|
|
103
150
|
| `browser_press_key` | Simular teclas (Enter, Tab, etc.) |
|
|
104
|
-
| `browser_take_screenshot` | Capturar evidências visuais |
|
|
151
|
+
| `browser_take_screenshot` | Capturar evidências visuais (salvar em `{{PRD_PATH}}/QA/screenshots/`) |
|
|
105
152
|
| `browser_console_messages` | Verificar erros no console |
|
|
106
153
|
| `browser_network_requests` | Verificar chamadas de API |
|
|
107
154
|
|
|
@@ -112,13 +159,16 @@ Para cada requisito funcional do PRD:
|
|
|
112
159
|
4. Executar fluxos negativos/erros quando aplicável
|
|
113
160
|
5. Executar regressões relacionadas ao requisito
|
|
114
161
|
6. Verificar o resultado
|
|
115
|
-
7. Capturar screenshot de evidência com nome padronizado: `RF-XX-[slug]-PASS.png` ou `RF-XX-[slug]-FAIL.png`
|
|
162
|
+
7. Capturar screenshot de evidência em `{{PRD_PATH}}/QA/screenshots/` com nome padronizado: `RF-XX-[slug]-PASS.png` ou `RF-XX-[slug]-FAIL.png`
|
|
116
163
|
8. Marcar como PASSOU ou FALHOU
|
|
117
|
-
9. Salvar o script Playwright do fluxo em `{{PRD_PATH}}/QA/scripts/`
|
|
164
|
+
9. Salvar o script Playwright do fluxo em `{{PRD_PATH}}/QA/scripts/` com nome padronizado: `RF-XX-[slug].spec.ts` (ou `.js`)
|
|
165
|
+
10. Registrar no relatório quais credenciais (usuário/perfil) foram usadas em cada fluxo sensível a permissões
|
|
166
|
+
11. Quando o fluxo MCP ficar instável ou insuficiente para evidência operacional, complementar com `agent-browser` ou `webapp-testing`, registrando isso explicitamente no relatório
|
|
118
167
|
|
|
119
168
|
<critical>Não basta validar apenas o caminho feliz. Cada requisito deve ser exercitado contra seus estados de borda e suas regressões mais prováveis</critical>
|
|
169
|
+
<critical>Se um requisito não puder ser completamente validado via E2E, o QA deve ser marcado como REJEITADO ou BLOQUEADO, nunca APROVADO</critical>
|
|
120
170
|
|
|
121
|
-
###
|
|
171
|
+
### 4.1. Matriz mínima obrigatória por requisito
|
|
122
172
|
|
|
123
173
|
Para cada RF, o QA deve responder explicitamente:
|
|
124
174
|
|
|
@@ -128,7 +178,19 @@ Para cada RF, o QA deve responder explicitamente:
|
|
|
128
178
|
- Quais regressões históricas ou riscos correlatos foram exercitados?
|
|
129
179
|
- O requisito foi validado integralmente ou parcialmente?
|
|
130
180
|
|
|
131
|
-
|
|
181
|
+
Exemplos de edge cases que devem ser considerados sempre que relevantes:
|
|
182
|
+
|
|
183
|
+
- estados vazios
|
|
184
|
+
- limites de data/hora
|
|
185
|
+
- dados longos ou truncamento visual
|
|
186
|
+
- permissões diferentes
|
|
187
|
+
- mobile e desktop
|
|
188
|
+
- comportamento com histórico pré-existente
|
|
189
|
+
- comportamento com itens já vinculados a outros fluxos
|
|
190
|
+
- reentrada/ações repetidas
|
|
191
|
+
- falhas de API, loading e estados intermediários
|
|
192
|
+
|
|
193
|
+
### 5. Verificações de Acessibilidade (Obrigatório)
|
|
132
194
|
|
|
133
195
|
Verificar para cada tela/componente (WCAG 2.2):
|
|
134
196
|
|
|
@@ -138,16 +200,20 @@ Verificar para cada tela/componente (WCAG 2.2):
|
|
|
138
200
|
- [ ] Contraste de cores é adequado
|
|
139
201
|
- [ ] Formulários têm labels associados aos inputs
|
|
140
202
|
- [ ] Mensagens de erro são claras e acessíveis
|
|
203
|
+
- [ ] Skip links para navegação principal (se aplicável)
|
|
141
204
|
- [ ] Focus indicators visíveis
|
|
142
205
|
|
|
143
|
-
|
|
206
|
+
Use `browser_press_key` para testar navegação por teclado.
|
|
207
|
+
Use `browser_snapshot` para verificar labels e estrutura semântica.
|
|
208
|
+
|
|
209
|
+
### 6. Verificações Visuais (Obrigatório)
|
|
144
210
|
|
|
145
|
-
- Capturar screenshots das telas principais
|
|
211
|
+
- Capturar screenshots das telas principais com `browser_take_screenshot` e salvar em `{{PRD_PATH}}/QA/screenshots/`
|
|
146
212
|
- Verificar layouts em diferentes estados (vazio, com dados, erro, loading)
|
|
147
213
|
- Documentar inconsistências visuais encontradas
|
|
148
|
-
- Verificar responsividade se aplicável
|
|
214
|
+
- Verificar responsividade se aplicável (diferentes viewports)
|
|
149
215
|
|
|
150
|
-
###
|
|
216
|
+
### 7. Documentação de Bugs (Se encontrar problemas)
|
|
151
217
|
|
|
152
218
|
Para cada bug encontrado, criar entrada em `{{PRD_PATH}}/QA/bugs.md`:
|
|
153
219
|
|
|
@@ -166,7 +232,7 @@ Para cada bug encontrado, criar entrada em `{{PRD_PATH}}/QA/bugs.md`:
|
|
|
166
232
|
- **Status:** Aberto
|
|
167
233
|
```
|
|
168
234
|
|
|
169
|
-
###
|
|
235
|
+
### 8. Relatório de QA (Obrigatório)
|
|
170
236
|
|
|
171
237
|
Gerar relatório em `{{PRD_PATH}}/QA/qa-report.md`:
|
|
172
238
|
|
|
@@ -221,18 +287,27 @@ Gerar relatório em `{{PRD_PATH}}/QA/qa-report.md`:
|
|
|
221
287
|
- [ ] Screenshots de evidência capturados
|
|
222
288
|
- [ ] Bugs documentados em `QA/bugs.md` (se houver)
|
|
223
289
|
- [ ] Relatório `QA/qa-report.md` gerado
|
|
290
|
+
- [ ] Logs de console/rede salvos em `QA/logs/`
|
|
291
|
+
- [ ] Scripts de teste Playwright salvos em `QA/scripts/`
|
|
224
292
|
|
|
225
293
|
## Notas Importantes
|
|
226
294
|
|
|
227
295
|
- Sempre use `browser_snapshot` antes de interagir para entender o estado atual da página
|
|
228
|
-
- Capture screenshots de TODOS os bugs encontrados
|
|
296
|
+
- Capture screenshots de TODOS os bugs encontrados em `QA/screenshots/`
|
|
229
297
|
- Se encontrar um bug bloqueante, documente e reporte imediatamente
|
|
230
|
-
- Verifique o console do browser para erros JavaScript com `browser_console_messages`
|
|
231
|
-
- Verifique chamadas de API com `browser_network_requests`
|
|
232
|
-
- Salve os scripts de testes E2E executados para reuso e auditoria
|
|
298
|
+
- Verifique o console do browser para erros JavaScript com `browser_console_messages` e salve em `QA/logs/console.log`
|
|
299
|
+
- Verifique chamadas de API com `browser_network_requests` e salve em `QA/logs/network.log`
|
|
300
|
+
- Salve os scripts de testes E2E executados em `QA/scripts/` para reuso e auditoria
|
|
301
|
+
- Para projetos usando shadcn/ui + Tailwind, verifique se os componentes seguem o design system
|
|
302
|
+
- Use `.dw/templates/qa-test-credentials.md` como fonte oficial de credenciais de login para QA
|
|
303
|
+
- Consulte `.dw/references/playwright-patterns.md` para padrões comuns de teste
|
|
233
304
|
- Não marque requisito como validado com base apenas em teste unitário, integração, inferência de código ou execução parcial
|
|
305
|
+
- Se a implementação requer dados históricos ou estado específico para validar um edge case, prepare esse estado e execute o caso
|
|
306
|
+
- Se não houver tempo ou ambiente suficiente para cobrir completamente um requisito, registre explicitamente como bloqueio e rejeite o QA
|
|
234
307
|
|
|
235
308
|
<critical>O QA só está APROVADO quando TODOS os requisitos do PRD forem verificados e estiverem funcionando</critical>
|
|
236
309
|
<critical>Utilize o Playwright MCP para TODAS as interações com a aplicação</critical>
|
|
237
310
|
<critical>Páginas stub/placeholder no menu são BUG ALTA — jamais aprovar QA com páginas que exibem o mesmo conteúdo genérico</critical>
|
|
311
|
+
<critical>Verifique que CADA página do módulo é ÚNICA e FUNCIONAL antes de testar RFs individuais</critical>
|
|
312
|
+
<critical>QA aprovado requer cobertura abrangente comprovada: happy path, edge cases, fluxos negativos e regressões aplicáveis</critical>
|
|
238
313
|
</system_instructions>
|
|
@@ -4,12 +4,30 @@ Você é um assistente IA responsável por implementar tasks de desenvolvimento
|
|
|
4
4
|
<critical>Você não deve se apressar para finalizar a tarefa. Sempre verifique os arquivos necessários, verifique os testes, faça um processo de reasoning para garantir tanto a compreensão quanto a execução correta.</critical>
|
|
5
5
|
<critical>A TAREFA NÃO PODE SER CONSIDERADA COMPLETA ENQUANTO TODOS OS TESTES NÃO ESTIVEREM PASSANDO</critical>
|
|
6
6
|
|
|
7
|
+
## Quando Usar
|
|
8
|
+
- Use para executar uma única task do tasks.md de um PRD com validação Nível 1 integrada
|
|
9
|
+
- NÃO use quando precisar executar TODAS as tasks sequencialmente (use `/dw-run-plan` em vez disso)
|
|
10
|
+
- NÃO use para corrigir um bug report (use `/dw-bugfix` em vez disso)
|
|
11
|
+
|
|
12
|
+
## Posição no Pipeline
|
|
13
|
+
**Antecessor:** `/dw-create-tasks` | **Sucessor:** `/dw-run-task` (próxima task) ou `/dw-review-implementation`
|
|
14
|
+
|
|
15
|
+
## Skills Complementares
|
|
16
|
+
|
|
17
|
+
Quando disponíveis no projeto em `./.agents/skills/`, use estas skills como suporte especializado sem substituir este comando:
|
|
18
|
+
|
|
19
|
+
| Skill | Gatilho |
|
|
20
|
+
|-------|---------|
|
|
21
|
+
| `vercel-react-best-practices` | Task envolve renderização React, hidratação, data fetching, bundle, cache ou performance |
|
|
22
|
+
| `webapp-testing` | Task tem frontend interativo que necessita validação E2E em navegador real |
|
|
23
|
+
| `agent-browser` | Validação de UI requer sessão persistente, inspeção de navegação operacional ou evidência visual complementar |
|
|
24
|
+
|
|
7
25
|
## Localização dos Arquivos
|
|
8
26
|
|
|
9
|
-
- PRD:
|
|
10
|
-
- Tech Spec:
|
|
11
|
-
- Tasks:
|
|
12
|
-
- Rules do Projeto:
|
|
27
|
+
- PRD: `.dw/spec/prd-[nome-funcionalidade]/prd.md`
|
|
28
|
+
- Tech Spec: `.dw/spec/prd-[nome-funcionalidade]/techspec.md`
|
|
29
|
+
- Tasks: `.dw/spec/prd-[nome-funcionalidade]/tasks.md`
|
|
30
|
+
- Rules do Projeto: `.dw/rules/`
|
|
13
31
|
|
|
14
32
|
## Etapas para Executar
|
|
15
33
|
|
|
@@ -27,8 +45,9 @@ Você é um assistente IA responsável por implementar tasks de desenvolvimento
|
|
|
27
45
|
Analise considerando:
|
|
28
46
|
- Objetivos principais da tarefa
|
|
29
47
|
- Como a tarefa se encaixa no contexto do projeto
|
|
30
|
-
- Alinhamento com regras e padrões do projeto (
|
|
48
|
+
- Alinhamento com regras e padrões do projeto (`.dw/rules/`)
|
|
31
49
|
- Possíveis soluções ou abordagens
|
|
50
|
+
- Se React/Next.js estiver no escopo, incorporar explicitamente heurísticas relevantes do `vercel-react-best-practices`
|
|
32
51
|
|
|
33
52
|
### 3. Resumo da Tarefa
|
|
34
53
|
|
|
@@ -58,7 +77,8 @@ Após fornecer o resumo e abordagem, **comece imediatamente** a implementar a ta
|
|
|
58
77
|
- **Implementar testes unitários** (obrigatório para backend)
|
|
59
78
|
- Seguir padrões estabelecidos do projeto
|
|
60
79
|
- Garantir que todos os requisitos sejam atendidos
|
|
61
|
-
- **Rodar testes
|
|
80
|
+
- **Rodar testes**: use o comando de teste do projeto
|
|
81
|
+
- Se houver frontend interativo, valide também o comportamento real com `webapp-testing` ou `agent-browser` quando isso reduzir o risco de regressão invisível nos testes unitários
|
|
62
82
|
|
|
63
83
|
**VOCÊ DEVE** iniciar a implementação logo após o processo acima.
|
|
64
84
|
|
|
@@ -82,6 +102,10 @@ Para cada critério de aceitação definido na task:
|
|
|
82
102
|
- Se algum critério não foi atendido: **CORRIJA antes de prosseguir**
|
|
83
103
|
|
|
84
104
|
### Execução de Testes
|
|
105
|
+
```bash
|
|
106
|
+
# Rodar testes do projeto impactado
|
|
107
|
+
pnpm test # ou npm test
|
|
108
|
+
```
|
|
85
109
|
- [ ] Todos os testes passam (existentes + novos)
|
|
86
110
|
- [ ] Novos testes foram criados para código novo
|
|
87
111
|
- Se algum teste falha: **CORRIJA antes de prosseguir**
|
|
@@ -90,7 +114,8 @@ Para cada critério de aceitação definido na task:
|
|
|
90
114
|
- [ ] Tipos explícitos (sem `any`)
|
|
91
115
|
- [ ] Código compila sem erros
|
|
92
116
|
- [ ] Lint passa
|
|
93
|
-
- [ ]
|
|
117
|
+
- [ ] Multi-tenancy respeitado (se aplicável)
|
|
118
|
+
- [ ] Padrões do projeto seguidos (`.dw/rules/`)
|
|
94
119
|
|
|
95
120
|
### Verificação de UI Funcional (para tasks com frontend)
|
|
96
121
|
<critical>Páginas placeholder/stub NÃO são entrega aceitável para RFs de interação do usuário.</critical>
|
|
@@ -147,12 +172,12 @@ git commit -m "feat([modulo]): [descrição concisa]
|
|
|
147
172
|
- Add unit tests"
|
|
148
173
|
```
|
|
149
174
|
|
|
150
|
-
**Nota**: O push será feito apenas no `/
|
|
175
|
+
**Nota**: O push será feito apenas no `/dw-generate-pr` ao final de todas as tasks.
|
|
151
176
|
|
|
152
177
|
<critical>Após completar a tarefa, marque como completa em tasks.md</critical>
|
|
153
178
|
|
|
154
179
|
## Próximos Passos
|
|
155
180
|
|
|
156
|
-
- Se há mais tasks: `/
|
|
157
|
-
- Se última task: `/
|
|
181
|
+
- Se há mais tasks: `/dw-run-task [próxima-task]`
|
|
182
|
+
- Se última task: `/dw-generate-pr [branch-alvo]` (ex: `/dw-generate-pr main`)
|
|
158
183
|
</system_instructions>
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Padrões de Teste Playwright
|
|
2
|
+
|
|
3
|
+
Referência para `/dw-run-qa` e `/dw-functional-doc`. Padrões E2E comuns.
|
|
4
|
+
|
|
5
|
+
## 1. Navegação Autenticada
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { test, expect } from "@playwright/test";
|
|
9
|
+
|
|
10
|
+
test("navegar rota autenticada", async ({ page }) => {
|
|
11
|
+
// Login
|
|
12
|
+
await page.goto("/login");
|
|
13
|
+
await page.getByLabel("Email").fill("user@test.com");
|
|
14
|
+
await page.getByLabel("Senha").fill("password123");
|
|
15
|
+
await page.getByRole("button", { name: "Entrar" }).click();
|
|
16
|
+
|
|
17
|
+
// Aguardar redirect
|
|
18
|
+
await page.waitForURL("/dashboard");
|
|
19
|
+
await expect(page.getByRole("heading", { name: /dashboard/i })).toBeVisible();
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 2. Submissão de Formulário com Validação
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
test("submeter formulário com erros de validação", async ({ page }) => {
|
|
27
|
+
await page.goto("/users/new");
|
|
28
|
+
|
|
29
|
+
// Submeter vazio → erros de validação
|
|
30
|
+
await page.getByRole("button", { name: "Salvar" }).click();
|
|
31
|
+
await expect(page.getByText("Nome é obrigatório")).toBeVisible();
|
|
32
|
+
await expect(page.getByText("Email é obrigatório")).toBeVisible();
|
|
33
|
+
|
|
34
|
+
// Preencher e submeter → sucesso
|
|
35
|
+
await page.getByLabel("Nome").fill("Maria Silva");
|
|
36
|
+
await page.getByLabel("Email").fill("maria@example.com");
|
|
37
|
+
await page.getByRole("button", { name: "Salvar" }).click();
|
|
38
|
+
|
|
39
|
+
await expect(page.getByText("Usuário criado com sucesso")).toBeVisible();
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 3. Tabela com Filtro e Paginação
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
test("filtrar e paginar tabela", async ({ page }) => {
|
|
47
|
+
await page.goto("/users");
|
|
48
|
+
|
|
49
|
+
// Verificar carregamento inicial
|
|
50
|
+
const rows = page.locator("table tbody tr");
|
|
51
|
+
await expect(rows).toHaveCount(10);
|
|
52
|
+
|
|
53
|
+
// Filtrar
|
|
54
|
+
await page.getByPlaceholder("Buscar...").fill("admin");
|
|
55
|
+
await expect(rows).toHaveCount(2);
|
|
56
|
+
|
|
57
|
+
// Limpar e paginar
|
|
58
|
+
await page.getByPlaceholder("Buscar...").clear();
|
|
59
|
+
await page.getByRole("button", { name: "Próxima" }).click();
|
|
60
|
+
await expect(page.getByText("Página 2")).toBeVisible();
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 4. Interação com Modal / Dialog
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
test("abrir modal, preencher e confirmar", async ({ page }) => {
|
|
68
|
+
await page.goto("/projects");
|
|
69
|
+
|
|
70
|
+
// Abrir modal
|
|
71
|
+
await page.getByRole("button", { name: "Novo Projeto" }).click();
|
|
72
|
+
const dialog = page.getByRole("dialog");
|
|
73
|
+
await expect(dialog).toBeVisible();
|
|
74
|
+
|
|
75
|
+
// Preencher formulário do modal
|
|
76
|
+
await dialog.getByLabel("Nome do Projeto").fill("Meu Projeto");
|
|
77
|
+
await dialog.getByRole("button", { name: "Criar" }).click();
|
|
78
|
+
|
|
79
|
+
// Modal fecha, item aparece na lista
|
|
80
|
+
await expect(dialog).not.toBeVisible();
|
|
81
|
+
await expect(page.getByText("Meu Projeto")).toBeVisible();
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 5. Permissão / Acesso Negado
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
test("usuário restrito vê acesso negado", async ({ page }) => {
|
|
89
|
+
// Login como usuário restrito
|
|
90
|
+
await page.goto("/login");
|
|
91
|
+
await page.getByLabel("Email").fill("restricted@test.com");
|
|
92
|
+
await page.getByLabel("Senha").fill("password123");
|
|
93
|
+
await page.getByRole("button", { name: "Entrar" }).click();
|
|
94
|
+
|
|
95
|
+
// Tentar acessar rota admin
|
|
96
|
+
await page.goto("/admin/settings");
|
|
97
|
+
|
|
98
|
+
// Verificar acesso negado
|
|
99
|
+
await expect(page.getByText(/acesso negado|proibido|não autorizado/i)).toBeVisible();
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 6. Tratamento de Erro de API
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
test("trata erro de API graciosamente", async ({ page }) => {
|
|
107
|
+
// Interceptar API para simular erro
|
|
108
|
+
await page.route("**/api/users", (route) =>
|
|
109
|
+
route.fulfill({ status: 500, body: "Internal Server Error" })
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
await page.goto("/users");
|
|
113
|
+
|
|
114
|
+
// Verificar estado de erro
|
|
115
|
+
await expect(page.getByText(/erro|algo deu errado/i)).toBeVisible();
|
|
116
|
+
|
|
117
|
+
// Verificar que botão de retry funciona
|
|
118
|
+
await page.unroute("**/api/users");
|
|
119
|
+
await page.getByRole("button", { name: /tentar novamente/i }).click();
|
|
120
|
+
await expect(page.locator("table tbody tr")).toHaveCount(10);
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Padrão de Captura de Evidência
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
await test.step("Capturar evidência", async () => {
|
|
128
|
+
await page.screenshot({
|
|
129
|
+
path: `evidence/screenshots/${testInfo.title}-${Date.now()}.png`,
|
|
130
|
+
fullPage: true
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
```
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Catálogo de Refatoração — Exemplos Antes/Depois
|
|
2
|
+
|
|
3
|
+
Referência para `/dw-refactoring-analysis`. Baseado no catálogo de Fowler.
|
|
4
|
+
|
|
5
|
+
## 1. Função Longa → Extract Function
|
|
6
|
+
|
|
7
|
+
**Smell:** Função com >15 linhas de lógica, múltiplas responsabilidades.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ ANTES: 30+ linhas fazendo validação, transformação e persistência
|
|
11
|
+
async function processOrder(order: Order) {
|
|
12
|
+
if (!order.items.length) throw new Error("Empty order");
|
|
13
|
+
if (order.total < 0) throw new Error("Invalid total");
|
|
14
|
+
if (!order.customer) throw new Error("No customer");
|
|
15
|
+
|
|
16
|
+
const discount = order.customer.isPremium
|
|
17
|
+
? order.total * 0.1
|
|
18
|
+
: order.total > 100 ? order.total * 0.05 : 0;
|
|
19
|
+
const tax = (order.total - discount) * 0.15;
|
|
20
|
+
const finalTotal = order.total - discount + tax;
|
|
21
|
+
|
|
22
|
+
order.discount = discount;
|
|
23
|
+
order.tax = tax;
|
|
24
|
+
order.total = finalTotal;
|
|
25
|
+
order.status = "processed";
|
|
26
|
+
|
|
27
|
+
await db.orders.update(order.id, order);
|
|
28
|
+
await emailService.send(order.customer.email, "Order processed", { order });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ✅ DEPOIS: Cada função com uma responsabilidade
|
|
32
|
+
async function processOrder(order: Order) {
|
|
33
|
+
validateOrder(order);
|
|
34
|
+
const pricing = calculatePricing(order);
|
|
35
|
+
const processed = applyPricing(order, pricing);
|
|
36
|
+
await persistOrder(processed);
|
|
37
|
+
await notifyCustomer(processed);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 2. Feature Envy → Move Method
|
|
42
|
+
|
|
43
|
+
**Smell:** Função acessa dados de outro objeto mais que os próprios.
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// ❌ ANTES: calculateShipping conhece demais sobre Address
|
|
47
|
+
function calculateShipping(order: Order) {
|
|
48
|
+
const addr = order.address;
|
|
49
|
+
if (addr.country === "BR" && addr.state === "SP") return 5.99;
|
|
50
|
+
if (addr.country === "BR") return 9.99;
|
|
51
|
+
return 19.99 + (addr.isRemote ? 10 : 0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ✅ DEPOIS: Address é dono da lógica de frete
|
|
55
|
+
class Address {
|
|
56
|
+
getShippingCost(): number {
|
|
57
|
+
if (this.country === "BR" && this.state === "SP") return 5.99;
|
|
58
|
+
if (this.country === "BR") return 9.99;
|
|
59
|
+
return 19.99 + (this.isRemote ? 10 : 0);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 3. Obsessão por Primitivos → Value Object
|
|
65
|
+
|
|
66
|
+
**Smell:** Usar strings/números crus para conceitos do domínio (emails, dinheiro, datas).
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ ANTES: email é apenas uma string em todo lugar
|
|
70
|
+
function sendEmail(to: string, subject: string) {
|
|
71
|
+
if (!to.includes("@")) throw new Error("Invalid email");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ✅ DEPOIS: Email é um value object com validação embutida
|
|
75
|
+
class Email {
|
|
76
|
+
constructor(private readonly value: string) {
|
|
77
|
+
if (!value.includes("@")) throw new Error("Invalid email");
|
|
78
|
+
}
|
|
79
|
+
toString() { return this.value; }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function sendEmail(to: Email, subject: string) { /* ... */ }
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 4. Lógica Duplicada → Extrair Utilitário Compartilhado
|
|
86
|
+
|
|
87
|
+
**Smell:** Mesmas 3+ linhas de lógica aparecem em múltiplos locais.
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// ❌ ANTES: formatação de data repetida em 4 componentes
|
|
91
|
+
const formatted = `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,"0")}-${String(date.getDate()).padStart(2,"0")}`;
|
|
92
|
+
|
|
93
|
+
// ✅ DEPOIS: utilitário único
|
|
94
|
+
function formatDate(date: Date): string {
|
|
95
|
+
return date.toISOString().split("T")[0];
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 5. God Component → Dividir por Responsabilidade
|
|
100
|
+
|
|
101
|
+
**Smell:** Componente React com 200+ linhas, múltiplos useEffects, responsabilidades misturadas.
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
// ❌ ANTES: UserDashboard faz fetch, filtragem, renderização e modais
|
|
105
|
+
function UserDashboard() {
|
|
106
|
+
// 50 linhas de state + effects
|
|
107
|
+
// 30 linhas de handlers
|
|
108
|
+
// 120 linhas de JSX com condições inline
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ✅ DEPOIS: container + presentation + hook
|
|
112
|
+
function useUserDashboard() { /* data fetching + state */ }
|
|
113
|
+
function UserFilters({ filters, onChange }) { /* UI de filtros */ }
|
|
114
|
+
function UserTable({ users, onSelect }) { /* UI de tabela */ }
|
|
115
|
+
function UserDashboard() {
|
|
116
|
+
const { users, filters, setFilters } = useUserDashboard();
|
|
117
|
+
return (
|
|
118
|
+
<>
|
|
119
|
+
<UserFilters filters={filters} onChange={setFilters} />
|
|
120
|
+
<UserTable users={users} />
|
|
121
|
+
</>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 6. Condicional Complexa → Strategy Pattern / Early Return
|
|
127
|
+
|
|
128
|
+
**Smell:** Cadeia de if/else aninhados com 4+ branches.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// ❌ ANTES: condicionais aninhadas
|
|
132
|
+
function getPrice(user: User, product: Product) {
|
|
133
|
+
if (user.type === "premium") {
|
|
134
|
+
if (product.category === "electronics") {
|
|
135
|
+
return product.price * 0.8;
|
|
136
|
+
} else {
|
|
137
|
+
return product.price * 0.9;
|
|
138
|
+
}
|
|
139
|
+
} else if (user.type === "wholesale") {
|
|
140
|
+
return product.price * 0.7;
|
|
141
|
+
} else {
|
|
142
|
+
return product.price;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ✅ DEPOIS: mapa de estratégias + early return
|
|
147
|
+
const DISCOUNT_STRATEGIES: Record<string, (p: Product) => number> = {
|
|
148
|
+
premium: (p) => p.category === "electronics" ? 0.8 : 0.9,
|
|
149
|
+
wholesale: () => 0.7,
|
|
150
|
+
standard: () => 1.0,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
function getPrice(user: User, product: Product) {
|
|
154
|
+
const discount = DISCOUNT_STRATEGIES[user.type] ?? DISCOUNT_STRATEGIES.standard;
|
|
155
|
+
return product.price * discount(product);
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Guia de Priorização
|
|
160
|
+
|
|
161
|
+
| Severidade | Critério | Ação |
|
|
162
|
+
|------------|----------|------|
|
|
163
|
+
| **P0 - Crítico** | Risco de segurança, corrupção de dados, contrato de API quebrado | Corrigir imediatamente |
|
|
164
|
+
| **P1 - Alto** | >3 duplicações, god objects, código não-testável | Corrigir no sprint atual |
|
|
165
|
+
| **P2 - Médio** | Funções longas, obsessão por primitivos, feature envy | Agendar para refatoração |
|
|
166
|
+
| **P3 - Baixo** | Problemas menores de naming, pequenas duplicações, estilo | Corrigir oportunisticamente |
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Brainstorm: {{TOPIC}}
|
|
2
|
+
|
|
3
|
+
## Contexto
|
|
4
|
+
|
|
5
|
+
{{CONTEXT_DESCRIPTION}}
|
|
6
|
+
|
|
7
|
+
## Matriz de Opções
|
|
8
|
+
|
|
9
|
+
| Critério | Opção A: {{NAME_A}} | Opção B: {{NAME_B}} | Opção C: {{NAME_C}} |
|
|
10
|
+
|----------|---------------------|---------------------|---------------------|
|
|
11
|
+
| **Abordagem** | | | |
|
|
12
|
+
| **Esforço** | Baixo / Médio / Alto | Baixo / Médio / Alto | Baixo / Médio / Alto |
|
|
13
|
+
| **Risco** | Baixo / Médio / Alto | Baixo / Médio / Alto | Baixo / Médio / Alto |
|
|
14
|
+
| **Escalabilidade** | | | |
|
|
15
|
+
| **Manutenibilidade** | | | |
|
|
16
|
+
| **Dependências** | | | |
|
|
17
|
+
|
|
18
|
+
## Trade-offs
|
|
19
|
+
|
|
20
|
+
### Opção A: {{NAME_A}}
|
|
21
|
+
- **Prós:**
|
|
22
|
+
- **Contras:**
|
|
23
|
+
- **Melhor quando:**
|
|
24
|
+
|
|
25
|
+
### Opção B: {{NAME_B}}
|
|
26
|
+
- **Prós:**
|
|
27
|
+
- **Contras:**
|
|
28
|
+
- **Melhor quando:**
|
|
29
|
+
|
|
30
|
+
### Opção C: {{NAME_C}}
|
|
31
|
+
- **Prós:**
|
|
32
|
+
- **Contras:**
|
|
33
|
+
- **Melhor quando:**
|
|
34
|
+
|
|
35
|
+
## Recomendação
|
|
36
|
+
|
|
37
|
+
**Recomendada:** Opção {{X}}
|
|
38
|
+
|
|
39
|
+
**Justificativa:** {{WHY}}
|
|
40
|
+
|
|
41
|
+
## Próximos Passos
|
|
42
|
+
|
|
43
|
+
- [ ] Validar com stakeholders
|
|
44
|
+
- [ ] Criar PRD: `/dw-create-prd`
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Matriz de Casos
|
|
2
|
+
|
|
3
|
+
| ID | Funcionalidade | Tipo de caso | Pré-condições | Ações | Resultado esperado | Mensagem esperada | Status | Evidência |
|
|
4
|
+
|----|----------------|--------------|---------------|-------|--------------------|-------------------|--------|-----------|
|
|
5
|
+
{{rows}}
|