@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,48 @@
1
+ /**
2
+ * Claude adapter — calls the Anthropic Messages API to execute a task.
3
+ *
4
+ * Env: ANTHROPIC_API_KEY
5
+ */
6
+ import Anthropic from '@anthropic-ai/sdk';
7
+ import { AdapterCallError, MissingApiKeyError, pickModel, } from './index.js';
8
+ const SYSTEM_PROMPT = 'You are a DARE subagent executing a single task from a DAG. Follow the prompt ' +
9
+ 'exactly. When you finish, respond with a concise summary of what you did and the ' +
10
+ 'paths of files you created or modified. Keep responses self-contained — your ' +
11
+ 'output may be quoted into a downstream task.';
12
+ export class ClaudeAdapter {
13
+ constructor() {
14
+ this.name = 'claude';
15
+ }
16
+ async call({ prompt, complexity, models, signal }) {
17
+ const apiKey = process.env.ANTHROPIC_API_KEY;
18
+ if (!apiKey)
19
+ throw new MissingApiKeyError('claude', 'ANTHROPIC_API_KEY');
20
+ const model = pickModel(models, complexity);
21
+ const client = new Anthropic({ apiKey });
22
+ try {
23
+ const res = await client.messages.create({
24
+ model,
25
+ max_tokens: 4096,
26
+ system: SYSTEM_PROMPT,
27
+ messages: [{ role: 'user', content: prompt }],
28
+ }, { signal });
29
+ const text = res.content
30
+ .filter((b) => b.type === 'text')
31
+ .map((b) => b.text)
32
+ .join('\n');
33
+ const tokens = (res.usage?.input_tokens ?? 0) + (res.usage?.output_tokens ?? 0);
34
+ return { output: text, tokens };
35
+ }
36
+ catch (err) {
37
+ if (err instanceof MissingApiKeyError)
38
+ throw err;
39
+ throw new AdapterCallError('claude', extractErrorMessage(err), err);
40
+ }
41
+ }
42
+ }
43
+ function extractErrorMessage(err) {
44
+ if (err instanceof Error)
45
+ return err.message;
46
+ return String(err);
47
+ }
48
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/dag-runner/adapters/claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,GAIV,MAAM,YAAY,CAAC;AAEpB,MAAM,aAAa,GACjB,gFAAgF;IAChF,mFAAmF;IACnF,+EAA+E;IAC/E,8CAA8C,CAAC;AAEjD,MAAM,OAAO,aAAa;IAA1B;QACW,SAAI,GAAG,QAAiB,CAAC;IAiCpC,CAAC;IA/BC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAoB;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CACtC;gBACE,KAAK;gBACL,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,EACD,EAAE,MAAM,EAAE,CACX,CAAC;YAEF,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO;iBACrB,MAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;YAEhF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,MAAM,GAAG,CAAC;YACjD,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type AdapterCallInput, type AdapterCallResult, type RunnerAdapter } from './index.js';
2
+ export declare class CursorAdapter implements RunnerAdapter {
3
+ readonly name: "cursor";
4
+ call({ prompt, complexity, models, signal }: AdapterCallInput): Promise<AdapterCallResult>;
5
+ }
6
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/adapters/cursor.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAoCjG"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Cursor adapter — uses @cursor/sdk to execute a task as a local subagent.
3
+ *
4
+ * Env: CURSOR_API_KEY
5
+ *
6
+ * Compatible with the cookbook DAG Task Runner pattern (Agent.create + send + wait).
7
+ */
8
+ import { Agent } from '@cursor/sdk';
9
+ import { AdapterCallError, MissingApiKeyError, pickModel, } from './index.js';
10
+ export class CursorAdapter {
11
+ constructor() {
12
+ this.name = 'cursor';
13
+ }
14
+ async call({ prompt, complexity, models, signal }) {
15
+ const apiKey = process.env.CURSOR_API_KEY;
16
+ if (!apiKey)
17
+ throw new MissingApiKeyError('cursor', 'CURSOR_API_KEY');
18
+ const model = pickModel(models, complexity);
19
+ let agent;
20
+ try {
21
+ agent = await Agent.create({
22
+ apiKey,
23
+ model: { id: model },
24
+ name: 'DARE DAG Subagent',
25
+ });
26
+ const run = await agent.send(prompt);
27
+ const onAbort = () => {
28
+ // Best-effort cancel; ignore failures.
29
+ run.cancel().catch(() => undefined);
30
+ };
31
+ if (signal.aborted)
32
+ onAbort();
33
+ else
34
+ signal.addEventListener('abort', onAbort, { once: true });
35
+ const result = await run.wait();
36
+ return { output: result.result ?? '' };
37
+ }
38
+ catch (err) {
39
+ if (err instanceof MissingApiKeyError)
40
+ throw err;
41
+ throw new AdapterCallError('cursor', extractErrorMessage(err), err);
42
+ }
43
+ finally {
44
+ try {
45
+ await agent?.close();
46
+ }
47
+ catch {
48
+ // ignore close failures — task already completed/failed
49
+ }
50
+ }
51
+ }
52
+ }
53
+ function extractErrorMessage(err) {
54
+ if (err instanceof Error)
55
+ return err.message;
56
+ return String(err);
57
+ }
58
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/dag-runner/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,GAIV,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,aAAa;IAA1B;QACW,SAAI,GAAG,QAAiB,CAAC;IAsCpC,CAAC;IApCC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAoB;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE5C,IAAI,KAA2D,CAAC;QAChE,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBACzB,MAAM;gBACN,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;gBACpB,IAAI,EAAE,mBAAmB;aAC1B,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAErC,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,uCAAuC;gBACvC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC;YACF,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,MAAM,GAAG,CAAC;YACjD,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,KAAK,EAAE,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Runner adapters — execute a single DAG task by calling the underlying
3
+ * provider SDK (Anthropic, Cursor, Google).
4
+ *
5
+ * Each adapter must:
6
+ * - read its API key from the documented env var (or throw a clear error)
7
+ * - honor the AbortSignal forwarded by `withTimeout`
8
+ * - return raw text output (capping is the runner's responsibility)
9
+ * - report token usage when the SDK exposes it
10
+ */
11
+ import type { Complexity, DagModelMap, RunnerName } from '../run_dag.js';
12
+ export interface AdapterCallInput {
13
+ prompt: string;
14
+ complexity: Complexity;
15
+ models: DagModelMap;
16
+ signal: AbortSignal;
17
+ }
18
+ export interface AdapterCallResult {
19
+ output: string;
20
+ tokens?: number;
21
+ }
22
+ export interface RunnerAdapter {
23
+ readonly name: RunnerName;
24
+ call(input: AdapterCallInput): Promise<AdapterCallResult>;
25
+ }
26
+ export declare class MissingApiKeyError extends Error {
27
+ readonly runner: RunnerName;
28
+ readonly envVar: string;
29
+ constructor(runner: RunnerName, envVar: string);
30
+ }
31
+ export declare class AdapterCallError extends Error {
32
+ readonly runner: RunnerName;
33
+ readonly cause?: unknown | undefined;
34
+ constructor(runner: RunnerName, message: string, cause?: unknown | undefined);
35
+ }
36
+ /**
37
+ * Resolve a model id from complexity → model map, with a soft fallback.
38
+ */
39
+ export declare function pickModel(models: DagModelMap | undefined, complexity: Complexity): string;
40
+ /**
41
+ * Lazy factory — keeps SDK imports out of the require graph until the
42
+ * specific adapter is actually invoked. Avoids loading three SDKs when only
43
+ * one is in use.
44
+ */
45
+ export declare function getAdapter(name: RunnerName): Promise<RunnerAdapter>;
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3D;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACf,MAAM,EAAE,UAAU;aAAkB,MAAM,EAAE,MAAM;gBAAlD,MAAM,EAAE,UAAU,EAAkB,MAAM,EAAE,MAAM;CAO/E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aACb,MAAM,EAAE,UAAU;aAAmC,KAAK,CAAC,EAAE,OAAO;gBAApE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAIjG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CASzF;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBzE"}
@@ -0,0 +1,55 @@
1
+ export class MissingApiKeyError extends Error {
2
+ constructor(runner, envVar) {
3
+ super(`${runner} runner requires ${envVar} to be set. ` +
4
+ `Export it before running: setx ${envVar} <your-key> (Windows) or export ${envVar}=<your-key> (bash).`);
5
+ this.runner = runner;
6
+ this.envVar = envVar;
7
+ this.name = 'MissingApiKeyError';
8
+ }
9
+ }
10
+ export class AdapterCallError extends Error {
11
+ constructor(runner, message, cause) {
12
+ super(`${runner} adapter: ${message}`);
13
+ this.runner = runner;
14
+ this.cause = cause;
15
+ this.name = 'AdapterCallError';
16
+ }
17
+ }
18
+ /**
19
+ * Resolve a model id from complexity → model map, with a soft fallback.
20
+ */
21
+ export function pickModel(models, complexity) {
22
+ if (!models) {
23
+ throw new Error(`No model mapping configured for complexity=${complexity}`);
24
+ }
25
+ const id = models[complexity];
26
+ if (!id) {
27
+ throw new Error(`Missing model for complexity=${complexity} in dare-dag.yaml`);
28
+ }
29
+ return id;
30
+ }
31
+ /**
32
+ * Lazy factory — keeps SDK imports out of the require graph until the
33
+ * specific adapter is actually invoked. Avoids loading three SDKs when only
34
+ * one is in use.
35
+ */
36
+ export async function getAdapter(name) {
37
+ switch (name) {
38
+ case 'claude': {
39
+ const { ClaudeAdapter } = await import('./claude.js');
40
+ return new ClaudeAdapter();
41
+ }
42
+ case 'cursor': {
43
+ const { CursorAdapter } = await import('./cursor.js');
44
+ return new CursorAdapter();
45
+ }
46
+ case 'antigravity': {
47
+ const { AntigravityAdapter } = await import('./antigravity.js');
48
+ return new AntigravityAdapter();
49
+ }
50
+ default: {
51
+ throw new Error(`Unknown runner: ${name}`);
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dag-runner/adapters/index.ts"],"names":[],"mappings":"AA6BA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAA4B,MAAkB,EAAkB,MAAc;QAC5E,KAAK,CACH,GAAG,MAAM,oBAAoB,MAAM,cAAc;YAC/C,kCAAkC,MAAM,sCAAsC,MAAM,sBAAsB,CAC7G,CAAC;QAJwB,WAAM,GAAN,MAAM,CAAY;QAAkB,WAAM,GAAN,MAAM,CAAQ;QAK5E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAA4B,MAAkB,EAAE,OAAe,EAAkB,KAAe;QAC9F,KAAK,CAAC,GAAG,MAAM,aAAa,OAAO,EAAE,CAAC,CAAC;QADb,WAAM,GAAN,MAAM,CAAY;QAAmC,UAAK,GAAL,KAAK,CAAU;QAE9F,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAA+B,EAAE,UAAsB;IAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,mBAAmB,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAChE,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAc,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,32 +1,71 @@
1
1
  /**
2
- * DARE Framework - DAG Task Runner
3
- * Adapted from Cursor Cookbook DAG Task Runner pattern
4
- * Executes tasks in parallel based on dependency graph
2
+ * DARE Framework DAG Task Runner
3
+ *
4
+ * Executes tasks in parallel based on a dependency graph (Kahn's ranks),
5
+ * delegating actual execution to a per-runner adapter (Claude / Cursor /
6
+ * Antigravity). Adapted from the Cursor Cookbook DAG Task Runner pattern.
5
7
  */
8
+ export type Complexity = 'LOW' | 'MED' | 'HIGH';
9
+ export type RunnerName = 'cursor' | 'claude' | 'antigravity';
10
+ export type TaskStatus = 'PENDING' | 'RUNNING' | 'DONE' | 'FAILED' | 'SKIPPED';
6
11
  export interface DagTask {
7
12
  id: string;
8
13
  title: string;
9
14
  depends_on: string[];
10
- complexity: 'LOW' | 'MED' | 'HIGH';
15
+ complexity: Complexity;
11
16
  subtask_prompt: string;
12
- status?: 'PENDING' | 'RUNNING' | 'DONE' | 'FAILED' | 'SKIPPED';
17
+ /** Optional path (relative to project root) to a spec file with detailed instructions. */
18
+ spec_file?: string;
19
+ status?: TaskStatus;
13
20
  output?: string;
21
+ /** Last error message when status is FAILED. */
22
+ error?: string;
14
23
  tokens?: number;
15
24
  duration?: number;
16
25
  }
26
+ /** Hard limits applied per task during execution. */
27
+ export interface DagLimits {
28
+ /** Snippet (in chars) of each parent's output injected into a child's context. */
29
+ parent_context_chars: number;
30
+ /** Cap (in chars) on the captured output of a single task. */
31
+ task_output_chars: number;
32
+ /** Per-task timeout, used by AbortController. */
33
+ timeout_seconds: number;
34
+ }
35
+ /** complexity → model mapping. */
36
+ export type DagModelMap = Record<Complexity, string>;
37
+ /**
38
+ * Per-runner model mapping. Legacy flat schema is normalized into this form
39
+ * by the YAML parser.
40
+ */
41
+ export type DagModels = Partial<Record<RunnerName, DagModelMap>>;
17
42
  export interface Dag {
18
43
  title: string;
19
44
  version: string;
20
- models: Record<string, string>;
45
+ generated?: string;
46
+ limits?: DagLimits;
47
+ models: DagModels;
21
48
  tasks: DagTask[];
22
49
  }
50
+ /** Defaults used when a YAML omits the `limits` block. */
51
+ export declare const DEFAULT_DAG_LIMITS: DagLimits;
23
52
  export interface RunDagOptions {
24
53
  parallel: boolean;
25
- runner: string;
54
+ runner: RunnerName | string;
26
55
  canvasPath: string;
56
+ /** When true, only PENDING/FAILED tasks run (DONE/SKIPPED are kept). */
57
+ resume?: boolean;
58
+ /** Restrict execution to a single task id. */
59
+ onlyTaskId?: string;
27
60
  }
28
61
  /**
29
- * Main DAG runner - executes tasks in parallel based on dependency ranks
62
+ * Execute the DAG. Tasks are statefully mutated in place: status, output,
63
+ * error, tokens and duration get filled in as execution progresses.
30
64
  */
31
65
  export declare function runDag(dag: Dag, options: RunDagOptions): Promise<void>;
66
+ /**
67
+ * Compute execution ranks for tasks based on dependencies.
68
+ * Tasks in the same rank can run in parallel (Kahn's algorithm).
69
+ */
70
+ export declare function computeRanks(tasks: DagTask[]): Map<string, number>;
32
71
  //# sourceMappingURL=run_dag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run_dag.d.ts","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AA2FD;;GAEG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4F5E"}
1
+ {"version":3,"file":"run_dag.d.ts","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;AAC7D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,kFAAkF;IAClF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAEjE,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,EAAE,SAIhC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD5E;AAiMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BlE"}