@dewtech/dare-cli 2.15.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 +659 -561
- 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/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +27 -9
- package/dist/commands/dag.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/excalidraw-renderer.d.ts +79 -0
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -0
- package/dist/utils/excalidraw-renderer.js +188 -0
- package/dist/utils/excalidraw-renderer.js.map +1 -0
- package/dist/utils/excalidraw-renderer.test.d.ts +2 -0
- package/dist/utils/excalidraw-renderer.test.d.ts.map +1 -0
- package/dist/utils/excalidraw-renderer.test.js +135 -0
- package/dist/utils/excalidraw-renderer.test.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/stack-bootstrap.js +3 -1
- package/dist/utils/stack-bootstrap.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/DARE-dag-example.yaml +280 -0
- 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-dag-viz.md +197 -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
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Exemplo completo de dare-dag.yaml para o DARE CLI
|
|
2
|
+
#
|
|
3
|
+
# Este arquivo ilustra como estruturar um grafo de tasks (DAG) para o método DARE.
|
|
4
|
+
# Copie e customize para seu projeto.
|
|
5
|
+
#
|
|
6
|
+
# Campos:
|
|
7
|
+
# - name: nome do projeto
|
|
8
|
+
# - version: semântica (versionamento do projeto)
|
|
9
|
+
# - created_at: timestamp
|
|
10
|
+
# - tasks: dicionário de tasks
|
|
11
|
+
#
|
|
12
|
+
# Cada task tem:
|
|
13
|
+
# - name (obrigatório): nome legível da tarefa
|
|
14
|
+
# - complexity (obrigatório): LOW | MEDIUM | HIGH
|
|
15
|
+
# - rank (opcional): ordem no DAG, calculado automaticamente se omitido
|
|
16
|
+
# - depends_on (opcional): lista de task IDs que DEVE completar antes
|
|
17
|
+
# - status (opcional): PENDING | RUNNING | DONE | FAILED
|
|
18
|
+
# - subtask_prompt (opcional): descrição detalhada para o agente executar
|
|
19
|
+
# - blueprint_section (opcional): link para seção em BLUEPRINT.md
|
|
20
|
+
|
|
21
|
+
name: "API de Autenticação com JWT"
|
|
22
|
+
version: "1.0"
|
|
23
|
+
created_at: "2026-05-14T10:30:00Z"
|
|
24
|
+
|
|
25
|
+
# Metadados opcionais
|
|
26
|
+
metadata:
|
|
27
|
+
project_url: "https://github.com/seu-org/seu-projeto"
|
|
28
|
+
team: "Backend Team"
|
|
29
|
+
deadline: "2026-06-30"
|
|
30
|
+
|
|
31
|
+
# ============================
|
|
32
|
+
# TAREFAS (TASKS)
|
|
33
|
+
# ============================
|
|
34
|
+
|
|
35
|
+
tasks:
|
|
36
|
+
# ─────────────────────────────────────────────────────────────
|
|
37
|
+
# RANK 1 — Fundação (sem dependências)
|
|
38
|
+
# Estas tarefas podem rodar em paralelo — nenhuma depende uma da outra
|
|
39
|
+
# ─────────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
task-001:
|
|
42
|
+
name: "Setup Boilerplate"
|
|
43
|
+
complexity: "LOW"
|
|
44
|
+
# rank será calculado como 1 automaticamente (sem deps)
|
|
45
|
+
depends_on: []
|
|
46
|
+
status: "DONE" # ✅ Já completada
|
|
47
|
+
subtask_prompt: |
|
|
48
|
+
Crie estrutura básica Node.js + NestJS:
|
|
49
|
+
- package.json com deps (typescript, express, dotenv)
|
|
50
|
+
- tsconfig.json
|
|
51
|
+
- .gitignore, .env.example
|
|
52
|
+
- scripts: dev, build, test, lint
|
|
53
|
+
blueprint_section: "1. Foundation"
|
|
54
|
+
|
|
55
|
+
task-002:
|
|
56
|
+
name: "Setup Database Schema"
|
|
57
|
+
complexity: "MEDIUM"
|
|
58
|
+
depends_on: []
|
|
59
|
+
status: "DONE" # ✅ Completada
|
|
60
|
+
subtask_prompt: |
|
|
61
|
+
Defina schema no banco de dados:
|
|
62
|
+
- Tabela `users` (id, email, password_hash, created_at, updated_at)
|
|
63
|
+
- Tabela `refresh_tokens` (id, user_id, token_hash, expires_at, revoked_at)
|
|
64
|
+
- Índices em email e token
|
|
65
|
+
- Migrations com Prisma / TypeORM / Knex
|
|
66
|
+
blueprint_section: "1. Foundation"
|
|
67
|
+
|
|
68
|
+
# ─────────────────────────────────────────────────────────────
|
|
69
|
+
# RANK 2 — Core (depende de Rank 1)
|
|
70
|
+
# task-003 depende de task-001 (boilerplate)
|
|
71
|
+
# task-004 depende de task-002 (schema)
|
|
72
|
+
# Podem rodar em paralelo uma com a outra
|
|
73
|
+
# ─────────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
task-003:
|
|
76
|
+
name: "Implement JWT Auth Middleware"
|
|
77
|
+
complexity: "HIGH"
|
|
78
|
+
depends_on:
|
|
79
|
+
- "task-001" # Precisa do boilerplate
|
|
80
|
+
status: "RUNNING" # ⚙️ Em andamento
|
|
81
|
+
subtask_prompt: |
|
|
82
|
+
Crie middleware de autenticação:
|
|
83
|
+
- Gere JWT (HS256 ou RS256) com payload (user_id, iat, exp)
|
|
84
|
+
- Middleware que valida JWT em cada request
|
|
85
|
+
- Extraia user_id do token e injete em req.user
|
|
86
|
+
- Trate expiração, inválido, ausente
|
|
87
|
+
- Logs de tentativas falhadas
|
|
88
|
+
blueprint_section: "2. Authentication Core"
|
|
89
|
+
|
|
90
|
+
task-004:
|
|
91
|
+
name: "Implement Refresh Token Flow"
|
|
92
|
+
complexity: "MEDIUM"
|
|
93
|
+
depends_on:
|
|
94
|
+
- "task-001", # Precisa do boilerplate
|
|
95
|
+
- "task-002" # Precisa do schema
|
|
96
|
+
status: "PENDING" # ⏳ Não iniciada
|
|
97
|
+
subtask_prompt: |
|
|
98
|
+
Implemente rotação de refresh tokens:
|
|
99
|
+
- Endpoint POST /auth/refresh que aceita refresh_token
|
|
100
|
+
- Valide refresh_token contra banco de dados
|
|
101
|
+
- Gere novo access_token + refresh_token
|
|
102
|
+
- Revogue token antigo no banco
|
|
103
|
+
- Implemente segurança: limite rate, valide origin
|
|
104
|
+
blueprint_section: "2. Authentication Core"
|
|
105
|
+
|
|
106
|
+
# ─────────────────────────────────────────────────────────────
|
|
107
|
+
# RANK 3 — Integração & Testes (depende de Rank 2)
|
|
108
|
+
# task-005 depende de task-003 (middleware)
|
|
109
|
+
# task-006 depende de task-003 e task-004 (ambos cores)
|
|
110
|
+
# ─────────────────────────────────────────────────────────────
|
|
111
|
+
|
|
112
|
+
task-005:
|
|
113
|
+
name: "Add Login & Logout Endpoints"
|
|
114
|
+
complexity: "LOW"
|
|
115
|
+
depends_on:
|
|
116
|
+
- "task-003" # Precisa do middleware JWT
|
|
117
|
+
status: "PENDING" # ⏳ Não iniciada
|
|
118
|
+
subtask_prompt: |
|
|
119
|
+
Crie endpoints de autenticação:
|
|
120
|
+
- POST /auth/login (email, password) → access_token, refresh_token
|
|
121
|
+
- POST /auth/logout (revoga refresh_token)
|
|
122
|
+
- Validação de entrada (email válido, password não vazio)
|
|
123
|
+
- Hash de password com bcrypt/argon2
|
|
124
|
+
- Testes unitários para sucesso e erro
|
|
125
|
+
blueprint_section: "3. API Endpoints"
|
|
126
|
+
|
|
127
|
+
task-006:
|
|
128
|
+
name: "Implement Tests & Security Hardening"
|
|
129
|
+
complexity: "HIGH"
|
|
130
|
+
depends_on:
|
|
131
|
+
- "task-003", # Precisa do middleware
|
|
132
|
+
- "task-004" # Precisa do refresh flow
|
|
133
|
+
status: "PENDING" # ⏳ Não iniciada
|
|
134
|
+
subtask_prompt: |
|
|
135
|
+
Teste segurança e implemente proteções:
|
|
136
|
+
- Testes end-to-end: login → refresh → logout
|
|
137
|
+
- Testes de segurança: expiração, inválido, reuso de token
|
|
138
|
+
- CORS policy (origem permitida)
|
|
139
|
+
- Helmet.js para headers de segurança
|
|
140
|
+
- Rate limiting no /auth/refresh
|
|
141
|
+
- CSP (Content Security Policy)
|
|
142
|
+
- Logs de auditoria (tentativas falhadas)
|
|
143
|
+
blueprint_section: "4. Security & Testing"
|
|
144
|
+
|
|
145
|
+
# ─────────────────────────────────────────────────────────────
|
|
146
|
+
# RANK 4 — Documentação & Deploy (depende de tudo)
|
|
147
|
+
# task-007 depende de toda core (task-005, task-006)
|
|
148
|
+
# ─────────────────────────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
task-007:
|
|
151
|
+
name: "Document API & Prepare Deploy"
|
|
152
|
+
complexity: "LOW"
|
|
153
|
+
depends_on:
|
|
154
|
+
- "task-005", # Precisa endpoints prontos
|
|
155
|
+
- "task-006" # Precisa testes passando
|
|
156
|
+
status: "PENDING" # ⏳ Não iniciada
|
|
157
|
+
subtask_prompt: |
|
|
158
|
+
Documente e prepare deployment:
|
|
159
|
+
- OpenAPI/Swagger documentation
|
|
160
|
+
- README com exemplos de uso (curl/Postman)
|
|
161
|
+
- Environment variables documentation
|
|
162
|
+
- Docker setup (Dockerfile, docker-compose)
|
|
163
|
+
- CI/CD pipeline (GitHub Actions / GitLab CI)
|
|
164
|
+
- Health check endpoint
|
|
165
|
+
blueprint_section: "5. Documentation & Deploy"
|
|
166
|
+
|
|
167
|
+
# ============================
|
|
168
|
+
# EXPLICAÇÃO DO GRAFO
|
|
169
|
+
# ============================
|
|
170
|
+
|
|
171
|
+
# Visualização (Rank = camada):
|
|
172
|
+
#
|
|
173
|
+
# Rank 1 (Fundação — paralelo)
|
|
174
|
+
# ├── task-001 [LOW] ✅
|
|
175
|
+
# └── task-002 [MEDIUM] ✅
|
|
176
|
+
#
|
|
177
|
+
# Rank 2 (Core — paralelo)
|
|
178
|
+
# ├── task-003 [HIGH] ⚙️ (depende: 001)
|
|
179
|
+
# └── task-004 [MEDIUM] ⏳ (depende: 001, 002)
|
|
180
|
+
#
|
|
181
|
+
# Rank 3 (Integração — paralelo)
|
|
182
|
+
# ├── task-005 [LOW] ⏳ (depende: 003)
|
|
183
|
+
# └── task-006 [HIGH] ⏳ (depende: 003, 004)
|
|
184
|
+
#
|
|
185
|
+
# Rank 4 (Documentação)
|
|
186
|
+
# └── task-007 [LOW] ⏳ (depende: 005, 006)
|
|
187
|
+
|
|
188
|
+
# ============================
|
|
189
|
+
# COMO USAR ESTE ARQUIVO
|
|
190
|
+
# ============================
|
|
191
|
+
|
|
192
|
+
# 1. Copie para seu projeto:
|
|
193
|
+
# cp packages/cli/templates/DARE-dag-example.yaml DARE/dare-dag.yaml
|
|
194
|
+
|
|
195
|
+
# 2. Customize:
|
|
196
|
+
# - Substitua nomes das tasks pelo seu projeto
|
|
197
|
+
# - Ajuste complexidade (LOW/MEDIUM/HIGH)
|
|
198
|
+
# - Defina dependências corretas
|
|
199
|
+
# - Atualize blueprint_section se tiver um BLUEPRINT.md
|
|
200
|
+
|
|
201
|
+
# 3. Valide:
|
|
202
|
+
# dare dag validate
|
|
203
|
+
|
|
204
|
+
# 4. Visualize:
|
|
205
|
+
# /dare-dag-viz
|
|
206
|
+
# → Abre em https://excalidraw.com com cores por complexidade
|
|
207
|
+
|
|
208
|
+
# 5. Atualize status conforme avança:
|
|
209
|
+
# task-003:
|
|
210
|
+
# status: "DONE" # Após completar
|
|
211
|
+
|
|
212
|
+
# ============================
|
|
213
|
+
# CONVENÇÕES
|
|
214
|
+
# ============================
|
|
215
|
+
|
|
216
|
+
# Task ID:
|
|
217
|
+
# Formato: task-NNN-slug
|
|
218
|
+
# - NNN = número sequencial (001, 002, ...)
|
|
219
|
+
# - slug = nome legível em kebab-case
|
|
220
|
+
# Exemplos: task-001-setup-boilerplate, task-003-jwt-middleware
|
|
221
|
+
|
|
222
|
+
# Complexidade:
|
|
223
|
+
# - LOW: < 30 min, padrão bem definido
|
|
224
|
+
# - MEDIUM: 2-8 horas, múltiplas decisões
|
|
225
|
+
# - HIGH: 1+ dias, design crítico, risco alto
|
|
226
|
+
|
|
227
|
+
# Status:
|
|
228
|
+
# - PENDING: não iniciada, aguardando
|
|
229
|
+
# - RUNNING: em execução neste momento
|
|
230
|
+
# - DONE: completada com sucesso
|
|
231
|
+
# - FAILED: falhou, requer ajuste
|
|
232
|
+
|
|
233
|
+
# Depends_on:
|
|
234
|
+
# Lista outras tasks que devem completar ANTES desta
|
|
235
|
+
# Sem ciclos permitidos (A→B→A é inválido)
|
|
236
|
+
|
|
237
|
+
# Rank (automático):
|
|
238
|
+
# Calculado como: 1 + max(rank das dependências)
|
|
239
|
+
# Rank 1 = nenhuma dependência
|
|
240
|
+
# Rank N = executa após Rank N-1
|
|
241
|
+
|
|
242
|
+
# ============================
|
|
243
|
+
# INTEGRAÇÃO COM DARE WORKFLOW
|
|
244
|
+
# ============================
|
|
245
|
+
|
|
246
|
+
# Phase 1: DESIGN (você define requisitos)
|
|
247
|
+
# → Cria DARE/DESIGN.md
|
|
248
|
+
#
|
|
249
|
+
# Phase 2: ARCHITECT (Claude Code/Cursor propõe arquitetura)
|
|
250
|
+
# → Cria DARE/BLUEPRINT.md
|
|
251
|
+
# → Você aprova / ajusta
|
|
252
|
+
#
|
|
253
|
+
# Phase 3: REVIEW (Claude Code propõe tasks)
|
|
254
|
+
# → Cria DARE/dare-dag.yaml (este arquivo!)
|
|
255
|
+
# → Você aprova structure
|
|
256
|
+
#
|
|
257
|
+
# Phase 4: EXECUTE (Claude Code implementa)
|
|
258
|
+
# → Roda dare execute --ralph-loop
|
|
259
|
+
# → Testes automáticos (build, test, lint)
|
|
260
|
+
# → Abre PR / commit automático
|
|
261
|
+
|
|
262
|
+
# ============================
|
|
263
|
+
# REFERÊNCIAS
|
|
264
|
+
# ============================
|
|
265
|
+
|
|
266
|
+
# DARE Methodology: https://github.com/dewtech-technologies/dare-method
|
|
267
|
+
# Design Tokens (cores, fonts): docs/DESIGN-TOKENS-EXCALIDRAW.md
|
|
268
|
+
# Visualization: /dare-dag-viz (gera dag-graph.excalidraw)
|
|
269
|
+
# Excalidraw app: https://excalidraw.com
|
|
270
|
+
|
|
271
|
+
# ============================
|
|
272
|
+
# LICENÇA
|
|
273
|
+
# ============================
|
|
274
|
+
|
|
275
|
+
# Este arquivo e o método DARE são AGPL v3.
|
|
276
|
+
# Você é livre para usar, modificar, compartilhar.
|
|
277
|
+
# Contribuições voltam ao projeto.
|
|
278
|
+
#
|
|
279
|
+
# Créditos: Wanderson Leandro (Dewtech Technologies)
|
|
280
|
+
# Inspirações: Ralph Loop (termo original), Excalidraw (ferramenta)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"releases": {
|
|
4
|
+
"2.16.0": {
|
|
5
|
+
"releasedAt": "2026-05-10",
|
|
6
|
+
"summary": "Excalidraw DAG visualization",
|
|
7
|
+
"changelog": "Adiciona renderer Excalidraw para visualizar o DAG (tasks + dependências) em diagrama interativo.",
|
|
8
|
+
"changes": []
|
|
9
|
+
},
|
|
10
|
+
"2.17.0": {
|
|
11
|
+
"releasedAt": "2026-05-16",
|
|
12
|
+
"summary": "dare update + dare review + dare refine + Anti-Stub Contract",
|
|
13
|
+
"changelog": "Release grande, três frentes complementares que resolvem três problemas reais:\n\n## 1. `dare update` — sincronizar projeto com CLI\n\nDev atualiza o CLI globalmente (npm install -g @dewtech/dare-cli@latest) e roda `dare update` em cada projeto pra puxar templates / skills / commands novos — sem mexer em DESIGN, BLUEPRINT, TASKS, dare-dag.yaml. UPDATE-MANIFEST.json declarativo lista changes + migrations por release. Backup automático em `.dare/backup-<version>/`. Detecção de customizações por hash SHA-256 (keep / replace / force). Filtro por IDE configurado.\n\nFlags: `--dry-run`, `--yes`, `--force`, `--target <version>`.\n\n## 2. `dare review` + `dare refine` — Anti-stub gates\n\nProblema: tasks marcadas como DONE com código mockado, stubs, esqueletos de função, TODOs pendentes.\n\n`dare review <task-id>`:\n- Camada estática (regex): TODO/FIXME/XXX/HACK, throw new Error('not implemented'), unimplemented!(), todo!(), NotImplementedError, funções vazias, retorno-fantasma (return null como única statement), mocks fora de testes (jest.fn, vi.mock, sinon.stub, MagicMock), placeholders\n- Camada semântica (opt-in via `--from-agent <verdict.json>`): IDE agent valida critério-a-critério se implementação satisfaz spec\n- Skills `dare-review` (Claude Code), `review-task` (Cursor), `dare-review` (Antigravity) produzem o verdito semântico\n- Gate opt-in no Ralph Loop: `review.onComplete: true` no dare.config.json bloqueia `dare execute --complete` quando review falha\n\n`dare refine <task-id>`:\n- Heurística determinística de complexidade: # arquivos, # funções/endpoints, # testes, # deps, keywords pesadas (refactor/migrate/integrate)\n- Buckets LOW (0-5) / MED (6-12) / HIGH (13-20) / CRITICAL (21+); thresholds configuráveis em `refine.thresholds`\n- `--split` propõe quebra em sub-tasks agrupadas por diretório\n- Skills `dare-refine` (todas IDEs) produzem split semântico (por camada, por endpoint, por feature, refactor-then-feature, migration-then-code)\n\n## 3. Anti-Stub Contract nos prompts de geração\n\nBlueprint e Tasks agora forçam especificação executável: para cada endpoint, função pública, evento ou job — assinatura completa, request/response shape por status code, validações enumeradas, edge cases, side effects, exemplos concretos. TASK-SPEC-template ganha seção 'PADRÕES PROIBIDOS' explícita e Definition of Done anti-mock obrigatório.\n\n## 4. Mudanças de schema em `dare.config.json`\n\n- Campo `version` agora rastreia a release do DARE (antes era placeholder zombie `0.1.0`).\n- Novo objeto `review`: `{ onComplete: false, strict: false }` (opt-in pra projetos legados, on para novos).\n- Novo objeto `refine`: `{ thresholds: { low: 5, med: 12, high: 20 } }`.\n\nMigrações `unify-version-field` e `add-review-refine-defaults` cuidam de projetos pré-2.17 automaticamente.",
|
|
14
|
+
"changes": [
|
|
15
|
+
{
|
|
16
|
+
"type": "modified",
|
|
17
|
+
"path": "dare.config.json#version",
|
|
18
|
+
"description": "Campo `version` agora rastreia a release do DARE (antes era placeholder `0.1.0` zombie)",
|
|
19
|
+
"appliesTo": ["*"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "added",
|
|
23
|
+
"path": "dare.config.json#review",
|
|
24
|
+
"description": "Adiciona objeto `review` ({ onComplete, strict }) em dare.config.json — gate opt-in pré-DONE no Ralph Loop",
|
|
25
|
+
"appliesTo": ["*"]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "added",
|
|
29
|
+
"path": "dare.config.json#refine",
|
|
30
|
+
"description": "Adiciona objeto `refine.thresholds` em dare.config.json para customizar buckets de complexidade",
|
|
31
|
+
"appliesTo": ["*"]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"migrations": [
|
|
35
|
+
{
|
|
36
|
+
"id": "unify-version-field",
|
|
37
|
+
"description": "Migra `dareVersion` → `version` e substitui o placeholder legacy `0.1.0` por `2.16.0` quando necessário",
|
|
38
|
+
"optional": false
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "add-review-refine-defaults",
|
|
42
|
+
"description": "Adiciona `review: { onComplete: false, strict: false }` e `refine: { thresholds: ... }` em projetos pré-2.17 (opt-in — não ativa o gate automaticamente)",
|
|
43
|
+
"optional": false
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -122,34 +122,90 @@ Crie um documento `DARE/BLUEPRINT.md` com a seguinte estrutura:
|
|
|
122
122
|
|
|
123
123
|
## Estrutura de Diretórios
|
|
124
124
|
|
|
125
|
+
> Mantenha esta seção **stack-agnóstica**. Liste os agrupamentos lógicos
|
|
126
|
+
> (domínio, infraestrutura, interfaces, testes, migrations) e use a
|
|
127
|
+
> nomenclatura **idiomática da stack escolhida** no `dare init`. Os exemplos
|
|
128
|
+
> abaixo cobrem as 5 stacks suportadas — use **apenas o bloco da stack do
|
|
129
|
+
> projeto**, não os 5 juntos.
|
|
130
|
+
|
|
131
|
+
<details>
|
|
132
|
+
<summary>Exemplo — Node.js / NestJS</summary>
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
projeto/
|
|
136
|
+
├── src/
|
|
137
|
+
│ ├── auth/
|
|
138
|
+
│ │ ├── auth.controller.ts
|
|
139
|
+
│ │ ├── auth.service.ts
|
|
140
|
+
│ │ ├── auth.module.ts
|
|
141
|
+
│ │ └── dto/{register,login}.dto.ts
|
|
142
|
+
│ ├── users/{users.entity.ts,users.service.ts}
|
|
143
|
+
│ └── main.ts
|
|
144
|
+
├── migrations/{001_users.ts,002_refresh_tokens.ts}
|
|
145
|
+
└── test/auth.e2e-spec.ts
|
|
146
|
+
```
|
|
147
|
+
</details>
|
|
148
|
+
|
|
149
|
+
<details>
|
|
150
|
+
<summary>Exemplo — Rust / Axum</summary>
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
projeto/
|
|
154
|
+
├── src/
|
|
155
|
+
│ ├── domain/{user.rs,refresh_token.rs}
|
|
156
|
+
│ ├── handlers/{register.rs,login.rs,refresh.rs,logout.rs}
|
|
157
|
+
│ ├── middleware/jwt.rs
|
|
158
|
+
│ └── main.rs
|
|
159
|
+
├── migrations/{001_users.sql,002_refresh_tokens.sql}
|
|
160
|
+
└── tests/auth_integration.rs
|
|
161
|
+
```
|
|
162
|
+
</details>
|
|
163
|
+
|
|
164
|
+
<details>
|
|
165
|
+
<summary>Exemplo — Python / FastAPI</summary>
|
|
166
|
+
|
|
125
167
|
```
|
|
126
168
|
projeto/
|
|
127
169
|
├── app/
|
|
128
|
-
│ ├──
|
|
129
|
-
│
|
|
130
|
-
│
|
|
131
|
-
│ ├──
|
|
132
|
-
│
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
│ │ │ ├── RegisterRequest.php
|
|
136
|
-
│ │ │ └── LoginRequest.php
|
|
137
|
-
│ │ └── Resources/
|
|
138
|
-
│ │ └── UserResource.php
|
|
139
|
-
│ ├── Services/
|
|
140
|
-
│ │ └── AuthService.php
|
|
141
|
-
│ └── Exceptions/
|
|
142
|
-
│ └── AuthException.php
|
|
143
|
-
├── database/
|
|
144
|
-
│ └── migrations/
|
|
145
|
-
│ ├── create_users_table.php
|
|
146
|
-
│ └── create_refresh_tokens_table.php
|
|
147
|
-
├── routes/
|
|
148
|
-
│ └── api.php
|
|
149
|
-
└── tests/
|
|
150
|
-
└── Feature/
|
|
151
|
-
└── AuthTest.php
|
|
170
|
+
│ ├── routers/auth.py
|
|
171
|
+
│ ├── models/{user.py,refresh_token.py}
|
|
172
|
+
│ ├── schemas/{register.py,login.py}
|
|
173
|
+
│ ├── services/auth.py
|
|
174
|
+
│ └── main.py
|
|
175
|
+
├── alembic/versions/{001_users.py,002_refresh_tokens.py}
|
|
176
|
+
└── tests/test_auth.py
|
|
152
177
|
```
|
|
178
|
+
</details>
|
|
179
|
+
|
|
180
|
+
<details>
|
|
181
|
+
<summary>Exemplo — PHP / Laravel</summary>
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
projeto/
|
|
185
|
+
├── app/Http/Controllers/AuthController.php
|
|
186
|
+
├── app/Http/Requests/{RegisterRequest,LoginRequest}.php
|
|
187
|
+
├── app/Models/{User,RefreshToken}.php
|
|
188
|
+
├── app/Services/AuthService.php
|
|
189
|
+
├── database/migrations/{create_users,create_refresh_tokens}_table.php
|
|
190
|
+
├── routes/api.php
|
|
191
|
+
└── tests/Feature/AuthTest.php
|
|
192
|
+
```
|
|
193
|
+
</details>
|
|
194
|
+
|
|
195
|
+
<details>
|
|
196
|
+
<summary>Exemplo — Go / Gin</summary>
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
projeto/
|
|
200
|
+
├── cmd/server/main.go
|
|
201
|
+
├── internal/
|
|
202
|
+
│ ├── handlers/{register,login,refresh,logout}.go
|
|
203
|
+
│ ├── models/{user,refresh_token}.go
|
|
204
|
+
│ └── middleware/jwt.go
|
|
205
|
+
├── migrations/{001_users.sql,002_refresh_tokens.sql}
|
|
206
|
+
└── handlers_test.go
|
|
207
|
+
```
|
|
208
|
+
</details>
|
|
153
209
|
|
|
154
210
|
## Plano de Execução
|
|
155
211
|
|
|
@@ -175,26 +231,71 @@ projeto/
|
|
|
175
231
|
|
|
176
232
|
## Comandos de Setup
|
|
177
233
|
|
|
234
|
+
> Liste **somente os comandos da stack do projeto** (definida em
|
|
235
|
+
> `dare init` / `dare.config.json#backend`). Não inclua todos os blocos
|
|
236
|
+
> abaixo — use o que casa com a stack escolhida.
|
|
237
|
+
|
|
238
|
+
<details>
|
|
239
|
+
<summary>Node.js / NestJS</summary>
|
|
240
|
+
|
|
178
241
|
```bash
|
|
179
|
-
|
|
180
|
-
|
|
242
|
+
npm install
|
|
243
|
+
cp .env.example .env
|
|
244
|
+
npm run migration:run
|
|
245
|
+
npm test
|
|
246
|
+
npm run start:dev
|
|
247
|
+
```
|
|
248
|
+
</details>
|
|
249
|
+
|
|
250
|
+
<details>
|
|
251
|
+
<summary>Rust / Axum</summary>
|
|
181
252
|
|
|
182
|
-
|
|
253
|
+
```bash
|
|
254
|
+
cargo build
|
|
183
255
|
cp .env.example .env
|
|
184
|
-
|
|
256
|
+
sqlx migrate run
|
|
257
|
+
cargo test
|
|
258
|
+
cargo run
|
|
259
|
+
```
|
|
260
|
+
</details>
|
|
185
261
|
|
|
186
|
-
|
|
187
|
-
|
|
262
|
+
<details>
|
|
263
|
+
<summary>Python / FastAPI</summary>
|
|
188
264
|
|
|
189
|
-
|
|
190
|
-
|
|
265
|
+
```bash
|
|
266
|
+
python -m venv .venv && source .venv/bin/activate
|
|
267
|
+
pip install -r requirements.txt
|
|
268
|
+
cp .env.example .env
|
|
269
|
+
alembic upgrade head
|
|
270
|
+
pytest
|
|
271
|
+
uvicorn app.main:app --reload
|
|
272
|
+
```
|
|
273
|
+
</details>
|
|
191
274
|
|
|
192
|
-
|
|
193
|
-
|
|
275
|
+
<details>
|
|
276
|
+
<summary>PHP / Laravel</summary>
|
|
194
277
|
|
|
195
|
-
|
|
278
|
+
```bash
|
|
279
|
+
composer install
|
|
280
|
+
cp .env.example .env
|
|
281
|
+
php artisan key:generate
|
|
282
|
+
php artisan migrate
|
|
283
|
+
php artisan test
|
|
196
284
|
php artisan serve
|
|
197
285
|
```
|
|
286
|
+
</details>
|
|
287
|
+
|
|
288
|
+
<details>
|
|
289
|
+
<summary>Go / Gin</summary>
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
go mod download
|
|
293
|
+
cp .env.example .env
|
|
294
|
+
migrate -path ./migrations -database "$DATABASE_URL" up
|
|
295
|
+
go test ./...
|
|
296
|
+
go run ./cmd/server
|
|
297
|
+
```
|
|
298
|
+
</details>
|
|
198
299
|
|
|
199
300
|
## Próximas Etapas
|
|
200
301
|
1. Revisar e aprovar este Blueprint
|
|
@@ -202,7 +303,50 @@ php artisan serve
|
|
|
202
303
|
3. Continuar com o Método DARE
|
|
203
304
|
```
|
|
204
305
|
|
|
205
|
-
### Passo 5:
|
|
306
|
+
### Passo 5: Aplicar ANTI-STUB CONTRACT (regra inegociável)
|
|
307
|
+
|
|
308
|
+
> **Por que existe esta regra:** a skill `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.
|
|
309
|
+
>
|
|
310
|
+
> Tasks que produzem mock/stub/skeleton **falham** no `dare review` (v2.17+) e bloqueiam o `dare execute --complete`.
|
|
311
|
+
|
|
312
|
+
Para **cada** endpoint, função pública, evento ou job declarado no Blueprint, especifique de forma **executável**:
|
|
313
|
+
|
|
314
|
+
**Endpoints HTTP/RPC:**
|
|
315
|
+
- Assinatura completa (método, path, headers obrigatórios, content-type)
|
|
316
|
+
- Request schema (todos os campos com tipo, restrições, opcionalidade)
|
|
317
|
+
- Response schema **por status code** (2xx, 4xx, 5xx — não só "200 OK")
|
|
318
|
+
- Validações server-side (lista exaustiva: `email único`, `senha ≥ 8 chars + maiúscula + dígito`)
|
|
319
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
320
|
+
- Side effects (tabelas/filas/caches/emails tocados, em ordem)
|
|
321
|
+
- Exemplo concreto (payload real, response real — não placeholder)
|
|
322
|
+
|
|
323
|
+
**Funções de domínio / services:**
|
|
324
|
+
- Assinatura tipada (`fn name(args: Types) -> ReturnType`)
|
|
325
|
+
- Pré-condições e pós-condições verificáveis
|
|
326
|
+
- Estados de erro com tipo de exceção/Result esperado
|
|
327
|
+
- Comportamento em concorrência (idempotência, locking, retry)
|
|
328
|
+
|
|
329
|
+
**Jobs / event handlers / workers:**
|
|
330
|
+
- Trigger (evento/cron/fila — nome canônico)
|
|
331
|
+
- Payload schema tipado
|
|
332
|
+
- Retry policy (backoff, max attempts, DLQ)
|
|
333
|
+
- Idempotência (chave + estratégia)
|
|
334
|
+
|
|
335
|
+
**Modelos de dados:**
|
|
336
|
+
- Cada campo com tipo, nullable, default, constraints (unique, fk, check), índices
|
|
337
|
+
- Triggers ou hooks (soft-delete, audit, encryption-at-rest)
|
|
338
|
+
|
|
339
|
+
**Critério "Blueprint detalhado o suficiente"** (auto-validação antes de salvar):
|
|
340
|
+
|
|
341
|
+
- [ ] Para cada endpoint, um humano não-familiarizado consegue escrever request/response sem perguntar nada?
|
|
342
|
+
- [ ] Para cada função pública, está claro **o que retorna** em todos os caminhos (sucesso + erros enumerados)?
|
|
343
|
+
- [ ] Edge cases foram **enumerados** ou só listados como "tratar edge cases"?
|
|
344
|
+
- [ ] Cada validação tem uma regra concreta (não só "validar email")?
|
|
345
|
+
- [ ] Cada decisão arquitetural tem **justificativa** (não só "escolhemos X")?
|
|
346
|
+
|
|
347
|
+
**Anti-padrão a evitar:** seções como _"implementar autenticação"_ ou _"validar dados"_ — isso vira stub. Especifique algoritmo, campos, regras.
|
|
348
|
+
|
|
349
|
+
### Passo 6: Pedir Aprovação
|
|
206
350
|
Após gerar o Blueprint, peça ao usuário:
|
|
207
351
|
- Revisar a arquitetura
|
|
208
352
|
- Aprovar endpoints e modelos
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-refine
|
|
3
|
+
description: Analisa complexidade de uma task DARE e, quando alta, quebra em sub-tasks menores. Use após gerar o DAG (para tasks HIGH/CRITICAL), quando o dev pedir refinamento manual, ou quando o escopo mudou e uma task ficou grande. Combina heurística determinística (CLI) com decisão semântica do agente.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Refine Skill
|
|
7
|
+
|
|
8
|
+
Você é o refinador de tasks do método DARE. Seu papel é garantir que cada task caiba em uma conversa única do agente — sem ficar tão grande que o agente "invente" stubs/mocks pra completar.
|
|
9
|
+
|
|
10
|
+
## Quando usar
|
|
11
|
+
|
|
12
|
+
- Após `dare-tasks` gerar o DAG, para cada task com complexity HIGH no `dare-dag.yaml`
|
|
13
|
+
- Quando o dev pede: "refine task-034"
|
|
14
|
+
- Quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
15
|
+
|
|
16
|
+
## Camada determinística vs semântica
|
|
17
|
+
|
|
18
|
+
O CLI `dare refine <id>` já mede sinais objetivos: # arquivos, # funções, # testes, # dependências, keywords pesadas. Esta skill faz a camada semântica — você lê o conteúdo da spec e decide se faz sentido quebrar.
|
|
19
|
+
|
|
20
|
+
## Como executar
|
|
21
|
+
|
|
22
|
+
### Passo 1: Rodar a heurística determinística
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
dare refine <task-id> --split --format json > .dare/refine-<task-id>.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
JSON traz:
|
|
29
|
+
- `report.score`, `report.level`
|
|
30
|
+
- `report.signals` — explica a pontuação
|
|
31
|
+
- `report.recommendsSplit` — true se HIGH/CRITICAL
|
|
32
|
+
- `proposal.subtasks` — quebra inicial coarse
|
|
33
|
+
|
|
34
|
+
### Passo 2: Decidir se quebra
|
|
35
|
+
|
|
36
|
+
**Quebrar quando:**
|
|
37
|
+
- `recommendsSplit: true` (HIGH/CRITICAL)
|
|
38
|
+
- Mais de 6 arquivos
|
|
39
|
+
- Mistura responsabilidades (modelo + controller + teste + migration)
|
|
40
|
+
- Inclui refactor + feature juntos
|
|
41
|
+
- Keyword "pesada" + score MED+
|
|
42
|
+
|
|
43
|
+
**Manter inteira quando:**
|
|
44
|
+
- LOW ou MED baixo
|
|
45
|
+
- Mesmo módulo
|
|
46
|
+
- Cabe em uma conversa (15–60 min)
|
|
47
|
+
|
|
48
|
+
### Passo 3: Eixos de split
|
|
49
|
+
|
|
50
|
+
| Eixo | Quando |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Por camada** | Modelo / Controller / Service / Test separados |
|
|
53
|
+
| **Por endpoint** | 4 endpoints → 4 sub-tasks |
|
|
54
|
+
| **Por feature** | Auth = register + login → split por verbo |
|
|
55
|
+
| **Refactor + feature** | "1. refactor" + "2. feature em cima" |
|
|
56
|
+
| **Migration + código** | "1. migration" + "2. código novo" |
|
|
57
|
+
|
|
58
|
+
Cada sub-task:
|
|
59
|
+
- `subtask_prompt` auto-suficiente (Anti-Stub Contract!)
|
|
60
|
+
- Spec própria em `DARE/EXECUTION/<sub-id>.md`
|
|
61
|
+
- `depends_on` mínimo mas correto
|
|
62
|
+
- Complexity honesta — se sub ainda for HIGH, quebrar de novo
|
|
63
|
+
|
|
64
|
+
### Passo 4: Verdito
|
|
65
|
+
|
|
66
|
+
`.dare/refine-verdict-<task-id>.json`:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"manageable": false,
|
|
71
|
+
"reasons": ["Score 18 (HIGH) — 7 endpoints + migration", "Mistura refactor com features novas"],
|
|
72
|
+
"proposedSubtasks": [
|
|
73
|
+
{
|
|
74
|
+
"id": "task-034a",
|
|
75
|
+
"title": "Refactor UserService",
|
|
76
|
+
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
77
|
+
"rationale": "Refactor isolado antes da feature",
|
|
78
|
+
"estimatedLevel": "MED"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Manuseável:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"manageable": true,
|
|
89
|
+
"reasons": ["Score 7 (MED), 4 arquivos mesmo módulo"]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Passo 5: Aplicar o split
|
|
94
|
+
|
|
95
|
+
1. Editar `DARE/dare-dag.yaml` substituindo a task pelas sub-tasks
|
|
96
|
+
2. Criar specs em `DARE/EXECUTION/<sub-id>.md` (template + Anti-Stub Contract)
|
|
97
|
+
3. Atualizar `DARE/TASKS.md` (visão humana)
|
|
98
|
+
4. Regenerar Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
99
|
+
5. Marcar task original como SPLIT (preservar histórico)
|
|
100
|
+
|
|
101
|
+
### Passo 6: Mensagem
|
|
102
|
+
|
|
103
|
+
Manuseável:
|
|
104
|
+
> ✅ Task bem-dimensionada (score X, level Y). Sem split.
|
|
105
|
+
|
|
106
|
+
Quebrada:
|
|
107
|
+
> 🪓 Task quebrada em N sub-tasks: [lista]. Revise com `dare validate` e `dare dag viz`.
|
|
108
|
+
|
|
109
|
+
## Regras inegociáveis
|
|
110
|
+
|
|
111
|
+
- Não quebrar tasks LOW
|
|
112
|
+
- Não inventar dependências falsas
|
|
113
|
+
- Cada sub-task testável independentemente
|
|
114
|
+
- Anti-Stub Contract aplica em cada sub-task
|