@brunosps00/dev-workflow 2.0.0 → 2.1.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/.claude-plugin/marketplace.json +1 -0
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +104 -0
- package/README.md +6 -4
- package/lib/build-plugin.js +4 -1
- package/lib/constants.js +4 -2
- package/lib/validate.js +21 -0
- package/package.json +1 -1
- package/scaffold/en/commands/dw-brainstorm.md +12 -8
- package/scaffold/en/commands/dw-bugfix.md +4 -2
- package/scaffold/en/commands/dw-plan.md +2 -2
- package/scaffold/en/commands/dw-refactor.md +1 -0
- package/scaffold/en/commands/dw-review.md +33 -2
- package/scaffold/en/commands/dw-run.md +1 -0
- package/scaffold/en/commands/dw-triage.md +220 -0
- package/scaffold/en/templates/idea-onepager.md +28 -0
- package/scaffold/en/templates/task-template.md +1 -0
- package/scaffold/en/templates/tasks-template.md +9 -8
- package/scaffold/en/templates/triage-needs-info-template.md +23 -0
- package/scaffold/en/templates/triage-out-of-scope-template.md +36 -0
- package/scaffold/en/templates/triage-record-template.md +88 -0
- package/scaffold/pt-br/commands/dw-autopilot.md +81 -81
- package/scaffold/pt-br/commands/dw-brainstorm.md +12 -9
- package/scaffold/pt-br/commands/dw-bugfix.md +4 -2
- package/scaffold/pt-br/commands/dw-claude-run.md +19 -19
- package/scaffold/pt-br/commands/dw-codex-run.md +19 -19
- package/scaffold/pt-br/commands/dw-context-budget.md +10 -10
- package/scaffold/pt-br/commands/dw-copilot-run.md +20 -20
- package/scaffold/pt-br/commands/dw-dockerize.md +102 -102
- package/scaffold/pt-br/commands/dw-find-skills.md +52 -52
- package/scaffold/pt-br/commands/dw-goal.md +41 -41
- package/scaffold/pt-br/commands/dw-harness-audit.md +11 -11
- package/scaffold/pt-br/commands/dw-intel.md +70 -70
- package/scaffold/pt-br/commands/dw-learn.md +24 -24
- package/scaffold/pt-br/commands/dw-new-project.md +88 -88
- package/scaffold/pt-br/commands/dw-open-design.md +53 -53
- package/scaffold/pt-br/commands/dw-opportunities.md +45 -45
- package/scaffold/pt-br/commands/dw-pause.md +39 -39
- package/scaffold/pt-br/commands/dw-plan.md +2 -2
- package/scaffold/pt-br/commands/dw-refactor.md +31 -30
- package/scaffold/pt-br/commands/dw-resume.md +22 -22
- package/scaffold/pt-br/commands/dw-review.md +33 -2
- package/scaffold/pt-br/commands/dw-run.md +1 -0
- package/scaffold/pt-br/commands/dw-skill-health.md +10 -10
- package/scaffold/pt-br/commands/dw-subtask-complete.md +4 -4
- package/scaffold/pt-br/commands/dw-subtask-start.md +4 -4
- package/scaffold/pt-br/commands/dw-triage.md +220 -0
- package/scaffold/pt-br/templates/bugfix-summary-template.md +20 -20
- package/scaffold/pt-br/templates/concerns-template.md +20 -20
- package/scaffold/pt-br/templates/idea-onepager.md +28 -0
- package/scaffold/pt-br/templates/project-onepager.md +32 -32
- package/scaffold/pt-br/templates/state-template.md +13 -13
- package/scaffold/pt-br/templates/task-template.md +1 -0
- package/scaffold/pt-br/templates/tasks-template.md +9 -8
- package/scaffold/pt-br/templates/triage-needs-info-template.md +23 -0
- package/scaffold/pt-br/templates/triage-out-of-scope-template.md +36 -0
- package/scaffold/pt-br/templates/triage-record-template.md +88 -0
- package/scaffold/scripts/hooks/git-guardrails.mjs +41 -24
- package/scaffold/skills/dw-debug-protocol/SKILL.md +2 -0
- package/scaffold/skills/dw-debug-protocol/references/six-step-triage.md +60 -1
- package/scaffold/skills/dw-execute-phase/references/wave-coordination.md +14 -14
- package/scaffold/skills/dw-grilling/SKILL.md +17 -7
- package/scaffold/skills/dw-grilling/references/decision-tree.md +30 -7
- package/scaffold/skills/dw-simplification/references/deep-modules.md +50 -0
- package/scaffold/skills/dw-testing-discipline/SKILL.md +3 -1
- package/scaffold/skills/dw-testing-discipline/references/tdd-loop.md +83 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
|
-
|
|
3
|
-
worktree dedicada** para implementar um prompt/spec
|
|
4
|
-
|
|
2
|
+
Você é o **adapter runner do Copilot**. Você dispara o GitHub Copilot CLI (`copilot -p`) dentro de uma **git
|
|
3
|
+
worktree dedicada** para implementar um prompt/spec já preparado, captura a execução inteira num log de auditoria
|
|
4
|
+
durável, mantem uma **sessão resumivel por tarefa**, da nota 0–10 a entrega, escala em caso de falha e **PARA para
|
|
5
5
|
o gate**.
|
|
6
6
|
|
|
7
|
-
<critical>Carregue e siga a skill `dw-cli-run` — ela tem o protocolo completo
|
|
8
|
-
<critical>NUNCA rode no checkout principal do repo —
|
|
9
|
-
<critical>NUNCA mergeie nem de push. Merge e
|
|
7
|
+
<critical>Carregue e siga a skill `dw-cli-run` — ela tem o protocolo completo agnóstico de CLI (regra dura da worktree, pre-flight, escolha do veiculo, dupla avaliação 0–10, escalonamento gradual, telemetria, disciplina de kill/detecção, Structured Return). Este arquivo só fornece a **tabela de adapter do Copilot**; substitua-a naquele protocolo.</critical>
|
|
8
|
+
<critical>NUNCA rode no checkout principal do repo — só worktree dedicada off main. ABORTE (`BLOCKED`) caso contrário.</critical>
|
|
9
|
+
<critical>NUNCA mergeie nem de push. Merge e decisão do dono, depois do gate.</critical>
|
|
10
10
|
|
|
11
11
|
## Tabela de adapter do Copilot (substituir na `dw-cli-run`)
|
|
12
12
|
|
|
@@ -14,34 +14,34 @@ o gate**.
|
|
|
14
14
|
|---|---|
|
|
15
15
|
| `DISPATCH` | `cd <WORKTREE> && copilot -p "$(cat <PROMPT>)" --allow-all --model <MODEL> --output-format json </dev/null > <AUDIT>/<slug>.log 2>&1` |
|
|
16
16
|
| `STREAM` | `--output-format json` (registros JSONL) |
|
|
17
|
-
| `AUTO` | `--allow-all` (auto-
|
|
18
|
-
| `RESUME <id>` | `cd <WORKTREE> && copilot --resume="<SESSION_ID>" -p "$(cat <FOLLOWUP_PROMPT>)" --allow-all --output-format json </dev/null >> <AUDIT>/<slug>.log 2>&1` (
|
|
19
|
-
| `RESUME_LAST` | `copilot --continue -p …` (continua a
|
|
20
|
-
| `SESSION_ID` | O `--resume`/`--session-id` do Copilot **RESUMEM** uma
|
|
17
|
+
| `AUTO` | `--allow-all` (auto-aprovação de todo uso de tool/comando; justificável porque a worktree é isolada). Somente leitura/análise: tire-o e deixe negar no prompt, ou escope com `--allow-tool`/`--deny-tool`. |
|
|
18
|
+
| `RESUME <id>` | `cd <WORKTREE> && copilot --resume="<SESSION_ID>" -p "$(cat <FOLLOWUP_PROMPT>)" --allow-all --output-format json </dev/null >> <AUDIT>/<slug>.log 2>&1` (também: `--connect=<SESSION_ID>`) |
|
|
19
|
+
| `RESUME_LAST` | `copilot --continue -p …` (continua a sessão mais recente nesta cwd) |
|
|
20
|
+
| `SESSION_ID` | O `--resume`/`--session-id` do Copilot **RESUMEM** uma sessão existente (não fixam uma nova) → **capture** o id da 1a run: varra o stream/log pelo registro do session id, ou leia o dir mais novo em `~/.copilot/logs` / `~/.copilot/history-session-state`. Grave em `<AUDIT>/<slug>.session`. **Confirme o campo exato do id no smoke test.** |
|
|
21
21
|
| `DONE_SIGNAL` | o registro JSON final do stream (fim de turno) |
|
|
22
22
|
| `USAGE` | o uso de tokens do registro final (confirme os nomes exatos dos campos no smoke test) |
|
|
23
23
|
|
|
24
|
-
**Modelo:** `--model` escolhe a engine (ex.: `claude-sonnet-4.5`, `gpt-5`). O Copilot
|
|
24
|
+
**Modelo:** `--model` escolhe a engine (ex.: `claude-sonnet-4.5`, `gpt-5`). O Copilot não tem flag numérica de
|
|
25
25
|
effort; mapeie "escalonamento" para o tier do modelo. Comece um tier abaixo do teto; escale conforme a `dw-cli-run`.
|
|
26
26
|
|
|
27
|
-
## Resume de
|
|
28
|
-
O Copilot
|
|
29
|
-
grave em `<AUDIT>/<slug>.session` (
|
|
27
|
+
## Resume de sessão (o coração)
|
|
28
|
+
O Copilot não deixa fixar o id, então na 1a run **capture** o session id (do stream/log ou `~/.copilot/logs`) e
|
|
29
|
+
grave em `<AUDIT>/<slug>.session` (durável, fora da worktree → sobrevive ao `git worktree remove`). Pra voltar com
|
|
30
30
|
o **mesmo contexto**, leia o id e re-rode `RESUME <id>` (`copilot --resume="<id>" -p …` ou `--connect=<id>`) com o
|
|
31
|
-
prompt de follow-up — o Copilot recarrega a mesma
|
|
31
|
+
prompt de follow-up — o Copilot recarrega a mesma sessão. Fallback se o sidecar sumiu: `copilot --continue -p …`
|
|
32
32
|
da mesma worktree.
|
|
33
33
|
|
|
34
|
-
> **
|
|
34
|
+
> **Confirmações no smoke test (conforme o plano):** o campo exato do session-id no JSONL, os nomes dos campos de
|
|
35
35
|
> usage, e que `--resume=<id>` de fato continua o mesmo contexto — verifique numa worktree descartavel antes de
|
|
36
36
|
> confiar, e atualize esta tabela com o que achar.
|
|
37
37
|
|
|
38
|
-
##
|
|
39
|
-
|
|
|
38
|
+
## Variáveis de Input
|
|
39
|
+
| Variável | Descrição | Exemplo |
|
|
40
40
|
|----------|-----------|---------|
|
|
41
41
|
| `<WORKTREE>` | git worktree dedicada (off main) | `~/code/vizzita-billing-s10` |
|
|
42
42
|
| `<PROMPT>` | caminho do prompt/spec preparado | `.dw/spec/prd-billing-integrador/codex-prompt.md` |
|
|
43
|
-
| `<slug>` | chave da tarefa p/ arquivos de audit/
|
|
44
|
-
| `<AUDIT>` | dir de auditoria
|
|
43
|
+
| `<slug>` | chave da tarefa p/ arquivos de audit/sessão | `prd-billing-integrador` |
|
|
44
|
+
| `<AUDIT>` | dir de auditoria durável FORA da worktree | `~/code/vizzita/.dw/cli-run` |
|
|
45
45
|
|
|
46
46
|
Retorne pelo **Structured Return** da `dw-cli-run` (Status/Score/Scope/Evidence/Artifacts/Decisions/Risks/
|
|
47
47
|
Telemetria/Next Step), incluindo o `session-id` capturado, o caminho do sidecar, e o comando `RESUME` exato pra
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
|
-
|
|
2
|
+
Você é um conselheiro de containerização. Sua função é ler um projeto existente, mapear arquitetura e dependências 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 explícitos e gate humano antes de qualquer arquivo ser escrito.
|
|
3
3
|
|
|
4
4
|
Este comando e **complementar** ao `/dw-new-project`:
|
|
5
|
-
- `/dw-new-project` faz scaffold de projeto do zero
|
|
6
|
-
- `/dw-dockerize` retrofita Docker em projeto que
|
|
5
|
+
- `/dw-new-project` faz scaffold de projeto do zero já com Docker.
|
|
6
|
+
- `/dw-dockerize` retrofita Docker em projeto que já existe, ou audita projeto que já tem artefatos Docker.
|
|
7
7
|
|
|
8
|
-
<critical>NUNCA sobrescreva `Dockerfile`, `docker-compose.yml` ou `docker-compose.*.yml` existente sem
|
|
8
|
+
<critical>NUNCA sobrescreva `Dockerfile`, `docker-compose.yml` ou `docker-compose.*.yml` existente sem confirmação explícita do usuário. Se já existem artefatos e o usuário não passou `--audit`, aborte e diga para usar `--audit` (sugestões incrementais).</critical>
|
|
9
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)
|
|
10
|
+
<critical>Fase 2 (escrita de arquivos) só roda após o usuário aprovar explicitamente o plano apresentado no fim da Fase 1. Sem bypass.</critical>
|
|
11
11
|
|
|
12
12
|
## Quando Usar
|
|
13
13
|
|
|
14
|
-
- Projeto existe (greenfield ou maduro) e
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
- Onboarding de teammate em projeto onde local-dev "
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
14
|
+
- Projeto existe (greenfield ou maduro) e você quer containerizar sem bikeshed em base de imagem ou YAML
|
|
15
|
+
- Você quer auditar Dockerfiles / compose existentes contra segurança e best practices (`--audit`)
|
|
16
|
+
- Você quer um `Dockerfile` `--prod` distinto do `--dev`, com multi-stage e usuário não-root
|
|
17
|
+
- Onboarding de teammate em projeto onde local-dev "só funciona" via `docker compose up`
|
|
18
|
+
- NÃO use para scaffold de projeto novo — `/dw-new-project`
|
|
19
|
+
- NÃO use para scan de vulnerabilidades em Dockerfile — `/dw-secure-audit` cobre Trivy IaC
|
|
20
|
+
- NÃO use para orquestração (manifests k8s, helm) — fora do escopo; o relatório pode citar essas tools
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Posição no Pipeline
|
|
23
23
|
|
|
24
24
|
**Predecessor:** qualquer projeto com manifest (`package.json`, `pyproject.toml`, `*.csproj`, `Cargo.toml`) | **Sucessor:** `/dw-secure-audit` (Trivy no Dockerfile + compose), `/dw-secure-audit --plan` (auditar deps antes de bakar elas em imagem prod)
|
|
25
25
|
|
|
@@ -27,32 +27,32 @@ Este comando e **complementar** ao `/dw-new-project`:
|
|
|
27
27
|
|
|
28
28
|
| Skill | Gatilho |
|
|
29
29
|
|-------|---------|
|
|
30
|
-
| `docker-compose-recipes` | **SEMPRE** — blocos de
|
|
30
|
+
| `docker-compose-recipes` | **SEMPRE** — blocos de serviço para `--dev` e referência do que migrar em `--prod` |
|
|
31
31
|
| `dw-verify` | **SEMPRE** — VERIFICATION REPORT por fase |
|
|
32
|
-
| `security-review` (`infrastructure/docker.md`) | **SEMPRE em `--prod`** —
|
|
33
|
-
| `dw-review-rigor` | **SEMPRE** — quando listar
|
|
32
|
+
| `security-review` (`infrastructure/docker.md`) | **SEMPRE em `--prod`** — usuário não-root, base mínima, sem secrets baked, multi-stage com `--from=build` para dropar build deps |
|
|
33
|
+
| `dw-review-rigor` | **SEMPRE** — quando listar serviços detectados ou findings de audit, dedupe e aplique signal-over-volume |
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## Variáveis de Entrada
|
|
36
36
|
|
|
37
|
-
|
|
|
37
|
+
| Variável | Descrição | Default |
|
|
38
38
|
|----------|-----------|---------|
|
|
39
|
-
| `{{MODE}}` | Um de `--dev`, `--prod`, `--both`, `--audit`, `--dry-run` | `--dev` se
|
|
39
|
+
| `{{MODE}}` | Um de `--dev`, `--prod`, `--both`, `--audit`, `--dry-run` | `--dev` se não tem Dockerfile; `--audit` se tem |
|
|
40
40
|
| `{{SCOPE}}` | Path da raiz do projeto (onde o manifest fica) | CWD |
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Localização dos Arquivos
|
|
43
43
|
|
|
44
|
-
-
|
|
44
|
+
- Relatório: `.dw/audit/dockerize-<YYYY-MM-DD>.md` (escopo PRD: `.dw/spec/prd-<slug>/dockerize.md`)
|
|
45
45
|
- Artefatos dev gerados: `<SCOPE>/docker-compose.dev.yml`, `<SCOPE>/Dockerfile.dev`, `<SCOPE>/.dockerignore`
|
|
46
46
|
- Artefatos prod gerados: `<SCOPE>/Dockerfile`, `<SCOPE>/docker-compose.prod.yml` (opcional), `<SCOPE>/.dockerignore`
|
|
47
47
|
- Fonte das receitas: `.agents/skills/docker-compose-recipes/services/*.yml`
|
|
48
48
|
|
|
49
|
-
## Comportamento
|
|
49
|
+
## Comportamento Obrigatório — Pipeline
|
|
50
50
|
|
|
51
|
-
Execute as fases em ordem. A Fase 2
|
|
51
|
+
Execute as fases em ordem. A Fase 2 só roda após aprovação do usuário no fim da Fase 1.
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
|
-
### Fase 0 —
|
|
55
|
+
### Fase 0 — Detecção de Stack
|
|
56
56
|
|
|
57
57
|
Detecte linguagem(s), framework, package manager, deps de infra de runtime e artefatos Docker existentes.
|
|
58
58
|
|
|
@@ -74,15 +74,15 @@ Se nada detectado → aborte com: `"dw-dockerize so suporta TypeScript, Python,
|
|
|
74
74
|
| Linguagem | Como |
|
|
75
75
|
|-----------|------|
|
|
76
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;
|
|
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; senão `pip + venv`. |
|
|
78
78
|
| C# | Parse `*.csproj` `<PackageReference>`. ASP.NET Core via `Microsoft.AspNetCore.App` ou `Microsoft.NET.Sdk.Web`. |
|
|
79
79
|
| Rust | Leia `Cargo.toml` `[dependencies]`. Framework: `axum`, `actix-web`, `rocket`, `warp`, `tonic`. |
|
|
80
80
|
|
|
81
|
-
#### 0.3
|
|
81
|
+
#### 0.3 Detecção de deps de infra
|
|
82
82
|
|
|
83
|
-
Grep no manifest + statements `import`/`use`/`using` para detectar
|
|
83
|
+
Grep no manifest + statements `import`/`use`/`using` para detectar serviços de runtime em uso:
|
|
84
84
|
|
|
85
|
-
|
|
|
85
|
+
| Serviço | TS/JS markers | Python markers | C# markers | Rust markers |
|
|
86
86
|
|---------|--------------|----------------|------------|--------------|
|
|
87
87
|
| Postgres | `pg`, `postgres`, `prisma`, `typeorm`, `kysely`, `drizzle-orm` | `psycopg2`, `psycopg`, `asyncpg`, `sqlalchemy.*postgres` | `Npgsql` | `sqlx` (com feature `postgres`), `tokio-postgres` |
|
|
88
88
|
| MySQL | `mysql2`, `prisma` (mysql) | `pymysql`, `mysqlclient`, `aiomysql` | `MySql.Data` | `sqlx` (mysql), `mysql_async` |
|
|
@@ -96,49 +96,49 @@ Grep no manifest + statements `import`/`use`/`using` para detectar servicos de r
|
|
|
96
96
|
#### 0.4 Artefatos Docker existentes
|
|
97
97
|
|
|
98
98
|
Procure: `Dockerfile`, `Dockerfile.*`, `docker-compose.yml`, `docker-compose.*.yml`, `.dockerignore`. Se algum existe:
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
99
|
+
- Usuário NÃO passou `--audit` → mude o header do relatório: "Artefatos existentes detectados — chaveando para --audit. Rerode com `--audit` para sugerir melhorias, ou passe `--mode=force-overwrite` (NÃO recomendado)."
|
|
100
|
+
- Usuário passou `--audit` → siga em modo audit.
|
|
101
|
+
- Usuário passou `--mode=force-overwrite` → log warning e siga.
|
|
102
102
|
|
|
103
|
-
Emita VERIFICATION REPORT da Fase 0 (linguagens detectadas, framework,
|
|
103
|
+
Emita VERIFICATION REPORT da Fase 0 (linguagens detectadas, framework, serviços encontrados, artefatos existentes).
|
|
104
104
|
|
|
105
105
|
---
|
|
106
106
|
|
|
107
107
|
### Fase 1 — Brainstorm + Plano
|
|
108
108
|
|
|
109
|
-
#### 1.1
|
|
109
|
+
#### 1.1 Resolução de modo (se não explícito)
|
|
110
110
|
|
|
111
|
-
Se `{{MODE}}`
|
|
112
|
-
- **
|
|
113
|
-
- **
|
|
111
|
+
Se `{{MODE}}` não foi passado por flag, pergunte:
|
|
112
|
+
- **Só dev** — `docker-compose.dev.yml` + `Dockerfile.dev` (hot-reload friendly)
|
|
113
|
+
- **Só prod** — `Dockerfile` (multi-stage, otimizado) + `docker-compose.prod.yml` opcional
|
|
114
114
|
- **Ambos** — artefatos dev + prod no mesmo run
|
|
115
115
|
|
|
116
116
|
#### 1.2 Para `--prod` (ou `--both`): brainstorm de base de imagem
|
|
117
117
|
|
|
118
|
-
Aplique o framing de
|
|
118
|
+
Aplique o framing de três opções do `dw-brainstorm` por linguagem:
|
|
119
119
|
|
|
120
120
|
| Estrategia | Base TS/JS | Base Python | Base C# | Base Rust | Trade-off |
|
|
121
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
|
|
123
|
-
| **Balanceada** | `node:20-alpine` | `python:3.12-alpine` (
|
|
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 fácil, imagem maior (~150-300MB), familiar para a maioria |
|
|
123
|
+
| **Balanceada** | `node:20-alpine` | `python:3.12-alpine` (só se sem deps nativas) | `mcr.microsoft.com/dotnet/aspnet:8.0-alpine` | `rust:1-alpine` (musl) → `alpine` | Menor (~50-100MB), às vezes dor com módulos nativos |
|
|
124
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
125
|
|
|
126
|
-
Cada
|
|
126
|
+
Cada opção 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
127
|
|
|
128
|
-
#### 1.3 Para `--dev`:
|
|
128
|
+
#### 1.3 Para `--dev`: confirmação dos serviços
|
|
129
129
|
|
|
130
|
-
Apresente os
|
|
130
|
+
Apresente os serviços detectados na Fase 0.3 como checklist. Usuário pode:
|
|
131
131
|
- **Aceitar** — incluir todos os detectados no `docker-compose.dev.yml`
|
|
132
|
-
- **Adicionar** — incluir extras (ex.: Mailpit se SMTP usado em
|
|
133
|
-
- **Remover** — dropar um detectado (ex.: Postgres gerenciado em dev
|
|
132
|
+
- **Adicionar** — incluir extras (ex.: Mailpit se SMTP usado em código, Jaeger se OTel)
|
|
133
|
+
- **Remover** — dropar um detectado (ex.: Postgres gerenciado em dev também)
|
|
134
134
|
|
|
135
|
-
Sempre ofereca Mailpit se algum lib de envio de email foi detectada e
|
|
135
|
+
Sempre ofereca Mailpit se algum lib de envio de email foi detectada e não tem serviço de email no dev.
|
|
136
136
|
|
|
137
|
-
Se pgvector for detectado no projeto,
|
|
137
|
+
Se pgvector for detectado no projeto, não há recipe bundled a que recorrer — ela foi removida porque a imagem carregava CVEs sem correção upstream. Mantenha a imagem que o projeto já usa e diga claramente ao usuário que ela precisa de revisão propria: uma imagem reconstruida, ou um Postgres gerenciado com a extensão `vector` habilitada. Não troque a imagem por conta propria.
|
|
138
138
|
|
|
139
|
-
#### 1.4 Preview de
|
|
139
|
+
#### 1.4 Preview de árvore de arquivos
|
|
140
140
|
|
|
141
|
-
Mostre a
|
|
141
|
+
Mostre a árvore de arquivos a criar/modificar:
|
|
142
142
|
|
|
143
143
|
```
|
|
144
144
|
{{SCOPE}}/
|
|
@@ -150,27 +150,27 @@ Mostre a arvore de arquivos a criar/modificar:
|
|
|
150
150
|
└── README.md (ANEXADO — secao "Local Dev")
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
#### 1.5 Gate de
|
|
153
|
+
#### 1.5 Gate de aprovação
|
|
154
154
|
|
|
155
|
-
Use `AskUserQuestion`.
|
|
155
|
+
Use `AskUserQuestion`. Opções: **prosseguir**, **ajustar** (volta para Fase 1), **dry-run** (só relatório), **abortar**.
|
|
156
156
|
|
|
157
|
-
Sem
|
|
157
|
+
Sem aprovação: escreve relatório (Fase 3 com `status: PLANNED`) e para.
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
-
### Fase 2 —
|
|
161
|
+
### Fase 2 — Geração
|
|
162
162
|
|
|
163
163
|
#### 2.1 Artefatos `--dev`
|
|
164
164
|
|
|
165
165
|
**`docker-compose.dev.yml`**:
|
|
166
166
|
- Componha blocos de `.agents/skills/docker-compose-recipes/services/*.yml` segundo `references/compose-composition.md`.
|
|
167
167
|
- 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`.
|
|
168
|
-
- Preserve a tag da imagem de cada recipe (
|
|
168
|
+
- Preserve a tag da imagem de cada recipe (NÃO converta nenhuma para digest — digest congela a base e nunca alcanca um rebuild de segurança), as vars de credencial obrigatórias e os binds em `127.0.0.1`. As portas loopback mantem intencionalmente a topologia `apps no host` funcionando.
|
|
169
169
|
- Header: `# Generated by /dw-dockerize on YYYY-MM-DD`.
|
|
170
170
|
|
|
171
|
-
**`.env.example`**: emita toda var de credencial sem valor funcional (as recipes usam `${VAR:?}`,
|
|
171
|
+
**`.env.example`**: emita toda var de credencial sem valor funcional (as recipes usam `${VAR:?}`, então o Compose recusa subir sem valor). Depois da copia para `.env`, exija que o usuário defina valores locais únicos e gerados antes de rodar Compose. URLs das apps usam `localhost` quando apps rodam no host e DNS do serviço quando rodam no Compose.
|
|
172
172
|
|
|
173
|
-
**`Dockerfile.dev`** (multi-stage
|
|
173
|
+
**`Dockerfile.dev`** (multi-stage NÃO obrigatório em dev — single stage tudo bem):
|
|
174
174
|
|
|
175
175
|
| Stack | Forma |
|
|
176
176
|
|-------|-------|
|
|
@@ -181,11 +181,11 @@ Sem aprovacao: escreve relatorio (Fase 3 com `status: PLANNED`) e para.
|
|
|
181
181
|
|
|
182
182
|
**`.dockerignore`** dev: exclua `.git`, `node_modules`, `target`, `dist`, `.dw`, `.agents`, `*.md` (exceto README.md).
|
|
183
183
|
|
|
184
|
-
**README.md
|
|
184
|
+
**README.md seção "Local Dev"** (anexada): tabela de portas dos serviços, requisitos de credenciais do `.env.example` sem senhas funcionais, os 4 comandos `dev:*`.
|
|
185
185
|
|
|
186
186
|
#### 2.2 Artefatos `--prod`
|
|
187
187
|
|
|
188
|
-
**`Dockerfile`** (multi-stage,
|
|
188
|
+
**`Dockerfile`** (multi-stage, específico por linguagem):
|
|
189
189
|
|
|
190
190
|
```dockerfile
|
|
191
191
|
# Exemplo: Node TS com base conservadora
|
|
@@ -211,44 +211,44 @@ CMD ["node", "dist/server.js"]
|
|
|
211
211
|
```
|
|
212
212
|
|
|
213
213
|
Requisitos chave (toda linguagem):
|
|
214
|
-
- Multi-stage: build deps
|
|
215
|
-
- `USER`
|
|
214
|
+
- Multi-stage: build deps NÃO podem ficar no runtime
|
|
215
|
+
- `USER` não-root no runtime
|
|
216
216
|
- `HEALTHCHECK` (delegue para endpoint `/health` ou check de processo)
|
|
217
|
-
- `EXPOSE`
|
|
217
|
+
- `EXPOSE` só a porta de runtime
|
|
218
218
|
- Sem secrets baked — use `ARG` para build-time + `ENV` referenciando que resolve em runtime
|
|
219
219
|
|
|
220
|
-
**`docker-compose.prod.yml`** (opcional,
|
|
221
|
-
- Sem bind mounts.
|
|
220
|
+
**`docker-compose.prod.yml`** (opcional, só se usuário quer compose em prod):
|
|
221
|
+
- Sem bind mounts. Só named volumes.
|
|
222
222
|
- `restart: always`.
|
|
223
|
-
- Network interna. SEM portas
|
|
223
|
+
- Network interna. SEM portas públicas exceto via reverse proxy.
|
|
224
224
|
- Secrets via bloco `secrets:` ou manager externo.
|
|
225
|
-
- Drope
|
|
226
|
-
- Para busca vetorial, use imagem revisada separadamente ou
|
|
225
|
+
- Drope serviços só-de-dev (sem Mailpit, Mailpit, smtp4dev, LocalStack, MinIO a menos que explicitamente preciso em prod).
|
|
226
|
+
- Para busca vetorial, use imagem revisada separadamente ou serviço Postgres gerenciado com a extensão `vector`; este projeto não distribui imagem pgvector validada.
|
|
227
227
|
|
|
228
|
-
**`.dockerignore`** prod: mais restritivo que dev. Exclua testes, `tests/`, `.github/`, `.dw/`, `.agents/`, todo markdown exceto
|
|
228
|
+
**`.dockerignore`** prod: mais restritivo que dev. Exclua testes, `tests/`, `.github/`, `.dw/`, `.agents/`, todo markdown exceto licença.
|
|
229
229
|
|
|
230
230
|
#### 2.3 Modo `--audit`
|
|
231
231
|
|
|
232
232
|
Leia `Dockerfile` e composes existentes. Aplique checks de `security-review/infrastructure/docker.md`:
|
|
233
|
-
- Multi-stage? (sim/
|
|
234
|
-
-
|
|
233
|
+
- Multi-stage? (sim/não)
|
|
234
|
+
- Usuário não-root? (sim/não)
|
|
235
235
|
- Tag `:latest`? (flag)
|
|
236
236
|
- Secrets em linhas `ENV`? (flag CRITICAL)
|
|
237
237
|
- Healthcheck presente? (flag se faltar)
|
|
238
|
-
- `.dockerignore` presente e exclui
|
|
239
|
-
- Compose: portas
|
|
240
|
-
- Compose:
|
|
241
|
-
- Compose:
|
|
238
|
+
- `.dockerignore` presente e exclui ruído óbvio? (flag se faltar)
|
|
239
|
+
- Compose: portas públicas em serviços data-tier? (flag)
|
|
240
|
+
- Compose: serviços sem healthcheck? (flag)
|
|
241
|
+
- Compose: serviços sem `restart` policy? (flag)
|
|
242
242
|
- Compose: bind mounts em compose prod? (flag CRITICAL se `prod` no nome do arquivo)
|
|
243
243
|
- Compose: alguma imagem pinada por digest, ou credencial com default funcional? (flag CRITICAL — ambos bloqueiam rebuild da base ou distribuem credencial usavel)
|
|
244
244
|
|
|
245
|
-
Aplique `dw-review-rigor`: dedupe
|
|
245
|
+
Aplique `dw-review-rigor`: dedupe padrões repetidos, signal-over-volume em nits de estilo.
|
|
246
246
|
|
|
247
|
-
Modo audit produz
|
|
247
|
+
Modo audit produz SUGESTÕES no relatório — NÃO modifica arquivos. Usuário age manualmente, ou roda `/dw-dockerize --mode=force-overwrite` para regerar.
|
|
248
248
|
|
|
249
249
|
---
|
|
250
250
|
|
|
251
|
-
### Fase 3 —
|
|
251
|
+
### Fase 3 — Relatório
|
|
252
252
|
|
|
253
253
|
Path: `.dw/audit/dockerize-<YYYY-MM-DD>.md` (ou `<SCOPE>/dockerize.md` se escopo PRD).
|
|
254
254
|
|
|
@@ -269,17 +269,17 @@ base_image_strategy: <conservative|balanced|bold>
|
|
|
269
269
|
---
|
|
270
270
|
```
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
Seções:
|
|
273
273
|
|
|
274
274
|
1. **VERIFICATION REPORT** — por fase: comandos rodados, exit codes, arquivos criados ou auditados.
|
|
275
275
|
2. **Stack Detection** — tabela de linguagem, framework, package manager, deps de infra detectadas (com markers da Fase 0.3).
|
|
276
276
|
3. **Existing Docker Artifacts** — lista de arquivos encontrados antes do run; "nenhum" se Docker greenfield.
|
|
277
|
-
4. **Brainstorm** —
|
|
278
|
-
5. **Approval** — o que o
|
|
277
|
+
4. **Brainstorm** — opções de base apresentadas (só `--prod` e `--both`), confirmação de serviços (só `--dev` e `--both`).
|
|
278
|
+
5. **Approval** — o que o usuário escolheu (modo, estrategia base, serviços a incluir/excluir).
|
|
279
279
|
6. **Files Created** — tabela com path + bytes + papel.
|
|
280
|
-
7. **Audit Findings** (
|
|
280
|
+
7. **Audit Findings** (só `--audit`) — tabela de issues com severidade, file:line, recomendação.
|
|
281
281
|
8. **Next Steps:**
|
|
282
|
-
- Para `--dev`: `cp .env.example .env` (se faltar), defina cada secret
|
|
282
|
+
- Para `--dev`: `cp .env.example .env` (se faltar), defina cada secret obrigatório como `POSTGRES_PASSWORD` com valor local único, rode `docker compose -f docker-compose.dev.yml up -d`, depois smoke test do app.
|
|
283
283
|
- Para `--prod`: build local primeiro (`docker build -t <name>:dev .`), rode `/dw-secure-audit` no Dockerfile e compose, depois push pro registry.
|
|
284
284
|
- Para `--audit`: aplique fixes manualmente ou rode com `--mode=force-overwrite`.
|
|
285
285
|
- Sempre: rode `/dw-secure-audit --plan` antes de promover a imagem para prod.
|
|
@@ -288,41 +288,41 @@ Secoes:
|
|
|
288
288
|
|
|
289
289
|
| Flag | Comportamento |
|
|
290
290
|
|------|---------------|
|
|
291
|
-
| `--dev` (default se
|
|
291
|
+
| `--dev` (default se não tem Dockerfile) | Fases 0 → 3, gera `docker-compose.dev.yml` + `Dockerfile.dev` + `.dockerignore` |
|
|
292
292
|
| `--prod` | Fases 0 → 3, gera `Dockerfile` multi-stage + `docker-compose.prod.yml` opcional |
|
|
293
293
|
| `--both` | Fases 0 → 3, gera artefatos dev + prod |
|
|
294
|
-
| `--audit` (default se Docker artifacts
|
|
295
|
-
| `--dry-run` | Fases 0 → 1,
|
|
296
|
-
| `--mode=force-overwrite` | Permite sobrescrever artefatos existentes (CUIDADO;
|
|
294
|
+
| `--audit` (default se Docker artifacts já existem) | Fases 0 → 3, sem escrita; produz relatório de sugestões |
|
|
295
|
+
| `--dry-run` | Fases 0 → 1, só plano, sem escrever |
|
|
296
|
+
| `--mode=force-overwrite` | Permite sobrescrever artefatos existentes (CUIDADO; usuário tem que confirmar na Fase 1.5) |
|
|
297
297
|
|
|
298
|
-
## Regras
|
|
298
|
+
## Regras Críticas
|
|
299
299
|
|
|
300
|
-
- <critical>Nunca sobrescreva em
|
|
301
|
-
- <critical>Imagens prod NUNCA incluem secrets, tooling SDK de dev, source
|
|
302
|
-
- <critical>Imagens prod SEMPRE rodam como
|
|
303
|
-
- <critical>Compose prod NUNCA inclui Mailpit, Mailpit, smtp4dev, LocalStack, ou
|
|
304
|
-
- <critical>Se `--audit` acha CRITICAL (secrets em ENV, root user, portas
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
-
|
|
300
|
+
- <critical>Nunca sobrescreva em silêncio. Se `Dockerfile`/`docker-compose.*.yml`/`.dockerignore` existe, default para `--audit`.</critical>
|
|
301
|
+
- <critical>Imagens prod NUNCA incluem secrets, tooling SDK de dev, source não compilado, ou fixtures de teste.</critical>
|
|
302
|
+
- <critical>Imagens prod SEMPRE rodam como usuário não-root.</critical>
|
|
303
|
+
- <critical>Compose prod NUNCA inclui Mailpit, Mailpit, smtp4dev, LocalStack, ou serviços só-de-dev.</critical>
|
|
304
|
+
- <critical>Se `--audit` acha CRITICAL (secrets em ENV, root user, portas públicas em data tier), Next Steps lista o fix como REQUIRED antes de deploy.</critical>
|
|
305
|
+
- NÃO use tag `:latest` em lugar nenhum.
|
|
306
|
+
- NÃO execute comandos compose deste comando — gere arquivos, o usuário roda `docker compose up`.
|
|
307
|
+
- NÃO mande `Dockerfile.dev` para producao. Dev Dockerfile e só para hot reload.
|
|
308
308
|
|
|
309
309
|
## Tratamento de Erros
|
|
310
310
|
|
|
311
311
|
- Manifest faltando → aborte com mensagem da matriz de linguagens.
|
|
312
|
-
- Linguagens misturadas (poliglota) → pergunte qual app/folder dockerizar;
|
|
313
|
-
- Recipe de
|
|
312
|
+
- Linguagens misturadas (poliglota) → pergunte qual app/folder dockerizar; não chute.
|
|
313
|
+
- Recipe de serviço detectado não bundled (ex.: MongoDB) → anote no relatório, sugira o usuário adicionar uma recipe na skill bundled ou ligar manualmente.
|
|
314
314
|
- Dockerfile existente invalido/unparseable → audit reporta como CRITICAL "unparseable Dockerfile" e propoe regenerar.
|
|
315
|
-
-
|
|
315
|
+
- Usuário passa `--mode=force-overwrite` mas o gate da Fase 1.5 nega → aborte sem escrita.
|
|
316
316
|
|
|
317
|
-
##
|
|
317
|
+
## Integração com Outros dw-* Commands
|
|
318
318
|
|
|
319
|
-
- **`/dw-secure-audit`** — rode
|
|
320
|
-
- **`/dw-secure-audit --plan`** — rode ANTES da
|
|
321
|
-
- **`/dw-new-project`** — comando
|
|
322
|
-
- **`/dw-qa --fix`** — se um `Dockerfile.dev` gerado quebra o hot-reload, `/dw-qa --fix` itera fixes com o
|
|
319
|
+
- **`/dw-secure-audit`** — rode APÓS geração `--prod` para escanear o novo Dockerfile + compose com Trivy IaC.
|
|
320
|
+
- **`/dw-secure-audit --plan`** — rode ANTES da geração `--prod` para garantir que nenhuma dep vulnerável vai pra imagem.
|
|
321
|
+
- **`/dw-new-project`** — comando irmão. `/dw-new-project` já inclui Docker do dia 1; `/dw-dockerize` retrofita. Compartilham a skill `docker-compose-recipes`.
|
|
322
|
+
- **`/dw-qa --fix`** — se um `Dockerfile.dev` gerado quebra o hot-reload, `/dw-qa --fix` itera fixes com o usuário.
|
|
323
323
|
|
|
324
324
|
## Inspirado em
|
|
325
325
|
|
|
326
|
-
`dw-dockerize`
|
|
326
|
+
`dw-dockerize` é dev-workflow-native. A camada de detecção reusa a matriz de linguagens de `/dw-secure-audit` e `/dw-secure-audit --plan`. A camada de brainstorm pega a disciplina das três opções (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 composição de compose está delegada para a skill bundled `docker-compose-recipes` (compartilhada com `/dw-new-project`).
|
|
327
327
|
|
|
328
328
|
</system_instructions>
|