@brunosps00/dev-workflow 0.7.0 → 0.8.1
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 +20 -4
- package/lib/constants.js +8 -0
- package/lib/install-deps.js +13 -0
- package/package.json +1 -1
- package/scaffold/en/commands/dw-deps-audit.md +326 -0
- package/scaffold/en/commands/dw-dockerize.md +321 -0
- package/scaffold/en/commands/dw-find-skills.md +158 -0
- package/scaffold/en/commands/dw-fix-qa.md +34 -13
- package/scaffold/en/commands/dw-help.md +4 -0
- package/scaffold/en/commands/dw-new-project.md +350 -0
- package/scaffold/en/commands/dw-run-qa.md +124 -23
- package/scaffold/en/templates/project-onepager.md +129 -0
- package/scaffold/pt-br/commands/dw-deps-audit.md +326 -0
- package/scaffold/pt-br/commands/dw-dockerize.md +321 -0
- package/scaffold/pt-br/commands/dw-find-skills.md +158 -0
- package/scaffold/pt-br/commands/dw-fix-qa.md +34 -13
- package/scaffold/pt-br/commands/dw-help.md +4 -0
- package/scaffold/pt-br/commands/dw-new-project.md +350 -0
- package/scaffold/pt-br/commands/dw-run-qa.md +124 -23
- package/scaffold/pt-br/templates/project-onepager.md +129 -0
- package/scaffold/skills/api-testing-recipes/SKILL.md +104 -0
- package/scaffold/skills/api-testing-recipes/recipes/dotnet-webapp-factory.md +168 -0
- package/scaffold/skills/api-testing-recipes/recipes/http-rest-client.md +130 -0
- package/scaffold/skills/api-testing-recipes/recipes/pytest-httpx.md +157 -0
- package/scaffold/skills/api-testing-recipes/recipes/rust-reqwest.md +173 -0
- package/scaffold/skills/api-testing-recipes/recipes/supertest-node.md +153 -0
- package/scaffold/skills/api-testing-recipes/references/auth-patterns.md +138 -0
- package/scaffold/skills/api-testing-recipes/references/log-conventions.md +117 -0
- package/scaffold/skills/api-testing-recipes/references/matrix-conventions.md +68 -0
- package/scaffold/skills/api-testing-recipes/references/openapi-driven.md +97 -0
- package/scaffold/skills/docker-compose-recipes/SKILL.md +84 -0
- package/scaffold/skills/docker-compose-recipes/references/compose-composition.md +91 -0
- package/scaffold/skills/docker-compose-recipes/references/env-conventions.md +51 -0
- package/scaffold/skills/docker-compose-recipes/references/healthcheck-patterns.md +54 -0
- package/scaffold/skills/docker-compose-recipes/references/prod-vs-dev.md +85 -0
- package/scaffold/skills/docker-compose-recipes/services/elasticsearch.yml +34 -0
- package/scaffold/skills/docker-compose-recipes/services/jaeger.yml +24 -0
- package/scaffold/skills/docker-compose-recipes/services/localstack.yml +30 -0
- package/scaffold/skills/docker-compose-recipes/services/mailhog.yml +23 -0
- package/scaffold/skills/docker-compose-recipes/services/mailpit.yml +27 -0
- package/scaffold/skills/docker-compose-recipes/services/meilisearch.yml +28 -0
- package/scaffold/skills/docker-compose-recipes/services/memcached.yml +19 -0
- package/scaffold/skills/docker-compose-recipes/services/minio.yml +30 -0
- package/scaffold/skills/docker-compose-recipes/services/mysql.yml +30 -0
- package/scaffold/skills/docker-compose-recipes/services/postgres.yml +30 -0
- package/scaffold/skills/docker-compose-recipes/services/rabbitmq.yml +29 -0
- package/scaffold/skills/docker-compose-recipes/services/redis.yml +25 -0
- package/scaffold/skills/docker-compose-recipes/services/smtp4dev.yml +27 -0
- package/scaffold/skills/docker-compose-recipes/services/traefik.yml +42 -0
- package/scaffold/skills/docker-compose-recipes/services/typesense.yml +25 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
<system_instructions>
|
|
2
|
+
Voce e o lider de bootstrap de workspace do dev-workflow. Sua funcao e pegar um diretorio vazio (ou quase vazio), rodar uma entrevista socratica de stack e produzir um monorepo ou app unico funcional com: (1) os scaffolds de framework certos via tools `create-*` oficiais, (2) um `docker-compose.dev.yml` cobrindo cada dependencia de dev escolhida (db, cache, fila, email, storage, search, observability, proxy), (3) `.env.example`, scripts, `.gitignore`, `.dockerignore`, GitHub Action, README, e (4) um `.dw/rules/index.md` semeado.
|
|
3
|
+
|
|
4
|
+
<critical>Este comando RODA APOS `npx dev-workflow init` ja ter populado o `.dw/`. Se `.dw/commands/` nao existir no diretorio alvo, aborte com: "Rode `npx @brunosps00/dev-workflow init` primeiro, depois reinvoque /dw-new-project."</critical>
|
|
5
|
+
<critical>NUNCA toque arquivos fora do diretorio do novo projeto. A entrevista captura `{{TARGET_DIR}}`; toda escrita fica escopada ali.</critical>
|
|
6
|
+
<critical>A Fase 3 (execucao) so roda apos o usuario aprovar explicitamente o plano apresentado na Fase 2. Sem flag de bypass.</critical>
|
|
7
|
+
<critical>MailHog e o DEFAULT para email-em-dev. O usuario tem que optar OUT explicitamente antes de qualquer outro destino SMTP ser ligado em dev.</critical>
|
|
8
|
+
|
|
9
|
+
## Quando Usar
|
|
10
|
+
|
|
11
|
+
- Comecando um projeto novo de diretorio vazio e voce quer as convencoes do dev-workflow, infra containerizada e CI prontos do dia 1
|
|
12
|
+
- Substituindo o ritual manual de `pnpm create next-app && create vite ...` por uma entrevista guiada que captura o ambiente de dev inteiro
|
|
13
|
+
- Subindo uma sandbox de aprendizado onde voce quer um stack realista (db + cache + email + observability) sem 30 minutos de YAML
|
|
14
|
+
- NAO use para adicionar servicos a um projeto existente — use `/dw-dockerize --audit`
|
|
15
|
+
- NAO use para adicionar app novo dentro de um monorepo existente — outra release vai cobrir isso
|
|
16
|
+
- NAO substitui `/dw-create-prd` — este aqui gera o workspace, nao a spec do produto
|
|
17
|
+
|
|
18
|
+
## Posicao no Pipeline
|
|
19
|
+
|
|
20
|
+
**Predecessor:** `npx dev-workflow init` (rodado de dentro do diretorio alvo) | **Sucessor:** `/dw-create-prd` para a primeira feature, ou `/dw-analyze-project` apos o primeiro commit substancial para enriquecer o `.dw/rules/`
|
|
21
|
+
|
|
22
|
+
## Skills Complementares
|
|
23
|
+
|
|
24
|
+
| Skill | Gatilho |
|
|
25
|
+
|-------|---------|
|
|
26
|
+
| `docker-compose-recipes` | **SEMPRE** — fonte dos blocos de servico validados. Leia o `SKILL.md` e os `services/<nome>.yml` relevantes para cada servico que o usuario escolher |
|
|
27
|
+
| `dw-verify` | **SEMPRE** — emita VERIFICATION REPORT apos cada fase (comandos rodados, exit codes, artefatos criados) |
|
|
28
|
+
| `dw-council` | **Opt-in** — quando uma decisao de stack e de alto impacto e o usuario quer stress-test (ex.: empate Next.js vs T3, ou Postgres vs Mongo). Invoque antes da Fase 2 se o usuario pedir |
|
|
29
|
+
|
|
30
|
+
## Variaveis de Entrada
|
|
31
|
+
|
|
32
|
+
| Variavel | Descricao | Exemplo |
|
|
33
|
+
|----------|-----------|---------|
|
|
34
|
+
| `{{PROJECT_NAME}}` | Slug em kebab-case. Deriva do basename do CWD se nao for passado. Perguntado na Fase 0. | `checkout-v2` |
|
|
35
|
+
| `{{TARGET_DIR}}` | Onde fazer scaffold. Default `.` (CWD). | `.` ou `./checkout-v2` |
|
|
36
|
+
|
|
37
|
+
## Localizacao dos Arquivos
|
|
38
|
+
|
|
39
|
+
- One-pager do projeto: `.dw/spec/projects/{{PROJECT_NAME}}.md` (usa `.dw/templates/project-onepager.md`)
|
|
40
|
+
- Relatorio final: `.dw/spec/projects/{{PROJECT_NAME}}-bootstrap.md`
|
|
41
|
+
- Rules semeadas: `.dw/rules/index.md` (minimo, depois substituido/enriquecido por `/dw-analyze-project`)
|
|
42
|
+
- Receitas de compose: `.agents/skills/docker-compose-recipes/services/*.yml`
|
|
43
|
+
|
|
44
|
+
## Comportamento Obrigatorio — Pipeline
|
|
45
|
+
|
|
46
|
+
Execute as fases em ordem. A Fase 3 so roda apos a aprovacao do usuario no fim da Fase 2.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Fase 0 — Pre-flight
|
|
51
|
+
|
|
52
|
+
1. Verifique se `.dw/commands/` existe em `{{TARGET_DIR}}`. Se nao, aborte com a mensagem acima.
|
|
53
|
+
2. Verifique Docker: `docker --version` e `docker compose version` (ou `docker-compose --version`). Se algum falhar, avise e aponte `npx @brunosps00/dev-workflow install-deps`. NAO aborte — o usuario pode querer um `--dry-run` mesmo sem Docker.
|
|
54
|
+
3. Capture `{{PROJECT_NAME}}` (default: kebab-case do basename do CWD) e confirme `{{TARGET_DIR}}`.
|
|
55
|
+
4. Confirme que o diretorio alvo esta vazio ou contem so `.dw/`, `.git/`, `.agents/`, `.claude/`, `.opencode/`. Se houver outros arquivos, liste e pergunte se procede (qualquer outra coisa pode sobrescrever codigo do usuario).
|
|
56
|
+
|
|
57
|
+
Emita VERIFICATION REPORT da Fase 0 (versao do Docker capturada, estado do diretorio).
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### Fase 1 — Entrevista Ampla de Stack
|
|
62
|
+
|
|
63
|
+
Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **camadas**, nao tudo de uma vez. Cada camada gateia a proxima.
|
|
64
|
+
|
|
65
|
+
#### Camada A — Forma do projeto
|
|
66
|
+
|
|
67
|
+
1. **Forma**: frontend / backend / fullstack
|
|
68
|
+
2. **Linguagem(s)**: TypeScript/JavaScript, Python, C#, Rust (por app)
|
|
69
|
+
3. **Framework por camada** (lista curada — recuse fora dela):
|
|
70
|
+
- **Frontend**: Next.js (app router), Vite + React (template TS)
|
|
71
|
+
- **Backend**: FastAPI (Python), ASP.NET Core minimal API (C#), Axum (Rust), Fastify (Node TS)
|
|
72
|
+
- **Fullstack** (bundle unico): T3 stack (Next.js + tRPC + Prisma + NextAuth), ou Next.js front + FastAPI back (apps separados em monorepo)
|
|
73
|
+
4. **Package manager** (SEM default — perguntar explicitamente):
|
|
74
|
+
- Node: npm / pnpm / yarn
|
|
75
|
+
- Python: poetry / uv / pip + venv
|
|
76
|
+
- .NET: dotnet (built-in)
|
|
77
|
+
- Rust: cargo (built-in)
|
|
78
|
+
5. **Se fullstack** — orchestrator do monorepo (SEM default — perguntar): pnpm workspaces, npm workspaces, Turborepo, Nx
|
|
79
|
+
|
|
80
|
+
#### Camada B — Infra (so pergunte o que cabe na forma)
|
|
81
|
+
|
|
82
|
+
6. **Database**: Postgres / MySQL / SQLite (arquivo, sem service) / MongoDB (fora do escopo dos compose recipes — anote e siga sem service se escolhido) / nenhum
|
|
83
|
+
7. **Cache**: Redis / Memcached / nenhum
|
|
84
|
+
8. **Fila / message broker**: BullMQ (so Node), Celery (so Python), RabbitMQ (qualquer), LocalStack SQS (qualquer), nenhum. Se escolheu, pergunte tambem se vai ter workers async.
|
|
85
|
+
9. **Email — captura em dev** (default: **MailHog**, so pergunte se quer override): MailHog / Mailpit / smtp4dev / pular
|
|
86
|
+
10. **Email — destino em prod** (so pergunte se quer email): SMTP relay / SendGrid / Resend / Postmark / SES / pular
|
|
87
|
+
11. **Object storage**: S3 (real, sem service) / MinIO (dev) / GCS (sem service) / nenhum
|
|
88
|
+
12. **Search**: Meilisearch / Typesense / Elasticsearch / nenhum
|
|
89
|
+
13. **Observability — tracing**: Sentry SDK so (sem service no compose) / OTel + Jaeger all-in-one (service no compose) / nenhum
|
|
90
|
+
14. **Reverse proxy / TLS dev**: Traefik / Caddy (sem recipe ainda — anote como manual) / nenhum
|
|
91
|
+
15. **Scheduler**: cron-em-container, node-cron (so Node), Celery beat (so Python), nenhum
|
|
92
|
+
|
|
93
|
+
#### Camada C — Tooling
|
|
94
|
+
|
|
95
|
+
16. **Auth** (so pergunte se aplicavel ao stack):
|
|
96
|
+
- Next.js: NextAuth / Lucia / Clerk / JWT custom / nenhum
|
|
97
|
+
- FastAPI: fastapi-users / authlib / JWT custom / nenhum
|
|
98
|
+
- ASP.NET: Identity built-in / IdentityServer / JWT custom / nenhum
|
|
99
|
+
- Axum: tower-cookies + jsonwebtoken / custom / nenhum
|
|
100
|
+
17. **Linter / formatter**:
|
|
101
|
+
- TS/JS: Biome / ESLint + Prettier
|
|
102
|
+
- Python: Ruff + Black / Ruff so
|
|
103
|
+
- C#: dotnet format
|
|
104
|
+
- Rust: rustfmt + clippy (default)
|
|
105
|
+
18. **CI**: GitHub Actions (sempre seed; usuario pode optar OUT)
|
|
106
|
+
|
|
107
|
+
Guarde todas as respostas para a Fase 2.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### Fase 2 — One-Pager + Plano + Gate de Aprovacao
|
|
112
|
+
|
|
113
|
+
1. Renderize `.dw/spec/projects/{{PROJECT_NAME}}.md` a partir de `.dw/templates/project-onepager.md`. Preencha tudo: forma, linguagens, frameworks, tabela de servicos (nome + porta + credencial default), diagrama da arquitetura (ASCII), lista de arquivos a gerar, perguntas em aberto.
|
|
114
|
+
2. Monte o plano:
|
|
115
|
+
- Comandos a rodar (em ordem, com argumentos)
|
|
116
|
+
- Arquivos a criar (paths sob `{{TARGET_DIR}}`)
|
|
117
|
+
- Tempo estimado
|
|
118
|
+
- Riscos (ex.: "T3 cria `.git/` mesmo com `--noGit` em versoes antigas; reinicializamos")
|
|
119
|
+
3. Apresente o plano e peca confirmacao. Use `AskUserQuestion` com opcoes: **prosseguir**, **ajustar respostas** (volta para Fase 1 com respostas atuais preenchidas), **dry-run** (so escreve one-pager), **abortar**.
|
|
120
|
+
4. Se **prosseguir**: vai para Fase 3.
|
|
121
|
+
Se **dry-run** ou **abortar**: escreve relatorio (Fase 4 com `status: PLANNED`) e para.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### Fase 3 — Execucao Guiada
|
|
126
|
+
|
|
127
|
+
Rode nesta ordem. Cada passo emite seu mini-VERIFICATION block.
|
|
128
|
+
|
|
129
|
+
#### 3.1 Bootstrap dos apps via tools `create-*` oficiais
|
|
130
|
+
|
|
131
|
+
| Escolha de stack | Comando (nao-interativo) |
|
|
132
|
+
|------------------|---------------------------|
|
|
133
|
+
| Next.js | `pnpm create next-app@latest <dir> --ts --tailwind --eslint --app --import-alias '@/*' --use-pnpm --no-git` |
|
|
134
|
+
| Vite + React | `pnpm create vite@latest <dir> --template react-ts` |
|
|
135
|
+
| T3 | `pnpm dlx create-t3-app@latest <dir> --noGit --CI --tailwind --trpc --prisma --nextAuth --appRouter` |
|
|
136
|
+
| Fastify | `pnpm create fastify@latest <dir>` (corte prompts interativos; se nenhuma flag servir, gere a estrutura inline com `src/server.ts` + `src/routes/` + `package.json`) |
|
|
137
|
+
| FastAPI | SEM `create-*` oficial. Gere inline: `pyproject.toml` (com o package manager escolhido), `app/{routers,models,schemas,deps}/`, `app/main.py`, esqueleto de `tests/` |
|
|
138
|
+
| ASP.NET Core | `dotnet new webapi -n <name> --use-minimal-apis --auth None` (use `--auth Individual` se Identity foi escolhido) |
|
|
139
|
+
| Axum | `cargo new <name> --bin` e adicione no `Cargo.toml`: axum, tokio (full features), tower, tower-http, serde, anyhow |
|
|
140
|
+
|
|
141
|
+
Ajuste a flag de package manager para a escolha do usuario (ex.: `--use-npm`, `--use-yarn`).
|
|
142
|
+
|
|
143
|
+
Para **fullstack-T3**: e so isso (T3 entrega tudo numa arvore so).
|
|
144
|
+
|
|
145
|
+
Para **fullstack-NextJS+FastAPI**: rode dois scaffolds, depois mova para `apps/web/` e `apps/api/`.
|
|
146
|
+
|
|
147
|
+
#### 3.2 Compor monorepo (so se fullstack)
|
|
148
|
+
|
|
149
|
+
Se fullstack:
|
|
150
|
+
1. Mova os apps scaffoldados para `apps/<nome>/`.
|
|
151
|
+
2. Crie `pnpm-workspace.yaml` (ou equivalente), `package.json` raiz com scripts de workspace, `tsconfig.base.json` se TS config compartilhado.
|
|
152
|
+
3. Se o usuario escolheu Turborepo: adicione `turbo.json` com pipelines `dev`, `build`, `lint`, `test`.
|
|
153
|
+
4. Se o usuario escolheu Nx: rode `pnpm dlx nx@latest init` apos os apps estarem no lugar; integre como projetos Nx.
|
|
154
|
+
|
|
155
|
+
#### 3.3 Gerar `docker-compose.dev.yml`
|
|
156
|
+
|
|
157
|
+
1. Leia `.agents/skills/docker-compose-recipes/SKILL.md` e os `services/<nome>.yml` relevantes.
|
|
158
|
+
2. Aplique o algoritmo de merge de `references/compose-composition.md`:
|
|
159
|
+
- Concatene blocos sob `services:`.
|
|
160
|
+
- Agregue volumes nomeados sob `volumes:`.
|
|
161
|
+
- Resolva colisoes de porta se houver.
|
|
162
|
+
- Adicione o(s) service(s) do app no fim (build context = `apps/<nome>` ou raiz, Dockerfile.dev, env_file, volumes, depends_on com `condition: service_healthy` segundo `references/healthcheck-patterns.md`).
|
|
163
|
+
3. Adicione header: `# Generated by /dw-new-project on YYYY-MM-DD`.
|
|
164
|
+
|
|
165
|
+
#### 3.4 Gerar `.env.example`
|
|
166
|
+
|
|
167
|
+
Consolide cada env var referenciada pelos servicos selecionados (segundo `references/env-conventions.md`). Agrupe por servico. Sempre inclua as URLs derivadas do lado da app (`DATABASE_URL`, `REDIS_URL`, `AMQP_URL`, `SMTP_HOST`/`SMTP_PORT`, `AWS_ENDPOINT_URL`, etc.).
|
|
168
|
+
|
|
169
|
+
#### 3.5 Gerar scripts
|
|
170
|
+
|
|
171
|
+
No `package.json` raiz (ou `Makefile` se sem Node):
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"scripts": {
|
|
176
|
+
"dev:up": "docker compose -f docker-compose.dev.yml up -d",
|
|
177
|
+
"dev:down": "docker compose -f docker-compose.dev.yml down",
|
|
178
|
+
"dev:logs": "docker compose -f docker-compose.dev.yml logs -f",
|
|
179
|
+
"dev:reset": "docker compose -f docker-compose.dev.yml down -v && pnpm dev:up",
|
|
180
|
+
"dev:db:migrate": "<comando de migrate especifico do stack>"
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Adapte o `dev:db:migrate` por ORM (Prisma: `pnpm prisma migrate dev`; Alembic: `alembic upgrade head`; EF: `dotnet ef database update`; SQLx: `sqlx migrate run`).
|
|
186
|
+
|
|
187
|
+
#### 3.6 Gerar `.gitignore` e `.dockerignore`
|
|
188
|
+
|
|
189
|
+
Por stack, anexe ao que `create-*` gerou:
|
|
190
|
+
- `.gitignore` deve excluir `.env`.
|
|
191
|
+
- Inclua `.dw/spec/`, `.planning/` se o usuario tambem usa GSD.
|
|
192
|
+
- `.dockerignore`: exclua `.git`, `node_modules`, `.dw`, `.agents`, `tests`, `*.md` (em imagens prod).
|
|
193
|
+
|
|
194
|
+
#### 3.7 Gerar GitHub Actions CI
|
|
195
|
+
|
|
196
|
+
`.github/workflows/ci.yml` com matrix por app: instalar deps, rodar linter, rodar testes. Pule se `--no-ci`.
|
|
197
|
+
|
|
198
|
+
#### 3.8 Semear `.dw/rules/index.md`
|
|
199
|
+
|
|
200
|
+
Scaffold minimo:
|
|
201
|
+
|
|
202
|
+
```markdown
|
|
203
|
+
# Project Rules — {{PROJECT_NAME}}
|
|
204
|
+
|
|
205
|
+
> Auto-gerado por /dw-new-project em YYYY-MM-DD. Rode /dw-analyze-project apos primeiro commit substancial para enriquecer.
|
|
206
|
+
|
|
207
|
+
## Stack
|
|
208
|
+
|
|
209
|
+
| Camada | Escolha |
|
|
210
|
+
|--------|---------|
|
|
211
|
+
| Forma | <frontend|backend|fullstack> |
|
|
212
|
+
| Frontend | <framework ou n/a> |
|
|
213
|
+
| Backend | <framework ou n/a> |
|
|
214
|
+
| Database | <db ou n/a> |
|
|
215
|
+
| Cache | <cache ou n/a> |
|
|
216
|
+
| Fila | <fila ou n/a> |
|
|
217
|
+
| Email (dev) | <mailhog|mailpit|smtp4dev|nenhum> |
|
|
218
|
+
| Search | <search ou n/a> |
|
|
219
|
+
| Observability | <observability ou n/a> |
|
|
220
|
+
| Reverse proxy | <traefik|nenhum> |
|
|
221
|
+
| Auth | <auth ou n/a> |
|
|
222
|
+
| Linter | <linter> |
|
|
223
|
+
| Package manager | <pm> |
|
|
224
|
+
| Monorepo orchestrator | <se fullstack> |
|
|
225
|
+
|
|
226
|
+
## Servicos no docker-compose.dev.yml
|
|
227
|
+
|
|
228
|
+
(tabela dos servicos selecionados com portas e credenciais default)
|
|
229
|
+
|
|
230
|
+
## Convencoes
|
|
231
|
+
|
|
232
|
+
- Veja `.dw/rules/<modulo>.md` apos o `/dw-analyze-project` rodar.
|
|
233
|
+
- Email em dev usa MailHog por default; o app NUNCA envia email real em dev.
|
|
234
|
+
- Toda env var vive em `.env` (gitignored); `.env.example` e o template.
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
#### 3.9 README.md
|
|
238
|
+
|
|
239
|
+
Gere um README inicial:
|
|
240
|
+
- Nome do projeto + 1 linha de proposito
|
|
241
|
+
- Quick Start (`cp .env.example .env && pnpm install && pnpm dev:up`)
|
|
242
|
+
- Local Dev (tabela de portas dos servicos selecionados + URLs das UIs + credenciais default)
|
|
243
|
+
- Diagrama da arquitetura (ASCII do one-pager)
|
|
244
|
+
- Layout do projeto (arvore dos diretorios top-level)
|
|
245
|
+
- Integracao com dev-workflow (mencione `/dw-create-prd`, `/dw-run-task`, `/dw-run-qa`, `/dw-deps-audit`, `/dw-security-check`)
|
|
246
|
+
|
|
247
|
+
Se `create-*` ja gerou README, **anexe** sob "## Local Dev"; nao sobrescreva.
|
|
248
|
+
|
|
249
|
+
#### 3.10 Commit inicial (opcional)
|
|
250
|
+
|
|
251
|
+
Se `--no-git` NAO foi passado e nao tem `.git/` ainda:
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
git init -b main
|
|
255
|
+
git add -A
|
|
256
|
+
git commit -m "chore: scaffold via /dw-new-project (0.8.0)"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Se ja tem `.git/` (algum `create-*` ignorou `--noGit`), so apague com confirmacao explicita do usuario.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
### Fase 4 — Relatorio Final
|
|
264
|
+
|
|
265
|
+
Escreva `.dw/spec/projects/{{PROJECT_NAME}}-bootstrap.md`:
|
|
266
|
+
|
|
267
|
+
```markdown
|
|
268
|
+
---
|
|
269
|
+
type: project-bootstrap
|
|
270
|
+
schema_version: "1.0"
|
|
271
|
+
status: <SCAFFOLDED | PARTIAL | PLANNED | ABORTED>
|
|
272
|
+
date: YYYY-MM-DD
|
|
273
|
+
shape: <frontend|backend|fullstack>
|
|
274
|
+
languages: [typescript, python, ...]
|
|
275
|
+
frameworks: { web: '...', api: '...' }
|
|
276
|
+
services: [postgres, redis, mailhog, ...]
|
|
277
|
+
package_manager: <pnpm|npm|yarn|poetry|uv|cargo|dotnet>
|
|
278
|
+
monorepo: <pnpm-workspaces|turborepo|nx|none>
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
# Bootstrap Report — {{PROJECT_NAME}}
|
|
282
|
+
|
|
283
|
+
## Status: <STATUS>
|
|
284
|
+
|
|
285
|
+
<paragrafo de resumo>
|
|
286
|
+
|
|
287
|
+
## VERIFICATION REPORT
|
|
288
|
+
<Fase 0 | Fase 1 | Fase 3.1-3.10 — comandos rodados com exit codes e paths dos artefatos>
|
|
289
|
+
|
|
290
|
+
## Respostas da Entrevista
|
|
291
|
+
<Camadas A/B/C em tabela>
|
|
292
|
+
|
|
293
|
+
## Arquivos Criados
|
|
294
|
+
| Path | Bytes | Gerado por |
|
|
295
|
+
|------|-------|------------|
|
|
296
|
+
| ... | ... | ... |
|
|
297
|
+
|
|
298
|
+
## Servicos Compostos
|
|
299
|
+
<tabela de servicos com porta + URL UI + credenciais default, vinda de .agents/skills/docker-compose-recipes/>
|
|
300
|
+
|
|
301
|
+
## Proximos Passos
|
|
302
|
+
1. `cp .env.example .env` e revise credenciais.
|
|
303
|
+
2. `pnpm install` (ou seu package manager).
|
|
304
|
+
3. `pnpm dev:up` para subir todos os servicos. Aguarde os healthchecks.
|
|
305
|
+
4. Abra a UI do MailHog em http://localhost:8025 para confirmar a captura de email.
|
|
306
|
+
5. `/dw-create-prd` para a primeira feature.
|
|
307
|
+
6. Apos o primeiro commit substancial, rode `/dw-analyze-project` para enriquecer `.dw/rules/`.
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Flags
|
|
311
|
+
|
|
312
|
+
| Flag | Comportamento |
|
|
313
|
+
|------|---------------|
|
|
314
|
+
| (default) | Roda fases 0 → 4 com gate humano no fim da Fase 2 |
|
|
315
|
+
| `--dry-run` | Roda fases 0 → 2, escreve so o one-pager e o relatorio (`status: PLANNED`), NAO executa Fase 3 |
|
|
316
|
+
| `--no-git` | Pula o commit inicial da Fase 3.10 |
|
|
317
|
+
| `--no-ci` | Pula o GitHub Action da Fase 3.7 |
|
|
318
|
+
|
|
319
|
+
## Regras Criticas
|
|
320
|
+
|
|
321
|
+
- <critical>NUNCA pule o gate de aprovacao da Fase 2. Se rodando em contexto nao-interativo, aborte com: "/dw-new-project exige aprovacao interativa; rerode com --dry-run para so planejar."</critical>
|
|
322
|
+
- <critical>NUNCA rode tools `create-*` fora de `{{TARGET_DIR}}`. CWD de cada comando e o target dir.</critical>
|
|
323
|
+
- <critical>Se MailHog/Mailpit/smtp4dev foi selecionado, NUNCA tambem ligue um SMTP real em dev. O compose de dev SEMPRE captura.</critical>
|
|
324
|
+
- <critical>Se uma tool `create-*` falha, PARE. Nao siga para gerar compose — scaffold parcial confunde os comandos seguintes.</critical>
|
|
325
|
+
- NAO pin de versao SDK Node/Python/.NET/Rust dentro do projeto a nao ser que o usuario peca; use `package.json` engines / `pyproject.toml` / `global.json` / `rust-toolchain.toml` para indicar intencao sem forcar.
|
|
326
|
+
- NAO baked secrets em arquivo gerado. `.env.example` so com defaults de dev; valor real fica em `.env` nao versionado.
|
|
327
|
+
|
|
328
|
+
## Tratamento de Erros
|
|
329
|
+
|
|
330
|
+
- Docker faltando → avise na Fase 0, permita `--dry-run`; aborte execucao com instrucoes de instalacao.
|
|
331
|
+
- Tool `create-*` indisponivel (registry npm fora) → aborte o bootstrap com o comando exato + exit code; NAO faca scaffold parcial.
|
|
332
|
+
- Usuario escolhe MongoDB → anote "Recipe MongoDB nao bundled na v0.8.0; vamos adicionar deps de app mas voce vai precisar ligar o servico manualmente". Continue.
|
|
333
|
+
- Usuario escolhe Caddy → idem: anote como nao bundled; siga sem servico no compose.
|
|
334
|
+
- Porta ja ocupada no host → sugira a env var de override e siga; nao escolha outra porta em silencio.
|
|
335
|
+
- Working tree contem arquivos fora do conjunto permitido → liste e pergunte explicitamente antes de prosseguir.
|
|
336
|
+
|
|
337
|
+
## Integracao com Outros dw-* Commands
|
|
338
|
+
|
|
339
|
+
- **`npx dev-workflow init`** e predecessor obrigatorio. Ordem: `init` → `/dw-new-project` → `/dw-create-prd`.
|
|
340
|
+
- **`/dw-create-prd`** e o proximo passo sugerido apos bootstrap bem-sucedido.
|
|
341
|
+
- **`/dw-analyze-project`** deve rodar apos primeiro commit substancial para enriquecer `.dw/rules/` — o bootstrap deixa um seed minimo.
|
|
342
|
+
- **`/dw-deps-audit --scan-only`** pode rodar logo apos o bootstrap para confirmar que nenhum dep vulneravel veio dos templates `create-*`.
|
|
343
|
+
- **`/dw-security-check`** roda como parte do pipeline de PRD apos a primeira feature aterrissar.
|
|
344
|
+
- **`/dw-dockerize`** e o comando irmao para retrofit de Docker em projeto existente que nao comecou com este aqui.
|
|
345
|
+
|
|
346
|
+
## Inspirado em
|
|
347
|
+
|
|
348
|
+
`dw-new-project` e dev-workflow-native. O padrao de entrevista herda do `/dw-create-prd` (clarificacao socratica, branching condicional por artefato anterior). A disciplina de execucao (verification por fase, gate atomico antes de mutar) herda do `/dw-deps-audit` e `/dw-security-check`. A logica de composicao do compose esta delegada para a skill bundled `docker-compose-recipes`. A filosofia de "wrap a tool oficial" foi confirmada via `/dw-find-skills` contra o ecossistema `npx skills` em 2026-04-28 — nada la matchava "entrevista + scaffold multi-stack + compose dev" em qualidade suficiente.
|
|
349
|
+
|
|
350
|
+
</system_instructions>
|
|
@@ -9,7 +9,7 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
9
9
|
## Posição no Pipeline
|
|
10
10
|
**Antecessor:** `/dw-run-plan` ou `/dw-run-task` | **Sucessor:** `/dw-code-review` (auto-fixes bugs internally before completing)
|
|
11
11
|
|
|
12
|
-
<critical>
|
|
12
|
+
<critical>Em modo UI, use o Playwright MCP para todos os testes E2E. Em modo API (sem UI no projeto OU flag `--api`), use a skill bundled `api-testing-recipes` para gerar scripts `.http` / pytest+httpx / supertest / WebApplicationFactory / reqwest e capturar logs de request/response como evidência.</critical>
|
|
13
13
|
<critical>Verifique TODOS os requisitos do PRD e TechSpec antes de aprovar</critical>
|
|
14
14
|
<critical>O QA NÃO está completo até que TODAS as verificações passem</critical>
|
|
15
15
|
<critical>Documente TODOS os bugs encontrados com screenshots de evidência</critical>
|
|
@@ -20,9 +20,10 @@ Você é um assistente IA especializado em Quality Assurance. Sua tarefa é vali
|
|
|
20
20
|
|
|
21
21
|
Quando disponíveis no projeto em `./.agents/skills/`, use estas skills como apoio operacional sem substituir este comando:
|
|
22
22
|
|
|
23
|
-
- `webapp-testing`: apoio para estruturar fluxos de teste, retestes, screenshots e logs quando complementar ao Playwright MCP
|
|
24
|
-
- `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
|
|
25
|
-
- `ui-ux-pro-max`: use quando validar consistência de design, paletas de cores, tipografia, espaçamento e hierarquia visual contra padrões da indústria
|
|
23
|
+
- `webapp-testing`: (modo UI) apoio para estruturar fluxos de teste, retestes, screenshots e logs quando complementar ao Playwright MCP
|
|
24
|
+
- `vercel-react-best-practices`: (modo UI) 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
|
|
25
|
+
- `ui-ux-pro-max`: (modo UI) use quando validar consistência de design, paletas de cores, tipografia, espaçamento e hierarquia visual contra padrões da indústria
|
|
26
|
+
- `api-testing-recipes`: **(modo API — SEMPRE)** snippets validados para `.http`, pytest+httpx, supertest, WebApplicationFactory, reqwest. Compõe um arquivo de teste por RF em `QA/scripts/api/` e logs JSONL em `QA/logs/api/` segundo seus references
|
|
26
27
|
|
|
27
28
|
## Ferramentas de Análise
|
|
28
29
|
|
|
@@ -38,12 +39,13 @@ Quando disponíveis no projeto em `./.agents/skills/`, use estas skills como apo
|
|
|
38
39
|
## Objetivos
|
|
39
40
|
|
|
40
41
|
1. Validar implementação contra PRD, TechSpec e Tasks
|
|
41
|
-
2.
|
|
42
|
-
3.
|
|
43
|
-
4.
|
|
44
|
-
5.
|
|
45
|
-
6.
|
|
46
|
-
7.
|
|
42
|
+
2. **Detectar modo** (UI vs API-only) e escolher o caminho de execução certo
|
|
43
|
+
3. Executar testes E2E via Playwright MCP (modo UI) OU via skill `api-testing-recipes` (modo API)
|
|
44
|
+
4. Cobrir cenários positivos, negativos, limites e regressões relevantes
|
|
45
|
+
5. Verificar acessibilidade (modo UI = WCAG 2.2; modo API = formato de erro e contratos de superfície)
|
|
46
|
+
6. Realizar verificações visuais (somente modo UI — pulado em modo API)
|
|
47
|
+
7. Documentar bugs encontrados
|
|
48
|
+
8. Gerar relatório final de QA
|
|
47
49
|
|
|
48
50
|
## Localização dos Arquivos
|
|
49
51
|
|
|
@@ -56,10 +58,13 @@ Quando disponíveis no projeto em `./.agents/skills/`, use estas skills como apo
|
|
|
56
58
|
- Pasta de evidências QA (obrigatória): `{{PRD_PATH}}/QA/`
|
|
57
59
|
- Relatório de Saída: `{{PRD_PATH}}/QA/qa-report.md`
|
|
58
60
|
- Bugs encontrados: `{{PRD_PATH}}/QA/bugs.md`
|
|
59
|
-
- Screenshots: `{{PRD_PATH}}/QA/screenshots/`
|
|
60
|
-
- Logs (console/rede): `{{PRD_PATH}}/QA/logs/`
|
|
61
|
-
-
|
|
61
|
+
- Screenshots (modo UI): `{{PRD_PATH}}/QA/screenshots/`
|
|
62
|
+
- Logs — UI (console/rede): `{{PRD_PATH}}/QA/logs/`
|
|
63
|
+
- Logs — API (JSONL request/response): `{{PRD_PATH}}/QA/logs/api/`
|
|
64
|
+
- Scripts de teste Playwright (modo UI): `{{PRD_PATH}}/QA/scripts/`
|
|
65
|
+
- Scripts de teste API (modo API — `.http` / pytest+httpx / supertest / etc.): `{{PRD_PATH}}/QA/scripts/api/`
|
|
62
66
|
- Checklist consolidado: `{{PRD_PATH}}/QA/checklist.md`
|
|
67
|
+
- Receitas de API testing (skill): `.agents/skills/api-testing-recipes/`
|
|
63
68
|
|
|
64
69
|
## Contexto Multi-Projeto
|
|
65
70
|
|
|
@@ -74,6 +79,43 @@ Consulte `.dw/rules/` para URLs e frameworks específicos do projeto.
|
|
|
74
79
|
|
|
75
80
|
## Etapas do Processo
|
|
76
81
|
|
|
82
|
+
### 0. Detecção de Modo (UI vs API) — Obrigatório PRIMEIRO
|
|
83
|
+
|
|
84
|
+
Decida se o projeto tem UI testável ou e API-only antes de qualquer setup de browser/API. O modo escolhido dirige todas as etapas seguintes.
|
|
85
|
+
|
|
86
|
+
**Auto-detecção (mesma matriz usada por `/dw-dockerize`):**
|
|
87
|
+
|
|
88
|
+
| Sinal | Modo UI | Modo API |
|
|
89
|
+
|-------|---------|----------|
|
|
90
|
+
| `package.json` deps | `next`, `vite`, `react`, `vue`, `svelte`, `@angular/*`, `nuxt`, `astro`, `solid-js`, `remix` | nenhum dos acima |
|
|
91
|
+
| `pyproject.toml` / `requirements*.txt` | `jinja2`, `django` (full), `flask` + `flask_login`/`render_template` | `fastapi`, `flask` (so JSON), `starlette`, `litestar` |
|
|
92
|
+
| `*.csproj` | `Microsoft.AspNetCore.Mvc`, Razor, Blazor | `Microsoft.AspNetCore.Mvc.Core` so, templates de minimal API |
|
|
93
|
+
| `Cargo.toml` | `yew`, `leptos`, `dioxus`, `sycamore` | `axum`, `actix-web`, `rocket`, `warp` (sem template engine) |
|
|
94
|
+
|
|
95
|
+
Se NENHUM sinal de UI bater → **modo API**. Se pelo menos um bate → **modo UI** (default).
|
|
96
|
+
|
|
97
|
+
**Override manual (flags):**
|
|
98
|
+
|
|
99
|
+
- `--api` força modo API (útil para rodar testes API headless dentro de um projeto fullstack onde a UI nao importa nesta rodada).
|
|
100
|
+
- `--ui` força modo UI (gera erro claro se nenhuma dep de UI for detectada — evita rodar testes de browser contra repo backend-only sem querer).
|
|
101
|
+
- `--from-openapi <path-or-url>` adiciona baseline OpenAPI em cima do modo API (veja `.agents/skills/api-testing-recipes/references/openapi-driven.md`).
|
|
102
|
+
|
|
103
|
+
**Efeito nas etapas seguintes:**
|
|
104
|
+
|
|
105
|
+
| Etapa | Modo UI | Modo API |
|
|
106
|
+
|-------|---------|----------|
|
|
107
|
+
| 2 — Preparação do Ambiente | Playwright + browser setup completo | Setup de cliente API, sem browser; cria `QA/scripts/api/` e `QA/logs/api/` |
|
|
108
|
+
| 3 — Verificação de Páginas do Menu | obrigatório, bloqueante | **pulado** |
|
|
109
|
+
| 4 — Testes E2E | Playwright MCP | skill `api-testing-recipes` (recipe por stack) |
|
|
110
|
+
| 5 — Acessibilidade | WCAG 2.2 com browser tools | checks de superfície API (formato de erro, semântica de status, detecção de leak) |
|
|
111
|
+
| 6 — Verificações Visuais | obrigatório (mobile + desktop) | **pulado** |
|
|
112
|
+
| 7-8 — Documentação de Bugs + Relatório | screenshots como evidência | logs JSONL como evidência (`evidence_type: api-log`) |
|
|
113
|
+
| 9 — Loop Fix-Retest | mesmo formato; replay do Playwright | mesmo formato; replay da recipe e gravação de nova linha de log |
|
|
114
|
+
|
|
115
|
+
Registre o modo escolhido no frontmatter do relatório QA (`mode: ui | api | mixed`). Em caso de dúvida, pergunte ao usuário antes de prosseguir — nunca caia em fallback silencioso.
|
|
116
|
+
|
|
117
|
+
<critical>Se nenhum sinal de UI nem de API for detectável (ex.: repo vazio), aborte com: "Não é possivel determinar o modo do QA. Rode `/dw-analyze-project` primeiro OU passe `--ui` ou `--api` explicitamente."</critical>
|
|
118
|
+
|
|
77
119
|
### 1. Análise de Documentação (Obrigatório)
|
|
78
120
|
|
|
79
121
|
- Ler o PRD e extrair TODOS os requisitos funcionais numerados (RF-XX)
|
|
@@ -109,9 +151,11 @@ Se NENHUMA credencial for encontrada, PARE e pergunte ao usuário antes de conti
|
|
|
109
151
|
- Confirmar que a página carregou corretamente com `browser_snapshot`
|
|
110
152
|
- 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 `webapp-testing`
|
|
111
153
|
|
|
112
|
-
### 3. Verificação de Páginas do Menu (
|
|
154
|
+
### 3. Verificação de Páginas do Menu (Somente modo UI — Obrigatório, Executar ANTES dos testes de RF)
|
|
113
155
|
|
|
114
|
-
|
|
156
|
+
**Em modo API, esta etapa é PULADA.** Superfícies de API não têm menus; o check equivalente (todo endpoint anunciado existe e responde) está dobrado dentro da Etapa 4-API.
|
|
157
|
+
|
|
158
|
+
<critical>(modo UI) 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>
|
|
115
159
|
|
|
116
160
|
Para cada item do menu do módulo:
|
|
117
161
|
1. Navegar para a página via `browser_navigate`
|
|
@@ -146,7 +190,11 @@ digraph menu_check {
|
|
|
146
190
|
}
|
|
147
191
|
```
|
|
148
192
|
|
|
149
|
-
### 4. Testes E2E
|
|
193
|
+
### 4. Testes E2E (Obrigatório, mode-aware)
|
|
194
|
+
|
|
195
|
+
Esta etapa tem dois branches; escolha conforme o modo da Etapa 0.
|
|
196
|
+
|
|
197
|
+
#### 4-UI (modo UI) — Playwright MCP
|
|
150
198
|
|
|
151
199
|
Utilize as ferramentas do Playwright MCP para testar cada fluxo:
|
|
152
200
|
|
|
@@ -179,6 +227,39 @@ Para cada requisito funcional do PRD:
|
|
|
179
227
|
<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>
|
|
180
228
|
<critical>Se um requisito não puder ser completamente validado via E2E, o QA deve ser marcado como REJEITADO ou BLOQUEADO, nunca APROVADO</critical>
|
|
181
229
|
|
|
230
|
+
#### 4-API (modo API) — skill `api-testing-recipes`
|
|
231
|
+
|
|
232
|
+
Use a skill bundled `api-testing-recipes` para compor os testes. A skill escolhe a recipe certa por stack (default `.http` / REST Client; `pytest+httpx`, `supertest`, `WebApplicationFactory`, `reqwest` por linguagem) e grava scripts e logs JSONL como evidência.
|
|
233
|
+
|
|
234
|
+
Processo:
|
|
235
|
+
|
|
236
|
+
1. **Leia** `.agents/skills/api-testing-recipes/SKILL.md` e selecione a recipe que casa com o stack backend primário do projeto. Default em `recipes/http-rest-client.md` a menos que o projeto já rode `pytest`/`vitest`/`dotnet test`/`cargo test`, caso em que prefira a recipe especifica do stack para os testes QA viverem ao lado dos testes unitários.
|
|
237
|
+
2. **Para cada requisito funcional (RF-XX) do PRD**, derive a matriz seguindo `.agents/skills/api-testing-recipes/references/matrix-conventions.md`:
|
|
238
|
+
- 200 happy path
|
|
239
|
+
- 4xx — validação (campo faltando, tipo errado, fora de range)
|
|
240
|
+
- 4xx — auth (sem token, expirado, malformado)
|
|
241
|
+
- 4xx — autorização (token válido, role errada)
|
|
242
|
+
- 4xx — not found
|
|
243
|
+
- 4xx — conflict
|
|
244
|
+
- 5xx — server error (so se reproduzível sinteticamente)
|
|
245
|
+
- **Contract drift** (formato da response vs OpenAPI / TS types) — obrigatório
|
|
246
|
+
- **Authorization cross-tenant** (token de outra org) — obrigatório se multi-tenant
|
|
247
|
+
3. **Gere um arquivo por RF** em `{{PRD_PATH}}/QA/scripts/api/RF-XX-[slug].<ext>` usando a estrutura da recipe. Encaminhe credenciais segundo os padrões em `.agents/skills/api-testing-recipes/references/auth-patterns.md` (NUNCA hardcode tokens).
|
|
248
|
+
4. **Execute** cada request (`curl` para `.http`; o runner do projeto para stack-specific). Para CADA request, anexe uma linha JSONL em `{{PRD_PATH}}/QA/logs/api/RF-XX-[slug].log` segundo `references/log-conventions.md`. Redact headers `Authorization`/`Cookie`/`X-API-Key` e qualquer campo de response que case com `password*`/`secret*`/`*_hash`/`token*`.
|
|
249
|
+
5. **Asserte** por expectativa da matriz:
|
|
250
|
+
- Status code casa com o esperado
|
|
251
|
+
- Response body casa com o schema (use `jq` em `.http`, matchers do framework por stack)
|
|
252
|
+
- Headers obrigatórios presentes (ex.: `Content-Type: application/json`)
|
|
253
|
+
- Sem campos internos vazados
|
|
254
|
+
6. **Marque o requisito** como APROVADO ou REPROVADO com resumo de uma linha citando o caminho do log e (se REPROVADO) o número da linha JSONL que falhou.
|
|
255
|
+
7. **Opcional**: se o projeto expõe spec OpenAPI (`openapi.yaml`, `openapi.json`, runtime `/openapi.json`), siga `references/openapi-driven.md` para gerar baseline. Use a flag `--from-openapi <path-or-url>` para deixar explícito.
|
|
256
|
+
|
|
257
|
+
Nota sobre baseline OpenAPI: se `--from-openapi` for usado, os testes gerados ficam ao lado dos derivados a mão, com filename `openapi-RF-XX-[path-slug].<ext>`. Endpoints da spec sem mapeamento para nenhum RF viram lacuna documental no relatório QA (`openapi-no-rf-*`).
|
|
258
|
+
|
|
259
|
+
<critical>(modo API) Todo endpoint que muta ou lê dados tenant-scoped DEVE ter teste de negacao cross-tenant. Pular so e permitido em sistemas explicitamente single-tenant e tem que ser registrado como `pytest.skip`/`it.skip`/equivalente com motivo.</critical>
|
|
260
|
+
<critical>(modo API) Logs sao evidência. Toda afirmacao de PASS ou FAIL no relatorio QA deve citar uma linha JSONL em `QA/logs/api/`. Sem log = sem evidência = QA nao pode ser APROVADO.</critical>
|
|
261
|
+
<critical>(modo API) NUNCA hardcode tokens ou credenciais em scripts commitados. Use referencias `@variavel`/env-var.</critical>
|
|
262
|
+
|
|
182
263
|
### 4.1. Matriz mínima obrigatória por requisito
|
|
183
264
|
|
|
184
265
|
Para cada RF, o QA deve responder explicitamente:
|
|
@@ -201,9 +282,9 @@ Exemplos de edge cases que devem ser considerados sempre que relevantes:
|
|
|
201
282
|
- reentrada/ações repetidas
|
|
202
283
|
- falhas de API, loading e estados intermediários
|
|
203
284
|
|
|
204
|
-
### 5.
|
|
285
|
+
### 5. Acessibilidade / Checks de Superfície API (Obrigatório, mode-aware)
|
|
205
286
|
|
|
206
|
-
|
|
287
|
+
Em **modo UI**, verificar para cada tela/componente (WCAG 2.2):
|
|
207
288
|
|
|
208
289
|
- [ ] Navegação por teclado funciona (Tab, Enter, Escape)
|
|
209
290
|
- [ ] Elementos interativos têm labels descritivos
|
|
@@ -217,13 +298,26 @@ Verificar para cada tela/componente (WCAG 2.2):
|
|
|
217
298
|
Use `browser_press_key` para testar navegação por teclado.
|
|
218
299
|
Use `browser_snapshot` para verificar labels e estrutura semântica.
|
|
219
300
|
|
|
220
|
-
|
|
301
|
+
**Em modo API**, o checklist WCAG acima é SUBSTITUÍDO por checks de superfície API:
|
|
302
|
+
|
|
303
|
+
- [ ] Todo endpoint retorna o `Content-Type` correto
|
|
304
|
+
- [ ] Erros seguem formato consistente (ex.: `{ "error": { "code": "...", "message": "..." } }`)
|
|
305
|
+
- [ ] `401` (auth missing/invalid) é distinto de `403` (auth presente mas não autorizado)
|
|
306
|
+
- [ ] Responses de erro NÃO vazam stack traces, IDs internos, fragmentos SQL ou pistas de ambiente
|
|
307
|
+
- [ ] Campos sensíveis (`password*`, `*_hash`, `secret*`, `token*`) NUNCA aparecem em response body
|
|
308
|
+
- [ ] Endpoints com rate limit retornam `429` com header `Retry-After` (quando aplicável)
|
|
309
|
+
|
|
310
|
+
Cada check FALHADO vira bug HIGH em `QA/bugs.md` com `evidence_type: api-log` apontando para a linha JSONL do erro.
|
|
311
|
+
|
|
312
|
+
### 6. Verificações Visuais (Somente modo UI — Obrigatório)
|
|
313
|
+
|
|
314
|
+
**Em modo API, esta etapa é PULADA.** O relatório QA omite a seção "Visual" inteira.
|
|
221
315
|
|
|
222
316
|
- Capturar screenshots das telas principais com `browser_take_screenshot` e salvar em `{{PRD_PATH}}/QA/screenshots/`
|
|
223
317
|
- Verificar layouts em diferentes estados (vazio, com dados, erro, loading)
|
|
224
318
|
- Documentar inconsistências visuais encontradas
|
|
225
319
|
|
|
226
|
-
### 6.1. Validação Mobile (Obrigatório)
|
|
320
|
+
### 6.1. Validação Mobile (Somente modo UI — Obrigatório)
|
|
227
321
|
|
|
228
322
|
<critical>TODA verificação visual DEVE incluir testes em viewport mobile (375px) ALÉM do desktop (1440px). A aprovação do QA REQUER que AMBAS as resoluções estejam funcionais e visualmente aceitáveis. Se o layout mobile estiver quebrado, inutilizável ou visualmente degradado, o QA NÃO pode ser aprovado.</critical>
|
|
229
323
|
|
|
@@ -246,13 +340,15 @@ Para cada bug encontrado, criar entrada em `{{PRD_PATH}}/QA/bugs.md`:
|
|
|
246
340
|
|
|
247
341
|
- **Severidade:** Alta/Média/Baixa
|
|
248
342
|
- **RF Afetado:** RF-XX
|
|
249
|
-
- **Componente:** [componente/página]
|
|
343
|
+
- **Componente:** [componente/página ou caminho do endpoint]
|
|
344
|
+
- **Modo:** ui | api
|
|
250
345
|
- **Passos para Reproduzir:**
|
|
251
346
|
1. [passo 1]
|
|
252
347
|
2. [passo 2]
|
|
253
348
|
- **Resultado Esperado:** [o que deveria acontecer]
|
|
254
349
|
- **Resultado Atual:** [o que acontece]
|
|
255
|
-
- **
|
|
350
|
+
- **Tipo de evidência:** screenshot | api-log
|
|
351
|
+
- **Caminho da evidência:** `QA/screenshots/[arquivo].png` (modo UI) OU `QA/logs/api/RF-XX-[slug].log#L<linha>` (modo API)
|
|
256
352
|
- **Status:** Aberto
|
|
257
353
|
```
|
|
258
354
|
|
|
@@ -294,10 +390,15 @@ Gerar relatório em `{{PRD_PATH}}/QA/qa-report.md`:
|
|
|
294
390
|
[Parecer final do QA]
|
|
295
391
|
```
|
|
296
392
|
|
|
297
|
-
### 9. Loop QA Fix-Retest (Automático)
|
|
393
|
+
### 9. Loop QA Fix-Retest (Automático, mode-aware)
|
|
298
394
|
|
|
299
395
|
<critical>O QA NÃO termina no primeiro relatório. Se bugs forem encontrados, entre em um loop automático de fix-retest até que o QA seja APROVADO ou explicitamente BLOQUEADO.</critical>
|
|
300
396
|
|
|
397
|
+
**Comportamento mode-aware:** a estrutura do loop (max 5 ciclos, commit atômico por fix, regression checks, critérios de saída) é idêntica nos dois modos. O que muda é a EVIDÊNCIA replayada:
|
|
398
|
+
|
|
399
|
+
- modo UI: re-executar o fluxo Playwright, capturar nova screenshot `BUG-NN-retest.png`.
|
|
400
|
+
- modo API: re-executar a mesma `.http`/recipe via runner da recipe, anexar nova linha em `QA/logs/api/BUG-NN-retest.log` com `verdict: "PASS"` (fecha o bug) ou `verdict: "FAIL"` (segue o ciclo).
|
|
401
|
+
|
|
301
402
|
Após gerar o relatório inicial de QA:
|
|
302
403
|
|
|
303
404
|
```dot
|