@dewtech/dare-cli 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -27
- package/dist/__tests__/dag-runner/graph-ingest.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.js +105 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.js.map +1 -0
- package/dist/__tests__/dag-runner/orchestrator.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/orchestrator.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/orchestrator.test.js +107 -0
- package/dist/__tests__/dag-runner/orchestrator.test.js.map +1 -0
- package/dist/__tests__/dag-runner/utils.test.js +0 -28
- package/dist/__tests__/dag-runner/utils.test.js.map +1 -1
- package/dist/__tests__/graphrag/json-graph.test.d.ts +2 -0
- package/dist/__tests__/graphrag/json-graph.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/json-graph.test.js +57 -0
- package/dist/__tests__/graphrag/json-graph.test.js.map +1 -0
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +165 -46
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/graph.d.ts +9 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +155 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/dag-runner/graph-ingest.d.ts +17 -0
- package/dist/dag-runner/graph-ingest.d.ts.map +1 -0
- package/dist/dag-runner/graph-ingest.js +149 -0
- package/dist/dag-runner/graph-ingest.js.map +1 -0
- package/dist/dag-runner/run_dag.d.ts +47 -30
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +145 -166
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/dag-runner/state-store.d.ts +13 -0
- package/dist/dag-runner/state-store.d.ts.map +1 -0
- package/dist/dag-runner/state-store.js +69 -0
- package/dist/dag-runner/state-store.js.map +1 -0
- package/dist/dag-runner/utils/cap-output.d.ts.map +1 -1
- package/dist/dag-runner/utils/cap-output.js +5 -2
- package/dist/dag-runner/utils/cap-output.js.map +1 -1
- package/dist/graphrag/factory.d.ts +25 -0
- package/dist/graphrag/factory.d.ts.map +1 -0
- package/dist/graphrag/factory.js +66 -0
- package/dist/graphrag/factory.js.map +1 -0
- package/dist/graphrag/index.d.ts +4 -0
- package/dist/graphrag/index.d.ts.map +1 -1
- package/dist/graphrag/index.js +2 -0
- package/dist/graphrag/index.js.map +1 -1
- package/dist/graphrag/json-graph.d.ts +28 -0
- package/dist/graphrag/json-graph.d.ts.map +1 -0
- package/dist/graphrag/json-graph.js +168 -0
- package/dist/graphrag/json-graph.js.map +1 -0
- package/dist/graphrag/knowledge-graph.d.ts +33 -0
- package/dist/graphrag/knowledge-graph.d.ts.map +1 -0
- package/dist/graphrag/knowledge-graph.js +2 -0
- package/dist/graphrag/knowledge-graph.js.map +1 -0
- package/dist/index.d.ts +13 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -4
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +99 -96
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +68 -69
- package/templates/ide/cursor/.cursor/commands/run-dag.md +67 -44
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +97 -87
package/dist/commands/execute.js
CHANGED
|
@@ -2,67 +2,186 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import fs from 'fs-extra';
|
|
4
4
|
import path from 'path';
|
|
5
|
-
import {
|
|
5
|
+
import { applyCascadingSkip, buildTaskPrompt, computeRanks, markDone, markFailed, markRunning, nextExecutableTasks, renderCanvas, } from '../dag-runner/run_dag.js';
|
|
6
6
|
import { convertYamlToDag } from '../utils/dag-converter.js';
|
|
7
|
+
import { createGraph, loadGraphConfig } from '../graphrag/index.js';
|
|
8
|
+
import { DEFAULT_STATE_PATH, loadAndApplyState, saveState, } from '../dag-runner/state-store.js';
|
|
7
9
|
export const executeCommand = new Command('execute')
|
|
8
|
-
.description('
|
|
9
|
-
.option('--parallel', 'Execute independent tasks in parallel by rank', false)
|
|
10
|
-
.option('--runner <runner>', 'Runner: cursor | claude | antigravity', 'cursor')
|
|
10
|
+
.description('Orchestrate DAG execution (the IDE agent runs each task)')
|
|
11
11
|
.option('--dag <file>', 'Path to dare-dag.yaml', 'DARE/dare-dag.yaml')
|
|
12
|
-
.option('--
|
|
13
|
-
.option('--
|
|
12
|
+
.option('--next', 'Print the next executable tasks (with composed prompts)', false)
|
|
13
|
+
.option('--status', 'Render canvas and show summary (default action)', false)
|
|
14
|
+
.option('--complete <id>', 'Mark a task DONE (use with --output)')
|
|
15
|
+
.option('--fail <id>', 'Mark a task FAILED (use with --reason)')
|
|
16
|
+
.option('--reset <id>', 'Reset a task back to PENDING')
|
|
17
|
+
.option('--output <text>', 'Captured task output (used with --complete)')
|
|
18
|
+
.option('--reason <text>', 'Failure reason (used with --fail)')
|
|
19
|
+
.option('--tokens <n>', 'Tokens consumed (used with --complete)')
|
|
20
|
+
.option('--duration <ms>', 'Task duration in ms (used with --complete)')
|
|
21
|
+
.option('--no-graph', 'Skip knowledge-graph ingestion for this call', false)
|
|
22
|
+
.option('--parallel-hint', 'When using --next, mark every rank-equal task as RUNNING', false)
|
|
14
23
|
.action(async (options) => {
|
|
15
|
-
|
|
16
|
-
const dagPath = path.resolve(
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
const dagPath = path.resolve(cwd, options.dag);
|
|
26
|
+
const canvasPath = path.resolve(cwd, 'DARE/.canvas.md');
|
|
17
27
|
if (!(await fs.pathExists(dagPath))) {
|
|
18
|
-
console.error(chalk.red(`❌
|
|
28
|
+
console.error(chalk.red(`❌ ${options.dag} not found.`));
|
|
19
29
|
console.log(chalk.yellow('Run: dare blueprint'));
|
|
20
30
|
process.exit(1);
|
|
21
31
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
const stateFile = path.resolve(cwd, DEFAULT_STATE_PATH);
|
|
33
|
+
const dag = await loadDag(dagPath);
|
|
34
|
+
await loadAndApplyState(dag, stateFile);
|
|
35
|
+
const graph = options.noGraph ? undefined : await tryOpenGraph(cwd);
|
|
36
|
+
try {
|
|
37
|
+
if (options.complete) {
|
|
38
|
+
await handleComplete(dag, options, stateFile, canvasPath, graph);
|
|
39
|
+
}
|
|
40
|
+
else if (options.fail) {
|
|
41
|
+
await handleFail(dag, options, stateFile, canvasPath, graph);
|
|
42
|
+
}
|
|
43
|
+
else if (options.reset) {
|
|
44
|
+
await handleReset(dag, options.reset, stateFile, canvasPath);
|
|
45
|
+
}
|
|
46
|
+
else if (options.next) {
|
|
47
|
+
await handleNext(dag, options, stateFile, canvasPath);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Default: --status
|
|
51
|
+
await handleStatus(dag, canvasPath);
|
|
52
|
+
}
|
|
25
53
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
54
|
+
finally {
|
|
55
|
+
graph?.close();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ─── Handlers ────────────────────────────────────────────────────────────────
|
|
59
|
+
async function handleNext(dag, options, stateFile, canvasPath) {
|
|
60
|
+
const newlySkipped = applyCascadingSkip(dag);
|
|
61
|
+
if (newlySkipped.length > 0) {
|
|
62
|
+
console.log(chalk.gray(`↷ Auto-skipped ${newlySkipped.length} blocked task(s).`));
|
|
63
|
+
}
|
|
64
|
+
const ready = nextExecutableTasks(dag, true);
|
|
65
|
+
if (ready.length === 0) {
|
|
66
|
+
const remaining = dag.tasks.some((t) => t.status === 'PENDING' || t.status === 'RUNNING');
|
|
67
|
+
if (remaining) {
|
|
68
|
+
console.log(chalk.yellow('⏸ No tasks ready right now (waiting on RUNNING tasks to complete).'));
|
|
33
69
|
}
|
|
34
|
-
|
|
70
|
+
else {
|
|
71
|
+
console.log(chalk.green('✅ All tasks resolved. Run `dare execute --status` for the summary.'));
|
|
72
|
+
}
|
|
73
|
+
await persist(dag, stateFile, canvasPath);
|
|
74
|
+
return;
|
|
35
75
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
console.log();
|
|
76
|
+
const ranks = computeRanks(dag.tasks);
|
|
77
|
+
const rank = ranks.get(ready[0].id) ?? 0;
|
|
78
|
+
console.log(chalk.blue.bold(`\n📦 Rank ${rank} — ${ready.length} task(s) ready in parallel\n`));
|
|
79
|
+
for (const task of ready) {
|
|
80
|
+
if (options.parallelHint)
|
|
81
|
+
markRunning(dag, task.id);
|
|
82
|
+
printTaskBriefing(dag, task);
|
|
44
83
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
84
|
+
await persist(dag, stateFile, canvasPath);
|
|
85
|
+
console.log(chalk.cyan('\nNext steps for the IDE agent:'));
|
|
86
|
+
console.log(' 1. Execute each task above (parallel or sequential — your choice).');
|
|
87
|
+
console.log(' 2. After each task: `dare execute --complete <id> --output "<summary>"`');
|
|
88
|
+
console.log(' 3. On failure: `dare execute --fail <id> --reason "<message>"`');
|
|
89
|
+
console.log(' 4. When this rank finishes, run `dare execute --next` again.\n');
|
|
90
|
+
}
|
|
91
|
+
async function handleComplete(dag, options, stateFile, canvasPath, graph) {
|
|
92
|
+
const taskId = options.complete;
|
|
93
|
+
const tokens = options.tokens ? parseInt(options.tokens, 10) : undefined;
|
|
94
|
+
const duration = options.duration ? parseInt(options.duration, 10) : undefined;
|
|
95
|
+
const task = markDone(dag, taskId, {
|
|
96
|
+
output: options.output,
|
|
97
|
+
tokens,
|
|
98
|
+
durationMs: duration,
|
|
99
|
+
graph,
|
|
100
|
+
});
|
|
101
|
+
console.log(chalk.green(`✅ ${task.id} marked as DONE.`));
|
|
102
|
+
if (task.tokens)
|
|
103
|
+
console.log(chalk.gray(` tokens: ${task.tokens}`));
|
|
104
|
+
if (task.duration)
|
|
105
|
+
console.log(chalk.gray(` duration: ${task.duration}ms`));
|
|
106
|
+
await persist(dag, stateFile, canvasPath);
|
|
107
|
+
}
|
|
108
|
+
async function handleFail(dag, options, stateFile, canvasPath, graph) {
|
|
109
|
+
const taskId = options.fail;
|
|
110
|
+
const duration = options.duration ? parseInt(options.duration, 10) : undefined;
|
|
111
|
+
const task = markFailed(dag, taskId, {
|
|
112
|
+
error: options.reason ?? 'unspecified',
|
|
113
|
+
durationMs: duration,
|
|
114
|
+
graph,
|
|
115
|
+
});
|
|
116
|
+
console.log(chalk.red(`❌ ${task.id} marked as FAILED: ${task.error}`));
|
|
117
|
+
const skipped = dag.tasks.filter((t) => t.status === 'SKIPPED');
|
|
118
|
+
if (skipped.length > 0) {
|
|
119
|
+
console.log(chalk.gray(` Cascading-skipped: ${skipped.map((t) => t.id).join(', ')}`));
|
|
53
120
|
}
|
|
54
|
-
|
|
55
|
-
|
|
121
|
+
await persist(dag, stateFile, canvasPath);
|
|
122
|
+
}
|
|
123
|
+
async function handleReset(dag, taskId, stateFile, canvasPath) {
|
|
124
|
+
const task = dag.tasks.find((t) => t.id === taskId);
|
|
125
|
+
if (!task) {
|
|
126
|
+
console.error(chalk.red(`❌ Task "${taskId}" not found.`));
|
|
56
127
|
process.exit(1);
|
|
57
128
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
129
|
+
task.status = 'PENDING';
|
|
130
|
+
task.error = undefined;
|
|
131
|
+
task.output = undefined;
|
|
132
|
+
task.duration = undefined;
|
|
133
|
+
task.tokens = undefined;
|
|
134
|
+
console.log(chalk.cyan(`↺ ${task.id} reset to PENDING.`));
|
|
135
|
+
await persist(dag, stateFile, canvasPath);
|
|
136
|
+
}
|
|
137
|
+
async function handleStatus(dag, canvasPath) {
|
|
138
|
+
await renderCanvas(dag, canvasPath);
|
|
139
|
+
const counts = {
|
|
140
|
+
PENDING: 0,
|
|
141
|
+
RUNNING: 0,
|
|
142
|
+
DONE: 0,
|
|
143
|
+
FAILED: 0,
|
|
144
|
+
SKIPPED: 0,
|
|
145
|
+
};
|
|
146
|
+
for (const t of dag.tasks)
|
|
147
|
+
counts[t.status ?? 'PENDING']++;
|
|
148
|
+
console.log(chalk.blue.bold(`\n📊 ${dag.title}\n`));
|
|
149
|
+
console.log(` ✅ DONE : ${counts.DONE}`);
|
|
150
|
+
console.log(` 🔄 RUNNING : ${counts.RUNNING}`);
|
|
151
|
+
console.log(` ⏳ PENDING : ${counts.PENDING}`);
|
|
152
|
+
console.log(` ❌ FAILED : ${counts.FAILED}`);
|
|
153
|
+
console.log(` ⏭️ SKIPPED : ${counts.SKIPPED}`);
|
|
154
|
+
console.log(chalk.cyan(`\n 📄 Canvas: ${canvasPath}\n`));
|
|
155
|
+
}
|
|
156
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
157
|
+
async function loadDag(dagPath) {
|
|
158
|
+
const yaml = await fs.readFile(dagPath, 'utf-8');
|
|
159
|
+
return convertYamlToDag(yaml);
|
|
160
|
+
}
|
|
161
|
+
async function persist(dag, stateFile, canvasPath) {
|
|
162
|
+
await saveState(dag, stateFile);
|
|
163
|
+
await renderCanvas(dag, canvasPath);
|
|
164
|
+
}
|
|
165
|
+
async function tryOpenGraph(cwd) {
|
|
166
|
+
try {
|
|
167
|
+
const config = await loadGraphConfig({ cwd });
|
|
168
|
+
return await createGraph(config, { cwd });
|
|
62
169
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
170
|
+
catch (err) {
|
|
171
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
172
|
+
console.log(chalk.gray(`(graph disabled: ${msg})`));
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function printTaskBriefing(dag, task) {
|
|
177
|
+
console.log(chalk.bold(`▸ ${task.id} — ${task.title}`));
|
|
178
|
+
console.log(chalk.gray(` complexity: ${task.complexity}`));
|
|
179
|
+
if (task.spec_file)
|
|
180
|
+
console.log(chalk.gray(` spec_file: ${task.spec_file}`));
|
|
181
|
+
console.log(chalk.gray(' prompt:'));
|
|
182
|
+
const prompt = buildTaskPrompt(dag, task);
|
|
183
|
+
for (const line of prompt.split('\n'))
|
|
184
|
+
console.log(` ${line}`);
|
|
185
|
+
console.log();
|
|
67
186
|
}
|
|
68
187
|
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `dare graph` — query and visualize the project's knowledge graph.
|
|
4
|
+
*
|
|
5
|
+
* The graph is populated automatically by `dare execute --complete/--fail`.
|
|
6
|
+
* Use these subcommands to inspect, search and export it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const graphCommand: Command;
|
|
9
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,SACuC,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { convertYamlToDag } from '../utils/dag-converter.js';
|
|
6
|
+
import { ingestDag } from '../dag-runner/graph-ingest.js';
|
|
7
|
+
import { loadAndApplyState } from '../dag-runner/state-store.js';
|
|
8
|
+
import { createGraph, loadGraphConfig } from '../graphrag/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* `dare graph` — query and visualize the project's knowledge graph.
|
|
11
|
+
*
|
|
12
|
+
* The graph is populated automatically by `dare execute --complete/--fail`.
|
|
13
|
+
* Use these subcommands to inspect, search and export it.
|
|
14
|
+
*/
|
|
15
|
+
export const graphCommand = new Command('graph')
|
|
16
|
+
.description('Inspect and visualize the DARE knowledge graph');
|
|
17
|
+
graphCommand
|
|
18
|
+
.command('stats')
|
|
19
|
+
.description('Show node/edge counts and type breakdown')
|
|
20
|
+
.action(async () => {
|
|
21
|
+
await withGraph(async (graph) => {
|
|
22
|
+
const stats = graph.getStatistics();
|
|
23
|
+
console.log(chalk.blue.bold('\n📊 DARE Knowledge Graph\n'));
|
|
24
|
+
console.log(` Total nodes: ${chalk.cyan(stats.totalNodes)}`);
|
|
25
|
+
console.log(` Total edges: ${chalk.cyan(stats.totalEdges)}`);
|
|
26
|
+
if (Object.keys(stats.nodesByType).length > 0) {
|
|
27
|
+
console.log(chalk.bold('\n Nodes by type:'));
|
|
28
|
+
for (const [type, count] of Object.entries(stats.nodesByType)) {
|
|
29
|
+
console.log(` ${type.padEnd(12)} ${count}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (Object.keys(stats.edgesByType).length > 0) {
|
|
33
|
+
console.log(chalk.bold('\n Edges by type:'));
|
|
34
|
+
for (const [type, count] of Object.entries(stats.edgesByType)) {
|
|
35
|
+
console.log(` ${type.padEnd(12)} ${count}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
console.log();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
graphCommand
|
|
42
|
+
.command('query <term>')
|
|
43
|
+
.description('Search nodes whose label/description contains <term>')
|
|
44
|
+
.option('-l, --limit <n>', 'Maximum results', '10')
|
|
45
|
+
.action(async (term, options) => {
|
|
46
|
+
const limit = parseInt(options.limit, 10) || 10;
|
|
47
|
+
await withGraph(async (graph) => {
|
|
48
|
+
const results = graph.searchNodes(term, limit);
|
|
49
|
+
if (results.length === 0) {
|
|
50
|
+
console.log(chalk.yellow(`No matches for "${term}".`));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.blue.bold(`\n🔎 ${results.length} match(es) for "${term}"\n`));
|
|
54
|
+
for (const r of results) {
|
|
55
|
+
console.log(`${chalk.cyan(r.node.id)} ${chalk.gray(`[${r.node.type}]`)}`);
|
|
56
|
+
console.log(` ${r.node.label}`);
|
|
57
|
+
if (r.snippet)
|
|
58
|
+
console.log(chalk.gray(` ${r.snippet}`));
|
|
59
|
+
console.log();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
graphCommand
|
|
64
|
+
.command('viz')
|
|
65
|
+
.description('Export the graph to a Mermaid or DOT diagram')
|
|
66
|
+
.option('-f, --format <fmt>', 'Output format: mermaid | dot', 'mermaid')
|
|
67
|
+
.option('-o, --output <file>', 'Write to file (defaults to stdout)')
|
|
68
|
+
.action(async (options) => {
|
|
69
|
+
const format = options.format.toLowerCase();
|
|
70
|
+
if (format !== 'mermaid' && format !== 'dot') {
|
|
71
|
+
console.error(chalk.red(`Unsupported format "${options.format}". Use: mermaid | dot.`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
await withGraph(async (graph) => {
|
|
75
|
+
const { nodes, edges } = graph.exportToJson();
|
|
76
|
+
const rendered = format === 'mermaid' ? renderMermaid(nodes, edges) : renderDot(nodes, edges);
|
|
77
|
+
if (options.output) {
|
|
78
|
+
await fs.writeFile(options.output, rendered);
|
|
79
|
+
console.log(chalk.green(`✅ Wrote ${nodes.length} nodes / ${edges.length} edges to ${options.output}`));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(rendered);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
graphCommand
|
|
87
|
+
.command('ingest')
|
|
88
|
+
.description('Re-sync the graph from the current dare-dag.yaml + state')
|
|
89
|
+
.option('--dag <file>', 'Path to dare-dag.yaml', 'DARE/dare-dag.yaml')
|
|
90
|
+
.action(async (options) => {
|
|
91
|
+
const cwd = process.cwd();
|
|
92
|
+
const dagPath = path.resolve(cwd, options.dag);
|
|
93
|
+
if (!(await fs.pathExists(dagPath))) {
|
|
94
|
+
console.error(chalk.red(`❌ ${options.dag} not found.`));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
const dag = convertYamlToDag(await fs.readFile(dagPath, 'utf-8'));
|
|
98
|
+
await loadAndApplyState(dag, path.resolve(cwd, '.dare/state.json'));
|
|
99
|
+
await withGraph(async (graph) => {
|
|
100
|
+
ingestDag(graph, dag);
|
|
101
|
+
const stats = graph.getStatistics();
|
|
102
|
+
console.log(chalk.green(`✅ Re-ingested ${dag.tasks.length} tasks. Graph now has ${stats.totalNodes} nodes / ${stats.totalEdges} edges.`));
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
106
|
+
async function withGraph(fn) {
|
|
107
|
+
const cwd = process.cwd();
|
|
108
|
+
let graph;
|
|
109
|
+
try {
|
|
110
|
+
const config = await loadGraphConfig({ cwd });
|
|
111
|
+
graph = await createGraph(config, { cwd });
|
|
112
|
+
await fn(graph);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(chalk.red(`❌ ${err instanceof Error ? err.message : String(err)}`));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
graph?.close();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function renderMermaid(nodes, edges) {
|
|
123
|
+
const lines = ['graph LR'];
|
|
124
|
+
for (const n of nodes) {
|
|
125
|
+
const safeId = sanitizeMermaidId(n.id);
|
|
126
|
+
const label = `${n.label}\\n[${n.type}]`.replace(/"/g, '"');
|
|
127
|
+
lines.push(` ${safeId}["${label}"]`);
|
|
128
|
+
}
|
|
129
|
+
for (const e of edges) {
|
|
130
|
+
const src = sanitizeMermaidId(e.sourceId);
|
|
131
|
+
const tgt = sanitizeMermaidId(e.targetId);
|
|
132
|
+
lines.push(` ${src} -- ${e.type} --> ${tgt}`);
|
|
133
|
+
}
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
function renderDot(nodes, edges) {
|
|
137
|
+
const lines = ['digraph DARE {', ' rankdir=LR;', ' node [shape=box];'];
|
|
138
|
+
for (const n of nodes) {
|
|
139
|
+
const id = JSON.stringify(n.id);
|
|
140
|
+
const label = JSON.stringify(`${n.label}\n[${n.type}]`);
|
|
141
|
+
lines.push(` ${id} [label=${label}];`);
|
|
142
|
+
}
|
|
143
|
+
for (const e of edges) {
|
|
144
|
+
const src = JSON.stringify(e.sourceId);
|
|
145
|
+
const tgt = JSON.stringify(e.targetId);
|
|
146
|
+
const lbl = JSON.stringify(e.type);
|
|
147
|
+
lines.push(` ${src} -> ${tgt} [label=${lbl}];`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('}');
|
|
150
|
+
return lines.join('\n');
|
|
151
|
+
}
|
|
152
|
+
function sanitizeMermaidId(id) {
|
|
153
|
+
return id.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Dag, DagTask } from './run_dag.js';
|
|
2
|
+
import type { KnowledgeGraph } from '../graphrag/knowledge-graph.js';
|
|
3
|
+
export interface IngestOptions {
|
|
4
|
+
/** Project root used to resolve relative file paths. Defaults to cwd. */
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Ingest a single task. Idempotent — re-running upserts by id.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ingestTask(graph: KnowledgeGraph, task: DagTask, dag: Dag, _opts?: IngestOptions): void;
|
|
11
|
+
/**
|
|
12
|
+
* Ingest every task of a DAG. Useful for `dare graph ingest` after an
|
|
13
|
+
* execution finishes (re-syncs the graph from in-memory DAG state).
|
|
14
|
+
*/
|
|
15
|
+
export declare function ingestDag(graph: KnowledgeGraph, dag: Dag, opts?: IngestOptions): void;
|
|
16
|
+
export declare function extractFilePaths(text: string): string[];
|
|
17
|
+
//# sourceMappingURL=graph-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-ingest.d.ts","sourceRoot":"","sources":["../../src/dag-runner/graph-ingest.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,GAAG,EACR,KAAK,GAAE,aAAkB,GACxB,IAAI,CA+CN;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,aAAkB,GAAG,IAAI,CAEzF;AAqBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBvD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ingest a finished DAG task into the knowledge graph.
|
|
3
|
+
*
|
|
4
|
+
* For each task we add:
|
|
5
|
+
* - one `task` node with status / duration / tokens metadata
|
|
6
|
+
* - one `depends_on` edge per parent task in the DAG
|
|
7
|
+
* - one `file` node + `implements` edge for each file the task touched
|
|
8
|
+
*
|
|
9
|
+
* "Files touched" are inferred heuristically from the task's captured output:
|
|
10
|
+
* - explicit markers ("Created: …", "Modified: …", "File: …", "wrote …")
|
|
11
|
+
* - bare path-like tokens with extensions (e.g. `src/auth.ts`, `tests/x.py`)
|
|
12
|
+
*
|
|
13
|
+
* The heuristic is intentionally simple — false positives are tolerated;
|
|
14
|
+
* the graph is meant to power discovery, not be a build-system source of truth.
|
|
15
|
+
*/
|
|
16
|
+
import path from 'path';
|
|
17
|
+
/**
|
|
18
|
+
* Ingest a single task. Idempotent — re-running upserts by id.
|
|
19
|
+
*/
|
|
20
|
+
export function ingestTask(graph, task, dag, _opts = {}) {
|
|
21
|
+
if (!task.status || task.status === 'PENDING' || task.status === 'RUNNING')
|
|
22
|
+
return;
|
|
23
|
+
// 1) task node
|
|
24
|
+
graph.addNode({
|
|
25
|
+
id: nodeId('task', task.id),
|
|
26
|
+
type: 'task',
|
|
27
|
+
label: task.title,
|
|
28
|
+
description: task.subtask_prompt.slice(0, 500),
|
|
29
|
+
metadata: {
|
|
30
|
+
status: task.status,
|
|
31
|
+
complexity: task.complexity,
|
|
32
|
+
tokens: task.tokens,
|
|
33
|
+
duration_ms: task.duration,
|
|
34
|
+
error: task.error,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// 2) depends_on edges (mirror DAG)
|
|
38
|
+
for (const parentId of task.depends_on) {
|
|
39
|
+
graph.addEdge({
|
|
40
|
+
id: edgeId('depends_on', task.id, parentId),
|
|
41
|
+
sourceId: nodeId('task', task.id),
|
|
42
|
+
targetId: nodeId('task', parentId),
|
|
43
|
+
type: 'depends_on',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// 3) file nodes + implements edges (only for DONE tasks)
|
|
47
|
+
if (task.status !== 'DONE' || !task.output)
|
|
48
|
+
return;
|
|
49
|
+
const files = extractFilePaths(task.output);
|
|
50
|
+
for (const filePath of files) {
|
|
51
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
52
|
+
graph.addNode({
|
|
53
|
+
id: nodeId('file', normalized),
|
|
54
|
+
type: 'file',
|
|
55
|
+
label: path.basename(normalized),
|
|
56
|
+
description: normalized,
|
|
57
|
+
metadata: { path: normalized, language: detectLanguage(normalized) },
|
|
58
|
+
});
|
|
59
|
+
graph.addEdge({
|
|
60
|
+
id: edgeId('implements', task.id, normalized),
|
|
61
|
+
sourceId: nodeId('task', task.id),
|
|
62
|
+
targetId: nodeId('file', normalized),
|
|
63
|
+
type: 'implements',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Ingest every task of a DAG. Useful for `dare graph ingest` after an
|
|
69
|
+
* execution finishes (re-syncs the graph from in-memory DAG state).
|
|
70
|
+
*/
|
|
71
|
+
export function ingestDag(graph, dag, opts = {}) {
|
|
72
|
+
for (const task of dag.tasks)
|
|
73
|
+
ingestTask(graph, task, dag, opts);
|
|
74
|
+
}
|
|
75
|
+
// ─── Heuristics ─────────────────────────────────────────────────────────────
|
|
76
|
+
// Find any token that contains a '/' and ends with .ext — explicit anchors and
|
|
77
|
+
// punctuation-trimming is handled in `looksLikePath` after extraction.
|
|
78
|
+
const FILE_PATH_REGEX = /[./\w-]+\/[./\w-]+/g;
|
|
79
|
+
const EXPLICIT_MARKERS = [
|
|
80
|
+
/(?:created|modified|wrote|updated|added|new file)[:\s]+([^\s`'"]+)/gi,
|
|
81
|
+
/(?:^|\n)\s*[-*]\s+([^\s`'"]+\.[a-zA-Z]{1,8})\s*$/gm,
|
|
82
|
+
];
|
|
83
|
+
const COMMON_EXTENSIONS = new Set([
|
|
84
|
+
'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs',
|
|
85
|
+
'py', 'rs', 'go', 'java', 'kt', 'swift',
|
|
86
|
+
'php', 'rb', 'cs', 'cpp', 'c', 'h', 'hpp',
|
|
87
|
+
'json', 'yaml', 'yml', 'toml', 'xml', 'html',
|
|
88
|
+
'css', 'scss', 'less', 'vue', 'svelte',
|
|
89
|
+
'md', 'mdx', 'sql', 'sh', 'bash', 'env', 'lock', 'gitignore',
|
|
90
|
+
]);
|
|
91
|
+
export function extractFilePaths(text) {
|
|
92
|
+
// Strip http/https URLs first so the path heuristic doesn't pick up
|
|
93
|
+
// tokens like "example.com/a.ts".
|
|
94
|
+
const sanitized = text.replace(/https?:\/\/\S+/g, ' ');
|
|
95
|
+
const found = new Set();
|
|
96
|
+
for (const re of EXPLICIT_MARKERS) {
|
|
97
|
+
re.lastIndex = 0;
|
|
98
|
+
for (let m; (m = re.exec(sanitized));) {
|
|
99
|
+
const cleaned = stripWrappers(m[1]);
|
|
100
|
+
if (looksLikePath(cleaned))
|
|
101
|
+
found.add(cleaned);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
FILE_PATH_REGEX.lastIndex = 0;
|
|
105
|
+
for (let m; (m = FILE_PATH_REGEX.exec(sanitized));) {
|
|
106
|
+
const cleaned = stripWrappers(m[0]);
|
|
107
|
+
if (looksLikePath(cleaned))
|
|
108
|
+
found.add(cleaned);
|
|
109
|
+
}
|
|
110
|
+
return [...found];
|
|
111
|
+
}
|
|
112
|
+
function looksLikePath(p) {
|
|
113
|
+
if (p.length === 0 || p.length > 200)
|
|
114
|
+
return false;
|
|
115
|
+
if (p.startsWith('http://') || p.startsWith('https://'))
|
|
116
|
+
return false;
|
|
117
|
+
const dot = p.lastIndexOf('.');
|
|
118
|
+
if (dot < 0)
|
|
119
|
+
return false;
|
|
120
|
+
const ext = p.slice(dot + 1).toLowerCase();
|
|
121
|
+
return COMMON_EXTENSIONS.has(ext);
|
|
122
|
+
}
|
|
123
|
+
function stripWrappers(s) {
|
|
124
|
+
return s.replace(/^[`'"(\[]+|[`'")\],.;:!?]+$/g, '').trim();
|
|
125
|
+
}
|
|
126
|
+
function detectLanguage(filePath) {
|
|
127
|
+
const ext = path.extname(filePath).slice(1).toLowerCase();
|
|
128
|
+
const map = {
|
|
129
|
+
ts: 'typescript', tsx: 'typescript',
|
|
130
|
+
js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',
|
|
131
|
+
py: 'python',
|
|
132
|
+
rs: 'rust',
|
|
133
|
+
go: 'go',
|
|
134
|
+
java: 'java',
|
|
135
|
+
php: 'php',
|
|
136
|
+
rb: 'ruby',
|
|
137
|
+
vue: 'vue',
|
|
138
|
+
svelte: 'svelte',
|
|
139
|
+
sql: 'sql',
|
|
140
|
+
};
|
|
141
|
+
return map[ext];
|
|
142
|
+
}
|
|
143
|
+
function nodeId(type, id) {
|
|
144
|
+
return `${type}:${id}`;
|
|
145
|
+
}
|
|
146
|
+
function edgeId(kind, from, to) {
|
|
147
|
+
return `${kind}:${from}->${to}`;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=graph-ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-ingest.js","sourceRoot":"","sources":["../../src/dag-runner/graph-ingest.ts"],"names":[],"mappings":"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"}
|