@dewtech/dare-cli 2.1.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.
Files changed (95) hide show
  1. package/README.md +53 -7
  2. package/dist/__tests__/dag-runner/adapters.test.d.ts +2 -0
  3. package/dist/__tests__/dag-runner/adapters.test.d.ts.map +1 -0
  4. package/dist/__tests__/dag-runner/adapters.test.js +134 -0
  5. package/dist/__tests__/dag-runner/adapters.test.js.map +1 -0
  6. package/dist/__tests__/dag-runner/graph-ingest.test.d.ts +2 -0
  7. package/dist/__tests__/dag-runner/graph-ingest.test.d.ts.map +1 -0
  8. package/dist/__tests__/dag-runner/graph-ingest.test.js +105 -0
  9. package/dist/__tests__/dag-runner/graph-ingest.test.js.map +1 -0
  10. package/dist/__tests__/dag-runner/orchestrator.test.d.ts +2 -0
  11. package/dist/__tests__/dag-runner/orchestrator.test.d.ts.map +1 -0
  12. package/dist/__tests__/dag-runner/orchestrator.test.js +107 -0
  13. package/dist/__tests__/dag-runner/orchestrator.test.js.map +1 -0
  14. package/dist/__tests__/dag-runner/utils.test.d.ts +2 -0
  15. package/dist/__tests__/dag-runner/utils.test.d.ts.map +1 -0
  16. package/dist/__tests__/dag-runner/utils.test.js +47 -0
  17. package/dist/__tests__/dag-runner/utils.test.js.map +1 -0
  18. package/dist/__tests__/graphrag/json-graph.test.d.ts +2 -0
  19. package/dist/__tests__/graphrag/json-graph.test.d.ts.map +1 -0
  20. package/dist/__tests__/graphrag/json-graph.test.js +57 -0
  21. package/dist/__tests__/graphrag/json-graph.test.js.map +1 -0
  22. package/dist/bin/dare.js +2 -0
  23. package/dist/bin/dare.js.map +1 -1
  24. package/dist/commands/execute.d.ts.map +1 -1
  25. package/dist/commands/execute.js +172 -45
  26. package/dist/commands/execute.js.map +1 -1
  27. package/dist/commands/graph.d.ts +9 -0
  28. package/dist/commands/graph.d.ts.map +1 -0
  29. package/dist/commands/graph.js +155 -0
  30. package/dist/commands/graph.js.map +1 -0
  31. package/dist/dag-runner/adapters/antigravity.d.ts +6 -0
  32. package/dist/dag-runner/adapters/antigravity.d.ts.map +1 -0
  33. package/dist/dag-runner/adapters/antigravity.js +54 -0
  34. package/dist/dag-runner/adapters/antigravity.js.map +1 -0
  35. package/dist/dag-runner/adapters/claude.d.ts +6 -0
  36. package/dist/dag-runner/adapters/claude.d.ts.map +1 -0
  37. package/dist/dag-runner/adapters/claude.js +48 -0
  38. package/dist/dag-runner/adapters/claude.js.map +1 -0
  39. package/dist/dag-runner/adapters/cursor.d.ts +6 -0
  40. package/dist/dag-runner/adapters/cursor.d.ts.map +1 -0
  41. package/dist/dag-runner/adapters/cursor.js +58 -0
  42. package/dist/dag-runner/adapters/cursor.js.map +1 -0
  43. package/dist/dag-runner/adapters/index.d.ts +46 -0
  44. package/dist/dag-runner/adapters/index.d.ts.map +1 -0
  45. package/dist/dag-runner/adapters/index.js +55 -0
  46. package/dist/dag-runner/adapters/index.js.map +1 -0
  47. package/dist/dag-runner/graph-ingest.d.ts +17 -0
  48. package/dist/dag-runner/graph-ingest.d.ts.map +1 -0
  49. package/dist/dag-runner/graph-ingest.js +149 -0
  50. package/dist/dag-runner/graph-ingest.js.map +1 -0
  51. package/dist/dag-runner/run_dag.d.ts +51 -24
  52. package/dist/dag-runner/run_dag.d.ts.map +1 -1
  53. package/dist/dag-runner/run_dag.js +163 -109
  54. package/dist/dag-runner/run_dag.js.map +1 -1
  55. package/dist/dag-runner/state-store.d.ts +13 -0
  56. package/dist/dag-runner/state-store.d.ts.map +1 -0
  57. package/dist/dag-runner/state-store.js +69 -0
  58. package/dist/dag-runner/state-store.js.map +1 -0
  59. package/dist/dag-runner/utils/cap-output.d.ts +14 -0
  60. package/dist/dag-runner/utils/cap-output.d.ts.map +1 -0
  61. package/dist/dag-runner/utils/cap-output.js +25 -0
  62. package/dist/dag-runner/utils/cap-output.js.map +1 -0
  63. package/dist/dag-runner/utils/stitch-context.d.ts +24 -0
  64. package/dist/dag-runner/utils/stitch-context.d.ts.map +1 -0
  65. package/dist/dag-runner/utils/stitch-context.js +36 -0
  66. package/dist/dag-runner/utils/stitch-context.js.map +1 -0
  67. package/dist/dag-runner/utils/timeout.d.ts +27 -0
  68. package/dist/dag-runner/utils/timeout.d.ts.map +1 -0
  69. package/dist/dag-runner/utils/timeout.js +55 -0
  70. package/dist/dag-runner/utils/timeout.js.map +1 -0
  71. package/dist/graphrag/factory.d.ts +25 -0
  72. package/dist/graphrag/factory.d.ts.map +1 -0
  73. package/dist/graphrag/factory.js +66 -0
  74. package/dist/graphrag/factory.js.map +1 -0
  75. package/dist/graphrag/index.d.ts +4 -0
  76. package/dist/graphrag/index.d.ts.map +1 -1
  77. package/dist/graphrag/index.js +2 -0
  78. package/dist/graphrag/index.js.map +1 -1
  79. package/dist/graphrag/json-graph.d.ts +28 -0
  80. package/dist/graphrag/json-graph.d.ts.map +1 -0
  81. package/dist/graphrag/json-graph.js +168 -0
  82. package/dist/graphrag/json-graph.js.map +1 -0
  83. package/dist/graphrag/knowledge-graph.d.ts +33 -0
  84. package/dist/graphrag/knowledge-graph.d.ts.map +1 -0
  85. package/dist/graphrag/knowledge-graph.js +2 -0
  86. package/dist/graphrag/knowledge-graph.js.map +1 -0
  87. package/dist/index.d.ts +13 -6
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +12 -5
  90. package/dist/index.js.map +1 -1
  91. package/package.json +1 -1
  92. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +99 -96
  93. package/templates/ide/claude/.claude/commands/dare-dag-run.md +68 -69
  94. package/templates/ide/cursor/.cursor/commands/run-dag.md +67 -44
  95. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +97 -87
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Run an async operation with a hard timeout, backed by `AbortController`.
3
+ *
4
+ * The operation receives the controller's `signal` — adapters MUST forward
5
+ * it to their underlying SDK call (Anthropic, Cursor, Google) so an external
6
+ * abort is honored. If the SDK doesn't support cancellation, we still time
7
+ * out at the JS level via the racing promise.
8
+ *
9
+ * Also accepts an optional `externalSignal` so a SIGINT/SIGTERM listener can
10
+ * cancel everything in flight.
11
+ */
12
+ export class TaskTimeoutError extends Error {
13
+ constructor(timeoutSeconds) {
14
+ super(`Task exceeded ${timeoutSeconds}s timeout`);
15
+ this.timeoutSeconds = timeoutSeconds;
16
+ this.name = 'TaskTimeoutError';
17
+ }
18
+ }
19
+ export class TaskAbortedError extends Error {
20
+ constructor(reason = 'aborted') {
21
+ super(`Task aborted: ${reason}`);
22
+ this.name = 'TaskAbortedError';
23
+ }
24
+ }
25
+ export async function withTimeout(op, { timeoutSeconds, externalSignal }) {
26
+ const controller = new AbortController();
27
+ // Forward external aborts (e.g. SIGINT handler) to our controller.
28
+ const onExternal = () => controller.abort('external');
29
+ if (externalSignal) {
30
+ if (externalSignal.aborted)
31
+ controller.abort('external');
32
+ else
33
+ externalSignal.addEventListener('abort', onExternal, { once: true });
34
+ }
35
+ const timer = setTimeout(() => controller.abort('timeout'), timeoutSeconds * 1000);
36
+ try {
37
+ return await Promise.race([
38
+ op({ signal: controller.signal }),
39
+ new Promise((_, reject) => {
40
+ controller.signal.addEventListener('abort', () => {
41
+ const reason = controller.signal.reason ?? 'aborted';
42
+ reject(reason === 'timeout'
43
+ ? new TaskTimeoutError(timeoutSeconds)
44
+ : new TaskAbortedError(String(reason)));
45
+ }, { once: true });
46
+ }),
47
+ ]);
48
+ }
49
+ finally {
50
+ clearTimeout(timer);
51
+ if (externalSignal)
52
+ externalSignal.removeEventListener('abort', onExternal);
53
+ }
54
+ }
55
+ //# sourceMappingURL=timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/dag-runner/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAA4B,cAAsB;QAChD,KAAK,CAAC,iBAAiB,cAAc,WAAW,CAAC,CAAC;QADxB,mBAAc,GAAd,cAAc,CAAQ;QAEhD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,MAAM,GAAG,SAAS;QAC5B,KAAK,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAuC,EACvC,EAAE,cAAc,EAAE,cAAc,EAAsB;IAEtD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,mEAAmE;IACnE,MAAM,UAAU,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,cAAc,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;YACpD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC/C,MAAM,MAAM,GAAI,UAAU,CAAC,MAAM,CAAC,MAA6B,IAAI,SAAS,CAAC;oBAC7E,MAAM,CAAC,MAAM,KAAK,SAAS;wBACzB,CAAC,CAAC,IAAI,gBAAgB,CAAC,cAAc,CAAC;wBACtC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5C,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,cAAc;YAAE,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { KnowledgeGraph } from './knowledge-graph.js';
2
+ export type GraphBackend = 'sqlite' | 'json' | 'neo4j';
3
+ export interface GraphConfig {
4
+ backend: GraphBackend;
5
+ /** Path to the persistence target, relative to the project root. */
6
+ path?: string;
7
+ }
8
+ /**
9
+ * Resolve graph config:
10
+ * - if `explicit` is given, use it;
11
+ * - otherwise read `dare-graph.yml` from cwd (or `cwd` if provided);
12
+ * - if no file exists, fall back to sqlite at `.dare/graph.db`.
13
+ */
14
+ export declare function loadGraphConfig(opts?: {
15
+ cwd?: string;
16
+ explicit?: GraphConfig;
17
+ }): Promise<GraphConfig>;
18
+ /**
19
+ * Build the backend instance and call `init()`. Caller owns the lifecycle and
20
+ * must call `.close()` when done.
21
+ */
22
+ export declare function createGraph(config: GraphConfig, opts?: {
23
+ cwd?: string;
24
+ }): Promise<KnowledgeGraph>;
25
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/graphrag/factory.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAQD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB5B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `createGraph()` — read `dare-graph.yml` (or take an explicit config) and
3
+ * return the matching backend instance.
4
+ *
5
+ * Supported backends:
6
+ * - `sqlite` → `GraphRAG` (sql.js)
7
+ * - `json` → `JsonGraph` (single JSON file, no native deps)
8
+ * - `neo4j` → not yet implemented (throws with guidance)
9
+ */
10
+ import path from 'path';
11
+ import fs from 'fs-extra';
12
+ import { parse as parseYaml } from 'yaml';
13
+ import { GraphRAG } from './graph-rag.js';
14
+ import { JsonGraph } from './json-graph.js';
15
+ const DEFAULTS = {
16
+ sqlite: '.dare/graph.db',
17
+ json: '.dare/graph.json',
18
+ neo4j: undefined,
19
+ };
20
+ /**
21
+ * Resolve graph config:
22
+ * - if `explicit` is given, use it;
23
+ * - otherwise read `dare-graph.yml` from cwd (or `cwd` if provided);
24
+ * - if no file exists, fall back to sqlite at `.dare/graph.db`.
25
+ */
26
+ export async function loadGraphConfig(opts = {}) {
27
+ if (opts.explicit) {
28
+ return normalize(opts.explicit);
29
+ }
30
+ const cwd = opts.cwd ?? process.cwd();
31
+ const ymlPath = path.join(cwd, 'dare-graph.yml');
32
+ if (!(await fs.pathExists(ymlPath))) {
33
+ return { backend: 'sqlite', path: DEFAULTS.sqlite };
34
+ }
35
+ const raw = (await fs.readFile(ymlPath, 'utf-8')).toString();
36
+ const parsed = (parseYaml(raw) ?? {});
37
+ const backend = parsed.backend ?? 'sqlite';
38
+ const subBlock = parsed[backend] ?? {};
39
+ const filePath = typeof subBlock.path === 'string' ? subBlock.path : DEFAULTS[backend];
40
+ return normalize({ backend, path: filePath });
41
+ }
42
+ /**
43
+ * Build the backend instance and call `init()`. Caller owns the lifecycle and
44
+ * must call `.close()` when done.
45
+ */
46
+ export async function createGraph(config, opts = {}) {
47
+ const cwd = opts.cwd ?? process.cwd();
48
+ const cfg = normalize(config);
49
+ if (cfg.backend === 'neo4j') {
50
+ throw new Error('Neo4j backend is not yet implemented in @dewtech/dare-cli. Use `backend: sqlite` or `backend: json` in dare-graph.yml. (PRs welcome.)');
51
+ }
52
+ if (!cfg.path) {
53
+ throw new Error(`dare-graph.yml is missing the storage path for backend=${cfg.backend}.`);
54
+ }
55
+ const absPath = path.isAbsolute(cfg.path) ? cfg.path : path.resolve(cwd, cfg.path);
56
+ const graph = cfg.backend === 'sqlite' ? new GraphRAG(absPath) : new JsonGraph(absPath);
57
+ await graph.init();
58
+ return graph;
59
+ }
60
+ function normalize(cfg) {
61
+ return {
62
+ backend: cfg.backend,
63
+ path: cfg.path ?? DEFAULTS[cfg.backend],
64
+ };
65
+ }
66
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/graphrag/factory.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
1
  export { GraphRAG } from './graph-rag.js';
