@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.
Files changed (221) hide show
  1. package/README.md +42 -42
  2. package/bin/dev-workflow.js +6 -4
  3. package/lib/constants.js +42 -40
  4. package/lib/init.js +66 -19
  5. package/package.json +1 -1
  6. package/scaffold/en/commands/{analyze-project.md → dw-analyze-project.md} +69 -40
  7. package/scaffold/en/commands/{brainstorm.md → dw-brainstorm.md} +31 -4
  8. package/scaffold/en/commands/{bugfix.md → dw-bugfix.md} +63 -19
  9. package/scaffold/en/commands/{code-review.md → dw-code-review.md} +38 -15
  10. package/scaffold/en/commands/{commit.md → dw-commit.md} +25 -0
  11. package/scaffold/en/commands/{create-prd.md → dw-create-prd.md} +24 -10
  12. package/scaffold/en/commands/{create-tasks.md → dw-create-tasks.md} +11 -4
  13. package/scaffold/en/commands/{create-techspec.md → dw-create-techspec.md} +38 -11
  14. package/scaffold/en/commands/{deep-research.md → dw-deep-research.md} +18 -17
  15. package/scaffold/en/commands/{fix-qa.md → dw-fix-qa.md} +20 -3
  16. package/scaffold/en/commands/dw-functional-doc.md +276 -0
  17. package/scaffold/en/commands/{generate-pr.md → dw-generate-pr.md} +20 -5
  18. package/scaffold/en/commands/dw-help.md +309 -0
  19. package/scaffold/en/commands/{refactoring-analysis.md → dw-refactoring-analysis.md} +50 -26
  20. package/scaffold/en/commands/{review-implementation.md → dw-review-implementation.md} +25 -6
  21. package/scaffold/en/commands/{run-plan.md → dw-run-plan.md} +21 -6
  22. package/scaffold/en/commands/{run-qa.md → dw-run-qa.md} +32 -13
  23. package/scaffold/en/commands/{run-task.md → dw-run-task.md} +17 -7
  24. package/scaffold/en/references/playwright-patterns.md +136 -0
  25. package/scaffold/en/references/refactoring-catalog.md +167 -0
  26. package/scaffold/en/templates/brainstorm-matrix.md +44 -0
  27. package/scaffold/en/templates/functional-doc/case-matrix.md +5 -0
  28. package/scaffold/en/templates/functional-doc/e2e-runbook.md +3 -0
  29. package/scaffold/en/templates/functional-doc/features.md +3 -0
  30. package/scaffold/en/templates/functional-doc/overview.md +21 -0
  31. package/scaffold/en/templates/functional-doc/playwright.spec.ts.tpl +19 -0
  32. package/scaffold/en/templates/pr-bugfix-template.md +28 -0
  33. package/scaffold/en/templates/qa-test-credentials.md +37 -0
  34. package/scaffold/en/templates/tasks-template.md +1 -1
  35. package/scaffold/en/templates/techspec-template.md +1 -1
  36. package/scaffold/pt-br/commands/{analyze-project.md → dw-analyze-project.md} +94 -44
  37. package/scaffold/pt-br/commands/{brainstorm.md → dw-brainstorm.md} +32 -5
  38. package/scaffold/pt-br/commands/{bugfix.md → dw-bugfix.md} +73 -16
  39. package/scaffold/pt-br/commands/{code-review.md → dw-code-review.md} +80 -17
  40. package/scaffold/pt-br/commands/{commit.md → dw-commit.md} +45 -1
  41. package/scaffold/pt-br/commands/{create-prd.md → dw-create-prd.md} +25 -10
  42. package/scaffold/pt-br/commands/{create-tasks.md → dw-create-tasks.md} +24 -17
  43. package/scaffold/pt-br/commands/{create-techspec.md → dw-create-techspec.md} +40 -13
  44. package/scaffold/pt-br/commands/{deep-research.md → dw-deep-research.md} +19 -11
  45. package/scaffold/pt-br/commands/{fix-qa.md → dw-fix-qa.md} +30 -1
  46. package/scaffold/pt-br/commands/dw-functional-doc.md +276 -0
  47. package/scaffold/pt-br/commands/{generate-pr.md → dw-generate-pr.md} +61 -6
  48. package/scaffold/pt-br/commands/dw-help.md +248 -0
  49. package/scaffold/pt-br/commands/{refactoring-analysis.md → dw-refactoring-analysis.md} +49 -25
  50. package/scaffold/pt-br/commands/{review-implementation.md → dw-review-implementation.md} +53 -5
  51. package/scaffold/pt-br/commands/{run-plan.md → dw-run-plan.md} +100 -12
  52. package/scaffold/pt-br/commands/{run-qa.md → dw-run-qa.md} +93 -18
  53. package/scaffold/pt-br/commands/{run-task.md → dw-run-task.md} +35 -10
  54. package/scaffold/pt-br/references/playwright-patterns.md +133 -0
  55. package/scaffold/pt-br/references/refactoring-catalog.md +166 -0
  56. package/scaffold/pt-br/templates/brainstorm-matrix.md +44 -0
  57. package/scaffold/pt-br/templates/functional-doc/case-matrix.md +5 -0
  58. package/scaffold/pt-br/templates/functional-doc/e2e-runbook.md +3 -0
  59. package/scaffold/pt-br/templates/functional-doc/features.md +3 -0
  60. package/scaffold/pt-br/templates/functional-doc/overview.md +21 -0
  61. package/scaffold/pt-br/templates/functional-doc/playwright.spec.ts.tpl +19 -0
  62. package/scaffold/pt-br/templates/pr-bugfix-template.md +28 -0
  63. package/scaffold/pt-br/templates/qa-test-credentials.md +37 -0
  64. package/scaffold/pt-br/templates/tasks-template.md +2 -2
  65. package/scaffold/pt-br/templates/techspec-template.md +1 -1
  66. package/scaffold/rules-readme.md +3 -3
  67. package/scaffold/scripts/functional-doc/generate-dossier.mjs +821 -0
  68. package/scaffold/scripts/functional-doc/run-playwright-flow.mjs +275 -0
  69. package/scaffold/skills/agent-browser/SKILL.md +750 -0
  70. package/scaffold/skills/agent-browser/references/authentication.md +303 -0
  71. package/scaffold/skills/agent-browser/references/commands.md +295 -0
  72. package/scaffold/skills/agent-browser/references/profiling.md +120 -0
  73. package/scaffold/skills/agent-browser/references/proxy-support.md +194 -0
  74. package/scaffold/skills/agent-browser/references/session-management.md +193 -0
  75. package/scaffold/skills/agent-browser/references/snapshot-refs.md +219 -0
  76. package/scaffold/skills/agent-browser/references/video-recording.md +173 -0
  77. package/scaffold/skills/agent-browser/templates/authenticated-session.sh +105 -0
  78. package/scaffold/skills/agent-browser/templates/capture-workflow.sh +69 -0
  79. package/scaffold/skills/agent-browser/templates/form-automation.sh +62 -0
  80. package/scaffold/skills/humanizer/README.md +143 -0
  81. package/scaffold/skills/humanizer/SKILL.md +488 -0
  82. package/scaffold/skills/humanizer/WARP.md +53 -0
  83. package/scaffold/skills/remotion-best-practices/SKILL.md +61 -0
  84. package/scaffold/skills/remotion-best-practices/rules/3d.md +86 -0
  85. package/scaffold/skills/remotion-best-practices/rules/animations.md +27 -0
  86. package/scaffold/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  87. package/scaffold/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  88. package/scaffold/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  89. package/scaffold/skills/remotion-best-practices/rules/assets.md +78 -0
  90. package/scaffold/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
  91. package/scaffold/skills/remotion-best-practices/rules/audio.md +169 -0
  92. package/scaffold/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
  93. package/scaffold/skills/remotion-best-practices/rules/can-decode.md +75 -0
  94. package/scaffold/skills/remotion-best-practices/rules/charts.md +120 -0
  95. package/scaffold/skills/remotion-best-practices/rules/compositions.md +154 -0
  96. package/scaffold/skills/remotion-best-practices/rules/display-captions.md +184 -0
  97. package/scaffold/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  98. package/scaffold/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
  99. package/scaffold/skills/remotion-best-practices/rules/fonts.md +152 -0
  100. package/scaffold/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  101. package/scaffold/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  102. package/scaffold/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  103. package/scaffold/skills/remotion-best-practices/rules/gifs.md +141 -0
  104. package/scaffold/skills/remotion-best-practices/rules/images.md +134 -0
  105. package/scaffold/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  106. package/scaffold/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  107. package/scaffold/skills/remotion-best-practices/rules/lottie.md +70 -0
  108. package/scaffold/skills/remotion-best-practices/rules/maps.md +412 -0
  109. package/scaffold/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  110. package/scaffold/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  111. package/scaffold/skills/remotion-best-practices/rules/parameters.md +109 -0
  112. package/scaffold/skills/remotion-best-practices/rules/sequencing.md +118 -0
  113. package/scaffold/skills/remotion-best-practices/rules/sfx.md +26 -0
  114. package/scaffold/skills/remotion-best-practices/rules/subtitles.md +36 -0
  115. package/scaffold/skills/remotion-best-practices/rules/tailwind.md +11 -0
  116. package/scaffold/skills/remotion-best-practices/rules/text-animations.md +20 -0
  117. package/scaffold/skills/remotion-best-practices/rules/timing.md +179 -0
  118. package/scaffold/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  119. package/scaffold/skills/remotion-best-practices/rules/transitions.md +197 -0
  120. package/scaffold/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  121. package/scaffold/skills/remotion-best-practices/rules/trimming.md +51 -0
  122. package/scaffold/skills/remotion-best-practices/rules/videos.md +171 -0
  123. package/scaffold/skills/remotion-best-practices/rules/voiceover.md +99 -0
  124. package/scaffold/skills/security-review/LICENSE +22 -0
  125. package/scaffold/skills/security-review/SKILL.md +312 -0
  126. package/scaffold/skills/security-review/infrastructure/docker.md +432 -0
  127. package/scaffold/skills/security-review/languages/javascript.md +388 -0
  128. package/scaffold/skills/security-review/languages/python.md +363 -0
  129. package/scaffold/skills/security-review/references/api-security.md +519 -0
  130. package/scaffold/skills/security-review/references/authentication.md +353 -0
  131. package/scaffold/skills/security-review/references/authorization.md +372 -0
  132. package/scaffold/skills/security-review/references/business-logic.md +443 -0
  133. package/scaffold/skills/security-review/references/cryptography.md +329 -0
  134. package/scaffold/skills/security-review/references/csrf.md +398 -0
  135. package/scaffold/skills/security-review/references/data-protection.md +378 -0
  136. package/scaffold/skills/security-review/references/deserialization.md +410 -0
  137. package/scaffold/skills/security-review/references/error-handling.md +436 -0
  138. package/scaffold/skills/security-review/references/file-security.md +457 -0
  139. package/scaffold/skills/security-review/references/injection.md +259 -0
  140. package/scaffold/skills/security-review/references/logging.md +433 -0
  141. package/scaffold/skills/security-review/references/misconfiguration.md +435 -0
  142. package/scaffold/skills/security-review/references/modern-threats.md +475 -0
  143. package/scaffold/skills/security-review/references/ssrf.md +415 -0
  144. package/scaffold/skills/security-review/references/supply-chain.md +405 -0
  145. package/scaffold/skills/security-review/references/xss.md +336 -0
  146. package/scaffold/skills/vercel-react-best-practices/AGENTS.md +3648 -0
  147. package/scaffold/skills/vercel-react-best-practices/README.md +123 -0
  148. package/scaffold/skills/vercel-react-best-practices/SKILL.md +146 -0
  149. package/scaffold/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  150. package/scaffold/skills/vercel-react-best-practices/rules/_template.md +28 -0
  151. package/scaffold/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  152. package/scaffold/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  153. package/scaffold/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  154. package/scaffold/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  155. package/scaffold/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  156. package/scaffold/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  157. package/scaffold/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  158. package/scaffold/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  159. package/scaffold/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  160. package/scaffold/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  161. package/scaffold/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  162. package/scaffold/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  163. package/scaffold/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  164. package/scaffold/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  165. package/scaffold/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  166. package/scaffold/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  167. package/scaffold/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  168. package/scaffold/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  169. package/scaffold/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  170. package/scaffold/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  171. package/scaffold/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  172. package/scaffold/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  173. package/scaffold/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  174. package/scaffold/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  175. package/scaffold/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  176. package/scaffold/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  177. package/scaffold/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  178. package/scaffold/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  179. package/scaffold/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  180. package/scaffold/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  181. package/scaffold/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  182. package/scaffold/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  183. package/scaffold/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  184. package/scaffold/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  185. package/scaffold/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  186. package/scaffold/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  187. package/scaffold/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  188. package/scaffold/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  189. package/scaffold/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  190. package/scaffold/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  191. package/scaffold/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  192. package/scaffold/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  193. package/scaffold/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  194. package/scaffold/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  195. package/scaffold/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  196. package/scaffold/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  197. package/scaffold/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  198. package/scaffold/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  199. package/scaffold/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  200. package/scaffold/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  201. package/scaffold/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  202. package/scaffold/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  203. package/scaffold/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  204. package/scaffold/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  205. package/scaffold/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  206. package/scaffold/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  207. package/scaffold/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  208. package/scaffold/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  209. package/scaffold/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  210. package/scaffold/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  211. package/scaffold/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  212. package/scaffold/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  213. package/scaffold/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  214. package/scaffold/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  215. package/scaffold/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  216. package/scaffold/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  217. package/scaffold/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  218. package/scaffold/skills/webapp-testing/SKILL.md +133 -0
  219. package/scaffold/skills/webapp-testing/assets/test-helper.js +56 -0
  220. package/scaffold/en/commands/help.md +0 -289
  221. 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 | `ai/spec/prd-minha-feature` |
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: `ai/rules/`
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
- ### 2.5 Verificação de Páginas do Menu (Obrigatório — Executar ANTES dos testes de RF)
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
- ### 3. Testes E2E com Playwright MCP (Obrigatório)
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
- ### 3.1. Matriz mínima obrigatória por requisito
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
- ### 4. Verificações de Acessibilidade (Obrigatório)
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
- ### 5. Verificações Visuais (Obrigatório)
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
- ### 6. Documentação de Bugs (Se encontrar problemas)
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
- ### 7. Relatório de QA (Obrigatório)
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: `ai/spec/prd-[nome-funcionalidade]/prd.md`
10
- - Tech Spec: `ai/spec/prd-[nome-funcionalidade]/techspec.md`
11
- - Tasks: `ai/spec/prd-[nome-funcionalidade]/tasks.md`
12
- - Rules do Projeto: `ai/rules/`
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 (`ai/rules/`)
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** conforme o comando de teste do projeto
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
- - [ ] Padrões do projeto seguidos (`ai/rules/`)
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 `/gerar-pr` ao final de todas as tasks.
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: `/executar-task [próxima-task]`
157
- - Se última task: `/gerar-pr [branch-alvo]` (ex: `/gerar-pr main`)
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}}
@@ -0,0 +1,3 @@
1
+ # Roteiro E2E
2
+
3
+ {{steps}}
@@ -0,0 +1,3 @@
1
+ # Funcionalidades
2
+
3
+ {{features}}