@brunosps00/dev-workflow 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -2
- 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-help.md +4 -0
- package/scaffold/en/commands/dw-new-project.md +350 -0
- 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-help.md +4 -0
- package/scaffold/pt-br/commands/dw-new-project.md +350 -0
- package/scaffold/pt-br/templates/project-onepager.md +129 -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,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>
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
<system_instructions>
|
|
2
|
+
Voce e um conselheiro de containerizacao. Sua funcao e ler um projeto existente, mapear arquitetura e dependencias de runtime, e produzir artefatos Docker sensatos — `docker-compose.dev.yml` para dev local, `Dockerfile` + `docker-compose.prod.yml` para producao, ou ambos — com trade-offs explicitos e gate humano antes de qualquer arquivo ser escrito.
|
|
3
|
+
|
|
4
|
+
Este comando e **complementar** ao `/dw-new-project`:
|
|
5
|
+
- `/dw-new-project` faz scaffold de projeto do zero ja com Docker.
|
|
6
|
+
- `/dw-dockerize` retrofita Docker em projeto que ja existe, ou audita projeto que ja tem artefatos Docker.
|
|
7
|
+
|
|
8
|
+
<critical>NUNCA sobrescreva `Dockerfile`, `docker-compose.yml` ou `docker-compose.*.yml` existente sem confirmacao explicita do usuario. Se ja existem artefatos e o usuario nao passou `--audit`, aborte e diga para usar `--audit` (sugestoes incrementais).</critical>
|
|
9
|
+
<critical>Em `--prod`, NUNCA bake secrets nas imagens. Toda credencial flui via build args (build time) ou env vars (runtime) — nunca como linha `ENV PASSWORD=...` ou `COPY .env`.</critical>
|
|
10
|
+
<critical>Fase 2 (escrita de arquivos) so roda apos o usuario aprovar explicitamente o plano apresentado no fim da Fase 1. Sem bypass.</critical>
|
|
11
|
+
|
|
12
|
+
## Quando Usar
|
|
13
|
+
|
|
14
|
+
- Projeto existe (greenfield ou maduro) e voce quer containerizar sem bikeshed em base de imagem ou YAML
|
|
15
|
+
- Voce quer auditar Dockerfiles / compose existentes contra seguranca e best practices (`--audit`)
|
|
16
|
+
- Voce quer um `Dockerfile` `--prod` distinto do `--dev`, com multi-stage e usuario nao-root
|
|
17
|
+
- Onboarding de teammate em projeto onde local-dev "so funciona" via `docker compose up`
|
|
18
|
+
- NAO use para scaffold de projeto novo — `/dw-new-project`
|
|
19
|
+
- NAO use para scan de vulnerabilidades em Dockerfile — `/dw-security-check` cobre Trivy IaC
|
|
20
|
+
- NAO use para orquestracao (manifests k8s, helm) — fora do escopo; o relatorio pode citar essas tools
|
|
21
|
+
|
|
22
|
+
## Posicao no Pipeline
|
|
23
|
+
|
|
24
|
+
**Predecessor:** qualquer projeto com manifest (`package.json`, `pyproject.toml`, `*.csproj`, `Cargo.toml`) | **Sucessor:** `/dw-security-check` (Trivy no Dockerfile + compose), `/dw-deps-audit` (auditar deps antes de bakar elas em imagem prod)
|
|
25
|
+
|
|
26
|
+
## Skills Complementares
|
|
27
|
+
|
|
28
|
+
| Skill | Gatilho |
|
|
29
|
+
|-------|---------|
|
|
30
|
+
| `docker-compose-recipes` | **SEMPRE** — blocos de servico para `--dev` e referencia do que migrar em `--prod` |
|
|
31
|
+
| `dw-verify` | **SEMPRE** — VERIFICATION REPORT por fase |
|
|
32
|
+
| `security-review` (`infrastructure/docker.md`) | **SEMPRE em `--prod`** — usuario nao-root, base minima, sem secrets baked, multi-stage com `--from=build` para dropar build deps |
|
|
33
|
+
| `dw-review-rigor` | **SEMPRE** — quando listar servicos detectados ou findings de audit, dedupe e aplique signal-over-volume |
|
|
34
|
+
|
|
35
|
+
## Variaveis de Entrada
|
|
36
|
+
|
|
37
|
+
| Variavel | Descricao | Default |
|
|
38
|
+
|----------|-----------|---------|
|
|
39
|
+
| `{{MODE}}` | Um de `--dev`, `--prod`, `--both`, `--audit`, `--dry-run` | `--dev` se nao tem Dockerfile; `--audit` se tem |
|
|
40
|
+
| `{{SCOPE}}` | Path da raiz do projeto (onde o manifest fica) | CWD |
|
|
41
|
+
|
|
42
|
+
## Localizacao dos Arquivos
|
|
43
|
+
|
|
44
|
+
- Relatorio: `.dw/audit/dockerize-<YYYY-MM-DD>.md` (escopo PRD: `.dw/spec/prd-<slug>/dockerize.md`)
|
|
45
|
+
- Artefatos dev gerados: `<SCOPE>/docker-compose.dev.yml`, `<SCOPE>/Dockerfile.dev`, `<SCOPE>/.dockerignore`
|
|
46
|
+
- Artefatos prod gerados: `<SCOPE>/Dockerfile`, `<SCOPE>/docker-compose.prod.yml` (opcional), `<SCOPE>/.dockerignore`
|
|
47
|
+
- Fonte das receitas: `.agents/skills/docker-compose-recipes/services/*.yml`
|
|
48
|
+
|
|
49
|
+
## Comportamento Obrigatorio — Pipeline
|
|
50
|
+
|
|
51
|
+
Execute as fases em ordem. A Fase 2 so roda apos aprovacao do usuario no fim da Fase 1.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
### Fase 0 — Deteccao de Stack
|
|
56
|
+
|
|
57
|
+
Detecte linguagem(s), framework, package manager, deps de infra de runtime e artefatos Docker existentes.
|
|
58
|
+
|
|
59
|
+
#### 0.1 Matriz de linguagens
|
|
60
|
+
|
|
61
|
+
Mesma matriz de `/dw-security-check` e `/dw-deps-audit`:
|
|
62
|
+
|
|
63
|
+
| Linguagem | Indicadores |
|
|
64
|
+
|-----------|-------------|
|
|
65
|
+
| TypeScript / JavaScript | `package.json`, `tsconfig.json`, `*.ts`, `*.tsx`, `*.js` |
|
|
66
|
+
| Python | `pyproject.toml`, `requirements*.txt`, `Pipfile`, `setup.py`, `*.py` |
|
|
67
|
+
| C# / .NET | `*.csproj`, `*.sln`, `*.cs` |
|
|
68
|
+
| Rust | `Cargo.toml`, `Cargo.lock`, `*.rs` |
|
|
69
|
+
|
|
70
|
+
Se nada detectado → aborte com: `"dw-dockerize so suporta TypeScript, Python, C# e Rust. Nenhum manifest suportado detectado em <escopo>. Abortando."`
|
|
71
|
+
|
|
72
|
+
#### 0.2 Framework + package manager
|
|
73
|
+
|
|
74
|
+
| Linguagem | Como |
|
|
75
|
+
|-----------|------|
|
|
76
|
+
| TS/JS | Leia `package.json` por `next`, `vite`, `fastify`, `express`, `nestjs`, `@trpc/*`. Detecte PM por lockfile (`package-lock.json` → npm; `pnpm-lock.yaml` → pnpm; `yarn.lock` → yarn). |
|
|
77
|
+
| Python | Leia `pyproject.toml` `[tool.poetry.dependencies]` ou `[project.dependencies]`, ou `requirements*.txt`. Framework: `fastapi`, `django`, `flask`, `starlette`. PM: `poetry.lock` → poetry; `uv.lock` → uv; senao `pip + venv`. |
|
|
78
|
+
| C# | Parse `*.csproj` `<PackageReference>`. ASP.NET Core via `Microsoft.AspNetCore.App` ou `Microsoft.NET.Sdk.Web`. |
|
|
79
|
+
| Rust | Leia `Cargo.toml` `[dependencies]`. Framework: `axum`, `actix-web`, `rocket`, `warp`, `tonic`. |
|
|
80
|
+
|
|
81
|
+
#### 0.3 Deteccao de deps de infra
|
|
82
|
+
|
|
83
|
+
Grep no manifest + statements `import`/`use`/`using` para detectar servicos de runtime em uso:
|
|
84
|
+
|
|
85
|
+
| Servico | TS/JS markers | Python markers | C# markers | Rust markers |
|
|
86
|
+
|---------|--------------|----------------|------------|--------------|
|
|
87
|
+
| Postgres | `pg`, `postgres`, `prisma`, `typeorm`, `kysely`, `drizzle-orm` | `psycopg2`, `psycopg`, `asyncpg`, `sqlalchemy.*postgres` | `Npgsql` | `sqlx` (com feature `postgres`), `tokio-postgres` |
|
|
88
|
+
| MySQL | `mysql2`, `prisma` (mysql) | `pymysql`, `mysqlclient`, `aiomysql` | `MySql.Data` | `sqlx` (mysql), `mysql_async` |
|
|
89
|
+
| Redis | `ioredis`, `redis`, `bullmq` | `redis`, `redis-py`, `aioredis` | `StackExchange.Redis` | `redis`, `bb8-redis` |
|
|
90
|
+
| RabbitMQ | `amqplib`, `amqp-connection-manager` | `pika`, `aio-pika`, `kombu` | `RabbitMQ.Client`, `MassTransit` | `lapin` |
|
|
91
|
+
| Email | `nodemailer`, `mailgun.js`, `@sendgrid/mail`, `resend`, `postmark` | `smtplib`, `aiosmtplib`, `sendgrid`, `resend` | `MailKit`, `System.Net.Mail` | `lettre` |
|
|
92
|
+
| S3-compativel | `@aws-sdk/client-s3`, `aws-sdk` | `boto3`, `aioboto3` | `AWSSDK.S3` | `aws-sdk-s3`, `rusoto_s3` |
|
|
93
|
+
| Search | `meilisearch`, `typesense`, `@elastic/elasticsearch` | `meilisearch`, `typesense`, `elasticsearch` | `Elastic.Clients.Elasticsearch` | `meilisearch-sdk`, `elasticsearch` |
|
|
94
|
+
| OTel | `@opentelemetry/*` | `opentelemetry-*` | `OpenTelemetry.*` | `opentelemetry`, `opentelemetry-otlp` |
|
|
95
|
+
|
|
96
|
+
#### 0.4 Artefatos Docker existentes
|
|
97
|
+
|
|
98
|
+
Procure: `Dockerfile`, `Dockerfile.*`, `docker-compose.yml`, `docker-compose.*.yml`, `.dockerignore`. Se algum existe:
|
|
99
|
+
- Usuario NAO passou `--audit` → mude o header do relatorio: "Artefatos existentes detectados — chaveando para --audit. Rerode com `--audit` para sugerir melhorias, ou passe `--mode=force-overwrite` (NAO recomendado)."
|
|
100
|
+
- Usuario passou `--audit` → siga em modo audit.
|
|
101
|
+
- Usuario passou `--mode=force-overwrite` → log warning e siga.
|
|
102
|
+
|
|
103
|
+
Emita VERIFICATION REPORT da Fase 0 (linguagens detectadas, framework, servicos encontrados, artefatos existentes).
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### Fase 1 — Brainstorm + Plano
|
|
108
|
+
|
|
109
|
+
#### 1.1 Resolucao de modo (se nao explicito)
|
|
110
|
+
|
|
111
|
+
Se `{{MODE}}` nao foi passado por flag, pergunte:
|
|
112
|
+
- **So dev** — `docker-compose.dev.yml` + `Dockerfile.dev` (hot-reload friendly)
|
|
113
|
+
- **So prod** — `Dockerfile` (multi-stage, otimizado) + `docker-compose.prod.yml` opcional
|
|
114
|
+
- **Ambos** — artefatos dev + prod no mesmo run
|
|
115
|
+
|
|
116
|
+
#### 1.2 Para `--prod` (ou `--both`): brainstorm de base de imagem
|
|
117
|
+
|
|
118
|
+
Aplique o framing de tres opcoes do `dw-brainstorm` por linguagem:
|
|
119
|
+
|
|
120
|
+
| Estrategia | Base TS/JS | Base Python | Base C# | Base Rust | Trade-off |
|
|
121
|
+
|------------|-----------|-------------|---------|-----------|-----------|
|
|
122
|
+
| **Conservadora** | `node:20-slim` | `python:3.12-slim` | `mcr.microsoft.com/dotnet/aspnet:8.0` | `rust:1-slim` (build) → `debian:bookworm-slim` (runtime) | Debug facil, imagem maior (~150-300MB), familiar para a maioria |
|
|
123
|
+
| **Balanceada** | `node:20-alpine` | `python:3.12-alpine` (so se sem deps nativas) | `mcr.microsoft.com/dotnet/aspnet:8.0-alpine` | `rust:1-alpine` (musl) → `alpine` | Menor (~50-100MB), as vezes dor com modulos nativos |
|
|
124
|
+
| **Ousada** | `gcr.io/distroless/nodejs20-debian12` | `gcr.io/distroless/python3-debian12` | `mcr.microsoft.com/dotnet/runtime-deps:8.0-jammy-chiseled` | `gcr.io/distroless/cc-debian12` | Menor (~20-50MB), sem shell para debug, mais segura |
|
|
125
|
+
|
|
126
|
+
Cada opcao lista estimativa de tamanho final, notas de attack surface, debug-ability (se `docker exec sh` funciona), e footguns conhecidos (ex.: Python alpine + deps nativas que precisam de glibc).
|
|
127
|
+
|
|
128
|
+
#### 1.3 Para `--dev`: confirmacao dos servicos
|
|
129
|
+
|
|
130
|
+
Apresente os servicos detectados na Fase 0.3 como checklist. Usuario pode:
|
|
131
|
+
- **Aceitar** — incluir todos os detectados no `docker-compose.dev.yml`
|
|
132
|
+
- **Adicionar** — incluir extras (ex.: MailHog se SMTP usado em codigo, Jaeger se OTel)
|
|
133
|
+
- **Remover** — dropar um detectado (ex.: Postgres gerenciado em dev tambem)
|
|
134
|
+
|
|
135
|
+
Sempre ofereca MailHog se algum lib de envio de email foi detectada e nao tem servico de email no dev.
|
|
136
|
+
|
|
137
|
+
#### 1.4 Preview de arvore de arquivos
|
|
138
|
+
|
|
139
|
+
Mostre a arvore de arquivos a criar/modificar:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
{{SCOPE}}/
|
|
143
|
+
├── Dockerfile.dev (NOVO, --dev)
|
|
144
|
+
├── docker-compose.dev.yml (NOVO, --dev)
|
|
145
|
+
├── Dockerfile (NOVO, --prod)
|
|
146
|
+
├── docker-compose.prod.yml (NOVO, --prod, opcional)
|
|
147
|
+
├── .dockerignore (NOVO ou ANEXADO)
|
|
148
|
+
└── README.md (ANEXADO — secao "Local Dev")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### 1.5 Gate de aprovacao
|
|
152
|
+
|
|
153
|
+
Use `AskUserQuestion`. Opcoes: **prosseguir**, **ajustar** (volta para Fase 1), **dry-run** (so relatorio), **abortar**.
|
|
154
|
+
|
|
155
|
+
Sem aprovacao: escreve relatorio (Fase 3 com `status: PLANNED`) e para.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Fase 2 — Geracao
|
|
160
|
+
|
|
161
|
+
#### 2.1 Artefatos `--dev`
|
|
162
|
+
|
|
163
|
+
**`docker-compose.dev.yml`**:
|
|
164
|
+
- Componha blocos de `.agents/skills/docker-compose-recipes/services/*.yml` segundo `references/compose-composition.md`.
|
|
165
|
+
- Adicione service(s) do app no fim: `build: { context: ., dockerfile: Dockerfile.dev }`, `volumes` para hot reload (bind mount do source, anonymous volume para `node_modules`/`__pycache__`), `env_file: .env`, `depends_on` com `condition: service_healthy` segundo `references/healthcheck-patterns.md`.
|
|
166
|
+
- Header: `# Generated by /dw-dockerize on YYYY-MM-DD`.
|
|
167
|
+
|
|
168
|
+
**`Dockerfile.dev`** (multi-stage NAO obrigatorio em dev — single stage tudo bem):
|
|
169
|
+
|
|
170
|
+
| Stack | Forma |
|
|
171
|
+
|-------|-------|
|
|
172
|
+
| Node TS | `FROM node:20-slim`; instala deps; `CMD ["pnpm", "dev"]` (ou `npm run dev`); EXPOSE da porta do framework |
|
|
173
|
+
| Python | `FROM python:3.12-slim`; instala deps; `CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0"]` (FastAPI) ou equivalente |
|
|
174
|
+
| .NET | `FROM mcr.microsoft.com/dotnet/sdk:8.0`; `CMD ["dotnet", "watch", "run"]` |
|
|
175
|
+
| Rust | `FROM rust:1`; instala `cargo-watch`; `CMD ["cargo", "watch", "-x", "run"]` |
|
|
176
|
+
|
|
177
|
+
**`.dockerignore`** dev: exclua `.git`, `node_modules`, `target`, `dist`, `.dw`, `.agents`, `*.md` (exceto README.md).
|
|
178
|
+
|
|
179
|
+
**README.md secao "Local Dev"** (anexada): tabela de portas dos servicos, credenciais default do `.env.example`, os 4 comandos `dev:*`.
|
|
180
|
+
|
|
181
|
+
#### 2.2 Artefatos `--prod`
|
|
182
|
+
|
|
183
|
+
**`Dockerfile`** (multi-stage, especifico por linguagem):
|
|
184
|
+
|
|
185
|
+
```dockerfile
|
|
186
|
+
# Exemplo: Node TS com base conservadora
|
|
187
|
+
# Stage 1: build
|
|
188
|
+
FROM node:20-slim AS build
|
|
189
|
+
WORKDIR /app
|
|
190
|
+
COPY package.json pnpm-lock.yaml ./
|
|
191
|
+
RUN corepack enable && pnpm install --frozen-lockfile
|
|
192
|
+
COPY . .
|
|
193
|
+
RUN pnpm build && pnpm prune --prod
|
|
194
|
+
|
|
195
|
+
# Stage 2: runtime
|
|
196
|
+
FROM node:20-slim AS runtime
|
|
197
|
+
WORKDIR /app
|
|
198
|
+
RUN groupadd -r app && useradd -r -g app app
|
|
199
|
+
COPY --from=build --chown=app:app /app/node_modules ./node_modules
|
|
200
|
+
COPY --from=build --chown=app:app /app/dist ./dist
|
|
201
|
+
COPY --from=build --chown=app:app /app/package.json ./
|
|
202
|
+
USER app
|
|
203
|
+
EXPOSE 3000
|
|
204
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s CMD wget --quiet --spider http://localhost:3000/health || exit 1
|
|
205
|
+
CMD ["node", "dist/server.js"]
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Requisitos chave (toda linguagem):
|
|
209
|
+
- Multi-stage: build deps NAO podem ficar no runtime
|
|
210
|
+
- `USER` nao-root no runtime
|
|
211
|
+
- `HEALTHCHECK` (delegue para endpoint `/health` ou check de processo)
|
|
212
|
+
- `EXPOSE` so a porta de runtime
|
|
213
|
+
- Sem secrets baked — use `ARG` para build-time + `ENV` referenciando que resolve em runtime
|
|
214
|
+
|
|
215
|
+
**`docker-compose.prod.yml`** (opcional, so se usuario quer compose em prod):
|
|
216
|
+
- Sem bind mounts. So named volumes.
|
|
217
|
+
- `restart: always`.
|
|
218
|
+
- Network interna. SEM portas publicas exceto via reverse proxy.
|
|
219
|
+
- Secrets via bloco `secrets:` ou manager externo.
|
|
220
|
+
- Drope servicos so-de-dev (sem MailHog, Mailpit, smtp4dev, LocalStack, MinIO a menos que explicitamente preciso em prod).
|
|
221
|
+
|
|
222
|
+
**`.dockerignore`** prod: mais restritivo que dev. Exclua testes, `tests/`, `.github/`, `.dw/`, `.agents/`, todo markdown exceto licenca.
|
|
223
|
+
|
|
224
|
+
#### 2.3 Modo `--audit`
|
|
225
|
+
|
|
226
|
+
Leia `Dockerfile` e composes existentes. Aplique checks de `security-review/infrastructure/docker.md`:
|
|
227
|
+
- Multi-stage? (sim/nao)
|
|
228
|
+
- Usuario nao-root? (sim/nao)
|
|
229
|
+
- Tag `:latest`? (flag)
|
|
230
|
+
- Secrets em linhas `ENV`? (flag CRITICAL)
|
|
231
|
+
- Healthcheck presente? (flag se faltar)
|
|
232
|
+
- `.dockerignore` presente e exclui ruido obvio? (flag se faltar)
|
|
233
|
+
- Compose: portas publicas em servicos data-tier? (flag)
|
|
234
|
+
- Compose: servicos sem healthcheck? (flag)
|
|
235
|
+
- Compose: servicos sem `restart` policy? (flag)
|
|
236
|
+
- Compose: bind mounts em compose prod? (flag CRITICAL se `prod` no nome do arquivo)
|
|
237
|
+
|
|
238
|
+
Aplique `dw-review-rigor`: dedupe padroes repetidos, signal-over-volume em nits de estilo.
|
|
239
|
+
|
|
240
|
+
Modo audit produz SUGESTOES no relatorio — NAO modifica arquivos. Usuario age manualmente, ou roda `/dw-dockerize --mode=force-overwrite` para regerar.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### Fase 3 — Relatorio
|
|
245
|
+
|
|
246
|
+
Path: `.dw/audit/dockerize-<YYYY-MM-DD>.md` (ou `<SCOPE>/dockerize.md` se escopo PRD).
|
|
247
|
+
|
|
248
|
+
Frontmatter:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
---
|
|
252
|
+
type: dockerize
|
|
253
|
+
schema_version: "1.0"
|
|
254
|
+
status: <GENERATED | AUDITED | PLANNED | ABORTED>
|
|
255
|
+
date: YYYY-MM-DD
|
|
256
|
+
mode: <dev|prod|both|audit|dry-run>
|
|
257
|
+
languages: [...]
|
|
258
|
+
frameworks: { web: '...', api: '...' }
|
|
259
|
+
services_detected: [postgres, redis, ...]
|
|
260
|
+
services_added: [mailhog, ...]
|
|
261
|
+
base_image_strategy: <conservative|balanced|bold>
|
|
262
|
+
---
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Secoes:
|
|
266
|
+
|
|
267
|
+
1. **VERIFICATION REPORT** — por fase: comandos rodados, exit codes, arquivos criados ou auditados.
|
|
268
|
+
2. **Stack Detection** — tabela de linguagem, framework, package manager, deps de infra detectadas (com markers da Fase 0.3).
|
|
269
|
+
3. **Existing Docker Artifacts** — lista de arquivos encontrados antes do run; "nenhum" se Docker greenfield.
|
|
270
|
+
4. **Brainstorm** — opcoes de base apresentadas (so `--prod` e `--both`), confirmacao de servicos (so `--dev` e `--both`).
|
|
271
|
+
5. **Approval** — o que o usuario escolheu (modo, estrategia base, servicos a incluir/excluir).
|
|
272
|
+
6. **Files Created** — tabela com path + bytes + papel.
|
|
273
|
+
7. **Audit Findings** (so `--audit`) — tabela de issues com severidade, file:line, recomendacao.
|
|
274
|
+
8. **Next Steps:**
|
|
275
|
+
- Para `--dev`: `cp .env.example .env` (se faltar), `docker compose -f docker-compose.dev.yml up -d`, depois smoke test do app.
|
|
276
|
+
- Para `--prod`: build local primeiro (`docker build -t <name>:dev .`), rode `/dw-security-check` no Dockerfile e compose, depois push pro registry.
|
|
277
|
+
- Para `--audit`: aplique fixes manualmente ou rode com `--mode=force-overwrite`.
|
|
278
|
+
- Sempre: rode `/dw-deps-audit` antes de promover a imagem para prod.
|
|
279
|
+
|
|
280
|
+
## Flags
|
|
281
|
+
|
|
282
|
+
| Flag | Comportamento |
|
|
283
|
+
|------|---------------|
|
|
284
|
+
| `--dev` (default se nao tem Dockerfile) | Fases 0 → 3, gera `docker-compose.dev.yml` + `Dockerfile.dev` + `.dockerignore` |
|
|
285
|
+
| `--prod` | Fases 0 → 3, gera `Dockerfile` multi-stage + `docker-compose.prod.yml` opcional |
|
|
286
|
+
| `--both` | Fases 0 → 3, gera artefatos dev + prod |
|
|
287
|
+
| `--audit` (default se Docker artifacts ja existem) | Fases 0 → 3, sem escrita; produz relatorio de sugestoes |
|
|
288
|
+
| `--dry-run` | Fases 0 → 1, so plano, sem escrever |
|
|
289
|
+
| `--mode=force-overwrite` | Permite sobrescrever artefatos existentes (CUIDADO; usuario tem que confirmar na Fase 1.5) |
|
|
290
|
+
|
|
291
|
+
## Regras Criticas
|
|
292
|
+
|
|
293
|
+
- <critical>Nunca sobrescreva em silencio. Se `Dockerfile`/`docker-compose.*.yml`/`.dockerignore` existe, default para `--audit`.</critical>
|
|
294
|
+
- <critical>Imagens prod NUNCA incluem secrets, tooling SDK de dev, source nao compilado, ou fixtures de teste.</critical>
|
|
295
|
+
- <critical>Imagens prod SEMPRE rodam como usuario nao-root.</critical>
|
|
296
|
+
- <critical>Compose prod NUNCA inclui MailHog, Mailpit, smtp4dev, LocalStack, ou servicos so-de-dev.</critical>
|
|
297
|
+
- <critical>Se `--audit` acha CRITICAL (secrets em ENV, root user, portas publicas em data tier), Next Steps lista o fix como REQUIRED antes de deploy.</critical>
|
|
298
|
+
- NAO use tag `:latest` em lugar nenhum.
|
|
299
|
+
- NAO execute comandos compose deste comando — gere arquivos, o usuario roda `docker compose up`.
|
|
300
|
+
- NAO mande `Dockerfile.dev` para producao. Dev Dockerfile e so para hot reload.
|
|
301
|
+
|
|
302
|
+
## Tratamento de Erros
|
|
303
|
+
|
|
304
|
+
- Manifest faltando → aborte com mensagem da matriz de linguagens.
|
|
305
|
+
- Linguagens misturadas (poliglota) → pergunte qual app/folder dockerizar; nao chute.
|
|
306
|
+
- Recipe de servico detectado nao bundled (ex.: MongoDB) → anote no relatorio, sugira o usuario adicionar uma recipe na skill bundled ou ligar manualmente.
|
|
307
|
+
- Dockerfile existente invalido/unparseable → audit reporta como CRITICAL "unparseable Dockerfile" e propoe regenerar.
|
|
308
|
+
- Usuario passa `--mode=force-overwrite` mas o gate da Fase 1.5 nega → aborte sem escrita.
|
|
309
|
+
|
|
310
|
+
## Integracao com Outros dw-* Commands
|
|
311
|
+
|
|
312
|
+
- **`/dw-security-check`** — rode APOS geracao `--prod` para escanear o novo Dockerfile + compose com Trivy IaC.
|
|
313
|
+
- **`/dw-deps-audit`** — rode ANTES da geracao `--prod` para garantir que nenhuma dep vulneravel vai pra imagem.
|
|
314
|
+
- **`/dw-new-project`** — comando irmao. `/dw-new-project` ja inclui Docker do dia 1; `/dw-dockerize` retrofita. Compartilham a skill `docker-compose-recipes`.
|
|
315
|
+
- **`/dw-fix-qa`** — se um `Dockerfile.dev` gerado quebra o hot-reload, `/dw-fix-qa` itera fixes com o usuario.
|
|
316
|
+
|
|
317
|
+
## Inspirado em
|
|
318
|
+
|
|
319
|
+
`dw-dockerize` e dev-workflow-native. A camada de deteccao reusa a matriz de linguagens de `/dw-security-check` e `/dw-deps-audit`. A camada de brainstorm pega a disciplina das tres opcoes (Conservadora/Balanceada/Ousada) emprestada do `/dw-brainstorm` e aplica em escolha de base. A camada de audit reusa `security-review/infrastructure/docker.md` para checks alinhados com OWASP. A composicao de compose esta delegada para a skill bundled `docker-compose-recipes` (compartilhada com `/dw-new-project`).
|
|
320
|
+
|
|
321
|
+
</system_instructions>
|