@dewtech/dare-cli 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/dag-converter.test.js +114 -0
- package/dist/__tests__/dag-converter.test.js.map +1 -1
- package/dist/commands/blueprint.d.ts +14 -0
- package/dist/commands/blueprint.d.ts.map +1 -1
- package/dist/commands/blueprint.js +249 -116
- package/dist/commands/blueprint.js.map +1 -1
- package/dist/dag-runner/run_dag.d.ts +32 -3
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +6 -0
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/utils/dag-converter.d.ts +8 -2
- package/dist/utils/dag-converter.d.ts.map +1 -1
- package/dist/utils/dag-converter.js +116 -21
- package/dist/utils/dag-converter.js.map +1 -1
- package/package.json +1 -1
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +172 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +210 -229
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +126 -42
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +110 -0
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +110 -0
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +117 -20
- package/templates/ide/cursor/.cursor/commands/run-dag.md +87 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +176 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# /dare-dag-build
|
|
2
|
+
|
|
3
|
+
Regenera **apenas** o `DARE/dare-dag.yaml` a partir do `DARE/BLUEPRINT.md` já
|
|
4
|
+
existente, sem refazer o blueprint nem as specs. Útil quando o BLUEPRINT
|
|
5
|
+
mudou pouco mas você precisa que o grafo reflita o novo estado.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- O BLUEPRINT foi ajustado e o grafo precisa refletir
|
|
10
|
+
- Você quer experimentar uma decomposição diferente sem refazer o blueprint
|
|
11
|
+
- O `dare-dag.yaml` ficou inconsistente com `EXECUTION/task-*.md`
|
|
12
|
+
- Precisa adicionar/remover/reordenar tasks no grafo
|
|
13
|
+
|
|
14
|
+
## Pré-requisitos
|
|
15
|
+
|
|
16
|
+
- `DARE/BLUEPRINT.md` existe e está aprovado
|
|
17
|
+
- (Opcional) `DARE/EXECUTION/task-*.md` específicas serão preservadas se não
|
|
18
|
+
forem mencionadas
|
|
19
|
+
|
|
20
|
+
## O que fazer
|
|
21
|
+
|
|
22
|
+
### 1. Ler `DARE/BLUEPRINT.md`
|
|
23
|
+
|
|
24
|
+
Obrigatório. Se faltar, peça `/dare-blueprint` antes.
|
|
25
|
+
|
|
26
|
+
### 2. Ler `DARE/dare-dag.yaml` atual (se existir)
|
|
27
|
+
|
|
28
|
+
Para preservar `id`s já em uso e não confundir o usuário com renomeações
|
|
29
|
+
desnecessárias.
|
|
30
|
+
|
|
31
|
+
### 3. Gerar o novo `dare-dag.yaml`
|
|
32
|
+
|
|
33
|
+
Schema canônico:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
title: "<Nome do Projeto> - Development Tasks"
|
|
37
|
+
version: "1.0.0"
|
|
38
|
+
|
|
39
|
+
limits:
|
|
40
|
+
parent_context_chars: 2000
|
|
41
|
+
task_output_chars: 4000
|
|
42
|
+
timeout_seconds: 600
|
|
43
|
+
|
|
44
|
+
models:
|
|
45
|
+
cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
|
|
46
|
+
claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
|
|
47
|
+
antigravity: { HIGH: gemini-2.5-pro, MED: gemini-2.5-flash, LOW: gemini-2.5-flash }
|
|
48
|
+
|
|
49
|
+
tasks:
|
|
50
|
+
- id: task-001
|
|
51
|
+
title: "..."
|
|
52
|
+
depends_on: []
|
|
53
|
+
complexity: LOW
|
|
54
|
+
spec_file: EXECUTION/task-001.md
|
|
55
|
+
subtask_prompt: |
|
|
56
|
+
<self-contained>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Regras inegociáveis:**
|
|
60
|
+
|
|
61
|
+
- `id` em kebab-case e único
|
|
62
|
+
- `depends_on` mínimo — só quando filha *literalmente* precisa do output
|
|
63
|
+
- `subtask_prompt` self-contained
|
|
64
|
+
- Pelo menos 2 tasks no rank 0
|
|
65
|
+
- Cadeia linear é antipattern
|
|
66
|
+
- `complexity` honesta
|
|
67
|
+
|
|
68
|
+
### 4. Validar consistência com `EXECUTION/task-*.md`
|
|
69
|
+
|
|
70
|
+
Se uma spec existe em `DARE/EXECUTION/task-<id>.md`:
|
|
71
|
+
- Mantenha o mesmo `id` no YAML
|
|
72
|
+
- Aponte `spec_file: EXECUTION/task-<id>.md`
|
|
73
|
+
- Se a `complexity` ou `depends_on` mudou, atualize **também** a spec e o
|
|
74
|
+
`TASKS.md`
|
|
75
|
+
|
|
76
|
+
Se uma task nova entrou no YAML mas não tem spec:
|
|
77
|
+
- Crie a spec correspondente em `EXECUTION/task-<id>.md`
|
|
78
|
+
|
|
79
|
+
Se uma task saiu do YAML mas a spec ficou:
|
|
80
|
+
- Pergunte ao usuário: arquivar (mover para `EXECUTION/_archived/`) ou
|
|
81
|
+
apagar?
|
|
82
|
+
|
|
83
|
+
### 5. Validar grafo
|
|
84
|
+
|
|
85
|
+
- Sem ciclos
|
|
86
|
+
- Todos os `depends_on` apontam para `id`s existentes
|
|
87
|
+
- `id`s únicos
|
|
88
|
+
- Pelo menos 2 tasks no rank 0
|
|
89
|
+
|
|
90
|
+
### 6. Atualizar `DARE/TASKS.md`
|
|
91
|
+
|
|
92
|
+
Reflita o novo grafo na tabela master.
|
|
93
|
+
|
|
94
|
+
### 7. Mensagem ao usuário
|
|
95
|
+
|
|
96
|
+
> `dare-dag.yaml` regenerado:
|
|
97
|
+
> - Total de tasks: N
|
|
98
|
+
> - Ranks paralelos: N
|
|
99
|
+
> - Adicionadas: [...]
|
|
100
|
+
> - Removidas: [...]
|
|
101
|
+
> - Modificadas: [...]
|
|
102
|
+
>
|
|
103
|
+
> Revise e aprove. Para executar: `/dare-dag-run`.
|
|
104
|
+
|
|
105
|
+
## Quando NÃO usar
|
|
106
|
+
|
|
107
|
+
- Se você nunca rodou `/dare-blueprint` antes — use `/dare-blueprint` primeiro
|
|
108
|
+
- Se o BLUEPRINT está desatualizado — atualize o BLUEPRINT primeiro
|
|
109
|
+
|
|
110
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# /dare-dag-run
|
|
2
|
+
|
|
3
|
+
Executa o grafo de tasks definido em `DARE/dare-dag.yaml` em paralelo,
|
|
4
|
+
respeitando dependências (Kahn's algorithm + execução por rank). O canvas
|
|
5
|
+
ao vivo é gravado em `DARE/.canvas.md`.
|
|
6
|
+
|
|
7
|
+
## Pré-requisitos
|
|
8
|
+
|
|
9
|
+
- `DARE/dare-dag.yaml` existe e foi aprovado pelo usuário
|
|
10
|
+
- Specs em `DARE/EXECUTION/task-<id>.md` geradas
|
|
11
|
+
- `ANTHROPIC_API_KEY` exportada no ambiente (runner padrão para o Claude)
|
|
12
|
+
|
|
13
|
+
## Como usar
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/dare-dag-run # paralelo, runner claude
|
|
17
|
+
/dare-dag-run --resume # só PENDING/FAILED
|
|
18
|
+
/dare-dag-run --task task-003 # task única
|
|
19
|
+
/dare-dag-run --sequential # debug
|
|
20
|
+
/dare-dag-run --runner cursor # trocar de runner
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## O que fazer
|
|
24
|
+
|
|
25
|
+
### 1. Validar pré-condições
|
|
26
|
+
|
|
27
|
+
- Confirme que `DARE/dare-dag.yaml` existe. Se não, oriente
|
|
28
|
+
`/dare-blueprint` ou `/dare-dag-build`.
|
|
29
|
+
- Leia o YAML e verifique:
|
|
30
|
+
- Sem ciclos
|
|
31
|
+
- Pelo menos 2 tasks no rank 0
|
|
32
|
+
- Cada task tem `id` único, `complexity`, `subtask_prompt`
|
|
33
|
+
- Confirme `ANTHROPIC_API_KEY` (ou a env var do runner escolhido).
|
|
34
|
+
|
|
35
|
+
### 2. Escolher modo de execução
|
|
36
|
+
|
|
37
|
+
| Modo | Comando |
|
|
38
|
+
|------|---------|
|
|
39
|
+
| Paralelo (recomendado) | `dare execute --parallel --runner claude` |
|
|
40
|
+
| Sequencial (debug) | `dare execute --runner claude` |
|
|
41
|
+
| Task única | `dare execute --task <id> --runner claude` |
|
|
42
|
+
| Resume (PENDING/FAILED) | `dare execute --parallel --runner claude --resume` |
|
|
43
|
+
|
|
44
|
+
### 3. Sugerir abrir o canvas ao vivo
|
|
45
|
+
|
|
46
|
+
Antes de rodar, peça ao usuário abrir `DARE/.canvas.md` em outra aba do
|
|
47
|
+
editor. O runner reescreve o arquivo a cada transição de status:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
| ID | Title | Status | Duration | Tokens |
|
|
51
|
+
|----------|--------------------|---------------|----------|--------|
|
|
52
|
+
| task-001 | Setup structure | ✅ DONE | 1240ms | 850 |
|
|
53
|
+
| task-002 | DB schema | 🔄 RUNNING | - | - |
|
|
54
|
+
| task-003 | Core endpoints | ⏳ PENDING | - | - |
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 4. Executar e monitorar
|
|
58
|
+
|
|
59
|
+
Rode o comando escolhido. Durante a execução:
|
|
60
|
+
|
|
61
|
+
- **Não interrompa por `SKIPPED`** — o runner pula automaticamente quando
|
|
62
|
+
uma dependência falha. Esse é comportamento esperado.
|
|
63
|
+
- Se uma task falhar, leia o erro no terminal/canvas e corrija a spec em
|
|
64
|
+
`EXECUTION/task-<id>.md` ou o `subtask_prompt` no `dare-dag.yaml`. Depois
|
|
65
|
+
re-execute com `--resume`.
|
|
66
|
+
- Use `Ctrl+C` para cancelar — o runner trata SIGINT e finaliza limpamente.
|
|
67
|
+
|
|
68
|
+
### 5. Pós-execução
|
|
69
|
+
|
|
70
|
+
Ao terminar:
|
|
71
|
+
|
|
72
|
+
- Atualize `DARE/TASKS.md` com os status finais (DONE/FAILED/SKIPPED)
|
|
73
|
+
- Mostre um resumo:
|
|
74
|
+
- Total DONE / FAILED / SKIPPED
|
|
75
|
+
- Duração total
|
|
76
|
+
- Tokens consumidos
|
|
77
|
+
- Tasks que precisam atenção (FAILED)
|
|
78
|
+
- Se houver FAILED, sugira:
|
|
79
|
+
1. Ler `EXECUTION/task-<id>.md` da que falhou
|
|
80
|
+
2. Corrigir spec ou prompt
|
|
81
|
+
3. Re-executar: `/dare-dag-run --resume`
|
|
82
|
+
- Se tudo DONE, parabenize e oriente próxima feature/blueprint
|
|
83
|
+
|
|
84
|
+
## Variáveis de ambiente por runner
|
|
85
|
+
|
|
86
|
+
| Runner | Env var |
|
|
87
|
+
|--------|---------|
|
|
88
|
+
| `claude` (default no Claude Code) | `ANTHROPIC_API_KEY` |
|
|
89
|
+
| `cursor` | `CURSOR_API_KEY` |
|
|
90
|
+
| `antigravity` | `ANTIGRAVITY_API_KEY` |
|
|
91
|
+
|
|
92
|
+
## Erros comuns
|
|
93
|
+
|
|
94
|
+
| Sintoma | Causa | Correção |
|
|
95
|
+
|---------|-------|----------|
|
|
96
|
+
| `dare-dag.yaml not found` | Grafo não foi gerado | `/dare-blueprint` ou `/dare-dag-build` |
|
|
97
|
+
| `Circular dependency detected` | Ciclo no grafo | Edite o YAML para remover |
|
|
98
|
+
| `ANTHROPIC_API_KEY not set` | Env var faltando | `export ANTHROPIC_API_KEY=...` |
|
|
99
|
+
| Cascata de SKIPPED | Pai falhou e bloqueou descendentes | Corrija pai, use `--resume` |
|
|
100
|
+
| Output truncado em 4000 chars | Cap de output | Faça a task escrever em arquivo e retornar resumo |
|
|
101
|
+
| Timeout (>600s) | Task longa demais | Quebre em sub-tasks ou aumente `limits.timeout_seconds` |
|
|
102
|
+
|
|
103
|
+
## Referências
|
|
104
|
+
|
|
105
|
+
- Schema do grafo: `DARE/dare-dag.yaml`
|
|
106
|
+
- Canvas ao vivo: `DARE/.canvas.md`
|
|
107
|
+
- Specs por task: `DARE/EXECUTION/task-*.md`
|
|
108
|
+
- Status humano: `DARE/TASKS.md`
|
|
109
|
+
|
|
110
|
+
$ARGUMENTS
|
|
@@ -1,20 +1,117 @@
|
|
|
1
|
-
# Comando: /generate-tasks
|
|
2
|
-
|
|
3
|
-
## Descrição
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
# Comando: /generate-tasks
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
Avança o Método DARE lendo o Blueprint aprovado e gerando os **três artefatos**
|
|
5
|
+
da fase de execução: `TASKS.md` (visão humana), `dare-dag.yaml` (grafo
|
|
6
|
+
executável pelo CLI) e `EXECUTION/task-<id>.md` (specs detalhadas por task).
|
|
7
|
+
|
|
8
|
+
## Pré-requisitos
|
|
9
|
+
|
|
10
|
+
- `DARE/BLUEPRINT.md` aprovado pelo usuário.
|
|
11
|
+
- Você deve seguir as regras de construção do DAG definidas em
|
|
12
|
+
`.cursor/rules/skill-dag-runner.mdc` — leia antes de gerar.
|
|
13
|
+
|
|
14
|
+
## Instruções para o Cursor Composer
|
|
15
|
+
|
|
16
|
+
### 1. Ler o contexto
|
|
17
|
+
|
|
18
|
+
- Leia `$ARGUMENTS` (geralmente `DARE/BLUEPRINT.md`).
|
|
19
|
+
- Leia os templates: `templates/TASKS-template.md` e `templates/TASK-SPEC-template.md`.
|
|
20
|
+
- Leia `.cursorrules` para convenções do projeto.
|
|
21
|
+
- Leia a skill `skill-dag-runner.mdc` para regras de DAG (depends_on mínimo,
|
|
22
|
+
complexity, prompt self-contained, output cap 4000, parent context 2000).
|
|
23
|
+
|
|
24
|
+
### 2. Decompor o Blueprint em tasks atômicas
|
|
25
|
+
|
|
26
|
+
- Cada fase do Blueprint vira tasks pequenas o suficiente para um único prompt
|
|
27
|
+
do Composer.
|
|
28
|
+
- Tarefas de segurança (FormRequests, middlewares, Bcrypt, rate limit) devem
|
|
29
|
+
ter tasks específicas ou estar explícitas nas tasks relevantes.
|
|
30
|
+
- Atribua `complexity` a cada task: LOW / MED / HIGH.
|
|
31
|
+
|
|
32
|
+
### 3. Gerar `DARE/TASKS.md` (visão humana)
|
|
33
|
+
|
|
34
|
+
Tabela com todas as tasks e dependências em formato legível:
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
| ID | Título | Status | Depends On | Complexity |
|
|
38
|
+
|----------|---------------------------|-------------|------------------|------------|
|
|
39
|
+
| task-001 | Setup project structure | ⏳ PENDING | — | LOW |
|
|
40
|
+
| task-002 | DB migrations | ⏳ PENDING | — | MED |
|
|
41
|
+
| task-003 | Auth controllers | ⏳ PENDING | task-001, 002 | HIGH |
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Inclua: total de tasks, fases agrupadas, tempo estimado, próximos passos.
|
|
45
|
+
|
|
46
|
+
### 4. Gerar `DARE/dare-dag.yaml` (grafo executável)
|
|
47
|
+
|
|
48
|
+
Schema canônico (alinhado com `skill-dag-runner.mdc`):
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
title: "<Nome do Projeto> - Development Tasks"
|
|
52
|
+
version: "1.0.0"
|
|
53
|
+
|
|
54
|
+
limits:
|
|
55
|
+
parent_context_chars: 2000
|
|
56
|
+
task_output_chars: 4000
|
|
57
|
+
timeout_seconds: 600
|
|
58
|
+
|
|
59
|
+
models:
|
|
60
|
+
cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
|
|
61
|
+
claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
|
|
62
|
+
antigravity: { HIGH: gemini-2.5-pro, MED: gemini-2.5-flash, LOW: gemini-2.5-flash }
|
|
63
|
+
|
|
64
|
+
tasks:
|
|
65
|
+
- id: task-001
|
|
66
|
+
title: "Setup project structure"
|
|
67
|
+
depends_on: []
|
|
68
|
+
complexity: LOW
|
|
69
|
+
spec_file: EXECUTION/task-001.md
|
|
70
|
+
subtask_prompt: |
|
|
71
|
+
Setup base project structure following DARE/BLUEPRINT.md.
|
|
72
|
+
Create directories: src/, tests/, docs/. Initialize package files.
|
|
73
|
+
No business logic yet. Validation gate: project builds.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Regras inegociáveis:**
|
|
77
|
+
- `id` em kebab-case e único.
|
|
78
|
+
- `depends_on` mínimo — só adicione quando a task filha **literalmente** não
|
|
79
|
+
pode começar sem o output da pai (arquivo, schema, decisão exportada).
|
|
80
|
+
- `subtask_prompt` totalmente self-contained (o subagente recebe só ele +
|
|
81
|
+
snippets de 2000 chars dos pais).
|
|
82
|
+
- Pelo menos 2 tasks no rank 0 (com `depends_on: []`) para haver paralelismo
|
|
83
|
+
real.
|
|
84
|
+
- Cadeia linear (`001 → 002 → 003 → ...`) é antipattern. Reanalise.
|
|
85
|
+
|
|
86
|
+
### 5. Gerar `DARE/EXECUTION/task-<id>.md` (uma spec por task)
|
|
87
|
+
|
|
88
|
+
Para CADA task em `dare-dag.yaml`, crie a spec correspondente seguindo
|
|
89
|
+
`templates/TASK-SPEC-template.md`:
|
|
90
|
+
|
|
91
|
+
- **Objetivo** claro
|
|
92
|
+
- **Arquivos a criar/modificar**
|
|
93
|
+
- **Validation Gates** (build, test, lint específicos da stack)
|
|
94
|
+
- **Testes esperados**
|
|
95
|
+
- **Considerações de segurança**
|
|
96
|
+
- **Próxima task** sugerida
|
|
97
|
+
|
|
98
|
+
O `subtask_prompt` no YAML pode referenciar a spec via
|
|
99
|
+
`spec_file: EXECUTION/task-<id>.md` para que o subagente leia a spec na hora
|
|
100
|
+
de executar.
|
|
101
|
+
|
|
102
|
+
### 6. Validar consistência dos 3 artefatos
|
|
103
|
+
|
|
104
|
+
- Mesmos `id`s em `TASKS.md`, `dare-dag.yaml` e `EXECUTION/task-*.md`.
|
|
105
|
+
- Mesmas `depends_on` em `TASKS.md` e `dare-dag.yaml`.
|
|
106
|
+
- Mesmas `complexity`.
|
|
107
|
+
- Sem ciclos.
|
|
108
|
+
|
|
109
|
+
### 7. Mensagem final ao usuário
|
|
110
|
+
|
|
111
|
+
> Gerados 3 artefatos da fase de execução:
|
|
112
|
+
> - `DARE/TASKS.md` ([N] tasks, visão humana)
|
|
113
|
+
> - `DARE/dare-dag.yaml` (grafo executável, [N] ranks paralelos)
|
|
114
|
+
> - `DARE/EXECUTION/task-*.md` ([N] specs detalhadas)
|
|
115
|
+
>
|
|
116
|
+
> Revise. Para executar tudo em paralelo: `/run-dag` ou `dare execute --parallel`.
|
|
117
|
+
> Para uma task isolada: `/execute-task task-001`.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Comando: /run-dag
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
Executa o grafo de tasks definido em `DARE/dare-dag.yaml` em paralelo
|
|
5
|
+
respeitando dependências (Kahn's algorithm + Promise.all por rank). O canvas
|
|
6
|
+
ao vivo é gravado em `DARE/.canvas.md`.
|
|
7
|
+
|
|
8
|
+
## Pré-requisitos
|
|
9
|
+
|
|
10
|
+
- `DARE/dare-dag.yaml` existe e foi aprovado pelo usuário
|
|
11
|
+
- Specs em `DARE/EXECUTION/task-<id>.md` geradas
|
|
12
|
+
- `CURSOR_API_KEY` exportada no ambiente
|
|
13
|
+
|
|
14
|
+
## Instruções para o Cursor Composer
|
|
15
|
+
|
|
16
|
+
### 1. Validar pré-condições
|
|
17
|
+
|
|
18
|
+
- Confirme que `DARE/dare-dag.yaml` existe. Se não, oriente o usuário a rodar
|
|
19
|
+
`/generate-tasks` primeiro.
|
|
20
|
+
- Leia o YAML e verifique:
|
|
21
|
+
- Sem ciclos
|
|
22
|
+
- Pelo menos 2 tasks no rank 0 (paralelismo real)
|
|
23
|
+
- Cada `task` tem `id` único, `complexity`, `subtask_prompt`
|
|
24
|
+
- Confira `CURSOR_API_KEY`. Se faltar, peça ao usuário exportar.
|
|
25
|
+
|
|
26
|
+
### 2. Escolher o modo de execução
|
|
27
|
+
|
|
28
|
+
Pergunte ao usuário (ou infira do `$ARGUMENTS`) qual modo:
|
|
29
|
+
|
|
30
|
+
| Modo | Comando |
|
|
31
|
+
|------|---------|
|
|
32
|
+
| Paralelo (recomendado) | `dare execute --parallel --runner cursor` |
|
|
33
|
+
| Sequencial (debug) | `dare execute --runner cursor` |
|
|
34
|
+
| Task única | `dare execute --task <id> --runner cursor` |
|
|
35
|
+
| Resume (só PENDING/FAILED) | `dare execute --parallel --runner cursor --resume` |
|
|
36
|
+
|
|
37
|
+
### 3. Abrir o canvas em paralelo à execução
|
|
38
|
+
|
|
39
|
+
Antes de rodar, sugira ao usuário abrir `DARE/.canvas.md` em uma aba para
|
|
40
|
+
acompanhar o progresso ao vivo. O runner reescreve o arquivo a cada transição
|
|
41
|
+
de status.
|
|
42
|
+
|
|
43
|
+
### 4. Executar e monitorar
|
|
44
|
+
|
|
45
|
+
Rode o comando escolhido. Durante a execução:
|
|
46
|
+
|
|
47
|
+
- Não interrompa por `SKIPPED` — o runner pula automaticamente quando uma
|
|
48
|
+
dependência falha
|
|
49
|
+
- Se uma task falhar, leia o erro no terminal/canvas e corrija a spec em
|
|
50
|
+
`EXECUTION/task-<id>.md` ou o `subtask_prompt` no `dare-dag.yaml`
|
|
51
|
+
- Use `--resume` para retomar sem refazer tasks DONE
|
|
52
|
+
|
|
53
|
+
### 5. Pós-execução
|
|
54
|
+
|
|
55
|
+
Ao terminar:
|
|
56
|
+
|
|
57
|
+
- Atualize `DARE/TASKS.md` com os status finais (DONE/FAILED/SKIPPED)
|
|
58
|
+
- Mostre um resumo: total DONE, FAILED, SKIPPED, duração total, tokens
|
|
59
|
+
- Se houver FAILED, sugira diagnóstico e re-execução com `--resume`
|
|
60
|
+
- Se tudo DONE, parabenize e oriente próximo blueprint/feature
|
|
61
|
+
|
|
62
|
+
## Variáveis de ambiente por runner
|
|
63
|
+
|
|
64
|
+
| Runner | Env var |
|
|
65
|
+
|--------|---------|
|
|
66
|
+
| `cursor` (default) | `CURSOR_API_KEY` |
|
|
67
|
+
| `claude` | `ANTHROPIC_API_KEY` |
|
|
68
|
+
| `antigravity` | `ANTIGRAVITY_API_KEY` |
|
|
69
|
+
|
|
70
|
+
## Erros comuns
|
|
71
|
+
|
|
72
|
+
| Sintoma | Causa | Correção |
|
|
73
|
+
|---------|-------|----------|
|
|
74
|
+
| `dare-dag.yaml not found` | Arquivo não foi gerado | Rode `/generate-tasks` |
|
|
75
|
+
| `Circular dependency detected` | Ciclo no grafo | Edite `dare-dag.yaml` para remover |
|
|
76
|
+
| `CURSOR_API_KEY not set` | Env var faltando | `export CURSOR_API_KEY=...` |
|
|
77
|
+
| Muitos `SKIPPED` em cascata | Pai falhou e bloqueou descendentes | Corrija o pai e use `--resume` |
|
|
78
|
+
| Output truncado | Cap de 4000 chars | Faça a task escrever em arquivo e retornar resumo |
|
|
79
|
+
|
|
80
|
+
## Referências
|
|
81
|
+
|
|
82
|
+
- Skill: `.cursor/rules/skill-dag-runner.mdc` (regras do DAG)
|
|
83
|
+
- Schema: `DARE/dare-dag.yaml`
|
|
84
|
+
- Canvas: `DARE/.canvas.md`
|
|
85
|
+
- Specs: `DARE/EXECUTION/task-*.md`
|
|
86
|
+
|
|
87
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Como construir e executar grafos de tasks (DAG) do método DARE com paralelismo real via dare-dag.yaml
|
|
3
|
+
globs: DARE/dare-dag.yaml,DARE/EXECUTION/**,DARE/.canvas.md
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: DAG Task Runner
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- O `BLUEPRINT.md` foi aprovado e você precisa decompor em tasks executáveis
|
|
12
|
+
- O usuário pediu execução paralela (`dare execute --parallel`)
|
|
13
|
+
- Existe `DARE/dare-dag.yaml` e você precisa entender ou modificar o grafo
|
|
14
|
+
- Aparece o canvas `DARE/.canvas.md` e você precisa interpretar os status
|
|
15
|
+
|
|
16
|
+
## O que é o DAG do DARE
|
|
17
|
+
|
|
18
|
+
`DARE/dare-dag.yaml` é o **plano de execução**: um grafo direcionado acíclico
|
|
19
|
+
em que cada nó é uma task atômica e as arestas são `depends_on`. O DAG runner
|
|
20
|
+
do CLI (`dare execute --parallel`) lê o YAML, ordena topologicamente
|
|
21
|
+
(Kahn's algorithm) e roda em paralelo todas as tasks do mesmo rank via
|
|
22
|
+
`Promise.all`.
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
rank 0: task-001 task-002 ← rodam juntas (sem depends_on)
|
|
26
|
+
rank 1: task-003 (deps: 001, 002) ← só após rank 0
|
|
27
|
+
rank 2: task-004 (deps: 003)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Schema canônico do `dare-dag.yaml`
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
title: "<Nome do projeto> - Development Tasks"
|
|
34
|
+
version: "1.0.0"
|
|
35
|
+
|
|
36
|
+
# Limites de contexto/output (alinhados com Cursor SDK DAG runner)
|
|
37
|
+
limits:
|
|
38
|
+
parent_context_chars: 2000 # snippet de cada output de pai injetado no filho
|
|
39
|
+
task_output_chars: 4000 # cap do output capturado por task
|
|
40
|
+
timeout_seconds: 600 # AbortController por task
|
|
41
|
+
|
|
42
|
+
# Mapeamento complexity → modelo, por runner
|
|
43
|
+
models:
|
|
44
|
+
cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
|
|
45
|
+
claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
|
|
46
|
+
antigravity: { HIGH: gemini-2.5-pro, MED: gemini-2.5-flash, LOW: gemini-2.5-flash }
|
|
47
|
+
|
|
48
|
+
tasks:
|
|
49
|
+
- id: task-001
|
|
50
|
+
title: "Setup project structure"
|
|
51
|
+
depends_on: []
|
|
52
|
+
complexity: LOW
|
|
53
|
+
spec_file: EXECUTION/task-001.md # opcional; fallback é subtask_prompt
|
|
54
|
+
subtask_prompt: |
|
|
55
|
+
<prompt completamente self-contained>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Regras inegociáveis ao construir o DAG
|
|
59
|
+
|
|
60
|
+
### 1. `id` em kebab-case e único
|
|
61
|
+
Use prefixo + número (`task-001`, `auth-jwt`, `db-migrations`). Sem espaços, sem
|
|
62
|
+
maiúsculas. O ID aparece no canvas e nos logs do runner.
|
|
63
|
+
|
|
64
|
+
### 2. `depends_on` mínimo — maximize paralelismo
|
|
65
|
+
Só adicione uma dependência quando a task filha **literalmente não pode começar**
|
|
66
|
+
sem o output da pai (arquivo, schema, constante exportada).
|
|
67
|
+
|
|
68
|
+
| Situação | `depends_on`? |
|
|
69
|
+
|----------|---------------|
|
|
70
|
+
| Task B precisa do arquivo que A cria | ✅ sim |
|
|
71
|
+
| Task B precisa de uma decisão tomada em A | ✅ sim |
|
|
72
|
+
| Task B faz coisa parecida com A mas independente | ❌ não |
|
|
73
|
+
| Tasks de pesquisa/leitura sem efeito colateral | ❌ raramente — fan out wide |
|
|
74
|
+
| Testes para módulo X | ✅ depende da implementação de X |
|
|
75
|
+
| Documentação de módulo X | ✅ depende da implementação de X |
|
|
76
|
+
|
|
77
|
+
**Antipattern:** cadeia linear `001 → 002 → 003 → 004 → ...`. Se virar isso, você
|
|
78
|
+
está adicionando dependências falsas. Reanalise.
|
|
79
|
+
|
|
80
|
+
### 3. `complexity` define qual modelo executa
|
|
81
|
+
| Nível | Quando usar | Modelo Cursor |
|
|
82
|
+
|-------|-------------|---------------|
|
|
83
|
+
| `LOW` | Setup, scaffolding, docs simples, leitura/pesquisa | `auto-low` |
|
|
84
|
+
| `MED` | Implementação direta, refactors, testes unitários | `composer-2` |
|
|
85
|
+
| `HIGH` | Lógica de negócio crítica, segurança, integrações | `gpt-5.3-codex` |
|
|
86
|
+
|
|
87
|
+
Não force `HIGH` em tudo — encarece e gasta contexto.
|
|
88
|
+
|
|
89
|
+
### 4. `subtask_prompt` totalmente self-contained
|
|
90
|
+
A task vai rodar como subagente isolado. Ele recebe apenas:
|
|
91
|
+
- O próprio `subtask_prompt`
|
|
92
|
+
- Snippets de até **2000 chars** dos outputs de cada pai
|
|
93
|
+
- Acesso ao filesystem do projeto
|
|
94
|
+
|
|
95
|
+
Não dá para referenciar "como combinamos antes" ou "use o padrão da task-001".
|
|
96
|
+
Tudo o que o subagente precisa saber tem que estar no prompt ou virá pelos pais.
|
|
97
|
+
|
|
98
|
+
### 5. Output cap de 4000 chars
|
|
99
|
+
Se a task vai produzir muita coisa, escreva em arquivo (ele permanece no FS) e
|
|
100
|
+
faça o output da task ser um resumo curto + caminhos dos arquivos criados.
|
|
101
|
+
|
|
102
|
+
### 6. Cada task vira também `EXECUTION/task-<id>.md`
|
|
103
|
+
Spec detalhada com: objetivo, arquivos a criar/modificar, validation gates,
|
|
104
|
+
testes esperados. O `subtask_prompt` no YAML pode referenciar
|
|
105
|
+
`spec_file: EXECUTION/task-001.md` para que o agente leia a spec na hora de
|
|
106
|
+
executar.
|
|
107
|
+
|
|
108
|
+
## Geração: o que o `/generate-tasks` deve produzir
|
|
109
|
+
|
|
110
|
+
Sempre os **três artefatos juntos**:
|
|
111
|
+
|
|
112
|
+
1. **`DARE/TASKS.md`** — tabela master legível por humano
|
|
113
|
+
2. **`DARE/dare-dag.yaml`** — grafo executável pelo CLI
|
|
114
|
+
3. **`DARE/EXECUTION/task-<id>.md`** — uma spec por task
|
|
115
|
+
|
|
116
|
+
O `TASKS.md` é a fonte de leitura humana; o `dare-dag.yaml` é a fonte de
|
|
117
|
+
execução; os `EXECUTION/task-*.md` são as specs detalhadas. Os três precisam
|
|
118
|
+
estar consistentes (mesmo `id`, mesmo `depends_on`, mesma `complexity`).
|
|
119
|
+
|
|
120
|
+
## Execução: como rodar o DAG
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Paralelo (recomendado) — runner padrão é cursor
|
|
124
|
+
dare execute --parallel
|
|
125
|
+
|
|
126
|
+
# Sequencial (debug)
|
|
127
|
+
dare execute
|
|
128
|
+
|
|
129
|
+
# Task única
|
|
130
|
+
dare execute --task task-003
|
|
131
|
+
|
|
132
|
+
# Resume — só PENDING/FAILED
|
|
133
|
+
dare execute --parallel --resume
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Variáveis de ambiente:
|
|
137
|
+
- `CURSOR_API_KEY` — necessário para runner cursor
|
|
138
|
+
- `ANTHROPIC_API_KEY` — runner claude
|
|
139
|
+
- `ANTIGRAVITY_API_KEY` — runner antigravity
|
|
140
|
+
|
|
141
|
+
## Canvas ao vivo (`DARE/.canvas.md`)
|
|
142
|
+
|
|
143
|
+
O runner reescreve `DARE/.canvas.md` a cada transição de status:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
| ID | Title | Status | Duration | Tokens |
|
|
147
|
+
|----------|--------------------|---------------|----------|--------|
|
|
148
|
+
| task-001 | Setup structure | ✅ DONE | 1240ms | 850 |
|
|
149
|
+
| task-002 | DB schema | 🔄 RUNNING | - | - |
|
|
150
|
+
| task-003 | Core endpoints | ⏳ PENDING | - | - |
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Status possíveis: `PENDING` ⏳, `RUNNING` 🔄, `DONE` ✅, `FAILED` ❌, `SKIPPED` ⏭️.
|
|
154
|
+
|
|
155
|
+
`SKIPPED` significa que uma dependência falhou — você não precisa intervir, o
|
|
156
|
+
runner pula automaticamente.
|
|
157
|
+
|
|
158
|
+
## Erros comuns ao construir DAG
|
|
159
|
+
|
|
160
|
+
| Erro | Sintoma | Como corrigir |
|
|
161
|
+
|------|---------|---------------|
|
|
162
|
+
| Ciclo em `depends_on` | `Circular dependency detected: <id>` | Reveja o grafo, retire a aresta cíclica |
|
|
163
|
+
| `id` duplicado | Comportamento indefinido no runner | Renomeie para únicos |
|
|
164
|
+
| `depends_on` aponta para `id` inexistente | `Task not found: <id>` | Corrija o nome ou adicione a task |
|
|
165
|
+
| Tudo em rank 0 (sem dependências reais) | Conflito de escrita no mesmo arquivo | Adicione `depends_on` quando há contenção |
|
|
166
|
+
| Cadeia linear longa | Sem ganho de paralelismo | Reveja se as dependências são reais |
|
|
167
|
+
|
|
168
|
+
## Checklist antes de aprovar um DAG
|
|
169
|
+
|
|
170
|
+
- [ ] Pelo menos 2 tasks no rank 0 (caso contrário não há paralelismo)
|
|
171
|
+
- [ ] Cada `subtask_prompt` é executável sem contexto adicional
|
|
172
|
+
- [ ] Tasks de teste/doc dependem da implementação correspondente
|
|
173
|
+
- [ ] `complexity` reflete o esforço real (não tudo HIGH)
|
|
174
|
+
- [ ] `id` em kebab-case e único
|
|
175
|
+
- [ ] Sem ciclos
|
|
176
|
+
- [ ] `TASKS.md` + `dare-dag.yaml` + `EXECUTION/task-*.md` consistentes
|