@dewtech/dare-cli 2.2.0 → 2.3.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 (64) hide show
  1. package/README.md +46 -27
  2. package/dist/__tests__/dag-runner/graph-ingest.test.d.ts +2 -0
  3. package/dist/__tests__/dag-runner/graph-ingest.test.d.ts.map +1 -0
  4. package/dist/__tests__/dag-runner/graph-ingest.test.js +105 -0
  5. package/dist/__tests__/dag-runner/graph-ingest.test.js.map +1 -0
  6. package/dist/__tests__/dag-runner/orchestrator.test.d.ts +2 -0
  7. package/dist/__tests__/dag-runner/orchestrator.test.d.ts.map +1 -0
  8. package/dist/__tests__/dag-runner/orchestrator.test.js +107 -0
  9. package/dist/__tests__/dag-runner/orchestrator.test.js.map +1 -0
  10. package/dist/__tests__/dag-runner/utils.test.js +0 -28
  11. package/dist/__tests__/dag-runner/utils.test.js.map +1 -1
  12. package/dist/__tests__/graphrag/json-graph.test.d.ts +2 -0
  13. package/dist/__tests__/graphrag/json-graph.test.d.ts.map +1 -0
  14. package/dist/__tests__/graphrag/json-graph.test.js +57 -0
  15. package/dist/__tests__/graphrag/json-graph.test.js.map +1 -0
  16. package/dist/bin/dare.js +2 -0
  17. package/dist/bin/dare.js.map +1 -1
  18. package/dist/commands/execute.d.ts.map +1 -1
  19. package/dist/commands/execute.js +165 -46
  20. package/dist/commands/execute.js.map +1 -1
  21. package/dist/commands/graph.d.ts +9 -0
  22. package/dist/commands/graph.d.ts.map +1 -0
  23. package/dist/commands/graph.js +155 -0
  24. package/dist/commands/graph.js.map +1 -0
  25. package/dist/dag-runner/graph-ingest.d.ts +17 -0
  26. package/dist/dag-runner/graph-ingest.d.ts.map +1 -0
  27. package/dist/dag-runner/graph-ingest.js +149 -0
  28. package/dist/dag-runner/graph-ingest.js.map +1 -0
  29. package/dist/dag-runner/run_dag.d.ts +47 -30
  30. package/dist/dag-runner/run_dag.d.ts.map +1 -1
  31. package/dist/dag-runner/run_dag.js +145 -166
  32. package/dist/dag-runner/run_dag.js.map +1 -1
  33. package/dist/dag-runner/state-store.d.ts +13 -0
  34. package/dist/dag-runner/state-store.d.ts.map +1 -0
  35. package/dist/dag-runner/state-store.js +69 -0
  36. package/dist/dag-runner/state-store.js.map +1 -0
  37. package/dist/dag-runner/utils/cap-output.d.ts.map +1 -1
  38. package/dist/dag-runner/utils/cap-output.js +5 -2
  39. package/dist/dag-runner/utils/cap-output.js.map +1 -1
  40. package/dist/graphrag/factory.d.ts +25 -0
  41. package/dist/graphrag/factory.d.ts.map +1 -0
  42. package/dist/graphrag/factory.js +66 -0
  43. package/dist/graphrag/factory.js.map +1 -0
  44. package/dist/graphrag/index.d.ts +4 -0
  45. package/dist/graphrag/index.d.ts.map +1 -1
  46. package/dist/graphrag/index.js +2 -0
  47. package/dist/graphrag/index.js.map +1 -1
  48. package/dist/graphrag/json-graph.d.ts +28 -0
  49. package/dist/graphrag/json-graph.d.ts.map +1 -0
  50. package/dist/graphrag/json-graph.js +168 -0
  51. package/dist/graphrag/json-graph.js.map +1 -0
  52. package/dist/graphrag/knowledge-graph.d.ts +33 -0
  53. package/dist/graphrag/knowledge-graph.d.ts.map +1 -0
  54. package/dist/graphrag/knowledge-graph.js +2 -0
  55. package/dist/graphrag/knowledge-graph.js.map +1 -0
  56. package/dist/index.d.ts +13 -8
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +12 -6
  59. package/dist/index.js.map +1 -1
  60. package/package.json +1 -4
  61. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +99 -96
  62. package/templates/ide/claude/.claude/commands/dare-dag-run.md +68 -69
  63. package/templates/ide/cursor/.cursor/commands/run-dag.md +67 -44
  64. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +97 -87
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Como construir e executar grafos de tasks (DAG) do método DARE com paralelismo real via dare-dag.yaml
2
+ description: Como construir e executar grafos de tasks (DAG) do método DARE com paralelismo lógico via dare-dag.yaml. O Cursor é o executor; o CLI dare é orquestrador.
3
3
  globs: DARE/dare-dag.yaml,DARE/EXECUTION/**,DARE/.canvas.md
4
4
  alwaysApply: false
5
5
  ---
@@ -9,20 +9,34 @@ alwaysApply: false
9
9
  ## Quando usar
10
10
 
11
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
12
+ - O usuário pediu para começar a execução do DAG
13
+ - Existe `DARE/dare-dag.yaml` e você precisa entender, executar ou modificar
14
+ - Aparece o canvas `DARE/.canvas.md` durante uma execução
15
+
16
+ ## Quem executa o quê
17
+
18
+ > **Você (Cursor) é o executor. O CLI `dare` é orquestrador.**
19
+
20
+ - A IDE em que você roda já está autenticada na conta do usuário
21
+ - Você lê o `dare-dag.yaml` e as specs em `DARE/EXECUTION/task-*.md`
22
+ - Você executa cada task — escreve código, roda testes, faz lint
23
+ - Depois de cada task, você chama o CLI para registrar o resultado:
24
+ - `dare execute --complete <task-id> --output "<resumo>"`
25
+ - `dare execute --fail <task-id> --reason "<mensagem>"`
26
+ - O CLI atualiza o canvas e popula o `dare-graph` automaticamente
27
+
28
+ **Não há API key. Não há custo extra de tokens. Você usa o plano da IDE.**
15
29
 
16
30
  ## O que é o DAG do DARE
17
31
 
18
32
  `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`) o YAML, ordena topologicamente
21
- (Kahn's algorithm) e roda em paralelo todas as tasks do mesmo rank via
22
- `Promise.all`.
33
+ em que cada nó é uma task atômica e as arestas são `depends_on`. O CLI ordena
34
+ topologicamente (Kahn's algorithm) e indica em que ordem você deve executar.
35
+ Tasks no mesmo rank podem rodar em paralelo (logicamente você decide se
36
+ literalmente fan-out ou roda uma após a outra).
23
37
 
24
38
  ```
25
- rank 0: task-001 task-002 ← rodam juntas (sem depends_on)
39
+ rank 0: task-001 task-002 ← podem rodar juntas (sem depends_on)
26
40
  rank 1: task-003 (deps: 001, 002) ← só após rank 0
27
41
  rank 2: task-004 (deps: 003)
28
42
  ```
@@ -33,13 +47,12 @@ rank 2: task-004 (deps: 003)
33
47
  title: "<Nome do projeto> - Development Tasks"
34
48
  version: "1.0.0"
35
49
 
36
- # Limites de contexto/output (alinhados com Cursor SDK DAG runner)
37
50
  limits:
38
51
  parent_context_chars: 2000 # snippet de cada output de pai injetado no filho
39
52
  task_output_chars: 4000 # cap do output capturado por task
40
- timeout_seconds: 600 # AbortController por task
53
+ timeout_seconds: 600 # apenas referência; quem aborta é você
41
54
 
42
- # Mapeamento complexity → modelo, por runner
55
+ # Mapeamento complexity → modelo (referencial — você usa o modelo da sua IDE)
43
56
  models:
44
57
  cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
45
58
  claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
@@ -50,97 +63,94 @@ tasks:
50
63
  title: "Setup project structure"
51
64
  depends_on: []
52
65
  complexity: LOW
53
- spec_file: EXECUTION/task-001.md # opcional; fallback é subtask_prompt
66
+ spec_file: EXECUTION/task-001.md
54
67
  subtask_prompt: |
55
68
  <prompt completamente self-contained>
56
69
  ```
57
70
 
71
+ ## Loop de execução
72
+
73
+ ```
74
+ 1. dare execute --next
75
+ ↓ imprime prompts das tasks ready (rank atual)
76
+ 2. Para cada prompt:
77
+ - leia spec_file se houver
78
+ - implemente
79
+ - rode build/test/lint (Ralph Loop)
80
+ 3. dare execute --complete <id> --output "<resumo + arquivos tocados>"
81
+ (ou --fail <id> --reason "..." se falhou)
82
+ 4. Volte ao passo 1 até não haver mais tasks ready
83
+ ```
84
+
85
+ Comandos úteis:
86
+
87
+ ```bash
88
+ dare execute --next # próximas tasks ready (rank atual)
89
+ dare execute --complete task-001 --output "..." # marca DONE
90
+ dare execute --fail task-002 --reason "..." # marca FAILED + cascade-skip
91
+ dare execute --reset task-002 # volta para PENDING (retry)
92
+ dare execute --status # snapshot do canvas
93
+ ```
94
+
58
95
  ## Regras inegociáveis ao construir o DAG
59
96
 
60
97
  ### 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.
98
+ `task-001`, `auth-jwt`, `db-migrations`. Sem espaços nem maiúsculas.
63
99
 
64
100
  ### 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.
101
+ Só adicione dependência quando a task filha **literalmente não pode começar**
102
+ sem o output da pai (arquivo, schema, decisão exportada).
103
+
104
+ | Cenário | Dep? |
105
+ |---------|------|
106
+ | B precisa do arquivo que A criou | sim |
107
+ | B precisa de uma decisão tomada em A | sim |
108
+ | B faz coisa similar a A mas independente | não |
109
+ | Pesquisa/leitura sem efeito colateral | não — fan out wide |
110
+ | Testes do módulo X | sim depende da implementação |
111
+ | Docs do módulo X | sim depende da implementação |
112
+
113
+ Cadeia linear `001 → 002 → 003 → ...` é antipattern. Reanalise.
114
+
115
+ ### 3. `complexity` é referência (não custo real para você)
116
+ | Nível | Quando usar |
117
+ |-------|-------------|
118
+ | `LOW` | Setup, scaffolding, docs simples, leitura/pesquisa |
119
+ | `MED` | Implementação direta, refactors, testes unitários |
120
+ | `HIGH` | Lógica de negócio crítica, segurança, integrações |
121
+
122
+ Como você usa o plano da IDE, `complexity` virou principalmente um sinal para
123
+ você priorizar atenção/cuidado, não para escolher modelo.
88
124
 
89
125
  ### 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.
126
+ Sua sessão futura recebe o prompt + snippets de até 2000 chars dos outputs
127
+ dos pais (via `dare execute --next`). Não vale "como combinamos antes".
128
+ Tudo o que precisa estar no prompt ou virá pelos pais.
97
129
 
98
130
  ### 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.
131
+ Se uma task gera muito, escreva em arquivo (permanece no FS) e faça o
132
+ `--output` do `dare execute --complete` ser um resumo curto + caminhos dos
133
+ arquivos criados.
101
134
 
102
- ### 6. Cada task vira também `EXECUTION/task-<id>.md`
135
+ ### 6. Cada task tem spec em `EXECUTION/task-<id>.md`
103
136
  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.
137
+ testes esperados. O `subtask_prompt` referencia `spec_file` para você ler na
138
+ hora de executar.
107
139
 
108
140
  ## Geração: o que o `/generate-tasks` deve produzir
109
141
 
110
142
  Sempre os **três artefatos juntos**:
111
143
 
112
- 1. **`DARE/TASKS.md`** — tabela master legível por humano
113
- 2. **`DARE/dare-dag.yaml`** — grafo executável pelo CLI
144
+ 1. **`DARE/TASKS.md`** — tabela master para humanos
145
+ 2. **`DARE/dare-dag.yaml`** — grafo executável
114
146
  3. **`DARE/EXECUTION/task-<id>.md`** — uma spec por task
115
147
 
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
148
+ Os três precisam estar consistentes (mesmos `id`s, mesmos `depends_on`,
149
+ mesma `complexity`). Inconsistência aqui quebra a execução.
140
150
 
141
151
  ## Canvas ao vivo (`DARE/.canvas.md`)
142
152
 
143
- O runner reescreve `DARE/.canvas.md` a cada transição de status:
153
+ O CLI reescreve `DARE/.canvas.md` a cada `dare execute --complete/--fail`:
144
154
 
145
155
  ```
146
156
  | ID | Title | Status | Duration | Tokens |
@@ -150,24 +160,24 @@ O runner reescreve `DARE/.canvas.md` a cada transição de status:
150
160
  | task-003 | Core endpoints | ⏳ PENDING | - | - |
151
161
  ```
152
162
 
153
- Status possíveis: `PENDING` ⏳, `RUNNING` 🔄, `DONE` ✅, `FAILED` ❌, `SKIPPED` ⏭️.
163
+ Status: `PENDING` · `RUNNING` 🔄 · `DONE` · `FAILED` · `SKIPPED` ⏭️
154
164
 
155
- `SKIPPED` significa que uma dependência falhou — você não precisa intervir, o
156
- runner pula automaticamente.
165
+ `SKIPPED` é automático quando uma dependência falha — você não precisa fazer
166
+ nada; o CLI cuida do cascade.
157
167
 
158
168
  ## Erros comuns ao construir DAG
159
169
 
160
170
  | Erro | Sintoma | Como corrigir |
161
171
  |------|---------|---------------|
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 |
172
+ | Ciclo em `depends_on` | `Circular dependency detected: <id>` | Reveja, retire a aresta cíclica |
173
+ | `id` duplicado | Comportamento indefinido | Renomeie |
174
+ | `depends_on` aponta para `id` inexistente | `Task not found: <id>` | Corrija nome |
175
+ | Tudo em rank 0 | Conflito de escrita no mesmo arquivo | Adicione `depends_on` quando há contenção |
176
+ | Cadeia linear longa | Sem ganho de paralelismo | Reveja se as deps são reais |
167
177
 
168
178
  ## Checklist antes de aprovar um DAG
169
179
 
170
- - [ ] Pelo menos 2 tasks no rank 0 (caso contrário não há paralelismo)
180
+ - [ ] Pelo menos 2 tasks no rank 0
171
181
  - [ ] Cada `subtask_prompt` é executável sem contexto adicional
172
182
  - [ ] Tasks de teste/doc dependem da implementação correspondente
173
183
  - [ ] `complexity` reflete o esforço real (não tudo HIGH)