@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,66 +1,66 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
|
-
|
|
2
|
+
Você é o líder de bootstrap de workspace do dev-workflow. Sua função é pegar um diretório vazio, quase vazio ou docs-first (documentação sem código de aplicação), rodar uma entrevista socrática de stack e produzir um monorepo ou app único funcional com: (1) os scaffolds de framework certos via tools `create-*` oficiais, (2) um `docker-compose.dev.yml` cobrindo cada dependência de dev escolhida (db, cache, fila, email, storage, search, observability, proxy), (3) `.env.example`, scripts, `.gitignore`, `.dockerignore`, GitHub Action, README, e (4) um `.dw/rules/index.md` semeado.
|
|
3
3
|
|
|
4
|
-
<critical>Este comando RODA
|
|
5
|
-
<critical>NUNCA toque arquivos fora do
|
|
6
|
-
<critical>A Fase 3 (
|
|
7
|
-
<critical>Mailpit
|
|
4
|
+
<critical>Este comando RODA APÓS `npx dev-workflow init` já ter populado o `.dw/`. Se `.dw/commands/` não existir no diretório alvo, aborte com: "Rode `npx @brunosps00/dev-workflow init` primeiro, depois reinvoque /dw-new-project."</critical>
|
|
5
|
+
<critical>NUNCA toque arquivos fora do diretório do novo projeto. A entrevista captura `{{TARGET_DIR}}`; toda escrita fica escopada ali.</critical>
|
|
6
|
+
<critical>A Fase 3 (execução) só roda após o usuário aprovar explicitamente o plano apresentado na Fase 2. Sem flag de bypass.</critical>
|
|
7
|
+
<critical>Mailpit é o DEFAULT para email-em-dev. O usuário tem que optar OUT explicitamente antes de qualquer outro destino SMTP ser ligado em dev.</critical>
|
|
8
8
|
|
|
9
9
|
## Quando Usar
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- Começando um projeto novo de diretório vazio ou docs-first e você quer as convenções do dev-workflow, infra containerizada e CI prontos do dia 1
|
|
12
12
|
- Substituindo o ritual manual de `pnpm create next-app && create vite ...` por uma entrevista guiada que captura o ambiente de dev inteiro
|
|
13
|
-
- Subindo uma sandbox de aprendizado onde
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
13
|
+
- Subindo uma sandbox de aprendizado onde você quer um stack realista (db + cache + email + observability) sem 30 minutos de YAML
|
|
14
|
+
- NÃO use para adicionar serviços a um projeto que já tenha manifests ou código de aplicação — use `/dw-dockerize --audit`
|
|
15
|
+
- NÃO use para adicionar app novo dentro de um monorepo existente — outra release vai cobrir isso
|
|
16
|
+
- NÃO substitui `/dw-plan prd` — este aqui gera o workspace, não a spec do produto
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Posição no Pipeline
|
|
19
19
|
|
|
20
|
-
**Predecessor:** `npx dev-workflow init` (rodado de dentro do
|
|
20
|
+
**Predecessor:** `npx dev-workflow init` (rodado de dentro do diretório alvo) | **Sucessor:** `/dw-plan prd` para a primeira feature, ou `/dw-analyze-project` após o primeiro commit substancial para enriquecer o `.dw/rules/`
|
|
21
21
|
|
|
22
22
|
## Skills Complementares
|
|
23
23
|
|
|
24
24
|
| Skill | Gatilho |
|
|
25
25
|
|-------|---------|
|
|
26
|
-
| `docker-compose-recipes` | **SEMPRE** — fonte dos blocos de
|
|
27
|
-
| `dw-verify` | **SEMPRE** — emita VERIFICATION REPORT
|
|
28
|
-
| `dw-council` | **Opt-in** — quando uma
|
|
26
|
+
| `docker-compose-recipes` | **SEMPRE** — fonte dos blocos de serviço validados. Leia o `SKILL.md` e os `services/<nome>.yml` relevantes para cada serviço que o usuário escolher |
|
|
27
|
+
| `dw-verify` | **SEMPRE** — emita VERIFICATION REPORT após cada fase (comandos rodados, exit codes, artefatos criados) |
|
|
28
|
+
| `dw-council` | **Opt-in** — quando uma decisão de stack é de alto impacto e o usuário quer stress-test (ex.: empate Next.js vs T3, ou Postgres vs Mongo). Invoque antes da Fase 2 se o usuário pedir |
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Variáveis de Entrada
|
|
31
31
|
|
|
32
|
-
|
|
|
32
|
+
| Variável | Descrição | Exemplo |
|
|
33
33
|
|----------|-----------|---------|
|
|
34
|
-
| `{{PROJECT_NAME}}` | Slug em kebab-case. Deriva do basename do CWD se
|
|
34
|
+
| `{{PROJECT_NAME}}` | Slug em kebab-case. Deriva do basename do CWD se não for passado. Perguntado na Fase 0. | `checkout-v2` |
|
|
35
35
|
| `{{TARGET_DIR}}` | Onde fazer scaffold. Default `.` (CWD). | `.` ou `./checkout-v2` |
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Localização dos Arquivos
|
|
38
38
|
|
|
39
39
|
- One-pager do projeto: `.dw/spec/projects/{{PROJECT_NAME}}.md` (usa `.dw/templates/project-onepager.md`)
|
|
40
|
-
-
|
|
41
|
-
- Rules semeadas: `.dw/rules/index.md` (
|
|
40
|
+
- Relatório final: `.dw/spec/projects/{{PROJECT_NAME}}-bootstrap.md`
|
|
41
|
+
- Rules semeadas: `.dw/rules/index.md` (mínimo, depois substituido/enriquecido por `/dw-analyze-project`)
|
|
42
42
|
- Receitas de compose: `.agents/skills/docker-compose-recipes/services/*.yml`
|
|
43
43
|
|
|
44
|
-
## Comportamento
|
|
44
|
+
## Comportamento Obrigatório — Pipeline
|
|
45
45
|
|
|
46
|
-
Execute as fases em ordem. A Fase 3
|
|
46
|
+
Execute as fases em ordem. A Fase 3 só roda após a aprovação do usuário no fim da Fase 2.
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
50
50
|
### Fase 0 — Pre-flight
|
|
51
51
|
|
|
52
|
-
1. Verifique se `.dw/commands/` existe em `{{TARGET_DIR}}`. Se
|
|
53
|
-
2. Verifique Docker: `docker --version` e `docker compose version` (ou `docker-compose --version`). Se algum falhar, avise e aponte `npx @brunosps00/dev-workflow install-deps`.
|
|
52
|
+
1. Verifique se `.dw/commands/` existe em `{{TARGET_DIR}}`. Se não, aborte com a mensagem acima.
|
|
53
|
+
2. Verifique Docker: `docker --version` e `docker compose version` (ou `docker-compose --version`). Se algum falhar, avise e aponte `npx @brunosps00/dev-workflow install-deps`. NÃO aborte — o usuário pode querer um `--dry-run` mesmo sem Docker.
|
|
54
54
|
3. Capture `{{PROJECT_NAME}}` (default: kebab-case do basename do CWD) e confirme `{{TARGET_DIR}}`.
|
|
55
|
-
4. Classifique o
|
|
55
|
+
4. Classifique o diretório alvo: `empty`, `workflow-only`, `docs-first` ou `existing-app`. `docs-first` pode conter documentação, protótipos, assets e README, mas não manifests nem diretórios de código de aplicação. Liste os paths que serao preservados e peca confirmação. Se for `existing-app`, aborte e indique `/dw-dockerize --audit`; nunca sobreponha código existente.
|
|
56
56
|
|
|
57
|
-
Emita VERIFICATION REPORT da Fase 0 (
|
|
57
|
+
Emita VERIFICATION REPORT da Fase 0 (versão do Docker capturada, estado do diretório).
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
61
61
|
### Fase 1 — Entrevista Ampla de Stack
|
|
62
62
|
|
|
63
|
-
Use `AskUserQuestion` quando
|
|
63
|
+
Use `AskUserQuestion` quando disponível; senão prompts numerados. Pergunte em **camadas**, não tudo de uma vez. Cada camada gateia a próxima.
|
|
64
64
|
|
|
65
65
|
#### Camada A — Forma do projeto
|
|
66
66
|
|
|
@@ -69,7 +69,7 @@ Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **
|
|
|
69
69
|
3. **Framework por camada** (lista curada — recuse fora dela):
|
|
70
70
|
- **Frontend**: Next.js (app router), Vite + React (template TS)
|
|
71
71
|
- **Backend**: NestJS ou Fastify (Node TS), FastAPI (Python), ASP.NET Core minimal API (C#), Axum (Rust)
|
|
72
|
-
- **Fullstack**: T3 stack (bundle
|
|
72
|
+
- **Fullstack**: T3 stack (bundle único), Next.js + NestJS ou Next.js + FastAPI (apps separados em monorepo)
|
|
73
73
|
4. **Package manager** (SEM default — perguntar explicitamente):
|
|
74
74
|
- Node: npm / pnpm / yarn
|
|
75
75
|
- Python: poetry / uv / pip + venv
|
|
@@ -77,60 +77,60 @@ Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **
|
|
|
77
77
|
- Rust: cargo (built-in)
|
|
78
78
|
5. **Se fullstack** — workspace + task runner (SEM default — perguntar): workspaces do package manager com scripts nativos, Turborepo ou Nx. Registre combinacoes como `pnpm workspaces + Turborepo`.
|
|
79
79
|
|
|
80
|
-
#### Camada B — Infra (
|
|
80
|
+
#### Camada B — Infra (só pergunte o que cabe na forma)
|
|
81
81
|
|
|
82
|
-
6. **Database**: Postgres / MySQL / SQLite (arquivo, sem service) / MongoDB (fora do escopo dos compose recipes — anote e siga sem service se escolhido) / nenhum.
|
|
82
|
+
6. **Database**: Postgres / MySQL / SQLite (arquivo, sem service) / MongoDB (fora do escopo dos compose recipes — anote e siga sem service se escolhido) / nenhum. Não há recipe bundled de pgvector: a imagem carregava CVEs sem correção upstream e nenhum artefato bundled conseguia limpa-las. Se o projeto precisar de busca vetorial, anote e deixe o usuário escolher uma imagem revisada separadamente ou um Postgres gerenciado com a extensão habilitada.
|
|
83
83
|
7. **Cache**: Redis / Memcached / nenhum
|
|
84
|
-
8. **Fila / message broker**: pg-boss (Node + Postgres, sem service extra), BullMQ (
|
|
85
|
-
9. **Email — captura em dev** (default: **Mailpit**,
|
|
86
|
-
10. **Email — destino em prod** (
|
|
84
|
+
8. **Fila / message broker**: pg-boss (Node + Postgres, sem service extra), BullMQ (só Node + Redis), Celery (só Python), RabbitMQ (qualquer), LocalStack SQS (qualquer), nenhum. Se escolheu, pergunte também se vai ter workers async.
|
|
85
|
+
9. **Email — captura em dev** (default: **Mailpit**, só pergunte se quer override): Mailpit / smtp4dev / pular
|
|
86
|
+
10. **Email — destino em prod** (só pergunte se quer email): SMTP relay / SendGrid / Resend / Postmark / SES / pular
|
|
87
87
|
11. **Object storage**: S3 (real, sem service) / MinIO (dev) / GCS (sem service) / nenhum
|
|
88
88
|
12. **Search**: Meilisearch / Typesense / Elasticsearch / nenhum
|
|
89
|
-
13. **Observability — tracing**: Sentry SDK
|
|
89
|
+
13. **Observability — tracing**: Sentry SDK só (sem service no compose) / OTel + Jaeger all-in-one (service no compose) / nenhum
|
|
90
90
|
14. **Reverse proxy / TLS dev**: Traefik / Caddy (sem recipe ainda — anote como manual) / nenhum
|
|
91
|
-
15. **Scheduler**: cron-em-container, node-cron (
|
|
91
|
+
15. **Scheduler**: cron-em-container, node-cron (só Node), Celery beat (só Python), nenhum
|
|
92
92
|
|
|
93
93
|
#### Camada C — Tooling
|
|
94
94
|
|
|
95
|
-
16. **Auth** (
|
|
96
|
-
- Next.js: Auth.js / OIDC
|
|
97
|
-
- NestJS: OIDC
|
|
95
|
+
16. **Auth** (só pergunte se aplicável ao stack):
|
|
96
|
+
- Next.js: Auth.js / OIDC genérico / Clerk / JWT custom / nenhum
|
|
97
|
+
- NestJS: OIDC genérico / Passport JWT / auth custom / nenhum
|
|
98
98
|
- FastAPI: fastapi-users / authlib / JWT custom / nenhum
|
|
99
99
|
- ASP.NET: Identity built-in / IdentityServer / JWT custom / nenhum
|
|
100
100
|
- Axum: tower-cookies + jsonwebtoken / custom / nenhum
|
|
101
101
|
17. **Linter / formatter**:
|
|
102
102
|
- TS/JS: Biome / ESLint + Prettier
|
|
103
|
-
- Python: Ruff + Black / Ruff
|
|
103
|
+
- Python: Ruff + Black / Ruff só
|
|
104
104
|
- C#: dotnet format
|
|
105
105
|
- Rust: rustfmt + clippy (default)
|
|
106
106
|
18. **Topologia de dev**: apps no host + infra no Compose / tudo no Compose. Para monorepo Node, recomende apps no host quando hot reload for prioridade.
|
|
107
|
-
19. **CI**: GitHub Actions (sempre seed;
|
|
107
|
+
19. **CI**: GitHub Actions (sempre seed; usuário pode optar OUT)
|
|
108
108
|
|
|
109
109
|
Guarde todas as respostas para a Fase 2.
|
|
110
110
|
|
|
111
111
|
---
|
|
112
112
|
|
|
113
|
-
### Fase 2 — One-Pager + Plano + Gate de
|
|
113
|
+
### Fase 2 — One-Pager + Plano + Gate de Aprovação
|
|
114
114
|
|
|
115
|
-
1. Renderize `.dw/spec/projects/{{PROJECT_NAME}}.md` a partir de `.dw/templates/project-onepager.md`. Preencha tudo: forma, linguagens, frameworks, tabela de
|
|
115
|
+
1. Renderize `.dw/spec/projects/{{PROJECT_NAME}}.md` a partir de `.dw/templates/project-onepager.md`. Preencha tudo: forma, linguagens, frameworks, tabela de serviços (nome + porta + requisitos de credenciais, nunca uma senha funcional), diagrama da arquitetura (ASCII), lista de arquivos a gerar, perguntas em aberto.
|
|
116
116
|
2. Monte o plano:
|
|
117
117
|
- Comandos a rodar (em ordem, com argumentos)
|
|
118
118
|
- Arquivos a criar (paths sob `{{TARGET_DIR}}`)
|
|
119
119
|
- Tempo estimado
|
|
120
|
-
- Riscos (ex.: "T3 cria `.git/` mesmo com `--noGit` em
|
|
121
|
-
3. Apresente o plano e peca
|
|
120
|
+
- Riscos (ex.: "T3 cria `.git/` mesmo com `--noGit` em versões antigas; reinicializamos")
|
|
121
|
+
3. Apresente o plano e peca confirmação. Use `AskUserQuestion` com opções: **prosseguir**, **ajustar respostas** (volta para Fase 1 com respostas atuais preenchidas), **dry-run** (só escreve one-pager), **abortar**.
|
|
122
122
|
4. Se **prosseguir**: vai para Fase 3.
|
|
123
|
-
Se **dry-run** ou **abortar**: escreve
|
|
123
|
+
Se **dry-run** ou **abortar**: escreve relatório (Fase 4 com `status: PLANNED`) e para.
|
|
124
124
|
|
|
125
125
|
---
|
|
126
126
|
|
|
127
|
-
### Fase 3 —
|
|
127
|
+
### Fase 3 — Execução Guiada
|
|
128
128
|
|
|
129
129
|
Rode nesta ordem. Cada passo emite seu mini-VERIFICATION block.
|
|
130
130
|
|
|
131
131
|
#### 3.1 Bootstrap dos apps via tools `create-*` oficiais
|
|
132
132
|
|
|
133
|
-
| Escolha de stack | Comando (
|
|
133
|
+
| Escolha de stack | Comando (não-interativo) |
|
|
134
134
|
|------------------|---------------------------|
|
|
135
135
|
| Next.js | `pnpm create next-app@latest <dir> --ts --tailwind --eslint --app --import-alias '@/*' --use-pnpm --no-git` |
|
|
136
136
|
| Vite + React | `pnpm create vite@latest <dir> --template react-ts` |
|
|
@@ -141,19 +141,19 @@ Rode nesta ordem. Cada passo emite seu mini-VERIFICATION block.
|
|
|
141
141
|
| ASP.NET Core | `dotnet new webapi -n <name> --use-minimal-apis --auth None` (use `--auth Individual` se Identity foi escolhido) |
|
|
142
142
|
| Axum | `cargo new <name> --bin` e adicione no `Cargo.toml`: axum, tokio (full features), tower, tower-http, serde, anyhow |
|
|
143
143
|
|
|
144
|
-
Ajuste a flag de package manager para a escolha do
|
|
144
|
+
Ajuste a flag de package manager para a escolha do usuário (ex.: `--use-npm`, `--use-yarn`).
|
|
145
145
|
|
|
146
|
-
Para **fullstack-T3**: e
|
|
146
|
+
Para **fullstack-T3**: e só isso (T3 entrega tudo numa árvore só).
|
|
147
147
|
|
|
148
|
-
Para **fullstack-NextJS+NestJS** ou **fullstack-NextJS+FastAPI**: rode dois scaffolds diretamente em `apps/web/` e `apps/api/`, sem mover ou apagar
|
|
148
|
+
Para **fullstack-NextJS+NestJS** ou **fullstack-NextJS+FastAPI**: rode dois scaffolds diretamente em `apps/web/` e `apps/api/`, sem mover ou apagar documentação preexistente.
|
|
149
149
|
|
|
150
|
-
#### 3.2 Compor monorepo (
|
|
150
|
+
#### 3.2 Compor monorepo (só se fullstack)
|
|
151
151
|
|
|
152
152
|
Se fullstack:
|
|
153
153
|
1. Se um app foi scaffoldado fora do caminho final do workspace, mova-o para `apps/<nome>/`. Apps scaffoldados diretamente em `apps/web/` ou `apps/api/` ja estao no lugar e nao devem ser movidos novamente.
|
|
154
154
|
2. Crie `pnpm-workspace.yaml` (ou equivalente), `package.json` raiz com scripts de workspace, `tsconfig.base.json` se TS config compartilhado.
|
|
155
|
-
3. Se o
|
|
156
|
-
4. Se o
|
|
155
|
+
3. Se o usuário escolheu Turborepo: adicione `turbo.json` com pipelines `dev`, `build`, `lint`, `test`.
|
|
156
|
+
4. Se o usuário escolheu Nx: rode `pnpm dlx nx@latest init` após os apps estarem no lugar; integre como projetos Nx.
|
|
157
157
|
|
|
158
158
|
#### 3.3 Gerar `docker-compose.dev.yml`
|
|
159
159
|
|
|
@@ -163,12 +163,12 @@ Se fullstack:
|
|
|
163
163
|
- Agregue volumes nomeados sob `volumes:`.
|
|
164
164
|
- Resolva colisoes de porta se houver.
|
|
165
165
|
- Se a topologia for `tudo no Compose`, adicione o(s) service(s) do app no fim (build context = `apps/<nome>` ou raiz, Dockerfile.dev, env_file, volumes, depends_on com `condition: service_healthy`). Se for `apps no host`, componha apenas infraestrutura e use endpoints `localhost` nas env vars consumidas pelas apps.
|
|
166
|
-
- Preserve a tag da imagem de cada recipe (
|
|
166
|
+
- Preserve a tag da imagem de cada recipe (NÃO converta nenhuma para digest — digest congela a imagem base e nunca alcanca um rebuild de segurança), as vars de credencial obrigatórias e os binds de porta em `127.0.0.1`. Esses mapeamentos loopback suportam intencionalmente `apps no host`; não os remova do dev local.
|
|
167
167
|
3. Adicione header: `# Generated by /dw-new-project on YYYY-MM-DD`.
|
|
168
168
|
|
|
169
169
|
#### 3.4 Gerar `.env.example`
|
|
170
170
|
|
|
171
|
-
Consolide cada env var referenciada pelos
|
|
171
|
+
Consolide cada env var referenciada pelos serviços selecionados (segundo `references/env-conventions.md`). Agrupe por serviço. Sempre inclua as URLs derivadas do lado da app (`DATABASE_URL`, `REDIS_URL`, `AMQP_URL`, `SMTP_HOST`/`SMTP_PORT`, `AWS_ENDPOINT_URL`, etc.). Toda var de credencial e emitida vazia no `.env.example` (as recipes usam `${VAR:?}`, então o Compose recusa subir sem valor real). Exija que o usuário defina valores únicos e gerados no `.env` gitignored antes de rodar Compose. Nunca emita uma senha reutilizavel.
|
|
172
172
|
|
|
173
173
|
#### 3.5 Gerar scripts
|
|
174
174
|
|
|
@@ -192,7 +192,7 @@ Adapte o `dev:db:migrate` por ORM (Prisma: `pnpm prisma migrate dev`; Alembic: `
|
|
|
192
192
|
|
|
193
193
|
Por stack, anexe ao que `create-*` gerou:
|
|
194
194
|
- `.gitignore` deve excluir `.env`.
|
|
195
|
-
- O
|
|
195
|
+
- O diretório `.dw/` e preservado entre updates pelo `/dw-update` (rules, spec, intel são dados do usuário).
|
|
196
196
|
- `.dockerignore`: exclua `.git`, `node_modules`, `.dw`, `.agents`, `tests`, `*.md` (em imagens prod).
|
|
197
197
|
|
|
198
198
|
#### 3.7 Gerar GitHub Actions CI
|
|
@@ -201,7 +201,7 @@ Por stack, anexe ao que `create-*` gerou:
|
|
|
201
201
|
|
|
202
202
|
#### 3.8 Semear `.dw/rules/index.md`
|
|
203
203
|
|
|
204
|
-
Scaffold
|
|
204
|
+
Scaffold mínimo:
|
|
205
205
|
|
|
206
206
|
```markdown
|
|
207
207
|
# Project Rules — {{PROJECT_NAME}}
|
|
@@ -241,18 +241,18 @@ Scaffold minimo:
|
|
|
241
241
|
#### 3.9 README.md
|
|
242
242
|
|
|
243
243
|
Gere um README inicial:
|
|
244
|
-
- Nome do projeto + 1 linha de
|
|
245
|
-
- Quick Start (`cp .env.example .env`, defina cada secret
|
|
246
|
-
- Local Dev (tabela de portas dos
|
|
244
|
+
- Nome do projeto + 1 linha de propósito
|
|
245
|
+
- Quick Start (`cp .env.example .env`, defina cada secret obrigatório com valor local único, depois `pnpm install && pnpm dev:up`)
|
|
246
|
+
- Local Dev (tabela de portas dos serviços selecionados + URLs das UIs + requisitos de credenciais; nunca publique senha funcional)
|
|
247
247
|
- Diagrama da arquitetura (ASCII do one-pager)
|
|
248
|
-
- Layout do projeto (
|
|
249
|
-
-
|
|
248
|
+
- Layout do projeto (árvore dos diretórios top-level)
|
|
249
|
+
- Integração com dev-workflow (mencione `/dw-plan prd`, `/dw-run`, `/dw-qa`, `/dw-secure-audit --plan`, `/dw-secure-audit`)
|
|
250
250
|
|
|
251
|
-
Se `create-*`
|
|
251
|
+
Se `create-*` já gerou README, **anexe** sob "## Local Dev"; não sobrescreva.
|
|
252
252
|
|
|
253
253
|
#### 3.10 Commit inicial (opcional)
|
|
254
254
|
|
|
255
|
-
Se `--no-git`
|
|
255
|
+
Se `--no-git` NÃO foi passado e não tem `.git/` ainda:
|
|
256
256
|
|
|
257
257
|
```bash
|
|
258
258
|
git init -b main
|
|
@@ -260,11 +260,11 @@ git add -A
|
|
|
260
260
|
git commit -m "chore: scaffold via /dw-new-project (0.8.0)"
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
-
Se
|
|
263
|
+
Se já tem `.git/` (algum `create-*` ignorou `--noGit`), só apague com confirmação explícita do usuário.
|
|
264
264
|
|
|
265
265
|
---
|
|
266
266
|
|
|
267
|
-
### Fase 4 —
|
|
267
|
+
### Fase 4 — Relatório Final
|
|
268
268
|
|
|
269
269
|
Escreva `.dw/spec/projects/{{PROJECT_NAME}}-bootstrap.md`:
|
|
270
270
|
|
|
@@ -316,39 +316,39 @@ monorepo: <pnpm-workspaces|turborepo|nx|none>
|
|
|
316
316
|
| Flag | Comportamento |
|
|
317
317
|
|------|---------------|
|
|
318
318
|
| (default) | Roda fases 0 → 4 com gate humano no fim da Fase 2 |
|
|
319
|
-
| `--dry-run` | Roda fases 0 → 2, escreve
|
|
319
|
+
| `--dry-run` | Roda fases 0 → 2, escreve só o one-pager e o relatório (`status: PLANNED`), NÃO executa Fase 3 |
|
|
320
320
|
| `--no-git` | Pula o commit inicial da Fase 3.10 |
|
|
321
321
|
| `--no-ci` | Pula o GitHub Action da Fase 3.7 |
|
|
322
322
|
|
|
323
|
-
## Regras
|
|
323
|
+
## Regras Críticas
|
|
324
324
|
|
|
325
|
-
- <critical>NUNCA pule o gate de
|
|
326
|
-
- <critical>NUNCA rode tools `create-*` fora de `{{TARGET_DIR}}`. CWD de cada comando
|
|
327
|
-
- <critical>Se Mailpit/smtp4dev foi selecionado, NUNCA
|
|
328
|
-
- <critical>Se uma tool `create-*` falha, PARE.
|
|
329
|
-
-
|
|
330
|
-
-
|
|
325
|
+
- <critical>NUNCA pule o gate de aprovação da Fase 2. Se rodando em contexto não-interativo, aborte com: "/dw-new-project exige aprovação interativa; rerode com --dry-run para só planejar."</critical>
|
|
326
|
+
- <critical>NUNCA rode tools `create-*` fora de `{{TARGET_DIR}}`. CWD de cada comando é o target dir.</critical>
|
|
327
|
+
- <critical>Se Mailpit/smtp4dev foi selecionado, NUNCA também ligue um SMTP real em dev. O compose de dev SEMPRE captura.</critical>
|
|
328
|
+
- <critical>Se uma tool `create-*` falha, PARE. Não siga para gerar compose — scaffold parcial confunde os comandos seguintes.</critical>
|
|
329
|
+
- NÃO pin de versão SDK Node/Python/.NET/Rust dentro do projeto a não ser que o usuário peca; use `package.json` engines / `pyproject.toml` / `global.json` / `rust-toolchain.toml` para indicar intenção sem forcar.
|
|
330
|
+
- NÃO baked secrets em arquivo gerado. `.env.example` contem defaults não secretos de dev e chaves secretas obrigatórias vazias; valores reais ficam em `.env` não versionado.
|
|
331
331
|
|
|
332
332
|
## Tratamento de Erros
|
|
333
333
|
|
|
334
|
-
- Docker faltando → avise na Fase 0, permita `--dry-run`; aborte
|
|
335
|
-
- Tool `create-*`
|
|
336
|
-
-
|
|
337
|
-
-
|
|
338
|
-
- Porta
|
|
334
|
+
- Docker faltando → avise na Fase 0, permita `--dry-run`; aborte execução com instruções de instalação.
|
|
335
|
+
- Tool `create-*` indisponível (registry npm fora) → aborte o bootstrap com o comando exato + exit code; NÃO faça scaffold parcial.
|
|
336
|
+
- Usuário escolhe MongoDB → anote "Recipe MongoDB não bundled na v0.8.0; vamos adicionar deps de app mas você vai precisar ligar o serviço manualmente". Continue.
|
|
337
|
+
- Usuário escolhe Caddy → idem: anote como não bundled; siga sem serviço no compose.
|
|
338
|
+
- Porta já ocupada no host → sugira a env var de override e siga; não escolha outra porta em silêncio.
|
|
339
339
|
- Working tree docs-first → preserve cada path listado e escreva apenas nos novos paths aprovados. Existing app → aborte e indique `/dw-dockerize --audit`.
|
|
340
340
|
|
|
341
|
-
##
|
|
341
|
+
## Integração com Outros dw-* Commands
|
|
342
342
|
|
|
343
|
-
- **`npx dev-workflow init`** e predecessor
|
|
344
|
-
- **`/dw-plan prd`**
|
|
345
|
-
- **`/dw-analyze-project`** deve rodar
|
|
346
|
-
- **`/dw-secure-audit --plan --scan-only`** pode rodar logo
|
|
347
|
-
- **`/dw-secure-audit`** roda como parte do pipeline de PRD
|
|
348
|
-
- **`/dw-dockerize`**
|
|
343
|
+
- **`npx dev-workflow init`** e predecessor obrigatório. Ordem: `init` → `/dw-new-project` → `/dw-plan prd`.
|
|
344
|
+
- **`/dw-plan prd`** é o próximo passo sugerido após bootstrap bem-sucedido.
|
|
345
|
+
- **`/dw-analyze-project`** deve rodar após primeiro commit substancial para enriquecer `.dw/rules/` — o bootstrap deixa um seed mínimo.
|
|
346
|
+
- **`/dw-secure-audit --plan --scan-only`** pode rodar logo após o bootstrap para confirmar que nenhum dep vulnerável veio dos templates `create-*`.
|
|
347
|
+
- **`/dw-secure-audit`** roda como parte do pipeline de PRD após a primeira feature aterrissar.
|
|
348
|
+
- **`/dw-dockerize`** é o comando irmão para retrofit de Docker em projeto existente que não comecou com este aqui.
|
|
349
349
|
|
|
350
350
|
## Inspirado em
|
|
351
351
|
|
|
352
|
-
`dw-new-project`
|
|
352
|
+
`dw-new-project` é dev-workflow-native. O padrão de entrevista herda do `/dw-plan prd` (clarificação socrática, branching condicional por artefato anterior). A disciplina de execução (verification por fase, gate atômico antes de mutar) herda do `/dw-secure-audit --plan` e `/dw-secure-audit`. A lógica de composição do compose está delegada para a skill bundled `docker-compose-recipes`. A filosofia de "wrap a tool oficial" foi confirmada via `/dw-find-skills` contra o ecossistema `npx skills` em 2026-04-28 — nada lá matchava "entrevista + scaffold multi-stack + compose dev" em qualidade suficiente.
|
|
353
353
|
|
|
354
354
|
</system_instructions>
|
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
|
-
|
|
3
|
-
sem abrir Electron e sem depender do estado da GUI do
|
|
2
|
+
Você é o **runner headless do Open Design (`od`)** para gerar e iterar protótipos HTML em uma pasta de projeto,
|
|
3
|
+
sem abrir Electron e sem depender do estado da GUI do usuário. Use o daemon do `nexu-io/open-design` em
|
|
4
4
|
`--headless`, importe a pasta alvo uma vez, rode briefs single ou batch em serie, verifique o arquivo produzido,
|
|
5
5
|
rode gate visual Playwright/Firefox e **PARE para o gate do dono** antes de qualquer commit.
|
|
6
6
|
|
|
7
|
-
<critical>NUNCA use o estado da GUI do
|
|
8
|
-
<critical>NUNCA commite
|
|
9
|
-
<critical>O agente (`codex` ou `claude`) deve ser sempre
|
|
10
|
-
<critical>NUNCA despache o pedido cru do
|
|
7
|
+
<critical>NUNCA use o estado da GUI do usuário. Sempre rode com `OD_DATA_DIR` isolado por projeto, por exemplo `.dw/.open-design/data/`.</critical>
|
|
8
|
+
<critical>NUNCA commite protótipo reprovado. O gate e dual >=9: gate automático + avaliação visual propria >=9, depois gate do dono.</critical>
|
|
9
|
+
<critical>O agente (`codex` ou `claude`) deve ser sempre explícito em `od run start --agent <agent>`. Se o usuário não passar, resolva de config/estado do projeto; fallback `codex`.</critical>
|
|
10
|
+
<critical>NUNCA despache o pedido cru do usuário para o `od`. O valor deste comando e refinar o prompt primeiro: ancore no código real, estruture o brief, qualifique estados/temas/a11y/deep-link, persista o brief revisavel e só então anexe o apendice headless.</critical>
|
|
11
11
|
|
|
12
12
|
## Inputs
|
|
13
13
|
|
|
14
|
-
| Flag/argumento | Default |
|
|
14
|
+
| Flag/argumento | Default | Descrição |
|
|
15
15
|
|---|---:|---|
|
|
16
16
|
| `--target <dir>` | `open-design/` | Pasta importada como projeto externo e onde os HTMLs serao escritos. |
|
|
17
17
|
| `--brief <file>` | nenhum | Um brief markdown para uma run single. |
|
|
18
18
|
| `--brief-glob <glob>` | nenhum | Batch em serie. Expanda para lista estavel e rode um prompt por vez. |
|
|
19
|
-
| `--output <file>` |
|
|
19
|
+
| `--output <file>` | obrigatório no brief/apendice | HTML esperado; verifique no filesystem depois da run. |
|
|
20
20
|
| `--agent <codex|claude>` | estado/config -> `codex` | Agente repassado ao `od run start --agent`. |
|
|
21
21
|
| `--platform <text>` | `Web responsivo desktop-first e mobile-safe` | Resposta pre-preenchida para o discovery da skill `web-prototype`. |
|
|
22
22
|
| `--deep-link-id <id>` | nenhum | Valor usado no gate comportamental `?aberto=<id>` + Esc. |
|
|
23
|
-
| `--refactor` | falso | Modo redesign/refactor de tela existente; captura prints atuais e ancora o brief no estado visivel +
|
|
23
|
+
| `--refactor` | falso | Modo redesign/refactor de tela existente; captura prints atuais e ancora o brief no estado visivel + código real. |
|
|
24
24
|
| `--url <url>` | nenhum | URL de app rodando para capturar prints atuais via Playwright Firefox. |
|
|
25
25
|
| `--viewports <lista>` | `1440x900,375x812` | Viewports separados por virgula para `--refactor --url`; expanda conforme a dor (ex.: `1920x1080` para tabela larga). |
|
|
26
|
-
| `--screenshot <path>` | repetivel | Print atual
|
|
26
|
+
| `--screenshot <path>` | repetivel | Print atual já capturado quando não houver `--url`; copie para `_refs/<slug>/`. |
|
|
27
27
|
|
|
28
28
|
## 0. Refinar o brief
|
|
29
29
|
|
|
30
|
-
Antes de qualquer pre-flight de daemon ou chamada ao `od`, transforme a
|
|
31
|
-
|
|
30
|
+
Antes de qualquer pre-flight de daemon ou chamada ao `od`, transforme a intenção do usuário em um brief qualificado.
|
|
31
|
+
Não envie a frase crua do usuário para o runner.
|
|
32
32
|
|
|
33
|
-
Contrato
|
|
33
|
+
Contrato obrigatório:
|
|
34
34
|
|
|
35
35
|
| Etapa | Exigencia |
|
|
36
36
|
|---|---|
|
|
37
|
-
| Ancorar na realidade | Se a tela existe, leia o
|
|
38
|
-
| Estruturar | Reescreva o pedido no esqueleto
|
|
37
|
+
| Ancorar na realidade | Se a tela existe, leia o código real dela: colunas, enums, ações, estados, permissões, contracts e domínio. Leia também design system, protótipos irmãos e guias de design do projeto. É proibido inventar campo, status ou ação. |
|
|
38
|
+
| Estruturar | Reescreva o pedido no esqueleto padrão abaixo, preenchendo paths reais e arquivo de saída exato. |
|
|
39
39
|
| Qualificar | Cubra loading/skeleton, empty/vazio, erro/falha, light + dark, a11y, limites do design system local (ex.: <=6 cards/filtros), responsividade e deep-link. |
|
|
40
|
-
| Persistir | Salve o brief refinado dentro do projeto, por exemplo `<target>/PROMPT-<slug>.md`. Ele e entregavel revisavel pelo dono,
|
|
41
|
-
| Revisar se
|
|
40
|
+
| Persistir | Salve o brief refinado dentro do projeto, por exemplo `<target>/PROMPT-<slug>.md`. Ele e entregavel revisavel pelo dono, não arquivo descartavel. |
|
|
41
|
+
| Revisar se já vier pronto | Se o usuário trouxer um brief já qualificado, faça uma revisão rapida por checklist, ajuste apenas lacunas e persista a versão final. |
|
|
42
42
|
|
|
43
|
-
Esqueleto
|
|
43
|
+
Esqueleto padrão do brief refinado:
|
|
44
44
|
|
|
45
45
|
```markdown
|
|
46
46
|
# <titulo da tela/prototipo>
|
|
@@ -74,12 +74,12 @@ Para o mock nao mentir: usar enums/status reais, dados de exemplo realistas no i
|
|
|
74
74
|
- `<OUTPUT_FILE>.artifact.json` se houver sidecar
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Só depois de persistir esse arquivo anexe o apendice headless em `.dw/.open-design/runs/` e despache a run.
|
|
78
78
|
|
|
79
79
|
### 0R. Modo refactor/redesign
|
|
80
80
|
|
|
81
|
-
Quando `--refactor` estiver presente, a fase 0 continua
|
|
82
|
-
|
|
81
|
+
Quando `--refactor` estiver presente, a fase 0 continua obrigatória. Prints complementam a ancoragem no código; eles
|
|
82
|
+
não substituem leitura de contracts, enums, permissões, estados, design system e protótipos irmãos.
|
|
83
83
|
|
|
84
84
|
Capture ou copie os prints atuais para dentro da pasta importada, em `_refs/<slug>/`, antes de persistir o brief:
|
|
85
85
|
|
|
@@ -106,9 +106,9 @@ Regras de captura:
|
|
|
106
106
|
| Caso | Exigencia |
|
|
107
107
|
|---|---|
|
|
108
108
|
| Viewports | Default sensato: desktop `1440x900` + mobile `375x812`. O agente escolhe/expande conforme a dor: bug mobile inclui `375x812`; tabela larga inclui `1920x1080`; tablet/console inclui `768x1024`. |
|
|
109
|
-
| Temas | Capture light e dark quando
|
|
110
|
-
| Caminho robusto | O agente do `od` le imagens do filesystem do projeto. Referencie caminhos relativos dentro do target;
|
|
111
|
-
| Higiene | `_refs/` e material de
|
|
109
|
+
| Temas | Capture light e dark quando aplicável. O helper usa `light,dark` por default e grava nomes como `_refs/<slug>/atual-1440-light.png` e `_refs/<slug>/atual-375-dark.png`. |
|
|
110
|
+
| Caminho robusto | O agente do `od` le imagens do filesystem do projeto. Referencie caminhos relativos dentro do target; não dependa de flag de imagem no `run start`. |
|
|
111
|
+
| Higiene | `_refs/` e material de referência não devem virar protótipo. Se o projeto-alvo versiona protótipos finais, documente limpeza ou adicione `<target>/_refs/` ao `.gitignore` conforme a convencao local. |
|
|
112
112
|
|
|
113
113
|
O brief refinado do modo refactor deve adicionar este bloco:
|
|
114
114
|
|
|
@@ -130,13 +130,13 @@ Abra e ANALISE os prints antes de escrever:
|
|
|
130
130
|
|
|
131
131
|
## Pre-flight
|
|
132
132
|
|
|
133
|
-
| Checagem |
|
|
133
|
+
| Checagem | Ação |
|
|
134
134
|
|---|---|
|
|
135
|
-
| Resolver `od` | `OD_CLI_DIR` vence.
|
|
136
|
-
| Prerequisitos | O checkout do Open Design exige Node `~24` e pnpm `>=10.33`. Se faltarem, pare com
|
|
135
|
+
| Resolver `od` | `OD_CLI_DIR` vence. Senão use `~/.dw/vendor/open-design`. Se `apps/daemon/bin/od.mjs` não existir, pare e mande rodar `dev-workflow install-deps`. |
|
|
136
|
+
| Prerequisitos | O checkout do Open Design exige Node `~24` e pnpm `>=10.33`. Se faltarem, pare com instruções objetivas. |
|
|
137
137
|
| Estado isolado | Crie `.dw/.open-design/`, `.dw/.open-design/data/`, `.dw/.open-design/runs/` e `.dw/.open-design/state.json`. |
|
|
138
138
|
| Porta | Escolha porta livre em `127.0.0.1`; persista `daemonUrl` e `port` no state. |
|
|
139
|
-
| Daemon vivo | Se `od daemon status --daemon-url <url> --json` retornar `ok: true`, reuse.
|
|
139
|
+
| Daemon vivo | Se `od daemon status --daemon-url <url> --json` retornar `ok: true`, reuse. Senão inicie novo daemon. |
|
|
140
140
|
|
|
141
141
|
Comando base do daemon:
|
|
142
142
|
|
|
@@ -149,8 +149,8 @@ node "$OD_DIR/apps/daemon/bin/od.mjs" daemon start \
|
|
|
149
149
|
--port "$PORT"
|
|
150
150
|
```
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
continua e o arquivo alvo
|
|
152
|
+
Ruído conhecido: `codex_core::shell_snapshot` pode logar `ERROR` de sintaxe. Isso e benigno; não aborte se a run
|
|
153
|
+
continua e o arquivo alvo é criado.
|
|
154
154
|
|
|
155
155
|
## Import idempotente
|
|
156
156
|
|
|
@@ -171,7 +171,7 @@ Persistir em `.dw/.open-design/state.json`:
|
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
Se `projectId` existe no state e `od project info <id> --daemon-url <url> --json` funciona para o mesmo
|
|
174
|
-
`targetDir`, reuse. Caso
|
|
174
|
+
`targetDir`, reuse. Caso contrário, reimporte:
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
177
|
node "$OD_DIR/apps/daemon/bin/od.mjs" project import-folder "$TARGET_DIR" \
|
|
@@ -182,12 +182,12 @@ node "$OD_DIR/apps/daemon/bin/od.mjs" project import-folder "$TARGET_DIR" \
|
|
|
182
182
|
--json
|
|
183
183
|
```
|
|
184
184
|
|
|
185
|
-
Capture `project.id` e `conversationId`;
|
|
185
|
+
Capture `project.id` e `conversationId`; não dependa de estado global do app.
|
|
186
186
|
|
|
187
|
-
## Apendice headless
|
|
187
|
+
## Apendice headless obrigatório
|
|
188
188
|
|
|
189
189
|
Anexe este bloco ao final de cada brief em um arquivo temporario dentro de `.dw/.open-design/runs/`.
|
|
190
|
-
Preencha `<PLATFORM>`, `<OUTPUT_FILE>` e
|
|
190
|
+
Preencha `<PLATFORM>`, `<OUTPUT_FILE>` e referências irma se houver.
|
|
191
191
|
|
|
192
192
|
```markdown
|
|
193
193
|
---
|
|
@@ -239,30 +239,30 @@ node "$OD_DIR/apps/daemon/bin/od.mjs" run start \
|
|
|
239
239
|
--json | tee ".dw/.open-design/runs/<slug>.jsonl"
|
|
240
240
|
```
|
|
241
241
|
|
|
242
|
-
Depois da run, confira o arquivo. **
|
|
242
|
+
Depois da run, confira o arquivo. **Não aceite apenas status `succeeded`:**
|
|
243
243
|
|
|
244
244
|
```bash
|
|
245
245
|
test -s "$TARGET_DIR/<OUTPUT_FILE>"
|
|
246
246
|
```
|
|
247
247
|
|
|
248
248
|
Registre no JSONL ou em sidecar de auditoria: brief, prompt com apendice, agente, daemonUrl, projectId,
|
|
249
|
-
conversationId, output esperado, status final e resultado da
|
|
249
|
+
conversationId, output esperado, status final e resultado da verificação do arquivo.
|
|
250
250
|
|
|
251
251
|
## Batch
|
|
252
252
|
|
|
253
253
|
Para `--brief-glob`, expanda os briefs, ordene por nome e rode em serie. Pare no primeiro caso em que:
|
|
254
254
|
|
|
255
|
-
|
|
|
255
|
+
| Condição | Resultado |
|
|
256
256
|
|---|---|
|
|
257
257
|
| run falha | `BLOCKED` com log JSONL |
|
|
258
|
-
| run diz sucesso mas arquivo
|
|
258
|
+
| run diz sucesso mas arquivo não existe ou está vazio | `FINDINGS` e follow-up cirúrgico ou `BLOCKED` |
|
|
259
259
|
| gate visual <9 | `FINDINGS`; iterar antes de continuar |
|
|
260
260
|
|
|
261
|
-
|
|
261
|
+
Não rode prompts em paralelo no mesmo projeto `od`; preserve auditabilidade e contexto.
|
|
262
262
|
|
|
263
263
|
## Iteracao cirurgica
|
|
264
264
|
|
|
265
|
-
Use follow-up run no mesmo `projectId`/`conversationId`, com prompt curto e arquivo alvo
|
|
265
|
+
Use follow-up run no mesmo `projectId`/`conversationId`, com prompt curto e arquivo alvo explícito:
|
|
266
266
|
|
|
267
267
|
```bash
|
|
268
268
|
node "$OD_DIR/apps/daemon/bin/od.mjs" run start \
|
|
@@ -277,11 +277,11 @@ node "$OD_DIR/apps/daemon/bin/od.mjs" run start \
|
|
|
277
277
|
--json | tee -a ".dw/.open-design/runs/<slug>.jsonl"
|
|
278
278
|
```
|
|
279
279
|
|
|
280
|
-
O follow-up deve dizer: arquivo
|
|
280
|
+
O follow-up deve dizer: arquivo único, mudança exata, não tocar protótipos irmãos, manter deep-link e estados.
|
|
281
281
|
|
|
282
|
-
## Gate visual
|
|
282
|
+
## Gate visual obrigatório
|
|
283
283
|
|
|
284
|
-
Execute o gate
|
|
284
|
+
Execute o gate automático:
|
|
285
285
|
|
|
286
286
|
```bash
|
|
287
287
|
node .dw/scripts/open-design/gate-prototype.mjs \
|
|
@@ -297,27 +297,27 @@ O gate cobre:
|
|
|
297
297
|
|---|---|
|
|
298
298
|
| Estrutural | `<title>`, `aberto`, `replaceState`, `role=dialog`/ARIA, skeleton/loading, empty/vazio, erro/falha. |
|
|
299
299
|
| Screenshot | Firefox headless em light e dark, com `colorScheme` e `data-theme`. |
|
|
300
|
-
| Comportamental | `?aberto=<id>` abre o item certo; Esc fecha e limpa o
|
|
301
|
-
|
|
|
300
|
+
| Comportamental | `?aberto=<id>` abre o item certo; Esc fecha e limpa o parâmetro. |
|
|
301
|
+
| Avaliação | Automático PASS + sua nota visual >=9. Se abaixo de 9, faça follow-up cirúrgico. |
|
|
302
302
|
|
|
303
|
-
Depois de passar, **pare para o gate do dono**.
|
|
303
|
+
Depois de passar, **pare para o gate do dono**. Não commite até o dono aprovar.
|
|
304
304
|
|
|
305
305
|
## Armadilhas validadas
|
|
306
306
|
|
|
307
|
-
| Armadilha | Sintoma | Contorno
|
|
307
|
+
| Armadilha | Sintoma | Contorno obrigatório |
|
|
308
308
|
|---|---|---|
|
|
309
|
-
| Discovery da `web-prototype` | Abre com `<question-form>` e encerra o turno; headless
|
|
309
|
+
| Discovery da `web-prototype` | Abre com `<question-form>` e encerra o turno; headless não gera GenUI (`od ui list` vazio). | Anexar o apendice headless respondendo plataforma e proibindo perguntas/discovery. |
|
|
310
310
|
| Timeout de inatividade | HTML grande fica silencioso e o run morre perto de 10min. | `OD_CHAT_RUN_INACTIVITY_TIMEOUT_MS=1800000` no daemon + instruir escrita em partes de ~150 linhas. |
|
|
311
|
-
| `codex_core::shell_snapshot` | Loga `ERROR` de sintaxe no stream. | Tratar como
|
|
312
|
-
| Estado da GUI | Config/agente/projetos vazam do app do
|
|
311
|
+
| `codex_core::shell_snapshot` | Loga `ERROR` de sintaxe no stream. | Tratar como ruído se a run prossegue e o arquivo final existe. |
|
|
312
|
+
| Estado da GUI | Config/agente/projetos vazam do app do usuário. | `OD_DATA_DIR` isolado sempre; `--agent`, `--skill` e `--design-system` explícitos. |
|
|
313
313
|
|
|
314
314
|
## Structured Return
|
|
315
315
|
|
|
316
316
|
**Status:** `PASS` | `FINDINGS` | `BLOCKED` | `NOT_APPLICABLE`
|
|
317
317
|
**Scope:** pasta alvo, briefs executados, agente usado, projectId/conversationId.
|
|
318
318
|
**Evidence:** logs JSONL, arquivo(s) HTML verificados, gate JSON, screenshots light/dark.
|
|
319
|
-
**Artifacts:** paths dos
|
|
319
|
+
**Artifacts:** paths dos protótipos e sidecars.
|
|
320
320
|
**Decisions:** defaults/overrides aplicados (`agent`, `target`, plataforma, porta).
|
|
321
|
-
**Risks:** qualquer gate abaixo de 9, arquivo
|
|
322
|
-
**Next Step:** gate do dono, follow-up
|
|
321
|
+
**Risks:** qualquer gate abaixo de 9, arquivo não gerado apesar de run succeeded, dependência ausente.
|
|
322
|
+
**Next Step:** gate do dono, follow-up cirúrgico necessário, ou comando de resume exato.
|
|
323
323
|
</system_instructions>
|