@dewtech/dare-cli 2.16.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -0
- package/dist/__tests__/refine.test.d.ts +2 -0
- package/dist/__tests__/refine.test.d.ts.map +1 -0
- package/dist/__tests__/refine.test.js +186 -0
- package/dist/__tests__/refine.test.js.map +1 -0
- package/dist/__tests__/review.test.d.ts +2 -0
- package/dist/__tests__/review.test.d.ts.map +1 -0
- package/dist/__tests__/review.test.js +242 -0
- package/dist/__tests__/review.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +150 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/bin/dare.js +6 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +76 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/refine.d.ts +16 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +167 -0
- package/dist/commands/refine.js.map +1 -0
- package/dist/commands/review.d.ts +16 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +106 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +149 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/types/Refine.types.d.ts +96 -0
- package/dist/types/Refine.types.d.ts.map +1 -0
- package/dist/types/Refine.types.js +19 -0
- package/dist/types/Refine.types.js.map +1 -0
- package/dist/types/Review.types.d.ts +86 -0
- package/dist/types/Review.types.d.ts.map +1 -0
- package/dist/types/Review.types.js +15 -0
- package/dist/types/Review.types.js.map +1 -0
- package/dist/types/UpdateManifest.types.d.ts +91 -0
- package/dist/types/UpdateManifest.types.d.ts.map +1 -0
- package/dist/types/UpdateManifest.types.js +13 -0
- package/dist/types/UpdateManifest.types.js.map +1 -0
- package/dist/utils/ReviewRunner.d.ts +42 -0
- package/dist/utils/ReviewRunner.d.ts.map +1 -0
- package/dist/utils/ReviewRunner.js +175 -0
- package/dist/utils/ReviewRunner.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts +42 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -0
- package/dist/utils/UpdateApplier.js +207 -0
- package/dist/utils/UpdateApplier.js.map +1 -0
- package/dist/utils/UpdateDetector.d.ts +56 -0
- package/dist/utils/UpdateDetector.d.ts.map +1 -0
- package/dist/utils/UpdateDetector.js +164 -0
- package/dist/utils/UpdateDetector.js.map +1 -0
- package/dist/utils/complexity-analyzer.d.ts +60 -0
- package/dist/utils/complexity-analyzer.d.ts.map +1 -0
- package/dist/utils/complexity-analyzer.js +292 -0
- package/dist/utils/complexity-analyzer.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +21 -2
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/static-analyzer.d.ts +29 -0
- package/dist/utils/static-analyzer.d.ts.map +1 -0
- package/dist/utils/static-analyzer.js +390 -0
- package/dist/utils/static-analyzer.js.map +1 -0
- package/dist/utils/version-compare.d.ts +27 -0
- package/dist/utils/version-compare.d.ts.map +1 -0
- package/dist/utils/version-compare.js +47 -0
- package/dist/utils/version-compare.js.map +1 -0
- package/package.json +1 -1
- package/templates/UPDATE-MANIFEST.json +48 -0
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +180 -36
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +41 -0
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +45 -4
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +56 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +41 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -0
- package/templates/ide/claude/templates/TASK-SPEC-template.md +45 -4
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +45 -0
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +42 -0
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -0
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -0
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +45 -4
|
@@ -85,16 +85,57 @@ Execute **todos** antes de marcar a task como DONE. Se qualquer um falhar, leia
|
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
## 7.
|
|
88
|
+
## 7. PADRÕES PROIBIDOS (ANTI-STUB / ANTI-MOCK)
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
> Esta seção é **inegociável**. O comando `dare review` (v2.17+) escaneia o código modificado por esta task e reprova se encontrar qualquer padrão abaixo.
|
|
91
|
+
|
|
92
|
+
### Em código de produção (qualquer arquivo **fora** de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
93
|
+
|
|
94
|
+
- ❌ **TODO / FIXME / XXX / HACK** — qualquer um desses marcadores em comentário
|
|
95
|
+
- ❌ **Função vazia** — `fn x() {}`, `function x() {}`, `def x(): pass`, `def x(): ...`
|
|
96
|
+
- ❌ **Stub explícito** — `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `raise NotImplementedError`
|
|
97
|
+
- ❌ **Retorno-fantasma** — `return null` / `return undefined` / `return {}` / `return []` como **única** statement de função pública declarada nesta task
|
|
98
|
+
- ❌ **Mocks fora de testes** — `jest.fn()`, `sinon.stub()`, `mockReturnValue`, dados hardcoded fingindo ser do banco, fixtures injetadas em controllers/services
|
|
99
|
+
- ❌ **Comentário de placeholder** — `// implement later`, `# placeholder`, `// stub`, `// FIXME implement`
|
|
100
|
+
|
|
101
|
+
### Mocks são permitidos APENAS em
|
|
102
|
+
|
|
103
|
+
- Arquivos de teste (`*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
104
|
+
- Seeds / fixtures dentro de `database/seeders/`, `tests/fixtures/`
|
|
105
|
+
- Helpers explicitamente marcados como auxiliares de teste
|
|
106
|
+
|
|
107
|
+
### Verificação automática
|
|
108
|
+
|
|
109
|
+
Antes de marcar a task como DONE, rode:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
dare review <task-id>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Output esperado:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✅ task-XYZ: nenhum padrão proibido detectado em N arquivos modificados.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Se a review falhar, a task **não pode** ir para DONE — corrija os achados e re-rode.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 8. CRITÉRIOS DE DONE
|
|
126
|
+
|
|
127
|
+
- [ ] Todos os 4 validation gates passaram sem erros (build + test + lint + audit)
|
|
128
|
+
- [ ] Testes cobrem caminho feliz + erros enumerados + edge cases da seção 4
|
|
92
129
|
- [ ] Considerações de segurança da seção 5 todas checadas
|
|
93
130
|
- [ ] Arquivos listados na seção 3 criados/modificados conforme spec
|
|
131
|
+
- [ ] **`dare review <task-id>` passou** (seção 7 — sem stubs, mocks, TODOs)
|
|
132
|
+
- [ ] Cada validação declarada na spec tem teste demonstrando o erro real (não placeholder)
|
|
133
|
+
- [ ] Cada edge case enumerado tem teste cobrindo
|
|
134
|
+
- [ ] Endpoints retornam dados reais do banco/service, não hardcoded
|
|
94
135
|
- [ ] `DARE/TASKS.md` atualizado com status `DONE`
|
|
95
136
|
|
|
96
137
|
---
|
|
97
138
|
|
|
98
|
-
##
|
|
139
|
+
## 9. PRÓXIMA TASK SUGERIDA
|
|
99
140
|
|
|
100
141
|
`[task-id]` — [título] _(desbloqueada após conclusão desta task)_
|
|
@@ -66,6 +66,62 @@ Siga o template `templates/BLUEPRINT-template.md`. Seções obrigatórias:
|
|
|
66
66
|
|
|
67
67
|
**2.11 Checklist de Aprovação** — checkboxes para o usuário revisar antes de prosseguir
|
|
68
68
|
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 🚫 ANTI-STUB CONTRACT (regra inegociável)
|
|
72
|
+
|
|
73
|
+
> **Por que existe esta seção:** o `/dare-tasks` que vem depois usa este Blueprint como **única fonte de verdade**. Se um endpoint, função ou regra ficar genérico aqui, o agente que implementar a task **será forçado a inventar** — e vai produzir mocks, stubs e esqueletos para "preencher o vazio". Detalhe agora.
|
|
74
|
+
>
|
|
75
|
+
> Tasks que produzem mock/stub/skeleton **falham** no `dare review` (introduzido na v2.17) e bloqueiam o `dare execute --complete`.
|
|
76
|
+
|
|
77
|
+
Para **cada** endpoint, função pública, evento ou job declarado no Blueprint, especifique de forma **executável**:
|
|
78
|
+
|
|
79
|
+
### Para endpoints HTTP/RPC
|
|
80
|
+
|
|
81
|
+
- **Assinatura completa:** método, path, headers obrigatórios, content-type
|
|
82
|
+
- **Request schema:** todos os campos com tipo, restrições (min/max/regex), opcionalidade
|
|
83
|
+
- **Response schema por status code:** estrutura para 2xx, 4xx, 5xx — não apenas "200 OK"
|
|
84
|
+
- **Validações server-side:** lista exaustiva de regras (`email único`, `senha ≥ 8 chars + 1 maiúscula + 1 dígito`, etc.)
|
|
85
|
+
- **Edge cases enumerados:** o que acontece com input vazio, duplicado, expirado, sem permissão, com dados inconsistentes
|
|
86
|
+
- **Side effects:** que tabelas/filas/caches/emails são tocados — em ordem
|
|
87
|
+
- **Exemplo concreto (não placeholder):** payload real, response real
|
|
88
|
+
|
|
89
|
+
### Para funções de domínio / services
|
|
90
|
+
|
|
91
|
+
- **Assinatura tipada** (`fn name(args: Types) -> ReturnType` ou equivalente)
|
|
92
|
+
- **Pré-condições** verificáveis (estado obrigatório do banco/cache/etc.)
|
|
93
|
+
- **Pós-condições** verificáveis (o que muda no sistema após retornar OK)
|
|
94
|
+
- **Estados de erro** com tipo de exceção/Result/Either esperado
|
|
95
|
+
- **Comportamento em concorrência** quando relevante (idempotência, locking, retry)
|
|
96
|
+
|
|
97
|
+
### Para jobs / event handlers / workers
|
|
98
|
+
|
|
99
|
+
- **Trigger:** evento, cron, fila — incluir o **nome canônico**
|
|
100
|
+
- **Payload schema** com tipos
|
|
101
|
+
- **Retry policy** (backoff, max attempts, DLQ)
|
|
102
|
+
- **Idempotência:** chave + estratégia
|
|
103
|
+
- **SLA / timeout**
|
|
104
|
+
|
|
105
|
+
### Para modelos de dados
|
|
106
|
+
|
|
107
|
+
- Cada campo: tipo, nullable, default, constraints (unique, fk, check), índices
|
|
108
|
+
- Triggers ou hooks (soft-delete, audit, encryption-at-rest)
|
|
109
|
+
- Estado inicial / seed obrigatório (se aplicável)
|
|
110
|
+
|
|
111
|
+
### Critério de "Blueprint detalhado o suficiente"
|
|
112
|
+
|
|
113
|
+
Antes de salvar, valide internamente — se a resposta a **qualquer** pergunta abaixo for "não", o Blueprint ainda está raso e precisa ser expandido:
|
|
114
|
+
|
|
115
|
+
- [ ] Para cada endpoint, um humano não-familiarizado consegue escrever request/response sem perguntar nada?
|
|
116
|
+
- [ ] Para cada função pública, está claro **o que retorna** em todos os caminhos (sucesso + erros enumerados)?
|
|
117
|
+
- [ ] Edge cases foram **enumerados** ou só listados como "tratar edge cases"?
|
|
118
|
+
- [ ] Cada validação tem uma regra concreta (não "validar email" — `^[a-z0-9._%+-]+@...`)?
|
|
119
|
+
- [ ] Cada decisão arquitetural tem **justificativa** (não só "escolhemos X")?
|
|
120
|
+
|
|
121
|
+
**Anti-padrão a evitar:** seções como _"implementar autenticação"_ ou _"validar dados"_ — isso vai virar stub. Especifique **qual** algoritmo, **quais** campos, **quais** regras.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
69
125
|
### 3. Salvar e aguardar aprovação humana
|
|
70
126
|
|
|
71
127
|
Salve `DARE/BLUEPRINT.md` e informe:
|
|
@@ -65,6 +65,47 @@ tasks:
|
|
|
65
65
|
- Cadeia linear é antipattern
|
|
66
66
|
- `complexity` honesta
|
|
67
67
|
|
|
68
|
+
### 3.1 ANTI-STUB CONTRACT (inegociável)
|
|
69
|
+
|
|
70
|
+
> Tasks geradas com `subtask_prompt` ou spec genéricos forçam o agente a inventar — e ele vai produzir mock, stub ou esqueleto. **Não é negociável**. O comando `dare review <task-id>` (v2.17+) detecta isso e marca a task como FAILED.
|
|
71
|
+
|
|
72
|
+
Cada `subtask_prompt` e `EXECUTION/task-<id>.md` deve atender este contrato:
|
|
73
|
+
|
|
74
|
+
**O `subtask_prompt` deve ser auto-suficiente**
|
|
75
|
+
|
|
76
|
+
O subagente recebe **apenas** o `subtask_prompt` + snippets de 2000 chars dos pais. Tudo que ele precisa para implementar **sem inventar** deve estar ali ou na `spec_file`. Inclua:
|
|
77
|
+
|
|
78
|
+
- Caminho exato dos arquivos a criar/modificar
|
|
79
|
+
- Assinaturas exatas das funções/endpoints (`fn name(params: T) -> R`)
|
|
80
|
+
- Schema de request/response com tipos
|
|
81
|
+
- Validações específicas (não "validar input" — `email: regex /^.../`, `senha: ≥ 8 chars + 1 maiúscula + 1 dígito`)
|
|
82
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
83
|
+
- Lista de testes esperados com nome + comportamento
|
|
84
|
+
|
|
85
|
+
**A `spec_file` (`EXECUTION/task-<id>.md`) deve ter Definition of Done anti-stub:**
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
## Definition of Done (ANTI-STUB)
|
|
89
|
+
|
|
90
|
+
- [ ] Nenhum `TODO`, `FIXME`, `XXX` ou `HACK` em arquivos modificados
|
|
91
|
+
- [ ] Nenhuma função vazia (`fn x() {}`, `def x(): pass`, `function x() {}`)
|
|
92
|
+
- [ ] Nenhum `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `NotImplementedError`
|
|
93
|
+
- [ ] Nenhum `return null` / `return undefined` / `return {}` como única statement de função pública
|
|
94
|
+
- [ ] Mocks **somente** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/` — NUNCA em código de produção
|
|
95
|
+
- [ ] Todos os endpoints declarados na seção 3 retornam dados reais (não fixos / hardcoded)
|
|
96
|
+
- [ ] Cada validação da spec produz erro real com status code correto (testado)
|
|
97
|
+
- [ ] Cada edge case da spec tem teste unitário ou integração demonstrando comportamento
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Verificação automatizável:** o agente vai rodar `dare review <id>` antes de marcar DONE. Se a review falhar, a task volta para revisão.
|
|
101
|
+
|
|
102
|
+
**Sinais de spec rasa** (auto-validar antes de salvar):
|
|
103
|
+
|
|
104
|
+
- ❌ "Implementar X" — sem assinatura, sem retorno, sem validações
|
|
105
|
+
- ❌ "Tratar erros adequadamente" — quais erros? como? que código?
|
|
106
|
+
- ❌ "Adicionar validações" — quais regras?
|
|
107
|
+
- ✅ "Implementar `POST /auth/login` retornando `{ token: string, refresh: string }` com 200 se credenciais válidas, 401 se inválidas, 429 se rate limit"
|
|
108
|
+
|
|
68
109
|
### 4. Validar consistência com `EXECUTION/task-*.md`
|
|
69
110
|
|
|
70
111
|
Se uma spec existe em `DARE/EXECUTION/task-<id>.md`:
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Comando: /dare-refine
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
|
|
5
|
+
Analisa a complexidade de uma task e, quando alta, **quebra em sub-tasks menores** com escopo bem delimitado. Pode ser chamada:
|
|
6
|
+
|
|
7
|
+
- Automaticamente pela skill `dare-tasks` logo após gerar o DAG (para cada task ≥ MED)
|
|
8
|
+
- Manualmente pelo dev: `/dare-refine task-034`
|
|
9
|
+
- Após mudança de escopo: quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
10
|
+
|
|
11
|
+
A camada determinística (heurística de complexidade) já é feita pelo CLI: `dare refine <id>`. Este comando adiciona a camada **semântica** — você lê a spec, decide se a quebra é necessária e, se for, produz sub-tasks coerentes.
|
|
12
|
+
|
|
13
|
+
## Quando rodar
|
|
14
|
+
|
|
15
|
+
- Logo após `/dare-tasks` para cada task com complexity HIGH no `dare-dag.yaml`
|
|
16
|
+
- Quando o dev pede explicitamente: `/dare-refine task-034`
|
|
17
|
+
- Quando você gerou uma task e ela "te parece grande" mesmo marcada MED — confie no instinto
|
|
18
|
+
|
|
19
|
+
## Como executar
|
|
20
|
+
|
|
21
|
+
### 1. Validar argumento
|
|
22
|
+
|
|
23
|
+
`$ARGUMENTS` deve ter o `task-id`. Se vazio, peça.
|
|
24
|
+
|
|
25
|
+
### 2. Rodar a camada determinística
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
dare refine $ARGUMENTS --split --format json > .dare/refine-$ARGUMENTS.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Esse JSON traz:
|
|
32
|
+
- `report.score` e `report.level` (LOW/MED/HIGH/CRITICAL)
|
|
33
|
+
- `report.signals` — explica por que pontuou alto/baixo
|
|
34
|
+
- `report.recommendsSplit` — true se HIGH ou CRITICAL
|
|
35
|
+
- `proposal.subtasks` — quebra inicial baseada em diretórios (chute coarse)
|
|
36
|
+
|
|
37
|
+
### 3. Decidir se vale quebrar
|
|
38
|
+
|
|
39
|
+
Critérios para **quebrar**:
|
|
40
|
+
|
|
41
|
+
- ✅ `recommendsSplit: true` da heurística (HIGH/CRITICAL)
|
|
42
|
+
- ✅ Mais de 6 arquivos a criar/modificar
|
|
43
|
+
- ✅ Mistura responsabilidades fortes (ex.: cria modelo + escreve controller + escreve teste + faz migration — split por camada)
|
|
44
|
+
- ✅ Toca código que outra task ainda não criou (deveria ser depois)
|
|
45
|
+
- ✅ Inclui refactor + feature nova juntos
|
|
46
|
+
- ✅ Tem keyword "pesada" (refactor, migrate, integrate) E score MED+
|
|
47
|
+
|
|
48
|
+
Critérios para **manter inteira**:
|
|
49
|
+
|
|
50
|
+
- ✅ Score LOW e até MED
|
|
51
|
+
- ✅ Todos os arquivos pertencem ao mesmo módulo/feature
|
|
52
|
+
- ✅ Cabe em uma conversa única do agente (15–60 min de trabalho efetivo)
|
|
53
|
+
|
|
54
|
+
### 4. Se decidir quebrar — produzir sub-tasks coerentes
|
|
55
|
+
|
|
56
|
+
Não use a `proposal.subtasks` da CLI sem revisão — ela agrupa por diretório, o que nem sempre faz sentido semantico. **Reagrupe por responsabilidade**:
|
|
57
|
+
|
|
58
|
+
| Eixo de split | Quando aplicar |
|
|
59
|
+
|---|---|
|
|
60
|
+
| **Por camada** | Modelo / Controller / Service / Test ficam em tasks separadas se cada um é grande |
|
|
61
|
+
| **Por endpoint** | Task original tinha 4 endpoints REST → 4 sub-tasks de 1 endpoint cada |
|
|
62
|
+
| **Por feature** | Auth tinha "register + login + refresh + logout" → split por verbo |
|
|
63
|
+
| **Refactor + feature** | Quebra em "1. refactor X para preparar terreno" + "2. adiciona feature Y em cima" |
|
|
64
|
+
| **Migration + código** | "1. migration + seeds" + "2. código que usa o novo schema" |
|
|
65
|
+
|
|
66
|
+
Cada sub-task deve:
|
|
67
|
+
|
|
68
|
+
- Ter `subtask_prompt` auto-suficiente (assinaturas exatas, validações, edge cases — o Anti-Stub Contract aplica)
|
|
69
|
+
- Ter spec_file própria em `DARE/EXECUTION/<sub-id>.md`
|
|
70
|
+
- Ter `depends_on` mínimo mas correto (sub-tasks da mesma família geralmente dependem em ordem)
|
|
71
|
+
- Ter complexity honesta — se a sub ainda ficar HIGH, quebra de novo
|
|
72
|
+
|
|
73
|
+
### 5. Emitir verdito + plano
|
|
74
|
+
|
|
75
|
+
Salve em `.dare/refine-verdict-$ARGUMENTS.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"manageable": false,
|
|
80
|
+
"reasons": [
|
|
81
|
+
"Score 18 (HIGH) — 7 endpoints + migration + 12 testes no mesmo escopo",
|
|
82
|
+
"Mistura refactor de service layer com novos endpoints"
|
|
83
|
+
],
|
|
84
|
+
"proposedSubtasks": [
|
|
85
|
+
{
|
|
86
|
+
"id": "task-034a",
|
|
87
|
+
"title": "Refactor UserService para suportar profile_settings",
|
|
88
|
+
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
89
|
+
"rationale": "Refactor isolado antes da feature — gates passam sem mexer em controllers",
|
|
90
|
+
"estimatedLevel": "MED"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "task-034b",
|
|
94
|
+
"title": "Endpoints GET/PATCH /users/me/profile",
|
|
95
|
+
"files": ["src/controllers/profile.ts", "tests/controllers/profile.test.ts"],
|
|
96
|
+
"rationale": "Endpoints novos consumindo o serviço refatorado",
|
|
97
|
+
"estimatedLevel": "MED"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Se a task **é** manuseável (não precisa quebrar):
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"manageable": true,
|
|
108
|
+
"reasons": ["Score 7 (MED), 4 arquivos no mesmo módulo, 6 testes — cabe em uma conversa"]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 6. Aplicar o split
|
|
113
|
+
|
|
114
|
+
Se quebrou:
|
|
115
|
+
|
|
116
|
+
1. **Edite** `DARE/dare-dag.yaml` substituindo a task original pelas sub-tasks
|
|
117
|
+
2. **Crie** as specs novas em `DARE/EXECUTION/<sub-id>.md` (use `templates/TASK-SPEC-template.md` — seguindo o Anti-Stub Contract!)
|
|
118
|
+
3. **Atualize** `DARE/TASKS.md` (visão humana) refletindo a quebra
|
|
119
|
+
4. **Regenere** o Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
120
|
+
5. **Marque** a task original como SPLIT (não deletar — preservar histórico) ou remover e referenciar no header das sub-tasks
|
|
121
|
+
|
|
122
|
+
### 7. Mensagem ao usuário
|
|
123
|
+
|
|
124
|
+
Se manteve inteira:
|
|
125
|
+
> ✅ Task `$ARGUMENTS` está bem-dimensionada (score X, level Y). Sem split necessário.
|
|
126
|
+
|
|
127
|
+
Se quebrou:
|
|
128
|
+
> 🪓 Task `$ARGUMENTS` quebrada em N sub-task(s):
|
|
129
|
+
> - `<id>a`: <título>
|
|
130
|
+
> - `<id>b`: <título>
|
|
131
|
+
> ...
|
|
132
|
+
>
|
|
133
|
+
> Specs criadas em `DARE/EXECUTION/`. Revise antes de executar:
|
|
134
|
+
> ```bash
|
|
135
|
+
> dare validate # verifica DAG
|
|
136
|
+
> dare dag viz # confirma grafo
|
|
137
|
+
> dare execute --next # roda a primeira sub-task pronta
|
|
138
|
+
> ```
|
|
139
|
+
|
|
140
|
+
## Regras inegociáveis
|
|
141
|
+
|
|
142
|
+
- **Não quebre tasks LOW** — overhead não vale a pena
|
|
143
|
+
- **Não invente dependências** — sub-tasks da mesma família frequentemente são sequenciais, não falsamente paralelas
|
|
144
|
+
- **Cada sub-task precisa ser independentemente testável** — se você precisa rodar A para testar B, A precisa ser parent de B no DAG
|
|
145
|
+
- **Anti-Stub Contract aplica em cada sub-task** — não relaxa critérios só porque é menor
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Comando: /dare-review
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
|
|
5
|
+
Audita uma task **implementada** cruzando a spec (`DARE/EXECUTION/<id>.md`) com os arquivos reais que ela tocou. Detecta stubs, mocks fora de testes, funções vazias, TODOs, retorno-fantasma — **e** valida critério-a-critério se a implementação satisfaz o que a spec prometeu.
|
|
6
|
+
|
|
7
|
+
Esta é a camada **semântica** do review. A camada estática (regex / patterns) já é feita automaticamente pelo CLI quando você roda `dare review <task-id>`. Este comando combina as duas: rode a estática via CLI, gere um verdito semântico aqui, e produza um relatório fundido.
|
|
8
|
+
|
|
9
|
+
## Quando rodar
|
|
10
|
+
|
|
11
|
+
- Antes de marcar uma task como DONE (gate obrigatório no Definition of Done do TASK-SPEC)
|
|
12
|
+
- Quando o `dare review <id>` estático passa mas você quer validação adicional contra a spec
|
|
13
|
+
- Quando o dev pede revisão manual: `/dare-review task-034`
|
|
14
|
+
|
|
15
|
+
## Como executar
|
|
16
|
+
|
|
17
|
+
### 1. Validar argumento
|
|
18
|
+
|
|
19
|
+
`$ARGUMENTS` deve conter o `task-id` (ex.: `task-034`). Se vazio, peça.
|
|
20
|
+
|
|
21
|
+
### 2. Rodar a camada estática primeiro
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
dare review $ARGUMENTS --format json > .dare/review-static-$ARGUMENTS.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Leia esse JSON. Se já houver erros estáticos, **reporte-os primeiro** e pergunte se quer prosseguir com a análise semântica mesmo assim (geralmente não vale — corrige os erros estáticos antes).
|
|
28
|
+
|
|
29
|
+
### 3. Carregar contexto
|
|
30
|
+
|
|
31
|
+
- `DARE/EXECUTION/$ARGUMENTS.md` — spec da task
|
|
32
|
+
- Cada arquivo listado na seção 3 da spec ("ARQUIVOS A CRIAR / MODIFICAR")
|
|
33
|
+
- `DARE/BLUEPRINT.md` — contratos de API / modelos referenciados
|
|
34
|
+
|
|
35
|
+
### 4. Auditoria critério-a-critério
|
|
36
|
+
|
|
37
|
+
Para **cada** item nas seções abaixo da spec, marque ✅ / ❌:
|
|
38
|
+
|
|
39
|
+
#### 4.1 Objetivo (seção 1)
|
|
40
|
+
A implementação atinge o estado observável que a seção 1 promete? Encontre **evidência concreta** (arquivo + linha) ou marque como não atendido.
|
|
41
|
+
|
|
42
|
+
#### 4.2 Arquivos a criar / modificar (seção 3)
|
|
43
|
+
- Todos os arquivos da tabela existem com o conteúdo descrito?
|
|
44
|
+
- Há arquivos não listados que deveriam estar lá?
|
|
45
|
+
|
|
46
|
+
#### 4.3 Implementação (seção 4)
|
|
47
|
+
- Cada passo numerado foi executado?
|
|
48
|
+
- Assinaturas exatas correspondem ao que a spec pede?
|
|
49
|
+
- Validações implementadas correspondem às regras descritas (não "valida email" — a regex específica)?
|
|
50
|
+
|
|
51
|
+
#### 4.4 Testes (seção 4, subitem)
|
|
52
|
+
Para cada teste listado:
|
|
53
|
+
- Existe um teste com nome correspondente?
|
|
54
|
+
- O teste tem **assertions reais** que validariam o comportamento (não `expect(true).toBe(true)`)?
|
|
55
|
+
- Edge cases enumerados têm cobertura?
|
|
56
|
+
|
|
57
|
+
#### 4.5 Segurança (seção 5)
|
|
58
|
+
- Input validation cobre o que a spec lista?
|
|
59
|
+
- Não há secrets/tokens hardcoded?
|
|
60
|
+
- SQL/Command injection mitigado via ORM / prepared statements?
|
|
61
|
+
|
|
62
|
+
#### 4.6 Padrões Proibidos (seção 7 — ANTI-STUB)
|
|
63
|
+
A camada estática já checou. **Não duplique** — só anote se você encontrar algo que o regex não pegaria (ex.: dados hardcoded que parecem reais mas vêm de uma constante embutida no controller).
|
|
64
|
+
|
|
65
|
+
### 5. Emitir o verdito semântico
|
|
66
|
+
|
|
67
|
+
Salve em `.dare/review-semantic-$ARGUMENTS.json`:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"passed": true,
|
|
72
|
+
"unmetCriteria": [],
|
|
73
|
+
"notes": "Resumo de 1-3 frases do que foi verificado"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Se algo falhou:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"passed": false,
|
|
82
|
+
"unmetCriteria": [
|
|
83
|
+
"Seção 4.3: validação de senha não implementa regex de força (≥8 chars + maiúscula + dígito)",
|
|
84
|
+
"Seção 4.4: teste de edge case 'email duplicado' não existe"
|
|
85
|
+
],
|
|
86
|
+
"notes": "2 critérios não atendidos em src/auth/register.ts e tests/auth.test.ts"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 6. Rodar o review fundido
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
dare review $ARGUMENTS --from-agent .dare/review-semantic-$ARGUMENTS.json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
O CLI vai fundir estática + semântica e exibir o relatório final. Exit code 0 = task pode ir para DONE; exit code 1 = não pode.
|
|
97
|
+
|
|
98
|
+
### 7. Mensagem final ao usuário
|
|
99
|
+
|
|
100
|
+
Se passou:
|
|
101
|
+
> ✅ Task `$ARGUMENTS` aprovada na review. Pode marcar como DONE: `dare execute --complete $ARGUMENTS`
|
|
102
|
+
|
|
103
|
+
Se falhou:
|
|
104
|
+
> ❌ Task `$ARGUMENTS` não passou na review. Itens a corrigir:
|
|
105
|
+
> [lista de unmetCriteria + violations estáticas]
|
|
106
|
+
>
|
|
107
|
+
> Após corrigir, rode `/dare-review $ARGUMENTS` novamente.
|
|
108
|
+
|
|
109
|
+
## Regras inegociáveis
|
|
110
|
+
|
|
111
|
+
- **Não invente** que algo está implementado se você não viu o código. Se um arquivo não existe, isso é `unmetCriteria`.
|
|
112
|
+
- **Não aceite** mocks/stubs em código de produção mesmo que "façam o teste passar". Eles violam o Anti-Stub Contract.
|
|
113
|
+
- **Mocks são OK** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/` — a camada estática já distingue.
|
|
@@ -85,16 +85,57 @@ Execute **todos** antes de marcar a task como DONE. Se qualquer um falhar, leia
|
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
## 7.
|
|
88
|
+
## 7. PADRÕES PROIBIDOS (ANTI-STUB / ANTI-MOCK)
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
> Esta seção é **inegociável**. O comando `dare review` (v2.17+) escaneia o código modificado por esta task e reprova se encontrar qualquer padrão abaixo.
|
|
91
|
+
|
|
92
|
+
### Em código de produção (qualquer arquivo **fora** de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
93
|
+
|
|
94
|
+
- ❌ **TODO / FIXME / XXX / HACK** — qualquer um desses marcadores em comentário
|
|
95
|
+
- ❌ **Função vazia** — `fn x() {}`, `function x() {}`, `def x(): pass`, `def x(): ...`
|
|
96
|
+
- ❌ **Stub explícito** — `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `raise NotImplementedError`
|
|
97
|
+
- ❌ **Retorno-fantasma** — `return null` / `return undefined` / `return {}` / `return []` como **única** statement de função pública declarada nesta task
|
|
98
|
+
- ❌ **Mocks fora de testes** — `jest.fn()`, `sinon.stub()`, `mockReturnValue`, dados hardcoded fingindo ser do banco, fixtures injetadas em controllers/services
|
|
99
|
+
- ❌ **Comentário de placeholder** — `// implement later`, `# placeholder`, `// stub`, `// FIXME implement`
|
|
100
|
+
|
|
101
|
+
### Mocks são permitidos APENAS em
|
|
102
|
+
|
|
103
|
+
- Arquivos de teste (`*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
104
|
+
- Seeds / fixtures dentro de `database/seeders/`, `tests/fixtures/`
|
|
105
|
+
- Helpers explicitamente marcados como auxiliares de teste
|
|
106
|
+
|
|
107
|
+
### Verificação automática
|
|
108
|
+
|
|
109
|
+
Antes de marcar a task como DONE, rode:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
dare review <task-id>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Output esperado:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✅ task-XYZ: nenhum padrão proibido detectado em N arquivos modificados.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Se a review falhar, a task **não pode** ir para DONE — corrija os achados e re-rode.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 8. CRITÉRIOS DE DONE
|
|
126
|
+
|
|
127
|
+
- [ ] Todos os 4 validation gates passaram sem erros (build + test + lint + audit)
|
|
128
|
+
- [ ] Testes cobrem caminho feliz + erros enumerados + edge cases da seção 4
|
|
92
129
|
- [ ] Considerações de segurança da seção 5 todas checadas
|
|
93
130
|
- [ ] Arquivos listados na seção 3 criados/modificados conforme spec
|
|
131
|
+
- [ ] **`dare review <task-id>` passou** (seção 7 — sem stubs, mocks, TODOs)
|
|
132
|
+
- [ ] Cada validação declarada na spec tem teste demonstrando o erro real (não placeholder)
|
|
133
|
+
- [ ] Cada edge case enumerado tem teste cobrindo
|
|
134
|
+
- [ ] Endpoints retornam dados reais do banco/service, não hardcoded
|
|
94
135
|
- [ ] `DARE/TASKS.md` atualizado com status `DONE`
|
|
95
136
|
|
|
96
137
|
---
|
|
97
138
|
|
|
98
|
-
##
|
|
139
|
+
## 9. PRÓXIMA TASK SUGERIDA
|
|
99
140
|
|
|
100
141
|
`[task-id]` — [título] _(desbloqueada após conclusão desta task)_
|
|
@@ -34,6 +34,51 @@ Avança o DARE para a fase Architect: lê `DARE/DESIGN.md` aprovado e gera **som
|
|
|
34
34
|
- **Estratégia de Deploy** — por ambiente
|
|
35
35
|
- **Checklist de Aprovação** — checkboxes para revisão humana
|
|
36
36
|
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### 🚫 ANTI-STUB CONTRACT (regra inegociável)
|
|
40
|
+
|
|
41
|
+
> **Por que existe esta seção:** o `/generate-tasks` que vem depois usa este Blueprint como **única fonte de verdade**. Se um endpoint, função ou regra ficar genérico aqui, o agente que implementar a task **será forçado a inventar** — e vai produzir mocks, stubs e esqueletos para "preencher o vazio". Detalhe agora.
|
|
42
|
+
>
|
|
43
|
+
> Tasks que produzem mock/stub/skeleton **falham** no `dare review` (v2.17+) e bloqueiam o `dare execute --complete`.
|
|
44
|
+
|
|
45
|
+
Para **cada** endpoint, função pública, evento ou job declarado no Blueprint, especifique de forma **executável**:
|
|
46
|
+
|
|
47
|
+
**Endpoints HTTP/RPC:**
|
|
48
|
+
- Assinatura completa (método, path, headers, content-type)
|
|
49
|
+
- Request schema (campos, tipos, restrições, opcionalidade)
|
|
50
|
+
- Response schema **por status code** (2xx, 4xx, 5xx)
|
|
51
|
+
- Validações server-side (lista exaustiva — `email único`, `senha ≥ 8 chars + maiúscula + dígito`)
|
|
52
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
53
|
+
- Side effects (tabelas/filas/caches/emails tocados — em ordem)
|
|
54
|
+
- Exemplo concreto (payload real, response real — não placeholder)
|
|
55
|
+
|
|
56
|
+
**Funções de domínio / services:**
|
|
57
|
+
- Assinatura tipada (`fn name(args: Types) -> ReturnType`)
|
|
58
|
+
- Pré-condições e pós-condições verificáveis
|
|
59
|
+
- Estados de erro com tipo de exceção esperado
|
|
60
|
+
- Comportamento em concorrência (idempotência, locking, retry)
|
|
61
|
+
|
|
62
|
+
**Jobs / event handlers / workers:**
|
|
63
|
+
- Trigger (evento, cron, fila — nome canônico)
|
|
64
|
+
- Payload schema tipado
|
|
65
|
+
- Retry policy (backoff, max attempts, DLQ)
|
|
66
|
+
- Idempotência (chave + estratégia)
|
|
67
|
+
|
|
68
|
+
**Modelos de dados:**
|
|
69
|
+
- Cada campo: tipo, nullable, default, constraints (unique, fk, check), índices
|
|
70
|
+
- Triggers / hooks (soft-delete, audit, encryption-at-rest)
|
|
71
|
+
|
|
72
|
+
**Critério de "Blueprint detalhado o suficiente"** (auto-validação antes de salvar):
|
|
73
|
+
|
|
74
|
+
- [ ] Para cada endpoint, um humano consegue escrever request/response sem perguntar?
|
|
75
|
+
- [ ] Para cada função pública, está claro o que retorna em todos os caminhos (sucesso + erros enumerados)?
|
|
76
|
+
- [ ] Edge cases enumerados explicitamente — não "tratar edge cases"?
|
|
77
|
+
- [ ] Cada validação tem regra concreta — não só "validar email"?
|
|
78
|
+
- [ ] Cada decisão arquitetural tem **justificativa**?
|
|
79
|
+
|
|
80
|
+
**Anti-padrão a evitar:** seções como _"implementar autenticação"_ ou _"validar dados"_ — isso vira stub. Especifique algoritmo, campos, regras.
|
|
81
|
+
|
|
37
82
|
4. **Salve `DARE/BLUEPRINT.md`** e informe:
|
|
38
83
|
|
|
39
84
|
_"Blueprint gerado. Revise a arquitetura, os contratos de API e os critérios de DONE de cada fase. Quando aprovado, execute `/generate-tasks` para gerar o DAG e as specs de execução."_
|
|
@@ -112,6 +112,48 @@ O `subtask_prompt` no YAML pode referenciar a spec via
|
|
|
112
112
|
`spec_file: EXECUTION/task-<id>.md` para que o subagente leia a spec na hora
|
|
113
113
|
de executar.
|
|
114
114
|
|
|
115
|
+
### 5.1 ANTI-STUB CONTRACT (inegociável)
|
|
116
|
+
|
|
117
|
+
> Tasks geradas com `subtask_prompt` ou spec genéricos forçam o agente a inventar — e ele vai produzir mock, stub ou esqueleto. **Não é negociável**. O comando `dare review <task-id>` (v2.17+) detecta isso e marca a task como FAILED.
|
|
118
|
+
|
|
119
|
+
Cada `subtask_prompt` e `EXECUTION/task-<id>.md` deve atender este contrato:
|
|
120
|
+
|
|
121
|
+
**O `subtask_prompt` deve ser auto-suficiente**
|
|
122
|
+
|
|
123
|
+
O subagente recebe **apenas** o `subtask_prompt` + snippets de 2000 chars dos pais. Tudo que ele precisa para implementar **sem inventar** deve estar ali ou na `spec_file`. Inclua:
|
|
124
|
+
|
|
125
|
+
- Caminho exato dos arquivos a criar/modificar
|
|
126
|
+
- Assinaturas exatas das funções/endpoints (`fn name(params: T) -> R`)
|
|
127
|
+
- Schema de request/response com tipos
|
|
128
|
+
- Validações específicas (não "validar input" — `email: regex /^.../`, `senha: ≥ 8 chars + 1 maiúscula + 1 dígito`)
|
|
129
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
130
|
+
- Lista de testes esperados com nome + comportamento (`should_reject_duplicate_email_with_409`)
|
|
131
|
+
|
|
132
|
+
**A `spec_file` (`EXECUTION/task-<id>.md`) deve ter Definition of Done anti-stub:**
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
## Definition of Done (ANTI-STUB)
|
|
136
|
+
|
|
137
|
+
- [ ] Nenhum `TODO`, `FIXME`, `XXX` ou `HACK` em arquivos modificados
|
|
138
|
+
- [ ] Nenhuma função vazia (`fn x() {}`, `def x(): pass`, `function x() {}`)
|
|
139
|
+
- [ ] Nenhum `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `NotImplementedError`
|
|
140
|
+
- [ ] Nenhum `return null` / `return undefined` / `return {}` como única statement de função pública
|
|
141
|
+
- [ ] Mocks **somente** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/` — NUNCA em código de produção
|
|
142
|
+
- [ ] Todos os endpoints declarados na seção 3 retornam dados reais (não fixos / hardcoded)
|
|
143
|
+
- [ ] Cada validação da spec produz erro real com status code correto (testado)
|
|
144
|
+
- [ ] Cada edge case da spec tem teste unitário ou integração demonstrando comportamento
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Verificação automatizável:** o agente que executar a task vai rodar `dare review <id>` antes de marcar DONE. Se a review falhar, a task volta para revisão.
|
|
148
|
+
|
|
149
|
+
**Sinais de spec rasa** (auto-validar antes de salvar):
|
|
150
|
+
|
|
151
|
+
- ❌ "Implementar X" — sem assinatura, sem retorno, sem validações
|
|
152
|
+
- ❌ "Tratar erros adequadamente" — quais erros? como? que código?
|
|
153
|
+
- ❌ "Adicionar validações" — quais regras?
|
|
154
|
+
- ❌ Arquivos listados sem dizer **o que cada um contém**
|
|
155
|
+
- ✅ "Implementar `POST /auth/login` retornando `{ token: string, refresh: string }` com 200 se credenciais válidas, 401 se inválidas, 429 se rate limit"
|
|
156
|
+
|
|
115
157
|
### 6. Validar consistência dos 3 artefatos
|
|
116
158
|
|
|
117
159
|
- Mesmos `id`s em `TASKS.md`, `dare-dag.yaml` e `EXECUTION/task-*.md`.
|