@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
package/dist/index.js CHANGED
@@ -11,8 +11,9 @@ export { designCommand } from './commands/design.js';
11
11
  export { blueprintCommand } from './commands/blueprint.js';
12
12
  export { executeCommand } from './commands/execute.js';
13
13
  // DAG Runner
14
- export { runDag } from './dag-runner/run_dag.js';
14
+ export { runDag, computeRanks, DEFAULT_DAG_LIMITS } from './dag-runner/run_dag.js';
15
15
  export { convertYamlToDag, convertDagToYaml } from './utils/dag-converter.js';
16
+ export { getAdapter, MissingApiKeyError, AdapterCallError, } from './dag-runner/adapters/index.js';
16
17
  // Project generation
17
18
  export { generateProjectStructure } from './utils/project-generator.js';
18
19
  // Knowledge graph engine
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,qBAAqB;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAe/C,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAYnF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,qBAAqB;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAe/C,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,10 +1,16 @@
1
1
  import type { Dag } from '../dag-runner/run_dag.js';
2
2
  /**
3
- * Convert dare-dag.yaml content to Dag object
3
+ * Parse `dare-dag.yaml` content into a Dag object.
4
+ *
5
+ * Accepts both the v2.1 schema (with `limits` and runner-keyed `models`) and
6
+ * the legacy flat schema (`models: { HIGH, MED, LOW }`). Legacy is normalized
7
+ * to the runner-keyed form (replicated under each runner).
4
8
  */
5
9
  export declare function convertYamlToDag(yamlContent: string): Dag;
6
10
  /**
7
- * Convert Dag object back to YAML string
11
+ * Serialize a Dag back to YAML. Uses the canonical v2.1 schema with `limits`
12
+ * and runner-keyed `models`. Status/output/tokens/duration are runtime fields
13
+ * and not emitted.
8
14
  */
9
15
  export declare function convertDagToYaml(dag: Dag): string;
10
16
  //# sourceMappingURL=dag-converter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dag-converter.d.ts","sourceRoot":"","sources":["../../src/utils/dag-converter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAW,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAkBzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAsBjD"}
