@brunosps00/dev-workflow 1.7.1 → 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 +305 -0
- package/README.md +7 -5
- package/lib/agents.js +6 -1
- package/lib/build-plugin.js +4 -1
- package/lib/constants.js +4 -2
- package/lib/init.js +14 -0
- package/lib/install-state.js +8 -4
- package/lib/validate.js +21 -0
- package/package.json +2 -1
- package/scaffold/agents/core/dw-build-fixer.md +0 -1
- package/scaffold/agents/core/dw-code-explorer.md +0 -1
- package/scaffold/agents/core/dw-code-reviewer.md +0 -1
- package/scaffold/agents/core/dw-planner.md +0 -1
- package/scaffold/agents/core/dw-test-author.md +0 -1
- package/scaffold/agents/csharp/dw-csharp-reviewer.md +0 -1
- package/scaffold/agents/csharp/dw-dotnet-build-fixer.md +0 -1
- package/scaffold/agents/frontend/dw-qa-runner.md +0 -1
- package/scaffold/agents/python/dw-python-build-fixer.md +0 -1
- package/scaffold/agents/python/dw-python-reviewer.md +0 -1
- package/scaffold/agents/rust/dw-rust-build-fixer.md +0 -1
- package/scaffold/agents/rust/dw-rust-reviewer.md +0 -1
- package/scaffold/agents/security/dw-security-reviewer.md +0 -1
- package/scaffold/agents/security/dw-silent-failure-hunter.md +0 -1
- package/scaffold/agents/typescript/dw-typescript-build-fixer.md +0 -1
- package/scaffold/agents/typescript/dw-typescript-reviewer.md +0 -1
- package/scaffold/config/routing.json +60 -0
- package/scaffold/en/commands/dw-brainstorm.md +12 -8
- package/scaffold/en/commands/dw-bugfix.md +4 -2
- package/scaffold/en/commands/dw-claude-run.md +5 -1
- package/scaffold/en/commands/dw-codex-run.md +5 -1
- package/scaffold/en/commands/dw-dockerize.md +14 -7
- package/scaffold/en/commands/dw-generate-pr.md +13 -0
- package/scaffold/en/commands/dw-new-project.md +14 -13
- 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 +2 -1
- package/scaffold/en/commands/dw-triage.md +220 -0
- package/scaffold/en/templates/idea-onepager.md +28 -0
- package/scaffold/en/templates/project-onepager.md +6 -5
- package/scaffold/en/templates/task-template.md +2 -1
- package/scaffold/en/templates/tasks-template.md +11 -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 +23 -19
- package/scaffold/pt-br/commands/dw-codex-run.md +22 -18
- 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 +106 -99
- package/scaffold/pt-br/commands/dw-find-skills.md +52 -52
- package/scaffold/pt-br/commands/dw-generate-pr.md +13 -0
- 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 +93 -92
- 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 +3 -3
- 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 +2 -1
- 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 +35 -34
- package/scaffold/pt-br/templates/state-template.md +13 -13
- package/scaffold/pt-br/templates/task-template.md +2 -1
- package/scaffold/pt-br/templates/tasks-template.md +11 -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/docker-compose-recipes/SKILL.md +2 -4
- package/scaffold/skills/docker-compose-recipes/references/compose-composition.md +2 -2
- package/scaffold/skills/docker-compose-recipes/references/env-conventions.md +16 -9
- package/scaffold/skills/docker-compose-recipes/references/healthcheck-patterns.md +0 -1
- package/scaffold/skills/docker-compose-recipes/references/prod-vs-dev.md +7 -2
- package/scaffold/skills/docker-compose-recipes/services/elasticsearch.yml +3 -3
- package/scaffold/skills/docker-compose-recipes/services/meilisearch.yml +2 -2
- package/scaffold/skills/docker-compose-recipes/services/minio.yml +8 -4
- package/scaffold/skills/docker-compose-recipes/services/mysql.yml +4 -4
- package/scaffold/skills/docker-compose-recipes/services/postgres.yml +2 -2
- package/scaffold/skills/docker-compose-recipes/services/rabbitmq.yml +3 -3
- package/scaffold/skills/docker-compose-recipes/services/typesense.yml +3 -3
- package/scaffold/skills/dw-cli-run/SKILL.md +42 -38
- package/scaffold/skills/dw-cli-run/references/dispatch-tuning.md +85 -0
- 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/SKILL.md +4 -2
- package/scaffold/skills/dw-execute-phase/agents/executor.md +4 -2
- package/scaffold/skills/dw-execute-phase/agents/plan-checker.md +9 -7
- package/scaffold/skills/dw-execute-phase/references/atomic-commits.md +12 -8
- package/scaffold/skills/dw-execute-phase/references/plan-verification.md +6 -4
- 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
- package/scaffold/skills/docker-compose-recipes/services/mailhog.yml +0 -23
- package/scaffold/skills/docker-compose-recipes/services/postgres-pgvector.yml +0 -31
|
@@ -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,47 +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.:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
139
|
+
#### 1.4 Preview de árvore de arquivos
|
|
140
|
+
|
|
141
|
+
Mostre a árvore de arquivos a criar/modificar:
|
|
140
142
|
|
|
141
143
|
```
|
|
142
144
|
{{SCOPE}}/
|
|
@@ -148,24 +150,27 @@ Mostre a arvore de arquivos a criar/modificar:
|
|
|
148
150
|
└── README.md (ANEXADO — secao "Local Dev")
|
|
149
151
|
```
|
|
150
152
|
|
|
151
|
-
#### 1.5 Gate de
|
|
153
|
+
#### 1.5 Gate de aprovação
|
|
152
154
|
|
|
153
|
-
Use `AskUserQuestion`.
|
|
155
|
+
Use `AskUserQuestion`. Opções: **prosseguir**, **ajustar** (volta para Fase 1), **dry-run** (só relatório), **abortar**.
|
|
154
156
|
|
|
155
|
-
Sem
|
|
157
|
+
Sem aprovação: escreve relatório (Fase 3 com `status: PLANNED`) e para.
|
|
156
158
|
|
|
157
159
|
---
|
|
158
160
|
|
|
159
|
-
### Fase 2 —
|
|
161
|
+
### Fase 2 — Geração
|
|
160
162
|
|
|
161
163
|
#### 2.1 Artefatos `--dev`
|
|
162
164
|
|
|
163
165
|
**`docker-compose.dev.yml`**:
|
|
164
166
|
- Componha blocos de `.agents/skills/docker-compose-recipes/services/*.yml` segundo `references/compose-composition.md`.
|
|
165
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 (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.
|
|
166
169
|
- Header: `# Generated by /dw-dockerize on YYYY-MM-DD`.
|
|
167
170
|
|
|
168
|
-
|
|
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
|
+
|
|
173
|
+
**`Dockerfile.dev`** (multi-stage NÃO obrigatório em dev — single stage tudo bem):
|
|
169
174
|
|
|
170
175
|
| Stack | Forma |
|
|
171
176
|
|-------|-------|
|
|
@@ -176,11 +181,11 @@ Sem aprovacao: escreve relatorio (Fase 3 com `status: PLANNED`) e para.
|
|
|
176
181
|
|
|
177
182
|
**`.dockerignore`** dev: exclua `.git`, `node_modules`, `target`, `dist`, `.dw`, `.agents`, `*.md` (exceto README.md).
|
|
178
183
|
|
|
179
|
-
**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:*`.
|
|
180
185
|
|
|
181
186
|
#### 2.2 Artefatos `--prod`
|
|
182
187
|
|
|
183
|
-
**`Dockerfile`** (multi-stage,
|
|
188
|
+
**`Dockerfile`** (multi-stage, específico por linguagem):
|
|
184
189
|
|
|
185
190
|
```dockerfile
|
|
186
191
|
# Exemplo: Node TS com base conservadora
|
|
@@ -206,42 +211,44 @@ CMD ["node", "dist/server.js"]
|
|
|
206
211
|
```
|
|
207
212
|
|
|
208
213
|
Requisitos chave (toda linguagem):
|
|
209
|
-
- Multi-stage: build deps
|
|
210
|
-
- `USER`
|
|
214
|
+
- Multi-stage: build deps NÃO podem ficar no runtime
|
|
215
|
+
- `USER` não-root no runtime
|
|
211
216
|
- `HEALTHCHECK` (delegue para endpoint `/health` ou check de processo)
|
|
212
|
-
- `EXPOSE`
|
|
217
|
+
- `EXPOSE` só a porta de runtime
|
|
213
218
|
- Sem secrets baked — use `ARG` para build-time + `ENV` referenciando que resolve em runtime
|
|
214
219
|
|
|
215
|
-
**`docker-compose.prod.yml`** (opcional,
|
|
216
|
-
- Sem bind mounts.
|
|
220
|
+
**`docker-compose.prod.yml`** (opcional, só se usuário quer compose em prod):
|
|
221
|
+
- Sem bind mounts. Só named volumes.
|
|
217
222
|
- `restart: always`.
|
|
218
|
-
- Network interna. SEM portas
|
|
223
|
+
- Network interna. SEM portas públicas exceto via reverse proxy.
|
|
219
224
|
- Secrets via bloco `secrets:` ou manager externo.
|
|
220
|
-
- Drope
|
|
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.
|
|
221
227
|
|
|
222
|
-
**`.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.
|
|
223
229
|
|
|
224
230
|
#### 2.3 Modo `--audit`
|
|
225
231
|
|
|
226
232
|
Leia `Dockerfile` e composes existentes. Aplique checks de `security-review/infrastructure/docker.md`:
|
|
227
|
-
- Multi-stage? (sim/
|
|
228
|
-
-
|
|
233
|
+
- Multi-stage? (sim/não)
|
|
234
|
+
- Usuário não-root? (sim/não)
|
|
229
235
|
- Tag `:latest`? (flag)
|
|
230
236
|
- Secrets em linhas `ENV`? (flag CRITICAL)
|
|
231
237
|
- Healthcheck presente? (flag se faltar)
|
|
232
|
-
- `.dockerignore` presente e exclui
|
|
233
|
-
- Compose: portas
|
|
234
|
-
- Compose:
|
|
235
|
-
- 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)
|
|
236
242
|
- Compose: bind mounts em compose prod? (flag CRITICAL se `prod` no nome do arquivo)
|
|
243
|
+
- Compose: alguma imagem pinada por digest, ou credencial com default funcional? (flag CRITICAL — ambos bloqueiam rebuild da base ou distribuem credencial usavel)
|
|
237
244
|
|
|
238
|
-
Aplique `dw-review-rigor`: dedupe
|
|
245
|
+
Aplique `dw-review-rigor`: dedupe padrões repetidos, signal-over-volume em nits de estilo.
|
|
239
246
|
|
|
240
|
-
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.
|
|
241
248
|
|
|
242
249
|
---
|
|
243
250
|
|
|
244
|
-
### Fase 3 —
|
|
251
|
+
### Fase 3 — Relatório
|
|
245
252
|
|
|
246
253
|
Path: `.dw/audit/dockerize-<YYYY-MM-DD>.md` (ou `<SCOPE>/dockerize.md` se escopo PRD).
|
|
247
254
|
|
|
@@ -257,22 +264,22 @@ mode: <dev|prod|both|audit|dry-run>
|
|
|
257
264
|
languages: [...]
|
|
258
265
|
frameworks: { web: '...', api: '...' }
|
|
259
266
|
services_detected: [postgres, redis, ...]
|
|
260
|
-
services_added: [
|
|
267
|
+
services_added: [mailpit, ...]
|
|
261
268
|
base_image_strategy: <conservative|balanced|bold>
|
|
262
269
|
---
|
|
263
270
|
```
|
|
264
271
|
|
|
265
|
-
|
|
272
|
+
Seções:
|
|
266
273
|
|
|
267
274
|
1. **VERIFICATION REPORT** — por fase: comandos rodados, exit codes, arquivos criados ou auditados.
|
|
268
275
|
2. **Stack Detection** — tabela de linguagem, framework, package manager, deps de infra detectadas (com markers da Fase 0.3).
|
|
269
276
|
3. **Existing Docker Artifacts** — lista de arquivos encontrados antes do run; "nenhum" se Docker greenfield.
|
|
270
|
-
4. **Brainstorm** —
|
|
271
|
-
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).
|
|
272
279
|
6. **Files Created** — tabela com path + bytes + papel.
|
|
273
|
-
7. **Audit Findings** (
|
|
280
|
+
7. **Audit Findings** (só `--audit`) — tabela de issues com severidade, file:line, recomendação.
|
|
274
281
|
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.
|
|
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.
|
|
276
283
|
- Para `--prod`: build local primeiro (`docker build -t <name>:dev .`), rode `/dw-secure-audit` no Dockerfile e compose, depois push pro registry.
|
|
277
284
|
- Para `--audit`: aplique fixes manualmente ou rode com `--mode=force-overwrite`.
|
|
278
285
|
- Sempre: rode `/dw-secure-audit --plan` antes de promover a imagem para prod.
|
|
@@ -281,41 +288,41 @@ Secoes:
|
|
|
281
288
|
|
|
282
289
|
| Flag | Comportamento |
|
|
283
290
|
|------|---------------|
|
|
284
|
-
| `--dev` (default se
|
|
291
|
+
| `--dev` (default se não tem Dockerfile) | Fases 0 → 3, gera `docker-compose.dev.yml` + `Dockerfile.dev` + `.dockerignore` |
|
|
285
292
|
| `--prod` | Fases 0 → 3, gera `Dockerfile` multi-stage + `docker-compose.prod.yml` opcional |
|
|
286
293
|
| `--both` | Fases 0 → 3, gera artefatos dev + prod |
|
|
287
|
-
| `--audit` (default se Docker artifacts
|
|
288
|
-
| `--dry-run` | Fases 0 → 1,
|
|
289
|
-
| `--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) |
|
|
290
297
|
|
|
291
|
-
## Regras
|
|
298
|
+
## Regras Críticas
|
|
292
299
|
|
|
293
|
-
- <critical>Nunca sobrescreva em
|
|
294
|
-
- <critical>Imagens prod NUNCA incluem secrets, tooling SDK de dev, source
|
|
295
|
-
- <critical>Imagens prod SEMPRE rodam como
|
|
296
|
-
- <critical>Compose prod NUNCA inclui
|
|
297
|
-
- <critical>Se `--audit` acha CRITICAL (secrets em ENV, root user, portas
|
|
298
|
-
-
|
|
299
|
-
-
|
|
300
|
-
-
|
|
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.
|
|
301
308
|
|
|
302
309
|
## Tratamento de Erros
|
|
303
310
|
|
|
304
311
|
- Manifest faltando → aborte com mensagem da matriz de linguagens.
|
|
305
|
-
- Linguagens misturadas (poliglota) → pergunte qual app/folder dockerizar;
|
|
306
|
-
- 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.
|
|
307
314
|
- Dockerfile existente invalido/unparseable → audit reporta como CRITICAL "unparseable Dockerfile" e propoe regenerar.
|
|
308
|
-
-
|
|
315
|
+
- Usuário passa `--mode=force-overwrite` mas o gate da Fase 1.5 nega → aborte sem escrita.
|
|
309
316
|
|
|
310
|
-
##
|
|
317
|
+
## Integração com Outros dw-* Commands
|
|
311
318
|
|
|
312
|
-
- **`/dw-secure-audit`** — rode
|
|
313
|
-
- **`/dw-secure-audit --plan`** — rode ANTES da
|
|
314
|
-
- **`/dw-new-project`** — comando
|
|
315
|
-
- **`/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.
|
|
316
323
|
|
|
317
324
|
## Inspirado em
|
|
318
325
|
|
|
319
|
-
`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`).
|
|
320
327
|
|
|
321
328
|
</system_instructions>
|