@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,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: project-onepager
|
|
3
|
+
schema_version: "1.0"
|
|
4
|
+
status: draft
|
|
5
|
+
date: YYYY-MM-DD
|
|
6
|
+
shape: frontend | backend | fullstack
|
|
7
|
+
languages: []
|
|
8
|
+
frameworks: { web: '', api: '' }
|
|
9
|
+
package_manager: ''
|
|
10
|
+
monorepo: ''
|
|
11
|
+
services: []
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Project: [Project name]
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
[One paragraph in product language. Who will use this, what problem it solves, what success looks like in 6-12 weeks. Avoid implementation language.]
|
|
19
|
+
|
|
20
|
+
## Stack Selected
|
|
21
|
+
|
|
22
|
+
| Layer | Choice | Rationale |
|
|
23
|
+
|-------|--------|-----------|
|
|
24
|
+
| Shape | frontend / backend / fullstack | [why this shape — single product surface, API for partners, etc.] |
|
|
25
|
+
| Frontend | Next.js / Vite+React / n/a | [why this framework — SSR needs, SPA simplicity, etc.] |
|
|
26
|
+
| Backend | FastAPI / ASP.NET Core minimal / Axum / Fastify / n/a | [why this framework — team expertise, ecosystem, latency targets] |
|
|
27
|
+
| Database | Postgres / MySQL / SQLite / MongoDB / none | [why this DB — relational needs, JSON-heavy, transactional, etc.] |
|
|
28
|
+
| Cache | Redis / Memcached / none | [why or why not] |
|
|
29
|
+
| Queue | BullMQ / Celery / RabbitMQ / LocalStack SQS / none | [why or why not + sync vs async workers] |
|
|
30
|
+
| Email — dev | MailHog (default) / Mailpit / smtp4dev / none | [usually MailHog — capture only, never sends real mail] |
|
|
31
|
+
| Email — prod | SMTP / SendGrid / Resend / Postmark / SES / none | [why this provider — volume, deliverability, cost] |
|
|
32
|
+
| Object storage | S3 / MinIO (dev) / GCS / none | [why or why not] |
|
|
33
|
+
| Search | Meilisearch / Typesense / Elasticsearch / none | [why this engine — features, scale, simplicity] |
|
|
34
|
+
| Observability | Sentry / OTel + Jaeger / none | [why this approach — error tracking only, full tracing, etc.] |
|
|
35
|
+
| Reverse proxy | Traefik / Caddy / none | [usually only needed for multi-host dev or prod] |
|
|
36
|
+
| Auth | NextAuth / Lucia / Clerk / fastapi-users / dotnet Identity / custom JWT / none | [why this approach — social login needs, B2B, etc.] |
|
|
37
|
+
| Linter / formatter | Biome / ESLint+Prettier / Ruff+Black / dotnet format / cargo fmt+clippy | [team preference] |
|
|
38
|
+
| Package manager | pnpm / npm / yarn / poetry / uv / cargo / dotnet | [team preference] |
|
|
39
|
+
| Monorepo orchestrator | pnpm workspaces / npm workspaces / Turborepo / Nx / n/a | [only for fullstack — caching/build needs] |
|
|
40
|
+
| CI | GitHub Actions / none | [usually GitHub Actions; opt out only for non-public repos] |
|
|
41
|
+
|
|
42
|
+
## Services & Infra
|
|
43
|
+
|
|
44
|
+
[Generated services from the docker-compose-recipes skill. Filled by /dw-new-project.]
|
|
45
|
+
|
|
46
|
+
| Service | Port (host) | UI | Default credentials |
|
|
47
|
+
|---------|-------------|----|--------------------|
|
|
48
|
+
| postgres | 5432 | — | POSTGRES_USER=app, POSTGRES_PASSWORD=app, POSTGRES_DB=app |
|
|
49
|
+
| redis | 6379 | — | (no auth in dev) |
|
|
50
|
+
| mailhog | 1025 (smtp), 8025 (UI) | http://localhost:8025 | (no auth) |
|
|
51
|
+
| ... | ... | ... | ... |
|
|
52
|
+
|
|
53
|
+
## Architecture Diagram
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
[ASCII diagram of the chosen shape. Examples below.]
|
|
57
|
+
|
|
58
|
+
# Frontend-only
|
|
59
|
+
[ Browser ] -> [ Next.js (apps/web) ]
|
|
60
|
+
|
|
61
|
+
# Fullstack
|
|
62
|
+
[ Browser ] -> [ Next.js (apps/web) ] -> [ FastAPI (apps/api) ] -> [ Postgres ]
|
|
63
|
+
|-> [ Redis ]
|
|
64
|
+
|-> [ MailHog ]
|
|
65
|
+
|
|
66
|
+
# With observability
|
|
67
|
+
... -> [ FastAPI ] -> { OTLP } -> [ Jaeger ]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Generated Files
|
|
71
|
+
|
|
72
|
+
[Filled by /dw-new-project after Phase 3 — list of files created with their sources.]
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
{{TARGET_DIR}}/
|
|
76
|
+
├── apps/
|
|
77
|
+
│ ├── web/ (created by `pnpm create next-app`)
|
|
78
|
+
│ └── api/ (inline scaffold — FastAPI)
|
|
79
|
+
├── packages/
|
|
80
|
+
│ └── shared/ (created by /dw-new-project)
|
|
81
|
+
├── docker-compose.dev.yml (composed from .agents/skills/docker-compose-recipes/)
|
|
82
|
+
├── .env.example (consolidated from selected services)
|
|
83
|
+
├── .gitignore (per stack)
|
|
84
|
+
├── .dockerignore (per stack)
|
|
85
|
+
├── .github/workflows/ci.yml (CI matrix per app)
|
|
86
|
+
├── package.json (root scripts: dev:up/down/logs/reset)
|
|
87
|
+
├── pnpm-workspace.yaml (if pnpm workspaces)
|
|
88
|
+
├── turbo.json (if Turborepo)
|
|
89
|
+
├── README.md (Quick Start + Local Dev port table)
|
|
90
|
+
└── .dw/
|
|
91
|
+
├── rules/index.md (seeded — enrich later via /dw-analyze-project)
|
|
92
|
+
└── spec/projects/<name>.md (this file)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## MVP Scope
|
|
96
|
+
|
|
97
|
+
[The smallest first feature you'll ship. Thought as user stories — this should drive the first /dw-create-prd run.]
|
|
98
|
+
|
|
99
|
+
- As a [persona], I can [action] so that [benefit]
|
|
100
|
+
- As a [persona], I can [action] so that [benefit]
|
|
101
|
+
|
|
102
|
+
If you don't have a first feature in mind yet, that's OK — leave a placeholder and run /dw-create-prd when ready.
|
|
103
|
+
|
|
104
|
+
## Not Doing (explicit)
|
|
105
|
+
|
|
106
|
+
[Tempting items deferred. Forces scope discipline.]
|
|
107
|
+
|
|
108
|
+
- **[item 1]** — reason: [out of v1 because...]
|
|
109
|
+
- **[item 2]** — reason: [could become v2 if hypothesis X validates]
|
|
110
|
+
|
|
111
|
+
## Key Assumptions
|
|
112
|
+
|
|
113
|
+
- **[assumption about users / market / scale]** — test: [how this assumption is validated]
|
|
114
|
+
- **[assumption about latency / volume / SLAs]** — test: [load profile, target metric]
|
|
115
|
+
|
|
116
|
+
## Open Questions
|
|
117
|
+
|
|
118
|
+
[Things this one-pager cannot answer alone. Resolve before /dw-create-prd or escalate to a stakeholder.]
|
|
119
|
+
|
|
120
|
+
- [question 1]
|
|
121
|
+
- [question 2]
|
|
122
|
+
|
|
123
|
+
## Next Step
|
|
124
|
+
|
|
125
|
+
Pick ONE:
|
|
126
|
+
|
|
127
|
+
- **`/dw-create-prd`** — when you have a first feature in mind and want to draft the PRD on top of this stack
|
|
128
|
+
- **`/dw-analyze-project`** — after the first substantial commit, to enrich `.dw/rules/` with module-level conventions
|
|
129
|
+
- **`/dw-deps-audit --scan-only`** — to confirm no vulnerable deps shipped from the `create-*` templates
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
<system_instructions>
|
|
2
|
+
Voce e o lider de remediacao de supply-chain de dependencias. Sua funcao e **encontrar** pacotes desatualizados e comprometidos por supply-chain, **planejar** uma estrategia de update por pacote com trade-offs explicitos, e (quando autorizado) **executar** os updates com seguranca + QA escopada para garantir que o upgrade nao quebra onde o pacote e realmente usado.
|
|
3
|
+
|
|
4
|
+
Este comando e **distinto** do `/dw-security-check`:
|
|
5
|
+
- `/dw-security-check` e um veredito SAST + SCA single-shot (CRITICAL/HIGH = REJECTED, sem remediacao).
|
|
6
|
+
- `/dw-deps-audit` e um planejador-remediador multi-fase: detect → classifica → brainstorm de plano de update → gate humano → execute com QA escopada → relatorio.
|
|
7
|
+
|
|
8
|
+
<critical>Este comando e rigido em seguranca: em modo `--execute`, NENHUM arquivo pode ser modificado antes do usuario aprovar explicitamente o plano apresentado no fim da Fase 3. Sem flag de bypass.</critical>
|
|
9
|
+
<critical>Linguagens suportadas: TypeScript/JavaScript, Python, C#, Rust. Aborta com mensagem clara se nenhuma e detectada no escopo.</critical>
|
|
10
|
+
<critical>Se o upgrade falhar nos testes escopados E um ciclo de `dw-fix-qa` nao recuperar, REVERTA a mudanca (lockfile + manifest) e marque o pacote como BLOCKED. Nao deixe estado sujo.</critical>
|
|
11
|
+
|
|
12
|
+
## Quando Usar
|
|
13
|
+
|
|
14
|
+
- Apos `/dw-security-check` apontar dependencias vulneraveis e voce precisa de plano de remediacao
|
|
15
|
+
- Quando o time quer reduzir divida tecnica em pacotes desatualizados de forma controlada
|
|
16
|
+
- Quando o monitoramento pega um incidente publico de supply-chain (ex.: pacote malicioso publicado) e voce precisa confirmar exposicao + planejar remocao/pin
|
|
17
|
+
- Antes de uma release grande, para reduzir a superficie de CVEs conhecidos nas dependencias enviadas
|
|
18
|
+
- NAO use para DAST em runtime nem para review de codigo da aplicacao (use `/dw-run-qa` e `/dw-code-review`)
|
|
19
|
+
- NAO substitui `/dw-security-check` — sao complementares; este aqui foca em SCA e remediacao, nao em review estatico OWASP
|
|
20
|
+
|
|
21
|
+
## Posicao no Pipeline
|
|
22
|
+
|
|
23
|
+
**Predecessor:** `/dw-security-check` (opcional — os findings dele podem prefilar a Fase 1) | **Sucessor:** `/dw-code-review` e `/dw-generate-pr` (o relatorio vira evidencia de que a superficie de deps esta limpa para o PR)
|
|
24
|
+
|
|
25
|
+
## Skills Complementares
|
|
26
|
+
|
|
27
|
+
| Skill | Gatilho |
|
|
28
|
+
|-------|---------|
|
|
29
|
+
| `dw-verify` | **SEMPRE** — toda fase emite VERIFICATION REPORT (comandos rodados, exit codes, artefatos) antes da proxima fase comecar |
|
|
30
|
+
| `dw-review-rigor` | **SEMPRE** — aplica deduplicacao (mesmo advisory em N pacotes = 1 finding com lista afetada), severity ordering, e signal-over-volume na lista OUTDATED-MINOR |
|
|
31
|
+
| `security-review` (`references/supply-chain.md`) | **SEMPRE** ao classificar findings — da o framing OWASP A06 (Vulnerable & Outdated Components) para os trade-offs do brainstorm |
|
|
32
|
+
| `dw-council` | Opt-in automatico quando >=3 pacotes caem em tier COMPROMISED — stress-test multi-conselheiro sobre ordem e escopo de remediacao |
|
|
33
|
+
| `webapp-testing` | Opcional — quando o projeto e frontend e a fase de testes escopados precisa de selecao Playwright-aware |
|
|
34
|
+
|
|
35
|
+
## Variaveis de Entrada
|
|
36
|
+
|
|
37
|
+
| Variavel | Descricao | Exemplo |
|
|
38
|
+
|----------|-----------|---------|
|
|
39
|
+
| `{{SCOPE}}` | Caminho do PRD OU caminho do source. Opcional — default e `.dw/spec/prd-<slug>` inferido da branch ativa `feat/prd-<slug>` | `.dw/spec/prd-checkout-v2` ou `.` |
|
|
40
|
+
| `{{MODE}}` | Um de `--scan-only`, `--plan` (default), `--execute` | `--execute` |
|
|
41
|
+
|
|
42
|
+
Se `{{SCOPE}}` nao foi passado e nao ha PRD ativo, escopo cai para a raiz do repo (`.`) e o relatorio vai para `.dw/audit/`.
|
|
43
|
+
|
|
44
|
+
## Localizacao dos Arquivos
|
|
45
|
+
|
|
46
|
+
- Relatorio (escopo PRD): `{{SCOPE}}/deps-audit.md`
|
|
47
|
+
- Relatorio (sem PRD): `.dw/audit/deps-audit-<YYYY-MM-DD>.md`
|
|
48
|
+
- Artefatos brutos do inventario (sempre): `/tmp/dw-deps-audit-<run-id>/{npm-audit.json, npm-outdated.json, pip-audit.json, ...}`
|
|
49
|
+
- Referencias de skill: `.agents/skills/security-review/references/supply-chain.md`
|
|
50
|
+
|
|
51
|
+
## Comportamento Obrigatorio — Pipeline
|
|
52
|
+
|
|
53
|
+
Execute as fases em ordem. A Fase 4 so roda quando `{{MODE}} == --execute` E o usuario aprovou o plano na Fase 3.5.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Fase 0 — Deteccao de Linguagem
|
|
58
|
+
|
|
59
|
+
Enumere arquivos no escopo e detecte linguagens:
|
|
60
|
+
|
|
61
|
+
| Linguagem | Indicadores |
|
|
62
|
+
|-----------|-------------|
|
|
63
|
+
| TypeScript / JavaScript | `package.json`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `*.ts`, `*.tsx`, `*.js`, `*.jsx`, `*.mjs` |
|
|
64
|
+
| Python | `pyproject.toml`, `requirements*.txt`, `Pipfile`, `poetry.lock`, `setup.py`, `*.py` |
|
|
65
|
+
| C# / .NET | `*.csproj`, `*.sln`, `packages.config`, `*.cs` |
|
|
66
|
+
| Rust | `Cargo.toml`, `Cargo.lock`, `*.rs` |
|
|
67
|
+
|
|
68
|
+
Se nenhuma das quatro for detectada → **abortar** com:
|
|
69
|
+
`"dw-deps-audit so suporta TypeScript, Python, C# e Rust. Nenhum arquivo nessas linguagens foi detectado em <escopo>. Abortando."`
|
|
70
|
+
|
|
71
|
+
Repos poliglotas rodam toda camada aplicavel; o relatorio tem uma secao por linguagem.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### Fase 1 — Inventario (tres sinais)
|
|
76
|
+
|
|
77
|
+
Monte o conjunto candidato a partir de tres sinais independentes para nada escapar.
|
|
78
|
+
|
|
79
|
+
#### Sinal A — Vulnerabilidades conhecidas (SCA)
|
|
80
|
+
|
|
81
|
+
| Linguagem | Comando primario | Notas |
|
|
82
|
+
|-----------|------------------|-------|
|
|
83
|
+
| TS/JS (npm) | `npm audit --json` | Detecte o package manager pelo lockfile |
|
|
84
|
+
| TS/JS (pnpm) | `pnpm audit --json` | |
|
|
85
|
+
| TS/JS (yarn) | `yarn npm audit --recursive --json` | Yarn Berry; em v1 use `yarn audit --json` |
|
|
86
|
+
| Python | `pip-audit --strict --format json` | Skip com nota se `pip-audit` ausente |
|
|
87
|
+
| C# / .NET | `dotnet list package --vulnerable --include-transitive` | Saida humana; parse a tabela |
|
|
88
|
+
| Rust | `cargo audit --json` | Skip com nota se `cargo-audit` ausente; sugira `cargo install cargo-audit` |
|
|
89
|
+
|
|
90
|
+
#### Sinal B — Pacotes desatualizados
|
|
91
|
+
|
|
92
|
+
| Linguagem | Comando primario | Notas |
|
|
93
|
+
|-----------|------------------|-------|
|
|
94
|
+
| TS/JS (npm) | `npm outdated --json` | Retorna 1 quando ha outdated; e esperado |
|
|
95
|
+
| TS/JS (pnpm) | `pnpm outdated --format json` | |
|
|
96
|
+
| TS/JS (yarn) | `yarn outdated --json` | |
|
|
97
|
+
| Python | `pip list --outdated --format json` | |
|
|
98
|
+
| C# / .NET | `dotnet list package --outdated` | |
|
|
99
|
+
| Rust | `cargo outdated --format json` | Skip com nota se `cargo-outdated` ausente |
|
|
100
|
+
|
|
101
|
+
#### Sinal C — Supply-chain attacks (o diferencial)
|
|
102
|
+
|
|
103
|
+
Este sinal busca pacotes **publicados maliciosamente**, nao apenas com CVE.
|
|
104
|
+
|
|
105
|
+
1. **Cross-check OSV.dev** — para cada dependencia direta, consulte a API OSV por advisories `OSV-MAL-*` (categoria malicious-package):
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
POST https://api.osv.dev/v1/query
|
|
109
|
+
Body: {"package": {"name": "<name>", "ecosystem": "<npm|PyPI|NuGet|crates.io>"}}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Faca via WebFetch. Filtre resultados onde `id` comeca com `MAL-` ou `aliases` contem advisory `MAL-`.
|
|
113
|
+
2. **Cross-check GitHub Security Advisories** — consulte advisories no ecossistema casado que sao `severity:critical` ou `published_in_last_90_days`. WebFetch em `https://api.github.com/advisories?ecosystem=<eco>&severity=critical&per_page=100` (sem auth para advisories publicos).
|
|
114
|
+
3. **Lista hardcoded de fallback** — conjunto conhecido de incidentes historicos de pacote malicioso para pegar mesmo offline. Inclua no minimo:
|
|
115
|
+
- `event-stream` (qualquer versao apos comprometimento)
|
|
116
|
+
- `ua-parser-js@0.7.29 || 0.7.30 || 0.7.31 || 1.0.0`
|
|
117
|
+
- `node-ipc@>=10.1.1`
|
|
118
|
+
- `coa@2.0.3`
|
|
119
|
+
- `colors@1.4.1`
|
|
120
|
+
- `flatmap-stream` (qualquer versao)
|
|
121
|
+
- `ctx@*` (incidente de typosquat no PyPI)
|
|
122
|
+
- `phpass@*` (incidente de typosquat no PyPI)
|
|
123
|
+
- `xrpl@4.2.1 || 4.2.2 || 4.2.3 || 4.2.4`
|
|
124
|
+
|
|
125
|
+
<critical>A lista hardcoded e SECUNDARIA. Vai ficar defasada. O OSV consult e a fonte de verdade — registre no relatorio quando o OSV ficou indisponivel e o run caiu so na lista hardcoded.</critical>
|
|
126
|
+
|
|
127
|
+
Escreva um VERIFICATION REPORT da Fase 1 (comandos + exit codes + contagem de findings) antes de seguir.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### Fase 2 — Classificacao
|
|
132
|
+
|
|
133
|
+
Classifique todo candidato da Fase 1 em um tier. Aplique as regras de `dw-review-rigor`:
|
|
134
|
+
- Deduplicar: o mesmo advisory afetando N pacotes vira um finding com a lista afetada.
|
|
135
|
+
- Severity ordering: COMPROMISED → CRITICAL CVE → HIGH CVE → OUTDATED-MAJOR → OUTDATED-MINOR.
|
|
136
|
+
- Signal over volume: no relatorio, liste todos COMPROMISED/CRITICAL/HIGH; colapse OUTDATED-MINOR para uma contagem mais top 5 por uso.
|
|
137
|
+
|
|
138
|
+
| Tier | Criterio | Acao default |
|
|
139
|
+
|------|----------|--------------|
|
|
140
|
+
| **COMPROMISED** | Match em OSV-MAL-*, advisory critical do GitHub, ou lista hardcoded | Sempre no plano; nao pode ser desmarcado pelo usuario (warning se tentar) |
|
|
141
|
+
| **CRITICAL CVE** | CVSS >= 9.0 OU advisory marcado como exploited | Sempre no plano; usuario pode adiar com motivo explicito registrado no relatorio |
|
|
142
|
+
| **HIGH CVE** | CVSS 7.0 a 8.9 | Sempre no plano; usuario pode adiar com motivo explicito |
|
|
143
|
+
| **OUTDATED-MAJOR** | Versao atual >= 1 major atras do latest stable | Vai pro brainstorm; usuario decide por pacote |
|
|
144
|
+
| **OUTDATED-MINOR** | Outdated minor/patch sem CVE | So sumarizado; nao entra no plano por pacote |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### Fase 3 — Mapeamento de Impacto + Brainstorm
|
|
149
|
+
|
|
150
|
+
Para cada pacote em **COMPROMISED / CRITICAL CVE / HIGH CVE / OUTDATED-MAJOR**:
|
|
151
|
+
|
|
152
|
+
#### 3.1 Mapeamento de uso
|
|
153
|
+
|
|
154
|
+
Encontre todo arquivo que importa o pacote:
|
|
155
|
+
|
|
156
|
+
- TS/JS: `from '<pkg>'` / `from "<pkg>/..."` / `require('<pkg>')` / `import('<pkg>')`
|
|
157
|
+
- Python: `import <pkg>` / `from <pkg> import` / `from <pkg>.* import`
|
|
158
|
+
- C#: `using <pkg>;` (namespace raiz) / `<PackageReference Include="<pkg>" .../>` para verificacao transitiva
|
|
159
|
+
- Rust: `use <pkg>::` / `extern crate <pkg>` / paths qualificados `<pkg>::`
|
|
160
|
+
|
|
161
|
+
Use `Grep` e `Glob`. Capture lista de arquivos por pacote.
|
|
162
|
+
|
|
163
|
+
#### 3.2 Mapeamento de testes
|
|
164
|
+
|
|
165
|
+
Para cada arquivo da 3.1, encontre os testes que o exercem. Heuristicas (na ordem):
|
|
166
|
+
|
|
167
|
+
1. Par com mesmo nome: `src/foo.ts` ↔ `src/foo.test.ts` / `src/foo.spec.ts`.
|
|
168
|
+
2. Diretorio de testes irmao: `__tests__/foo.test.ts`, `tests/test_foo.py`, `Foo.Tests/FooTests.cs`, `tests/foo.rs`.
|
|
169
|
+
3. Busca por simbolo: grep nos testes pelo simbolo exportado usado pelo arquivo de aplicacao.
|
|
170
|
+
4. Monte um comando de teste concreto por linguagem:
|
|
171
|
+
- npm: `npm test -- <files>` ou o script de unit test do projeto (`test:unit`).
|
|
172
|
+
- pnpm: `pnpm test -- <files>`. yarn: `yarn test <files>`.
|
|
173
|
+
- Python: `pytest <files>`.
|
|
174
|
+
- .NET: `dotnet test --filter "FullyQualifiedName~<Class>"`.
|
|
175
|
+
- Rust: `cargo test <module>` ou `cargo test --package <pkg-que-usa>`.
|
|
176
|
+
|
|
177
|
+
Se um arquivo nao tem testes descobriveis, marque `UNCOVERED` e suba no relatorio — o usuario tem que aceitar o risco antes do upgrade rodar em modo `--execute`.
|
|
178
|
+
|
|
179
|
+
#### 3.3 Brainstorm (3 opcoes por pacote)
|
|
180
|
+
|
|
181
|
+
Para cada pacote, apresente tres estrategias de update no estilo do `dw-brainstorm`:
|
|
182
|
+
|
|
183
|
+
| Opcao | Definicao | Esforco | Risco de breaking | Ganho de seguranca |
|
|
184
|
+
|-------|-----------|---------|-------------------|--------------------|
|
|
185
|
+
| **Conservadora** | Pin na versao corrigida mais proxima dentro do major atual (ou remocao do pacote inteiro se COMPROMISED e tem alternativa drop-in) | S | Baixo | Alto (fecha o advisory) |
|
|
186
|
+
| **Balanceada** | Upgrade para o maior minor/patch dentro do major atual | S–M | Baixo–Medio | Alto |
|
|
187
|
+
| **Ousada** | Upgrade para o latest major | M–L | Medio–Alto (pode pedir refactor) | Maximo (ultimos patches + features novas) |
|
|
188
|
+
|
|
189
|
+
Para cada opcao, liste:
|
|
190
|
+
- Versao alvo
|
|
191
|
+
- Notas de breaking change (consulte CHANGELOG / releases do GitHub se alcancavel; cite a fonte)
|
|
192
|
+
- Estimativa de escopo de refactor (contagem de arquivos da 3.1)
|
|
193
|
+
|
|
194
|
+
#### 3.4 Recomendacao
|
|
195
|
+
|
|
196
|
+
Uma linha por pacote: **opcao recomendada** + comando de proxima acao (ex.: `npm install lodash@4.17.21 && npm test`).
|
|
197
|
+
|
|
198
|
+
#### 3.5 Gate de aprovacao humana
|
|
199
|
+
|
|
200
|
+
Apresente o plano completo e pergunte ao usuario, via `AskUserQuestion` se disponivel, senao via prompt numerado:
|
|
201
|
+
|
|
202
|
+
1. Quais pacotes aplicar
|
|
203
|
+
2. Qual opcao (Conservadora / Balanceada / Ousada) por pacote
|
|
204
|
+
3. Para pacotes COMPROMISED: confirmacao de que entendem que a remocao nao pode ser adiada
|
|
205
|
+
|
|
206
|
+
Sem aprovacao explicita, o comando termina aqui com status **PLANNED** e escreve o relatorio.
|
|
207
|
+
|
|
208
|
+
Se `{{MODE}} == --plan` (default), PARE depois de escrever o relatorio. Nao entre na Fase 4.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
### Fase 4 — Execucao Guiada (so em `--execute`)
|
|
213
|
+
|
|
214
|
+
Para cada pacote aprovado, na ordem COMPROMISED → CRITICAL → HIGH → OUTDATED-MAJOR:
|
|
215
|
+
|
|
216
|
+
1. **Aplicar o update**:
|
|
217
|
+
- npm/pnpm/yarn: detecte o manager pelo lockfile e rode o comando casado:
|
|
218
|
+
- `npm install <pkg>@<v> --save-exact`
|
|
219
|
+
- `pnpm add <pkg>@<v>`
|
|
220
|
+
- `yarn add <pkg>@<v>` (Berry) ou `yarn upgrade <pkg>@<v>` (v1)
|
|
221
|
+
- Python: `pip install -U "<pkg>==<v>"` OU `poetry add <pkg>@<v>` se `poetry.lock` existir OU edite `pyproject.toml` e rode `pip install -e .`
|
|
222
|
+
- C#: `dotnet add package <pkg> --version <v>`
|
|
223
|
+
- Rust: edite `Cargo.toml` e rode `cargo update -p <pkg> --precise <v>`
|
|
224
|
+
2. **Rodar testes escopados** da Fase 3.2 — apenas os testes que tocam este pacote, nao a suite inteira. Capture stdout, stderr, exit code.
|
|
225
|
+
3. **Se os testes falharem**:
|
|
226
|
+
- Rode um ciclo de `dw-fix-qa` automatico (mesmo padrao fix-retest do `/dw-fix-qa`).
|
|
227
|
+
- Se ainda falhar depois desse ciclo: **reverta o update**:
|
|
228
|
+
- Restaure lockfile + manifest do git (`git checkout -- <lockfile> <manifest>`)
|
|
229
|
+
- Rode o comando de install de novo para reconciliar deps com o lockfile restaurado
|
|
230
|
+
- Marque o pacote como **BLOCKED** no relatorio com nomes dos testes que falharam e trecho do stderr
|
|
231
|
+
- Va para o proximo pacote
|
|
232
|
+
4. **Se os testes passarem**: crie commit atomico por pacote:
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
chore(deps): update <pkg> from <old> to <new> [supply-chain] (<tier>)
|
|
236
|
+
|
|
237
|
+
- Closes <CVE-ID> | <OSV-ID> | <advisory>
|
|
238
|
+
- Testes escopados que passaram: <count>
|
|
239
|
+
- Arquivos que importam <pkg>: <count>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
5. Apos processar todos os aprovados, rode `/dw-run-qa` (escopo PRD se houver, senao a suite e2e) como gate final.
|
|
243
|
+
- PASS → status **EXECUTED-CLEAN**
|
|
244
|
+
- FAIL → status **EXECUTED-PARTIAL** (pacotes commitados ficam; falha do QA final fica documentada)
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
### Fase 5 — Relatorio
|
|
249
|
+
|
|
250
|
+
Escreva o relatorio em:
|
|
251
|
+
- `.dw/spec/prd-<slug>/deps-audit.md` se escopo PRD
|
|
252
|
+
- `.dw/audit/deps-audit-<YYYY-MM-DD>.md` caso contrario (cria o diretorio se faltar)
|
|
253
|
+
|
|
254
|
+
Frontmatter:
|
|
255
|
+
|
|
256
|
+
```markdown
|
|
257
|
+
---
|
|
258
|
+
type: deps-audit
|
|
259
|
+
schema_version: "1.0"
|
|
260
|
+
status: <SCANNED | PLANNED | EXECUTED-CLEAN | EXECUTED-PARTIAL | BLOCKED>
|
|
261
|
+
date: YYYY-MM-DD
|
|
262
|
+
languages: [typescript, python, csharp, rust]
|
|
263
|
+
mode: <scan|plan|execute>
|
|
264
|
+
osv_consulted: <true|false>
|
|
265
|
+
github_advisories_consulted: <true|false>
|
|
266
|
+
---
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Secoes:
|
|
270
|
+
|
|
271
|
+
1. **VERIFICATION REPORT** (por fase: comando, exit code, caminho do artefato)
|
|
272
|
+
2. **Inventario** — tabelas por linguagem dos resultados de Sinal A / B / C
|
|
273
|
+
3. **Classificacao** — pacotes agrupados por tier
|
|
274
|
+
4. **Mapeamento de Impacto** — por pacote: arquivos de uso, arquivos de teste, warning UNCOVERED se houver
|
|
275
|
+
5. **Brainstorm e Recomendacoes** — 3 opcoes por pacote + a recomendada
|
|
276
|
+
6. **Aprovacoes Humanas** — so em `--execute`: quais pacotes aprovados com qual opcao, e razoes para qualquer adiamento
|
|
277
|
+
7. **Log de Execucao** — so em `--execute`: por pacote, comando de install, comando de teste, resultado, SHA do commit (ou motivo do BLOCKED)
|
|
278
|
+
8. **QA Final** — so em `--execute`: resultado do `/dw-run-qa`
|
|
279
|
+
9. **Proximos Passos** — pacotes ainda BLOCKED, pacotes adiados para uma proxima rodada, link para `/dw-security-check` para o proximo gate
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Flags
|
|
284
|
+
|
|
285
|
+
| Flag | Fases | Uso |
|
|
286
|
+
|------|-------|-----|
|
|
287
|
+
| (default) `--plan` | 0 → 3 → 5 | Detecta, classifica, faz brainstorm, escreve plano. Sem mutacao de arquivos. Default seguro. |
|
|
288
|
+
| `--scan-only` | 0 → 2 → 5 | Detecta e classifica. Pula brainstorm e execucao. Pensado para dashboards de CI. |
|
|
289
|
+
| `--execute` | 0 → 5 | Pipeline completo incluindo updates, QA escopada, commits. Exige aprovacao humana explicita na Fase 3.5. |
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Regras Criticas
|
|
294
|
+
|
|
295
|
+
- <critical>Fase 4 NUNCA roda sem aprovacao explicita capturada na Fase 3.5. Se o agente que executa este comando nao tem canal interativo e `--execute` foi passado, aborte com: `"--execute exige aprovacao interativa; rerode com --plan e aplique as mudancas aprovadas manualmente."`</critical>
|
|
296
|
+
- <critical>Pacotes COMPROMISED ESTAO SEMPRE no plano. O usuario pode declinar, mas o relatorio registra os COMPROMISED declinados em uma secao de warning visivel.</critical>
|
|
297
|
+
- <critical>Se os testes escopados falham e `dw-fix-qa` nao recupera em um ciclo, o update e REVERTIDO. Sem commit parcial.</critical>
|
|
298
|
+
- <critical>OSV consult e a fonte de verdade para COMPROMISED. A lista hardcoded e fallback; sinalize no relatorio quando o OSV estava indisponivel.</critical>
|
|
299
|
+
- NAO bumpe pacotes fora da lista aprovada, mesmo que apareca em `npm outdated`.
|
|
300
|
+
- NAO modifique lockfiles direto — deixe o package manager regenerar.
|
|
301
|
+
- NAO rode `npm audit fix --force` ou qualquer flag de auto-fix; ela pula o brainstorm e o gate humano.
|
|
302
|
+
- NAO pule o relatorio da Fase 5 mesmo em abort precoce — escreva o que foi coletado para o proximo run ter contexto.
|
|
303
|
+
|
|
304
|
+
## Tratamento de Erros
|
|
305
|
+
|
|
306
|
+
- Tool ausente (`pip-audit`, `cargo-audit`, `cargo-outdated`) → pule esse sinal com nota visivel no relatorio; nao quebre o run.
|
|
307
|
+
- API OSV indisponivel → use a lista hardcoded como fallback, marque `osv_consulted: false` no frontmatter, ponha warning visivel no relatorio.
|
|
308
|
+
- API GitHub Advisories com rate limit → caia para a lista hardcoded no resto do run, marque `github_advisories_consulted: false`.
|
|
309
|
+
- Lockfile faltando para uma linguagem detectada (ex.: tem `package.json` mas nao `package-lock.json`) → pule Sinal A/B daquela linguagem, anote; o usuario tem que commitar lockfile primeiro.
|
|
310
|
+
- `--execute` pedido com working tree sujo → aborte com `"Working tree precisa estar limpo antes de --execute (mudancas sem commit detectadas). Comite ou stash, depois retente."`
|
|
311
|
+
- `dw-fix-qa` indisponivel no ambiente → em `--execute`, caia para revert direto (sem tentativa de fix) e marque BLOCKED.
|
|
312
|
+
|
|
313
|
+
## Integracao com Outros dw-* Commands
|
|
314
|
+
|
|
315
|
+
- **`/dw-security-check`** — os findings dele podem prefilar a Fase 1 Sinal A. Apos `EXECUTED-CLEAN` deste comando, rerode `/dw-security-check` para confirmar que o veredito virou.
|
|
316
|
+
- **`/dw-run-qa`** — invocado como gate final na Fase 4 passo 5.
|
|
317
|
+
- **`/dw-fix-qa`** — invocado uma vez por pacote que falha na Fase 4 passo 3 (recupera ou reverte).
|
|
318
|
+
- **`/dw-brainstorm`** — Fase 3.3 reusa a disciplina das tres opcoes (Conservadora/Balanceada/Ousada), mas aplicada por pacote, nao por feature.
|
|
319
|
+
- **`/dw-commit`** — nao invocado direto; este comando escreve as proprias mensagens com trailer de supply-chain.
|
|
320
|
+
- **`/dw-generate-pr`** — o relatorio vira evidencia de remediacao no body do PR.
|
|
321
|
+
|
|
322
|
+
## Inspirado em
|
|
323
|
+
|
|
324
|
+
`dw-deps-audit` e dev-workflow-native. A camada de deteccao reusa o pipeline SCA ja declarado no `/dw-security-check` (npm/pnpm/pip-audit/dotnet/cargo). A camada de brainstorm pega a disciplina das tres opcoes (Conservadora/Balanceada/Ousada) emprestada do `/dw-brainstorm`. O loop fix-retest pega emprestado de `/dw-run-qa` e `/dw-fix-qa`. O framing OWASP A06 (Vulnerable & Outdated Components) vem da skill `security-review` (`references/supply-chain.md`). O OSV.dev consult e a lista de incidentes de pacote malicioso sao sinais primarios aqui — nem `/dw-security-check` nem nenhuma das skills open-source surfaceadas pelo `/dw-find-skills` integram isso como orquestrador de remediacao.
|
|
325
|
+
|
|
326
|
+
</system_instructions>
|