2
+ export { JsonGraph } from './json-graph.js';
3
+ export { createGraph, loadGraphConfig } from './factory.js';
4
+ export type { KnowledgeGraph } from './knowledge-graph.js';
5
+ export type { GraphConfig, GraphBackend } from './factory.js';
2
6
  export type { GraphNode, GraphEdge, NodeType, EdgeType, TaskNode, FileNode, SchemaNode, EndpointNode, ComponentNode, SearchResult, GraphStatistics, } from './types.js';
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graphrag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graphrag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -1,2 +1,4 @@
1
1
  export { GraphRAG } from './graph-rag.js';
2
+ export { JsonGraph } from './json-graph.js';
3
+ export { createGraph, loadGraphConfig } from './factory.js';
2
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graphrag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graphrag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { KnowledgeGraph, GraphNode, GraphEdge, NodeType, SearchResult, GraphStatistics } from './knowledge-graph.js';
2
+ export declare class JsonGraph implements KnowledgeGraph {
3
+ private readonly filePath;
4
+ private nodes;
5
+ private edges;
6
+ constructor(filePath: string);
7
+ init(): Promise<void>;
8
+ addNode(node: GraphNode): void;
9
+ getNode(id: string): GraphNode | null;
10
+ queryNodes(type?: NodeType, limit?: number): GraphNode[];
11
+ searchNodes(query: string, limit?: number): SearchResult[];
12
+ deleteNode(id: string): void;
13
+ addEdge(edge: GraphEdge): void;
14
+ getEdges(nodeId: string, direction?: 'out' | 'in' | 'both'): GraphEdge[];
15
+ getNodeDependencies(nodeId: string, depth?: number): GraphNode[];
16
+ getStatistics(): GraphStatistics;
17
+ exportToJson(): {
18
+ nodes: GraphNode[];
19
+ edges: GraphEdge[];
20
+ };
21
+ importFromJson(data: {
22
+ nodes: GraphNode[];
23
+ edges: GraphEdge[];
24
+ }): void;
25
+ close(): void;
26
+ private flushSync;
27
+ }
28
+ //# sourceMappingURL=json-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-graph.d.ts","sourceRoot":"","sources":["../../src/graphrag/json-graph.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,QAAQ,EAER,YAAY,EACZ,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAO9B,qBAAa,SAAU,YAAW,cAAc;IAIlC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,KAAK,CAAgC;gBAEhB,QAAQ,EAAE,MAAM;IAEvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAqB9B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIrC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE;IAOpD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,YAAY,EAAE;IAiBtD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAU5B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAS9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,GAAG,IAAI,GAAG,MAAe,GAAG,SAAS,EAAE;IAQhF,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,SAAS,EAAE;IAqB3D,aAAa,IAAI,eAAe;IAiBhC,YAAY,IAAI;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE;IAI1D,cAAc,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,IAAI;IAKtE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;CAWlB"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * JsonGraph — minimal in-memory knowledge graph persisted to a JSON file.
3
+ *
4
+ * Useful for projects that want zero native dependencies (no sql.js).
5
+ * Trade-offs vs SQLite: no FTS, no SQL queries, full file rewrite on each
6
+ * mutation. Good enough for small DARE projects (<10k nodes).
7
+ */
8
+ import path from 'path';
9
+ import fs from 'fs-extra';
10
+ export class JsonGraph {
11
+ constructor(filePath) {
12
+ this.filePath = filePath;
13
+ this.nodes = new Map();
14
+ this.edges = new Map();
15
+ }
16
+ async init() {
17
+ await fs.ensureDir(path.dirname(this.filePath));
18
+ if (await fs.pathExists(this.filePath)) {
19
+ try {
20
+ const data = (await fs.readJson(this.filePath));
21
+ for (const n of data.nodes ?? [])
22
+ this.nodes.set(n.id, n);
23
+ for (const e of data.edges ?? [])
24
+ this.edges.set(e.id, e);
25
+ }
26
+ catch {
27
+ // corrupt file — start fresh, but keep a backup
28
+ await fs.copy(this.filePath, `${this.filePath}.corrupt-${Date.now()}`);
29
+ }
30
+ }
31
+ this.flushSync();
32
+ }
33
+ // ─── Nodes ────────────────────────────────────────────────────────────────
34
+ addNode(node) {
35
+ const now = new Date().toISOString();
36
+ const existing = this.nodes.get(node.id);
37
+ const merged = existing
38
+ ? {
39
+ ...existing,
40
+ label: node.label,
41
+ description: node.description,
42
+ metadata: node.metadata ?? existing.metadata ?? {},
43
+ updatedAt: now,
44
+ }
45
+ : {
46
+ ...node,
47
+ metadata: node.metadata ?? {},
48
+ createdAt: node.createdAt ?? now,
49
+ updatedAt: now,
50
+ };
51
+ this.nodes.set(node.id, merged);
52
+ this.flushSync();
53
+ }
54
+ getNode(id) {
55
+ return this.nodes.get(id) ?? null;
56
+ }
57
+ queryNodes(type, limit = 20) {
58
+ const all = type
59
+ ? [...this.nodes.values()].filter((n) => n.type === type)
60
+ : [...this.nodes.values()];
61
+ return all.slice(0, limit);
62
+ }
63
+ searchNodes(query, limit = 10) {
64
+ const q = query.toLowerCase();
65
+ const out = [];
66
+ for (const node of this.nodes.values()) {
67
+ const haystack = `${node.label} ${node.description ?? ''}`.toLowerCase();
68
+ if (haystack.includes(q)) {
69
+ out.push({
70
+ node,
71
+ score: 1,
72
+ snippet: node.description?.slice(0, 150),
73
+ });
74
+ if (out.length >= limit)
75
+ break;
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ deleteNode(id) {
81
+ this.nodes.delete(id);
82
+ for (const [edgeId, e] of this.edges) {
83
+ if (e.sourceId === id || e.targetId === id)
84
+ this.edges.delete(edgeId);
85
+ }
86
+ this.flushSync();
87
+ }
88
+ // ─── Edges ────────────────────────────────────────────────────────────────
89
+ addEdge(edge) {
90
+ const existing = this.edges.get(edge.id);
91
+ const merged = existing
92
+ ? { ...existing, type: edge.type, weight: edge.weight ?? existing.weight ?? 1, metadata: edge.metadata ?? existing.metadata ?? {} }
93
+ : { ...edge, weight: edge.weight ?? 1, metadata: edge.metadata ?? {} };
94
+ this.edges.set(edge.id, merged);
95
+ this.flushSync();
96
+ }
97
+ getEdges(nodeId, direction = 'both') {
98
+ return [...this.edges.values()].filter((e) => {
99
+ if (direction === 'out')
100
+ return e.sourceId === nodeId;
101
+ if (direction === 'in')
102
+ return e.targetId === nodeId;
103
+ return e.sourceId === nodeId || e.targetId === nodeId;
104
+ });
105
+ }
106
+ getNodeDependencies(nodeId, depth = 3) {
107
+ const visited = new Set();
108
+ const out = [];
109
+ const traverse = (id, d) => {
110
+ if (d === 0 || visited.has(id))
111
+ return;
112
+ visited.add(id);
113
+ for (const e of this.edges.values()) {
114
+ if (e.sourceId !== id || e.type !== 'depends_on')
115
+ continue;
116
+ const target = this.nodes.get(e.targetId);
117
+ if (target) {
118
+ out.push(target);
119
+ traverse(e.targetId, d - 1);
120
+ }
121
+ }
122
+ };
123
+ traverse(nodeId, depth);
124
+ return out;
125
+ }
126
+ // ─── Utilities ────────────────────────────────────────────────────────────
127
+ getStatistics() {
128
+ const nodesByType = {};
129
+ const edgesByType = {};
130
+ for (const n of this.nodes.values()) {
131
+ nodesByType[n.type] = (nodesByType[n.type] ?? 0) + 1;
132
+ }
133
+ for (const e of this.edges.values()) {
134
+ edgesByType[e.type] = (edgesByType[e.type] ?? 0) + 1;
135
+ }
136
+ return {
137
+ totalNodes: this.nodes.size,
138
+ totalEdges: this.edges.size,
139
+ nodesByType,
140
+ edgesByType,
141
+ };
142
+ }
143
+ exportToJson() {
144
+ return { nodes: [...this.nodes.values()], edges: [...this.edges.values()] };
145
+ }
146
+ importFromJson(data) {
147
+ for (const n of data.nodes)
148
+ this.addNode(n);
149
+ for (const e of data.edges)
150
+ this.addEdge(e);
151
+ }
152
+ close() {
153
+ // Synchronous flush is performed on every mutation; no shutdown work.
154
+ }
155
+ flushSync() {
156
+ const data = {
157
+ nodes: [...this.nodes.values()],
158
+ edges: [...this.edges.values()],
159
+ };
160
+ try {
161
+ fs.writeJsonSync(this.filePath, data, { spaces: 2 });
162
+ }
163
+ catch {
164
+ // best-effort persistence
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=json-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-graph.js","sourceRoot":"","sources":["../../src/graphrag/json-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Common interface implemented by every backend (SQLite, JSON, Neo4j…).
3
+ *
4
+ * Methods mirror the SQLite implementation so callers don't care which
5
+ * backend is in use. Backends should:
6
+ * - upsert by `id` on addNode / addEdge
7
+ * - persist incrementally (or on close, when that's safer)
8
+ * - never throw on unknown ids — return `null` / empty arrays
9
+ */
10
+ import type { GraphNode, GraphEdge, NodeType, EdgeType, SearchResult, GraphStatistics } from './types.js';
11
+ export interface KnowledgeGraph {
12
+ init(): Promise<void>;
13
+ addNode(node: GraphNode): void;
14
+ getNode(id: string): GraphNode | null;
15
+ queryNodes(type?: NodeType, limit?: number): GraphNode[];
16
+ searchNodes(query: string, limit?: number): SearchResult[];
17
+ deleteNode(id: string): void;
18
+ addEdge(edge: GraphEdge): void;
19
+ getEdges(nodeId: string, direction?: 'out' | 'in' | 'both'): GraphEdge[];
20
+ getNodeDependencies(nodeId: string, depth?: number): GraphNode[];
21
+ getStatistics(): GraphStatistics;
22
+ exportToJson(): {
23
+ nodes: GraphNode[];
24
+ edges: GraphEdge[];
25
+ };
26
+ importFromJson(data: {
27
+ nodes: GraphNode[];
28
+ edges: GraphEdge[];
29
+ }): void;
30
+ close(): void;
31
+ }
32
+ export type { NodeType, EdgeType, GraphNode, GraphEdge, SearchResult, GraphStatistics };
33
+ //# sourceMappingURL=knowledge-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../../src/graphrag/knowledge-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IACzD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAC3D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;IACzE,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IAEjE,aAAa,IAAI,eAAe,CAAC;IAEjC,YAAY,IAAI;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IAC3D,cAAc,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAEvE,KAAK,IAAI,IAAI,CAAC;CACf;AAED,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=knowledge-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../src/graphrag/knowledge-graph.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -2,20 +2,27 @@
2
2
  * @dewtech/dare-cli — pacote único do framework DARE.
3
3
  *
4
4
  * Inclui CLI (`dare`), servidor MCP (`dare-mcp-server`), engine GraphRAG e
5
- * o DAG Task Runner. Instalar este pacote dá acesso a todas as funcionalidades
6
- * do método — não há subpacotes para gerenciar separadamente.
5
+ * o DAG Task Runner (orquestrador). Instalar este pacote dá acesso a todas
6
+ * as funcionalidades do método — não há subpacotes para gerenciar.
7
+ *
8
+ * O CLI **não** chama nenhuma API de LLM diretamente: a execução de tasks
9
+ * acontece dentro da IDE em que você já está autenticado (Cursor, Antigravity
10
+ * ou Claude Code). O DAG runner é orquestrador puro — coordena estado,
11
+ * canvas e ingestão no GraphRAG.
7
12
  */
8
13
  export { initCommand } from './commands/init.js';
9
14
  export { designCommand } from './commands/design.js';
10
15
  export { blueprintCommand } from './commands/blueprint.js';
11
16
  export { executeCommand } from './commands/execute.js';
12
- export { runDag } from './dag-runner/run_dag.js';
13
- export type { Dag, DagTask, RunDagOptions } from './dag-runner/run_dag.js';
17
+ export { graphCommand } from './commands/graph.js';
18
+ export { computeRanks, nextExecutableTasks, applyCascadingSkip, buildTaskPrompt, markRunning, markDone, markFailed, renderCanvas, DEFAULT_DAG_LIMITS, } from './dag-runner/run_dag.js';
19
+ export type { Dag, DagTask, DagLimits, DagModelMap, DagModels, RunnerName, Complexity, TaskStatus as DagTaskStatus, MarkOptions, } from './dag-runner/run_dag.js';
20
+ export { ingestTask, ingestDag, extractFilePaths } from './dag-runner/graph-ingest.js';
14
21
  export { convertYamlToDag, convertDagToYaml } from './utils/dag-converter.js';
15
22
  export { generateProjectStructure } from './utils/project-generator.js';
16
23
  export type { ProjectConfig } from './utils/project-generator.js';
17
- export { GraphRAG } from './graphrag/index.js';
18
- export type { GraphNode, GraphEdge, NodeType, EdgeType, TaskNode, FileNode, SchemaNode, EndpointNode, ComponentNode, SearchResult, GraphStatistics, } from './graphrag/index.js';
24
+ export { GraphRAG, JsonGraph, createGraph, loadGraphConfig } from './graphrag/index.js';
25
+ export type { KnowledgeGraph, GraphConfig, GraphBackend, GraphNode, GraphEdge, NodeType, EdgeType, TaskNode, FileNode, SchemaNode, EndpointNode, ComponentNode, SearchResult, GraphStatistics, } from './graphrag/index.js';
19
26
  export { createMcpServer } from './mcp-server/index.js';
20
27
  export type { ContextQuery, ContextResult, TaskStatus } from './mcp-server/index.js';
21
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,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;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,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;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,GAAG,EACH,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,IAAI,aAAa,EAC3B,WAAW,GACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxF,YAAY,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -2,21 +2,28 @@
2
2
  * @dewtech/dare-cli — pacote único do framework DARE.
3
3
  *
4
4
  * Inclui CLI (`dare`), servidor MCP (`dare-mcp-server`), engine GraphRAG e
5
- * o DAG Task Runner. Instalar este pacote dá acesso a todas as funcionalidades
6
- * do método — não há subpacotes para gerenciar separadamente.
5
+ * o DAG Task Runner (orquestrador). Instalar este pacote dá acesso a todas
6
+ * as funcionalidades do método — não há subpacotes para gerenciar.
7
+ *
8
+ * O CLI **não** chama nenhuma API de LLM diretamente: a execução de tasks
9
+ * acontece dentro da IDE em que você já está autenticado (Cursor, Antigravity
10
+ * ou Claude Code). O DAG runner é orquestrador puro — coordena estado,
11
+ * canvas e ingestão no GraphRAG.
7
12
  */
8
13
  // Commands
9
14
  export { initCommand } from './commands/init.js';
10
15
  export { designCommand } from './commands/design.js';
11
16
  export { blueprintCommand } from './commands/blueprint.js';
12
17
  export { executeCommand } from './commands/execute.js';
13
- // DAG Runner
14
- export { runDag } from './dag-runner/run_dag.js';
18
+ export { graphCommand } from './commands/graph.js';
19
+ // DAG Runner (orchestration)
20
+ export { computeRanks, nextExecutableTasks, applyCascadingSkip, buildTaskPrompt, markRunning, markDone, markFailed, renderCanvas, DEFAULT_DAG_LIMITS, } from './dag-runner/run_dag.js';
21
+ export { ingestTask, ingestDag, extractFilePaths } from './dag-runner/graph-ingest.js';
15
22
  export { convertYamlToDag, convertDagToYaml } from './utils/dag-converter.js';
16
23
  // Project generation
17
24
  export { generateProjectStructure } from './utils/project-generator.js';
18
25
  // Knowledge graph engine
19
- export { GraphRAG } from './graphrag/index.js';
26
+ export { GraphRAG, JsonGraph, createGraph, loadGraphConfig } from './graphrag/index.js';
20
27
  // MCP server
21
28
  export { createMcpServer } from './mcp-server/index.js';
22
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,qBAAqB;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAe/C,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;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;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,6BAA6B;AAC7B,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,qBAAqB;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkBxF,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dewtech/dare-cli",
3
- "version": "2.1.0",
3
+ "version": "2.3.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",