1
+ {"version":3,"file":"dag-converter.d.ts","sourceRoot":"","sources":["../../src/utils/dag-converter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,GAAG,EAMJ,MAAM,0BAA0B,CAAC;AAKlC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAuBzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CA8CjD"}
@@ -1,46 +1,141 @@
1
1
  import { parse } from 'yaml';
2
+ import { DEFAULT_DAG_LIMITS } from '../dag-runner/run_dag.js';
3
+ const KNOWN_RUNNERS = ['cursor', 'claude', 'antigravity'];
2
4
  /**
3
- * Convert dare-dag.yaml content to Dag object
5
+ * Parse `dare-dag.yaml` content into a Dag object.
6
+ *
7
+ * Accepts both the v2.1 schema (with `limits` and runner-keyed `models`) and
8
+ * the legacy flat schema (`models: { HIGH, MED, LOW }`). Legacy is normalized
9
+ * to the runner-keyed form (replicated under each runner).
4
10
  */
5
11
  export function convertYamlToDag(yamlContent) {
6
12
  const raw = parse(yamlContent);
7
- const tasks = raw.tasks.map((t) => ({
8
- id: t.id,
9
- title: t.title || t.id,
10
- depends_on: t.depends_on || [],
11
- complexity: t.complexity || 'MED',
13
+ const tasks = (raw.tasks || []).map((t) => ({
14
+ id: String(t.id),
15
+ title: t.title || String(t.id),
16
+ depends_on: Array.isArray(t.depends_on) ? t.depends_on : [],
17
+ complexity: normalizeComplexity(t.complexity),
12
18
  subtask_prompt: t.subtask_prompt || '',
19
+ spec_file: typeof t.spec_file === 'string' ? t.spec_file : undefined,
13
20
  status: 'PENDING',
14
21
  }));
15
22
  return {
16
23
  title: raw.title || 'DARE Project',
17
24
  version: raw.version || '1.0.0',
18
- models: raw.models || {},
25
+ generated: typeof raw.generated === 'string' ? raw.generated : undefined,
26
+ limits: parseLimits(raw.limits),
27
+ models: parseModels(raw.models),
19
28
  tasks,
20
29
  };
21
30
  }
22
31
  /**
23
- * Convert Dag object back to YAML string
32
+ * Serialize a Dag back to YAML. Uses the canonical v2.1 schema with `limits`
33
+ * and runner-keyed `models`. Status/output/tokens/duration are runtime fields
34
+ * and not emitted.
24
35
  */
25
36
  export function convertDagToYaml(dag) {
26
- const lines = [
27
- `title: "${dag.title}"`,
28
- `version: "${dag.version}"`,
29
- ``,
30
- `models:`,
31
- ...Object.entries(dag.models).map(([k, v]) => ` ${k}: "${v}"`),
32
- ``,
33
- `tasks:`,
34
- ];
37
+ const limits = dag.limits ?? DEFAULT_DAG_LIMITS;
38
+ const lines = [];
39
+ lines.push(`title: "${escapeYamlString(dag.title)}"`);
40
+ lines.push(`version: "${dag.version}"`);
41
+ if (dag.generated) {
42
+ lines.push(`generated: "${dag.generated}"`);
43
+ }
44
+ lines.push('');
45
+ lines.push('limits:');
46
+ lines.push(` parent_context_chars: ${limits.parent_context_chars}`);
47
+ lines.push(` task_output_chars: ${limits.task_output_chars}`);
48
+ lines.push(` timeout_seconds: ${limits.timeout_seconds}`);
49
+ lines.push('');
50
+ lines.push('models:');
51
+ for (const runner of KNOWN_RUNNERS) {
52
+ const m = dag.models[runner];
53
+ if (!m)
54
+ continue;
55
+ lines.push(` ${runner}: { HIGH: ${m.HIGH}, MED: ${m.MED}, LOW: ${m.LOW} }`);
56
+ }
57
+ lines.push('');
58
+ lines.push('tasks:');
35
59
  for (const task of dag.tasks) {
60
+ const deps = task.depends_on.length === 0 ? '[]' : `[${task.depends_on.join(', ')}]`;
36
61
  lines.push(` - id: ${task.id}`);
37
- lines.push(` title: "${task.title}"`);
38
- lines.push(` depends_on: [${task.depends_on.map((d) => `"${d}"`).join(', ')}]`);
62
+ lines.push(` title: "${escapeYamlString(task.title)}"`);
63
+ lines.push(` depends_on: ${deps}`);
39
64
  lines.push(` complexity: ${task.complexity}`);
40
- lines.push(` subtask_prompt: |`);
41
- task.subtask_prompt.split('\n').forEach((l) => lines.push(` ${l}`));
65
+ if (task.spec_file) {
66
+ lines.push(` spec_file: ${task.spec_file}`);
67
+ }
68
+ lines.push(' subtask_prompt: |');
69
+ for (const line of (task.subtask_prompt || '').split('\n')) {
70
+ lines.push(` ${line}`);
71
+ }
42
72
  lines.push('');
43
73
  }
44
74
  return lines.join('\n');
45
75
  }
76
+ // ─── Internal helpers ────────────────────────────────────────────────────────
77
+ function normalizeComplexity(value) {
78
+ if (value === 'LOW' || value === 'MED' || value === 'HIGH')
79
+ return value;
80
+ return 'MED';
81
+ }
82
+ function parseLimits(raw) {
83
+ if (!raw || typeof raw !== 'object')
84
+ return { ...DEFAULT_DAG_LIMITS };
85
+ const r = raw;
86
+ return {
87
+ parent_context_chars: typeof r.parent_context_chars === 'number'
88
+ ? r.parent_context_chars
89
+ : DEFAULT_DAG_LIMITS.parent_context_chars,
90
+ task_output_chars: typeof r.task_output_chars === 'number'
91
+ ? r.task_output_chars
92
+ : DEFAULT_DAG_LIMITS.task_output_chars,
93
+ timeout_seconds: typeof r.timeout_seconds === 'number'
94
+ ? r.timeout_seconds
95
+ : DEFAULT_DAG_LIMITS.timeout_seconds,
96
+ };
97
+ }
98
+ /**
99
+ * Accepts either:
100
+ * - per-runner: { cursor: { HIGH, MED, LOW }, claude: {...}, antigravity: {...} }
101
+ * - legacy flat: { HIGH, MED, LOW } — replicated under each known runner
102
+ */
103
+ function parseModels(raw) {
104
+ if (!raw || typeof raw !== 'object')
105
+ return {};
106
+ const r = raw;
107
+ // Legacy flat schema
108
+ if (isModelMap(r)) {
109
+ const flat = toModelMap(r);
110
+ const expanded = {};
111
+ for (const runner of KNOWN_RUNNERS) {
112
+ expanded[runner] = flat;
113
+ }
114
+ return expanded;
115
+ }
116
+ // Per-runner schema
117
+ const out = {};
118
+ for (const runner of KNOWN_RUNNERS) {
119
+ const sub = r[runner];
120
+ if (sub && typeof sub === 'object' && isModelMap(sub)) {
121
+ out[runner] = toModelMap(sub);
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ function isModelMap(obj) {
127
+ return (typeof obj.HIGH === 'string' &&
128
+ typeof obj.MED === 'string' &&
129
+ typeof obj.LOW === 'string');
130
+ }
131
+ function toModelMap(obj) {
132
+ return {
133
+ HIGH: String(obj.HIGH),
134
+ MED: String(obj.MED),
135
+ LOW: String(obj.LOW),
136
+ };
137
+ }
138
+ function escapeYamlString(value) {
139
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
140
+ }
46
141
  //# sourceMappingURL=dag-converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dag-converter.js","sourceRoot":"","sources":["../../src/utils/dag-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAA4B,CAAC;IAE1D,MAAM,KAAK,GAAI,GAAG,CAAC,KAAmC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,CAAC,CAAC,EAAY;QAC5C,UAAU,EAAG,CAAC,CAAC,UAAuB,IAAI,EAAE;QAC5C,UAAU,EAAG,CAAC,CAAC,UAAoC,IAAI,KAAK;QAC5D,cAAc,EAAG,CAAC,CAAC,cAAyB,IAAI,EAAE;QAClD,MAAM,EAAE,SAAkB;KAC3B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK,EAAG,GAAG,CAAC,KAAgB,IAAI,cAAc;QAC9C,OAAO,EAAG,GAAG,CAAC,OAAkB,IAAI,OAAO;QAC3C,MAAM,EAAG,GAAG,CAAC,MAAiC,IAAI,EAAE;QACpD,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAQ;IACvC,MAAM,KAAK,GAAG;QACZ,WAAW,GAAG,CAAC,KAAK,GAAG;QACvB,aAAa,GAAG,CAAC,OAAO,GAAG;QAC3B,EAAE;QACF,SAAS;QACT,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/D,EAAE;QACF,QAAQ;KACT,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"dag-converter.js","sourceRoot":"","sources":["../../src/utils/dag-converter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dewtech/dare-cli",
3
- "version": "2.0.1",
3
+ "version": "2.2.0",
4
4
  "description": "DARE Framework - CLI, GraphRAG engine, MCP server and shared types in a single package",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -20,6 +20,9 @@
20
20
  "templates"
21
21
  ],
22
22
  "dependencies": {
23
+ "@anthropic-ai/sdk": "^0.93.0",
24
+ "@cursor/sdk": "^1.0.12",
25
+ "@google/generative-ai": "^0.24.1",
23
26
  "chalk": "^5.3.0",
24
27
  "commander": "^11.0.0",
25
28
  "cors": "^2.8.5",
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: dare-dag-runner
3
+ description: Constrói e executa o grafo DAG de tasks do método DARE com paralelismo via Kahn's algorithm. Use quando o BLUEPRINT.md está aprovado e é hora de gerar dare-dag.yaml ou executar tasks em paralelo. Garante schema correto, dependências mínimas e specs consistentes.
4
+ ---
5
+
6
+ # DARE DAG Runner Skill
7
+
8
+ Você é o orquestrador da fase de execução paralela do método DARE. Seu papel
9
+ é traduzir o BLUEPRINT em um grafo executável (`DARE/dare-dag.yaml`) e
10
+ operar o `dare execute --parallel` com confiança.
11
+
12
+ ## Quando usar esta skill
13
+
14
+ - BLUEPRINT.md foi aprovado e é hora de gerar tasks
15
+ - Existe `DARE/dare-dag.yaml` e você precisa entender, modificar ou rodar
16
+ - Aparece o canvas `DARE/.canvas.md` durante uma execução
17
+ - Usuário pede "executa em paralelo" ou "gera o DAG"
18
+
19
+ ## O que é o DAG do DARE
20
+
21
+ `DARE/dare-dag.yaml` é o **plano de execução** da fase E (Execute) do método.
22
+ É um grafo direcionado acíclico:
23
+
24
+ - **Nó** = uma task atômica
25
+ - **Aresta** = `depends_on` (a task filha precisa do output da pai)
26
+
27
+ O CLI ordena topologicamente (Kahn's algorithm) e executa tasks do mesmo rank
28
+ em paralelo via `Promise.all`. Tasks sem dependências comuns rodam ao mesmo
29
+ tempo. Outputs dos pais são costurados no contexto dos filhos (snippet de até
30
+ 2000 chars cada).
31
+
32
+ ```
33
+ rank 0 ─→ task-001 task-002 (paralelas)
34
+ rank 1 ─→ task-003 (deps: 001,002)
35
+ rank 2 ─→ task-004 (deps: 003)
36
+ ```
37
+
38
+ ## Schema canônico
39
+
40
+ ```yaml
41
+ title: "<Nome do projeto> - Development Tasks"
42
+ version: "1.0.0"
43
+
44
+ limits:
45
+ parent_context_chars: 2000 # snippet de output de cada pai injetado no filho
46
+ task_output_chars: 4000 # cap do output capturado por task
47
+ timeout_seconds: 600 # AbortController por task
48
+
49
+ models:
50
+ cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
51
+ claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
52
+ antigravity: { HIGH: gemini-2.5-pro, MED: gemini-2.5-flash, LOW: gemini-2.5-flash }
53
+
54
+ tasks:
55
+ - id: task-001
56
+ title: "Setup project structure"
57
+ depends_on: []
58
+ complexity: LOW
59
+ spec_file: EXECUTION/task-001.md
60
+ subtask_prompt: |
61
+ <prompt completamente self-contained>
62
+ ```
63
+
64
+ ## Regras inegociáveis ao construir o DAG
65
+
66
+ ### 1. `id` em kebab-case e único
67
+ `task-001`, `auth-jwt`, `db-migrations`. Sem espaços nem maiúsculas. O id
68
+ aparece no canvas e nos logs.
69
+
70
+ ### 2. `depends_on` mínimo
71
+
72
+ > Adicione uma dependência **somente** quando a task filha não pode começar
73
+ > sem o output da pai (arquivo, schema, decisão exportada).
74
+
75
+ | Cenário | Dependência? |
76
+ |---------|--------------|
77
+ | B precisa do arquivo que A criou | sim |
78
+ | B precisa de uma decisão tomada em A | sim |
79
+ | B faz coisa similar a A mas independente | não |
80
+ | Pesquisa/leitura sem efeito colateral | não — fan out wide |
81
+ | Testes do módulo X | sim — depende da implementação |
82
+ | Docs do módulo X | sim — depende da implementação |
83
+
84
+ Se o seu DAG vira uma cadeia linear `001 → 002 → 003 → ...`, há dependências
85
+ falsas. Reanalise.
86
+
87
+ ### 3. `complexity` mapeia para modelo
88
+ | Nível | Uso típico |
89
+ |-------|------------|
90
+ | `LOW` | Setup, scaffolding, docs simples, pesquisa |
91
+ | `MED` | Implementação direta, refactors, testes unitários |
92
+ | `HIGH` | Lógica de negócio crítica, segurança, integrações |
93
+
94
+ Não use `HIGH` em tudo — encarece sem ganho.
95
+
96
+ ### 4. `subtask_prompt` totalmente self-contained
97
+
98
+ O subagente recebe apenas:
99
+ - O próprio `subtask_prompt`
100
+ - Snippets de até 2000 chars dos outputs de cada pai
101
+ - Acesso ao filesystem do projeto
102
+
103
+ Não vale dizer "use o padrão combinado" ou "como na task-001". Coloque tudo no
104
+ prompt ou faça vir pelos pais.
105
+
106
+ ### 5. Output capado em 4000 chars
107
+
108
+ Se a task gera muito, escreva em arquivo e faça o output ser um resumo curto +
109
+ caminhos dos arquivos criados.
110
+
111
+ ### 6. Cada task tem spec em `EXECUTION/task-<id>.md`
112
+
113
+ Spec detalhada com: objetivo, arquivos a criar/modificar, validation gates,
114
+ testes esperados, segurança. O `subtask_prompt` referencia
115
+ `spec_file: EXECUTION/task-001.md` para que o subagente leia a spec.
116
+
117
+ ## Os 3 artefatos sempre juntos
118
+
119
+ Quando gerar tasks, produza simultaneamente:
120
+
121
+ 1. **`DARE/TASKS.md`** — tabela master para humanos
122
+ 2. **`DARE/dare-dag.yaml`** — grafo executável pelo CLI
123
+ 3. **`DARE/EXECUTION/task-<id>.md`** — uma spec detalhada por task
124
+
125
+ Os três precisam estar consistentes: mesmo `id`, mesmo `depends_on`, mesma
126
+ `complexity`. Inconsistência aqui quebra a execução.
127
+
128
+ ## Como executar
129
+
130
+ ```bash
131
+ dare execute --parallel # paralelo, runner padrão
132
+ dare execute --parallel --runner antigravity
133
+ dare execute # sequencial (debug)
134
+ dare execute --task task-003 # task única
135
+ dare execute --parallel --resume # só PENDING/FAILED
136
+ ```
137
+
138
+ Env vars necessárias por runner:
139
+ - `CURSOR_API_KEY` — runner cursor
140
+ - `ANTHROPIC_API_KEY` — runner claude
141
+ - `ANTIGRAVITY_API_KEY` — runner antigravity
142
+
143
+ ## Canvas ao vivo (`DARE/.canvas.md`)
144
+
145
+ O runner reescreve `DARE/.canvas.md` a cada mudança de status. Status:
146
+ - `PENDING` ⏳ — aguardando rank
147
+ - `RUNNING` 🔄 — executando agora
148
+ - `DONE` ✅ — concluído com sucesso
149
+ - `FAILED` ❌ — erro durante execução
150
+ - `SKIPPED` ⏭️ — dependência falhou; runner pulou automaticamente
151
+
152
+ Você não precisa intervir em `SKIPPED` — o runner cuida.
153
+
154
+ ## Erros comuns
155
+
156
+ | Erro | Sintoma | Correção |
157
+ |------|---------|----------|
158
+ | Ciclo | `Circular dependency detected: <id>` | Retire a aresta cíclica |
159
+ | `id` duplicado | Resultado indefinido | Renomeie |
160
+ | `depends_on` inexistente | `Task not found: <id>` | Corrija ou adicione |
161
+ | Tudo em rank 0 | Conflito de escrita no mesmo arquivo | Adicione dependências reais |
162
+ | Cadeia linear | Sem paralelismo | Reveja se as deps são necessárias |
163
+
164
+ ## Checklist antes de aprovar
165
+
166
+ - [ ] Pelo menos 2 tasks no rank 0
167
+ - [ ] `subtask_prompt` executável sem contexto adicional
168
+ - [ ] Tasks de teste/doc dependem da implementação correspondente
169
+ - [ ] `complexity` reflete o esforço real
170
+ - [ ] `id` em kebab-case e único
171
+ - [ ] Sem ciclos
172
+ - [ ] `TASKS.md` + `dare-dag.yaml` + `EXECUTION/task-*.md` consistentes