@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.
- package/README.md +33 -6
- package/dist/__tests__/dag-converter.test.js +114 -0
- package/dist/__tests__/dag-converter.test.js.map +1 -1
- package/dist/__tests__/dag-runner/adapters.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/adapters.test.js +134 -0
- package/dist/__tests__/dag-runner/adapters.test.js.map +1 -0
- package/dist/__tests__/dag-runner/utils.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/utils.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/utils.test.js +75 -0
- package/dist/__tests__/dag-runner/utils.test.js.map +1 -0
- 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/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +38 -30
- package/dist/commands/execute.js.map +1 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +6 -0
- package/dist/dag-runner/adapters/antigravity.d.ts.map +1 -0
- package/dist/dag-runner/adapters/antigravity.js +54 -0
- package/dist/dag-runner/adapters/antigravity.js.map +1 -0
- package/dist/dag-runner/adapters/claude.d.ts +6 -0
- package/dist/dag-runner/adapters/claude.d.ts.map +1 -0
- package/dist/dag-runner/adapters/claude.js +48 -0
- package/dist/dag-runner/adapters/claude.js.map +1 -0
- package/dist/dag-runner/adapters/cursor.d.ts +6 -0
- package/dist/dag-runner/adapters/cursor.d.ts.map +1 -0
- package/dist/dag-runner/adapters/cursor.js +58 -0
- package/dist/dag-runner/adapters/cursor.js.map +1 -0
- package/dist/dag-runner/adapters/index.d.ts +46 -0
- package/dist/dag-runner/adapters/index.d.ts.map +1 -0
- package/dist/dag-runner/adapters/index.js +55 -0
- package/dist/dag-runner/adapters/index.js.map +1 -0
- package/dist/dag-runner/run_dag.d.ts +47 -8
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +205 -124
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/dag-runner/utils/cap-output.d.ts +14 -0
- package/dist/dag-runner/utils/cap-output.d.ts.map +1 -0
- package/dist/dag-runner/utils/cap-output.js +22 -0
- package/dist/dag-runner/utils/cap-output.js.map +1 -0
- package/dist/dag-runner/utils/stitch-context.d.ts +24 -0
- package/dist/dag-runner/utils/stitch-context.d.ts.map +1 -0
- package/dist/dag-runner/utils/stitch-context.js +36 -0
- package/dist/dag-runner/utils/stitch-context.js.map +1 -0
- package/dist/dag-runner/utils/timeout.d.ts +27 -0
- package/dist/dag-runner/utils/timeout.d.ts.map +1 -0
- package/dist/dag-runner/utils/timeout.js +55 -0
- package/dist/dag-runner/utils/timeout.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.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 +4 -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
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;
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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:
|
|
62
|
+
lines.push(` title: "${escapeYamlString(task.title)}"`);
|
|
63
|
+
lines.push(` depends_on: ${deps}`);
|
|
39
64
|
lines.push(` complexity: ${task.complexity}`);
|
|
40
|
-
|
|
41
|
-
|
|
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;
|
|
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
|
|
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
|