@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/README.md
CHANGED
|
@@ -88,19 +88,46 @@ dare blueprint
|
|
|
88
88
|
|
|
89
89
|
### `dare execute`
|
|
90
90
|
|
|
91
|
-
Execute
|
|
91
|
+
Execute the DAG using a real SDK adapter (Claude / Cursor / Antigravity).
|
|
92
|
+
The runner orders tasks topologically (Kahn's algorithm), runs each rank in
|
|
93
|
+
parallel, applies per-task `parent_context_chars` / `task_output_chars` /
|
|
94
|
+
`timeout_seconds` limits, and writes a live canvas to `DARE/.canvas.md`.
|
|
92
95
|
|
|
93
96
|
```bash
|
|
94
|
-
#
|
|
97
|
+
# Parallel execution (recommended, default runner = cursor)
|
|
95
98
|
dare execute --parallel --runner cursor
|
|
99
|
+
dare execute --parallel --runner claude
|
|
100
|
+
dare execute --parallel --runner antigravity
|
|
96
101
|
|
|
97
|
-
#
|
|
98
|
-
dare execute
|
|
102
|
+
# Sequential (debug)
|
|
103
|
+
dare execute --runner claude
|
|
99
104
|
|
|
100
|
-
#
|
|
101
|
-
dare execute
|
|
105
|
+
# Single task
|
|
106
|
+
dare execute --task task-003 --runner claude
|
|
107
|
+
|
|
108
|
+
# Resume — only run PENDING/FAILED, keep DONE/SKIPPED
|
|
109
|
+
dare execute --parallel --resume
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### Required environment variables
|
|
113
|
+
|
|
114
|
+
| Runner | Env var | Where to get it |
|
|
115
|
+
|--------|---------|-----------------|
|
|
116
|
+
| `claude` | `ANTHROPIC_API_KEY` | https://console.anthropic.com/settings/keys |
|
|
117
|
+
| `cursor` | `CURSOR_API_KEY` | Cursor Settings → API Keys |
|
|
118
|
+
| `antigravity` | `ANTIGRAVITY_API_KEY` (or `GOOGLE_API_KEY`) | https://aistudio.google.com/app/apikey |
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Windows (PowerShell)
|
|
122
|
+
$env:ANTHROPIC_API_KEY = "sk-ant-..."
|
|
123
|
+
|
|
124
|
+
# bash
|
|
125
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
102
126
|
```
|
|
103
127
|
|
|
128
|
+
The runner honors `SIGINT` / `SIGTERM` — Ctrl+C cancels every in-flight task
|
|
129
|
+
cleanly via AbortController.
|
|
130
|
+
|
|
104
131
|
---
|
|
105
132
|
|
|
106
133
|
## Full Workflow
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { convertYamlToDag, convertDagToYaml } from '../utils/dag-converter.js';
|
|
3
|
+
import { DEFAULT_DAG_LIMITS } from '../dag-runner/run_dag.js';
|
|
2
4
|
// Inline DAG validation logic
|
|
3
5
|
function validateDAG(dag) {
|
|
4
6
|
const errors = [];
|
|
@@ -131,4 +133,116 @@ describe('DAG Converter', () => {
|
|
|
131
133
|
});
|
|
132
134
|
});
|
|
133
135
|
});
|
|
136
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
137
|
+
// Real converter tests (v2.1 schema with limits + per-runner models)
|
|
138
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
+
describe('convertYamlToDag (v2.1 schema)', () => {
|
|
140
|
+
const v21Yaml = `title: "Sample"
|
|
141
|
+
version: "1.0.0"
|
|
142
|
+
|
|
143
|
+
limits:
|
|
144
|
+
parent_context_chars: 1500
|
|
145
|
+
task_output_chars: 3000
|
|
146
|
+
timeout_seconds: 300
|
|
147
|
+
|
|
148
|
+
models:
|
|
149
|
+
cursor: { HIGH: gpt-5.3-codex, MED: composer-2, LOW: auto-low }
|
|
150
|
+
claude: { HIGH: claude-sonnet-4-5, MED: claude-haiku-4, LOW: claude-haiku-4 }
|
|
151
|
+
antigravity: { HIGH: gemini-2.5-pro, MED: gemini-2.5-flash, LOW: gemini-2.5-flash }
|
|
152
|
+
|
|
153
|
+
tasks:
|
|
154
|
+
- id: task-001
|
|
155
|
+
title: "Setup"
|
|
156
|
+
depends_on: []
|
|
157
|
+
complexity: LOW
|
|
158
|
+
spec_file: EXECUTION/task-001.md
|
|
159
|
+
subtask_prompt: |
|
|
160
|
+
Do the setup.
|
|
161
|
+
- id: task-002
|
|
162
|
+
title: "Implement"
|
|
163
|
+
depends_on: [task-001]
|
|
164
|
+
complexity: HIGH
|
|
165
|
+
subtask_prompt: |
|
|
166
|
+
Build the thing.
|
|
167
|
+
`;
|
|
168
|
+
it('parses limits block', () => {
|
|
169
|
+
const dag = convertYamlToDag(v21Yaml);
|
|
170
|
+
expect(dag.limits).toEqual({
|
|
171
|
+
parent_context_chars: 1500,
|
|
172
|
+
task_output_chars: 3000,
|
|
173
|
+
timeout_seconds: 300,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it('parses per-runner models', () => {
|
|
177
|
+
const dag = convertYamlToDag(v21Yaml);
|
|
178
|
+
expect(dag.models.cursor?.HIGH).toBe('gpt-5.3-codex');
|
|
179
|
+
expect(dag.models.claude?.MED).toBe('claude-haiku-4');
|
|
180
|
+
expect(dag.models.antigravity?.LOW).toBe('gemini-2.5-flash');
|
|
181
|
+
});
|
|
182
|
+
it('parses spec_file when present', () => {
|
|
183
|
+
const dag = convertYamlToDag(v21Yaml);
|
|
184
|
+
expect(dag.tasks[0].spec_file).toBe('EXECUTION/task-001.md');
|
|
185
|
+
expect(dag.tasks[1].spec_file).toBeUndefined();
|
|
186
|
+
});
|
|
187
|
+
it('initializes status as PENDING for every task', () => {
|
|
188
|
+
const dag = convertYamlToDag(v21Yaml);
|
|
189
|
+
for (const t of dag.tasks) {
|
|
190
|
+
expect(t.status).toBe('PENDING');
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe('convertYamlToDag (legacy flat models)', () => {
|
|
195
|
+
const legacyYaml = `title: "Old"
|
|
196
|
+
version: "1.0.0"
|
|
197
|
+
models:
|
|
198
|
+
HIGH: "gpt-4"
|
|
199
|
+
MED: "gpt-4o-mini"
|
|
200
|
+
LOW: "gpt-4o-mini"
|
|
201
|
+
tasks:
|
|
202
|
+
- id: task-1
|
|
203
|
+
depends_on: []
|
|
204
|
+
complexity: MED
|
|
205
|
+
subtask_prompt: "noop"
|
|
206
|
+
`;
|
|
207
|
+
it('replicates flat models under each known runner', () => {
|
|
208
|
+
const dag = convertYamlToDag(legacyYaml);
|
|
209
|
+
expect(dag.models.cursor?.HIGH).toBe('gpt-4');
|
|
210
|
+
expect(dag.models.claude?.MED).toBe('gpt-4o-mini');
|
|
211
|
+
expect(dag.models.antigravity?.LOW).toBe('gpt-4o-mini');
|
|
212
|
+
});
|
|
213
|
+
it('falls back to default limits when block is absent', () => {
|
|
214
|
+
const dag = convertYamlToDag(legacyYaml);
|
|
215
|
+
expect(dag.limits).toEqual(DEFAULT_DAG_LIMITS);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('convertDagToYaml round-trip', () => {
|
|
219
|
+
it('preserves limits, models and spec_file across YAML → Dag → YAML → Dag', () => {
|
|
220
|
+
const original = `title: "RT"
|
|
221
|
+
version: "1.0.0"
|
|
222
|
+
limits:
|
|
223
|
+
parent_context_chars: 1234
|
|
224
|
+
task_output_chars: 5678
|
|
225
|
+
timeout_seconds: 90
|
|
226
|
+
models:
|
|
227
|
+
cursor: { HIGH: a, MED: b, LOW: c }
|
|
228
|
+
claude: { HIGH: d, MED: e, LOW: f }
|
|
229
|
+
antigravity: { HIGH: g, MED: h, LOW: i }
|
|
230
|
+
tasks:
|
|
231
|
+
- id: t1
|
|
232
|
+
title: "First"
|
|
233
|
+
depends_on: []
|
|
234
|
+
complexity: HIGH
|
|
235
|
+
spec_file: EXECUTION/t1.md
|
|
236
|
+
subtask_prompt: |
|
|
237
|
+
go.
|
|
238
|
+
`;
|
|
239
|
+
const dag1 = convertYamlToDag(original);
|
|
240
|
+
const yaml2 = convertDagToYaml(dag1);
|
|
241
|
+
const dag2 = convertYamlToDag(yaml2);
|
|
242
|
+
expect(dag2.limits).toEqual(dag1.limits);
|
|
243
|
+
expect(dag2.models).toEqual(dag1.models);
|
|
244
|
+
expect(dag2.tasks[0].spec_file).toBe('EXECUTION/t1.md');
|
|
245
|
+
expect(dag2.tasks[0].complexity).toBe('HIGH');
|
|
246
|
+
});
|
|
247
|
+
});
|
|
134
248
|
//# sourceMappingURL=dag-converter.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dag-converter.test.js","sourceRoot":"","sources":["../../src/__tests__/dag-converter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"dag-converter.test.js","sourceRoot":"","sources":["../../src/__tests__/dag-converter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/dag-runner/adapters.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { getAdapter, MissingApiKeyError, pickModel, } from '../../dag-runner/adapters/index.js';
|
|
3
|
+
const sampleModels = { HIGH: 'big', MED: 'mid', LOW: 'small' };
|
|
4
|
+
// ─── Anthropic SDK mock ──────────────────────────────────────────────────────
|
|
5
|
+
vi.mock('@anthropic-ai/sdk', () => {
|
|
6
|
+
var _a;
|
|
7
|
+
const create = vi.fn(async () => ({
|
|
8
|
+
content: [{ type: 'text', text: 'mocked claude response' }],
|
|
9
|
+
usage: { input_tokens: 10, output_tokens: 20 },
|
|
10
|
+
}));
|
|
11
|
+
// Default export is the client class.
|
|
12
|
+
return {
|
|
13
|
+
default: (_a = class MockAnthropic {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.messages = { create };
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
_a.__spy = create,
|
|
19
|
+
_a),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
// ─── Cursor SDK mock ─────────────────────────────────────────────────────────
|
|
23
|
+
vi.mock('@cursor/sdk', () => ({
|
|
24
|
+
Agent: {
|
|
25
|
+
create: vi.fn(async () => ({
|
|
26
|
+
send: vi.fn(async () => ({
|
|
27
|
+
cancel: vi.fn(async () => undefined),
|
|
28
|
+
wait: vi.fn(async () => ({ result: 'mocked cursor response' })),
|
|
29
|
+
})),
|
|
30
|
+
close: vi.fn(async () => undefined),
|
|
31
|
+
})),
|
|
32
|
+
},
|
|
33
|
+
}));
|
|
34
|
+
// ─── Google Generative AI mock ───────────────────────────────────────────────
|
|
35
|
+
vi.mock('@google/generative-ai', () => ({
|
|
36
|
+
GoogleGenerativeAI: class {
|
|
37
|
+
getGenerativeModel() {
|
|
38
|
+
return {
|
|
39
|
+
generateContent: async () => ({
|
|
40
|
+
response: {
|
|
41
|
+
text: () => 'mocked antigravity response',
|
|
42
|
+
usageMetadata: { promptTokenCount: 5, candidatesTokenCount: 7 },
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
}));
|
|
49
|
+
describe('pickModel', () => {
|
|
50
|
+
it('returns the model id for the given complexity', () => {
|
|
51
|
+
expect(pickModel(sampleModels, 'HIGH')).toBe('big');
|
|
52
|
+
expect(pickModel(sampleModels, 'MED')).toBe('mid');
|
|
53
|
+
expect(pickModel(sampleModels, 'LOW')).toBe('small');
|
|
54
|
+
});
|
|
55
|
+
it('throws when models block is missing', () => {
|
|
56
|
+
expect(() => pickModel(undefined, 'HIGH')).toThrow();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('Adapters — happy path with mocked SDKs', () => {
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
62
|
+
process.env.CURSOR_API_KEY = 'test-key';
|
|
63
|
+
process.env.ANTIGRAVITY_API_KEY = 'test-key';
|
|
64
|
+
});
|
|
65
|
+
it('claude adapter calls SDK and returns text + tokens', async () => {
|
|
66
|
+
const adapter = await getAdapter('claude');
|
|
67
|
+
const ctrl = new AbortController();
|
|
68
|
+
const res = await adapter.call({
|
|
69
|
+
prompt: 'hi',
|
|
70
|
+
complexity: 'MED',
|
|
71
|
+
models: sampleModels,
|
|
72
|
+
signal: ctrl.signal,
|
|
73
|
+
});
|
|
74
|
+
expect(res.output).toBe('mocked claude response');
|
|
75
|
+
expect(res.tokens).toBe(30);
|
|
76
|
+
});
|
|
77
|
+
it('cursor adapter calls SDK and returns result', async () => {
|
|
78
|
+
const adapter = await getAdapter('cursor');
|
|
79
|
+
const ctrl = new AbortController();
|
|
80
|
+
const res = await adapter.call({
|
|
81
|
+
prompt: 'hi',
|
|
82
|
+
complexity: 'LOW',
|
|
83
|
+
models: sampleModels,
|
|
84
|
+
signal: ctrl.signal,
|
|
85
|
+
});
|
|
86
|
+
expect(res.output).toBe('mocked cursor response');
|
|
87
|
+
});
|
|
88
|
+
it('antigravity adapter calls SDK and returns text + tokens', async () => {
|
|
89
|
+
const adapter = await getAdapter('antigravity');
|
|
90
|
+
const ctrl = new AbortController();
|
|
91
|
+
const res = await adapter.call({
|
|
92
|
+
prompt: 'hi',
|
|
93
|
+
complexity: 'HIGH',
|
|
94
|
+
models: sampleModels,
|
|
95
|
+
signal: ctrl.signal,
|
|
96
|
+
});
|
|
97
|
+
expect(res.output).toBe('mocked antigravity response');
|
|
98
|
+
expect(res.tokens).toBe(12);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('Adapters — missing API keys', () => {
|
|
102
|
+
it('claude adapter throws MissingApiKeyError when ANTHROPIC_API_KEY is unset', async () => {
|
|
103
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
104
|
+
const adapter = await getAdapter('claude');
|
|
105
|
+
await expect(adapter.call({
|
|
106
|
+
prompt: 'hi',
|
|
107
|
+
complexity: 'MED',
|
|
108
|
+
models: sampleModels,
|
|
109
|
+
signal: new AbortController().signal,
|
|
110
|
+
})).rejects.toBeInstanceOf(MissingApiKeyError);
|
|
111
|
+
});
|
|
112
|
+
it('cursor adapter throws MissingApiKeyError when CURSOR_API_KEY is unset', async () => {
|
|
113
|
+
delete process.env.CURSOR_API_KEY;
|
|
114
|
+
const adapter = await getAdapter('cursor');
|
|
115
|
+
await expect(adapter.call({
|
|
116
|
+
prompt: 'hi',
|
|
117
|
+
complexity: 'MED',
|
|
118
|
+
models: sampleModels,
|
|
119
|
+
signal: new AbortController().signal,
|
|
120
|
+
})).rejects.toBeInstanceOf(MissingApiKeyError);
|
|
121
|
+
});
|
|
122
|
+
it('antigravity adapter throws MissingApiKeyError when both env vars are unset', async () => {
|
|
123
|
+
delete process.env.ANTIGRAVITY_API_KEY;
|
|
124
|
+
delete process.env.GOOGLE_API_KEY;
|
|
125
|
+
const adapter = await getAdapter('antigravity');
|
|
126
|
+
await expect(adapter.call({
|
|
127
|
+
prompt: 'hi',
|
|
128
|
+
complexity: 'MED',
|
|
129
|
+
models: sampleModels,
|
|
130
|
+
signal: new AbortController().signal,
|
|
131
|
+
})).rejects.toBeInstanceOf(MissingApiKeyError);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=adapters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.test.js","sourceRoot":"","sources":["../../../src/__tests__/dag-runner/adapters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/dag-runner/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { capOutput } from '../../dag-runner/utils/cap-output.js';
|
|
3
|
+
import { composePrompt, stitchParentContext, } from '../../dag-runner/utils/stitch-context.js';
|
|
4
|
+
import { TaskAbortedError, TaskTimeoutError, withTimeout, } from '../../dag-runner/utils/timeout.js';
|
|
5
|
+
const makeTask = (over) => ({
|
|
6
|
+
id: 't',
|
|
7
|
+
title: 't',
|
|
8
|
+
depends_on: [],
|
|
9
|
+
complexity: 'MED',
|
|
10
|
+
subtask_prompt: '',
|
|
11
|
+
...over,
|
|
12
|
+
});
|
|
13
|
+
describe('capOutput', () => {
|
|
14
|
+
it('passes through when below the cap', () => {
|
|
15
|
+
expect(capOutput('hello', 100)).toBe('hello');
|
|
16
|
+
});
|
|
17
|
+
it('truncates with notice when above the cap', () => {
|
|
18
|
+
const out = capOutput('a'.repeat(200), 50);
|
|
19
|
+
expect(out.length).toBe(50);
|
|
20
|
+
expect(out).toMatch(/truncated by DARE/);
|
|
21
|
+
});
|
|
22
|
+
it('returns empty when cap is 0', () => {
|
|
23
|
+
expect(capOutput('anything', 0)).toBe('');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('stitchParentContext / composePrompt', () => {
|
|
27
|
+
it('returns empty string when no parents', () => {
|
|
28
|
+
const task = makeTask({ id: 'child', subtask_prompt: 'do x' });
|
|
29
|
+
expect(stitchParentContext({ task, parents: [], parentContextChars: 2000 })).toBe('');
|
|
30
|
+
});
|
|
31
|
+
it('appends a tail snippet for each parent capped to N chars', () => {
|
|
32
|
+
const parent = makeTask({ id: 'p1', output: 'A'.repeat(5000) });
|
|
33
|
+
const task = makeTask({ id: 'c', subtask_prompt: 'work' });
|
|
34
|
+
const ctx = stitchParentContext({ task, parents: [parent], parentContextChars: 100 });
|
|
35
|
+
expect(ctx).toMatch(/From parent: p1/);
|
|
36
|
+
// Tail-of-output strategy: ellipsis + 99 chars = 100
|
|
37
|
+
expect(ctx).toMatch(/A{50,}/); // contains a long run of As
|
|
38
|
+
const snippetLine = ctx.split('\n').find((l) => l.startsWith('…')) ?? '';
|
|
39
|
+
expect(snippetLine.length).toBe(100);
|
|
40
|
+
});
|
|
41
|
+
it('composePrompt prepends prompt and appends context', () => {
|
|
42
|
+
const parent = makeTask({ id: 'p', output: 'parent says hi' });
|
|
43
|
+
const task = makeTask({ subtask_prompt: 'go' });
|
|
44
|
+
const out = composePrompt({ task, parents: [parent], parentContextChars: 2000 });
|
|
45
|
+
expect(out.startsWith('go')).toBe(true);
|
|
46
|
+
expect(out).toMatch(/Upstream context/);
|
|
47
|
+
expect(out).toMatch(/parent says hi/);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('withTimeout', () => {
|
|
51
|
+
it('resolves when the operation finishes in time', async () => {
|
|
52
|
+
const result = await withTimeout(async () => 42, { timeoutSeconds: 5 });
|
|
53
|
+
expect(result).toBe(42);
|
|
54
|
+
});
|
|
55
|
+
it('rejects with TaskTimeoutError when the operation exceeds the budget', async () => {
|
|
56
|
+
await expect(withTimeout(async ({ signal }) => new Promise((resolve, reject) => {
|
|
57
|
+
const t = setTimeout(() => resolve(1), 500);
|
|
58
|
+
signal.addEventListener('abort', () => {
|
|
59
|
+
clearTimeout(t);
|
|
60
|
+
reject(new Error('ignored — outer rejects first'));
|
|
61
|
+
});
|
|
62
|
+
}),
|
|
63
|
+
// 50ms timeout — way before the 500ms operation finishes
|
|
64
|
+
{ timeoutSeconds: 0.05 })).rejects.toBeInstanceOf(TaskTimeoutError);
|
|
65
|
+
});
|
|
66
|
+
it('rejects with TaskAbortedError when the external signal aborts', async () => {
|
|
67
|
+
const ctrl = new AbortController();
|
|
68
|
+
setTimeout(() => ctrl.abort('user'), 20);
|
|
69
|
+
await expect(withTimeout(async ({ signal }) => new Promise((resolve) => {
|
|
70
|
+
const t = setTimeout(() => resolve(1), 500);
|
|
71
|
+
signal.addEventListener('abort', () => clearTimeout(t));
|
|
72
|
+
}), { timeoutSeconds: 5, externalSignal: ctrl.signal })).rejects.toBeInstanceOf(TaskAbortedError);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../src/__tests__/dag-runner/utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `dare blueprint` — gera o esqueleto dos 4 artefatos da fase de Architect:
|
|
4
|
+
*
|
|
5
|
+
* DARE/BLUEPRINT.md
|
|
6
|
+
* DARE/TASKS.md
|
|
7
|
+
* DARE/dare-dag.yaml
|
|
8
|
+
* DARE/EXECUTION/task-<id>.md (uma por task)
|
|
9
|
+
*
|
|
10
|
+
* O preenchimento real é responsabilidade do agente IA (via `/dare-blueprint`,
|
|
11
|
+
* `/generate-blueprint` ou skill `dare-blueprint`). Este comando apenas
|
|
12
|
+
* inicializa a estrutura com placeholders consistentes — alinhada com o
|
|
13
|
+
* schema canônico definido em `skill-dag-runner` (com `limits`, `models` per
|
|
14
|
+
* runner e `spec_file`). Arquivos já existentes são preservados.
|
|
15
|
+
*/
|
|
2
16
|
export declare const blueprintCommand: Command;
|
|
3
17
|
//# sourceMappingURL=blueprint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../../src/commands/blueprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../../src/commands/blueprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,SA8FzB,CAAC"}
|