@dewtech/dare-cli 2.0.1 → 2.2.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.
Files changed (67) hide show
  1. package/README.md +33 -6
  2. package/dist/__tests__/dag-converter.test.js +114 -0
  3. package/dist/__tests__/dag-converter.test.js.map +1 -1
  4. package/dist/__tests__/dag-runner/adapters.test.d.ts +2 -0
  5. package/dist/__tests__/dag-runner/adapters.test.d.ts.map +1 -0
  6. package/dist/__tests__/dag-runner/adapters.test.js +134 -0
  7. package/dist/__tests__/dag-runner/adapters.test.js.map +1 -0
  8. package/dist/__tests__/dag-runner/utils.test.d.ts +2 -0
  9. package/dist/__tests__/dag-runner/utils.test.d.ts.map +1 -0
  10. package/dist/__tests__/dag-runner/utils.test.js +75 -0
  11. package/dist/__tests__/dag-runner/utils.test.js.map +1 -0
  12. package/dist/commands/blueprint.d.ts +14 -0
  13. package/dist/commands/blueprint.d.ts.map +1 -1
  14. package/dist/commands/blueprint.js +249 -116
  15. package/dist/commands/blueprint.js.map +1 -1
  16. package/dist/commands/execute.d.ts.map +1 -1
  17. package/dist/commands/execute.js +38 -30
  18. package/dist/commands/execute.js.map +1 -1
  19. package/dist/dag-runner/adapters/antigravity.d.ts +6 -0
  20. package/dist/dag-runner/adapters/antigravity.d.ts.map +1 -0
  21. package/dist/dag-runner/adapters/antigravity.js +54 -0
  22. package/dist/dag-runner/adapters/antigravity.js.map +1 -0
  23. package/dist/dag-runner/adapters/claude.d.ts +6 -0
  24. package/dist/dag-runner/adapters/claude.d.ts.map +1 -0
  25. package/dist/dag-runner/adapters/claude.js +48 -0
  26. package/dist/dag-runner/adapters/claude.js.map +1 -0
  27. package/dist/dag-runner/adapters/cursor.d.ts +6 -0
  28. package/dist/dag-runner/adapters/cursor.d.ts.map +1 -0
  29. package/dist/dag-runner/adapters/cursor.js +58 -0
  30. package/dist/dag-runner/adapters/cursor.js.map +1 -0
  31. package/dist/dag-runner/adapters/index.d.ts +46 -0
  32. package/dist/dag-runner/adapters/index.d.ts.map +1 -0
  33. package/dist/dag-runner/adapters/index.js +55 -0
  34. package/dist/dag-runner/adapters/index.js.map +1 -0
  35. package/dist/dag-runner/run_dag.d.ts +47 -8
  36. package/dist/dag-runner/run_dag.d.ts.map +1 -1
  37. package/dist/dag-runner/run_dag.js +205 -124
  38. package/dist/dag-runner/run_dag.js.map +1 -1
  39. package/dist/dag-runner/utils/cap-output.d.ts +14 -0
  40. package/dist/dag-runner/utils/cap-output.d.ts.map +1 -0
  41. package/dist/dag-runner/utils/cap-output.js +22 -0
  42. package/dist/dag-runner/utils/cap-output.js.map +1 -0
  43. package/dist/dag-runner/utils/stitch-context.d.ts +24 -0
  44. package/dist/dag-runner/utils/stitch-context.d.ts.map +1 -0
  45. package/dist/dag-runner/utils/stitch-context.js +36 -0
  46. package/dist/dag-runner/utils/stitch-context.js.map +1 -0
  47. package/dist/dag-runner/utils/timeout.d.ts +27 -0
  48. package/dist/dag-runner/utils/timeout.d.ts.map +1 -0
  49. package/dist/dag-runner/utils/timeout.js +55 -0
  50. package/dist/dag-runner/utils/timeout.js.map +1 -0
  51. package/dist/index.d.ts +4 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/utils/dag-converter.d.ts +8 -2
  56. package/dist/utils/dag-converter.d.ts.map +1 -1
  57. package/dist/utils/dag-converter.js +116 -21
  58. package/dist/utils/dag-converter.js.map +1 -1
  59. package/package.json +4 -1
  60. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +172 -0
  61. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +210 -229
  62. package/templates/ide/claude/.claude/commands/dare-blueprint.md +126 -42
  63. package/templates/ide/claude/.claude/commands/dare-dag-build.md +110 -0
  64. package/templates/ide/claude/.claude/commands/dare-dag-run.md +110 -0
  65. package/templates/ide/cursor/.cursor/commands/generate-tasks.md +117 -20
  66. package/templates/ide/cursor/.cursor/commands/run-dag.md +87 -0
  67. 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
- Este comando avança o Método DARE lendo o Blueprint aprovado e gerando as tarefas atômicas isoladas para execução.
5
-
6
- ## Instruções para o Cursor Composer
7
-
8
- 1. **Leia o Documento Blueprint:** Acesse e leia o arquivo `$ARGUMENTS` (geralmente `DARE/BLUEPRINT.md`) que contém a arquitetura completa.
9
- 2. **Leia os Templates:** Utilize a estrutura definida em `templates/TASKS-template.md` e `templates/TASK-SPEC-template.md`.
10
- 3. **Analise o Contexto Global:** Leia o arquivo `.cursorrules` (ou equivalente) para garantir que as instruções de código sigam as convenções do projeto.
11
- 4. **Desdobre as Fases em Tarefas Atômicas:**
12
- - Para cada Fase definida no Blueprint, crie tarefas granulares e executáveis.
13
- - Uma tarefa deve ser pequena o suficiente para ser concluída em um único prompt do Composer.
14
- - **Tarefas de Segurança:** Garanta que requisitos de segurança (ex: Middlewares, Validação de FormRequests, Criptografia) tenham tarefas específicas ou estejam explicitamente incluídos nas tarefas relevantes.
15
- - Exemplo: "Fase 2: Autenticação" vira "Task 003: Migration de Users", "Task 004: AuthController (com Rate Limit e Bcrypt)", etc.
16
- 5. **Gere os Arquivos de Tarefas:**
17
- - **TASKS.md:** Crie o arquivo `DARE/TASKS.md` com a visão geral de todas as tarefas e suas dependências.
18
- - **Especificações Isoladas:** Para CADA tarefa criada, crie um arquivo em `DARE/EXECUTION/task-[id].md` seguindo o template `TASK-SPEC-template.md`.
19
- - Preencha as instruções de implementação detalhadas para cada arquivo de task isolada, incluindo os Validation Gates apropriados para a stack (ex: PHPUnit para Laravel, Pytest para Python).
20
- 6. **Mensagem Final:** Informe ao usuário: "Documento TASKS.md e especificações isoladas geradas em DARE/EXECUTION/ com sucesso. Revise as tarefas. Para iniciar a implementação, execute `/execute-task task-001`."
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