@dewtech/dare-cli 3.8.2 → 3.10.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 (256) hide show
  1. package/README.md +19 -0
  2. package/dist/__tests__/drift-regression.test.d.ts +2 -0
  3. package/dist/__tests__/drift-regression.test.d.ts.map +1 -0
  4. package/dist/__tests__/drift-regression.test.js +118 -0
  5. package/dist/__tests__/drift-regression.test.js.map +1 -0
  6. package/dist/__tests__/ide-command-parity.test.js +1 -0
  7. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  8. package/dist/__tests__/project-generator.test.js +10 -1
  9. package/dist/__tests__/project-generator.test.js.map +1 -1
  10. package/dist/__tests__/secure-executor-regression.test.d.ts +2 -0
  11. package/dist/__tests__/secure-executor-regression.test.d.ts.map +1 -0
  12. package/dist/__tests__/secure-executor-regression.test.js +294 -0
  13. package/dist/__tests__/secure-executor-regression.test.js.map +1 -0
  14. package/dist/__tests__/semantic-regression.test.d.ts +2 -0
  15. package/dist/__tests__/semantic-regression.test.d.ts.map +1 -0
  16. package/dist/__tests__/semantic-regression.test.js +248 -0
  17. package/dist/__tests__/semantic-regression.test.js.map +1 -0
  18. package/dist/agent/__tests__/budget.test.d.ts +2 -0
  19. package/dist/agent/__tests__/budget.test.d.ts.map +1 -0
  20. package/dist/agent/__tests__/budget.test.js +36 -0
  21. package/dist/agent/__tests__/budget.test.js.map +1 -0
  22. package/dist/agent/__tests__/claude-driver.test.d.ts +2 -0
  23. package/dist/agent/__tests__/claude-driver.test.d.ts.map +1 -0
  24. package/dist/agent/__tests__/claude-driver.test.js +88 -0
  25. package/dist/agent/__tests__/claude-driver.test.js.map +1 -0
  26. package/dist/agent/__tests__/cost-telemetry.test.d.ts +2 -0
  27. package/dist/agent/__tests__/cost-telemetry.test.d.ts.map +1 -0
  28. package/dist/agent/__tests__/cost-telemetry.test.js +61 -0
  29. package/dist/agent/__tests__/cost-telemetry.test.js.map +1 -0
  30. package/dist/agent/__tests__/driver.types.test.d.ts +2 -0
  31. package/dist/agent/__tests__/driver.types.test.d.ts.map +1 -0
  32. package/dist/agent/__tests__/driver.types.test.js +33 -0
  33. package/dist/agent/__tests__/driver.types.test.js.map +1 -0
  34. package/dist/agent/__tests__/mock-driver.test.d.ts +2 -0
  35. package/dist/agent/__tests__/mock-driver.test.d.ts.map +1 -0
  36. package/dist/agent/__tests__/mock-driver.test.js +100 -0
  37. package/dist/agent/__tests__/mock-driver.test.js.map +1 -0
  38. package/dist/agent/__tests__/no-llm-in-core.test.d.ts +2 -0
  39. package/dist/agent/__tests__/no-llm-in-core.test.d.ts.map +1 -0
  40. package/dist/agent/__tests__/no-llm-in-core.test.js +46 -0
  41. package/dist/agent/__tests__/no-llm-in-core.test.js.map +1 -0
  42. package/dist/agent/budget.d.ts +15 -0
  43. package/dist/agent/budget.d.ts.map +1 -0
  44. package/dist/agent/budget.js +23 -0
  45. package/dist/agent/budget.js.map +1 -0
  46. package/dist/agent/driver.d.ts +46 -0
  47. package/dist/agent/driver.d.ts.map +1 -0
  48. package/dist/agent/driver.js +2 -0
  49. package/dist/agent/driver.js.map +1 -0
  50. package/dist/agent/drivers/claude.d.ts +43 -0
  51. package/dist/agent/drivers/claude.d.ts.map +1 -0
  52. package/dist/agent/drivers/claude.js +134 -0
  53. package/dist/agent/drivers/claude.js.map +1 -0
  54. package/dist/agent/drivers/mock.d.ts +3 -0
  55. package/dist/agent/drivers/mock.d.ts.map +1 -0
  56. package/dist/agent/drivers/mock.js +56 -0
  57. package/dist/agent/drivers/mock.js.map +1 -0
  58. package/dist/agent/drivers/noop.d.ts +3 -0
  59. package/dist/agent/drivers/noop.d.ts.map +1 -0
  60. package/dist/agent/drivers/noop.js +13 -0
  61. package/dist/agent/drivers/noop.js.map +1 -0
  62. package/dist/agent/telemetry.d.ts +4 -0
  63. package/dist/agent/telemetry.d.ts.map +1 -0
  64. package/dist/agent/telemetry.js +25 -0
  65. package/dist/agent/telemetry.js.map +1 -0
  66. package/dist/bin/dare.js +2 -0
  67. package/dist/bin/dare.js.map +1 -1
  68. package/dist/commands/__tests__/execute-agent.test.d.ts +2 -0
  69. package/dist/commands/__tests__/execute-agent.test.d.ts.map +1 -0
  70. package/dist/commands/__tests__/execute-agent.test.js +191 -0
  71. package/dist/commands/__tests__/execute-agent.test.js.map +1 -0
  72. package/dist/commands/__tests__/execute.telemetry.spec.js +3 -0
  73. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -1
  74. package/dist/commands/__tests__/graph-drift.test.d.ts +2 -0
  75. package/dist/commands/__tests__/graph-drift.test.d.ts.map +1 -0
  76. package/dist/commands/__tests__/graph-drift.test.js +169 -0
  77. package/dist/commands/__tests__/graph-drift.test.js.map +1 -0
  78. package/dist/commands/__tests__/require-approval.test.d.ts +2 -0
  79. package/dist/commands/__tests__/require-approval.test.d.ts.map +1 -0
  80. package/dist/commands/__tests__/require-approval.test.js +158 -0
  81. package/dist/commands/__tests__/require-approval.test.js.map +1 -0
  82. package/dist/commands/execute.d.ts +68 -0
  83. package/dist/commands/execute.d.ts.map +1 -1
  84. package/dist/commands/execute.js +567 -2
  85. package/dist/commands/execute.js.map +1 -1
  86. package/dist/commands/graph.d.ts.map +1 -1
  87. package/dist/commands/graph.js +204 -1
  88. package/dist/commands/graph.js.map +1 -1
  89. package/dist/commands/guard.d.ts +13 -0
  90. package/dist/commands/guard.d.ts.map +1 -0
  91. package/dist/commands/guard.js +338 -0
  92. package/dist/commands/guard.js.map +1 -0
  93. package/dist/dag-runner/graph-ingest.d.ts.map +1 -1
  94. package/dist/dag-runner/graph-ingest.js +13 -7
  95. package/dist/dag-runner/graph-ingest.js.map +1 -1
  96. package/dist/graphrag/__tests__/drift-config.test.d.ts +2 -0
  97. package/dist/graphrag/__tests__/drift-config.test.d.ts.map +1 -0
  98. package/dist/graphrag/__tests__/drift-config.test.js +33 -0
  99. package/dist/graphrag/__tests__/drift-config.test.js.map +1 -0
  100. package/dist/graphrag/__tests__/drift.test.d.ts +2 -0
  101. package/dist/graphrag/__tests__/drift.test.d.ts.map +1 -0
  102. package/dist/graphrag/__tests__/drift.test.js +152 -0
  103. package/dist/graphrag/__tests__/drift.test.js.map +1 -0
  104. package/dist/graphrag/__tests__/hybrid-integration.test.d.ts +2 -0
  105. package/dist/graphrag/__tests__/hybrid-integration.test.d.ts.map +1 -0
  106. package/dist/graphrag/__tests__/hybrid-integration.test.js +158 -0
  107. package/dist/graphrag/__tests__/hybrid-integration.test.js.map +1 -0
  108. package/dist/graphrag/__tests__/hybrid.test.d.ts +2 -0
  109. package/dist/graphrag/__tests__/hybrid.test.d.ts.map +1 -0
  110. package/dist/graphrag/__tests__/hybrid.test.js +71 -0
  111. package/dist/graphrag/__tests__/hybrid.test.js.map +1 -0
  112. package/dist/graphrag/__tests__/incremental-index.test.d.ts +2 -0
  113. package/dist/graphrag/__tests__/incremental-index.test.d.ts.map +1 -0
  114. package/dist/graphrag/__tests__/incremental-index.test.js +135 -0
  115. package/dist/graphrag/__tests__/incremental-index.test.js.map +1 -0
  116. package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.d.ts +2 -0
  117. package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.d.ts.map +1 -0
  118. package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.js +48 -0
  119. package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.js.map +1 -0
  120. package/dist/graphrag/__tests__/requirement-hash.test.d.ts +2 -0
  121. package/dist/graphrag/__tests__/requirement-hash.test.d.ts.map +1 -0
  122. package/dist/graphrag/__tests__/requirement-hash.test.js +74 -0
  123. package/dist/graphrag/__tests__/requirement-hash.test.js.map +1 -0
  124. package/dist/graphrag/__tests__/semantic-config.test.d.ts +2 -0
  125. package/dist/graphrag/__tests__/semantic-config.test.d.ts.map +1 -0
  126. package/dist/graphrag/__tests__/semantic-config.test.js +39 -0
  127. package/dist/graphrag/__tests__/semantic-config.test.js.map +1 -0
  128. package/dist/graphrag/__tests__/vector-persistence.test.d.ts +2 -0
  129. package/dist/graphrag/__tests__/vector-persistence.test.d.ts.map +1 -0
  130. package/dist/graphrag/__tests__/vector-persistence.test.js +112 -0
  131. package/dist/graphrag/__tests__/vector-persistence.test.js.map +1 -0
  132. package/dist/graphrag/__tests__/vector-search.test.d.ts +2 -0
  133. package/dist/graphrag/__tests__/vector-search.test.d.ts.map +1 -0
  134. package/dist/graphrag/__tests__/vector-search.test.js +36 -0
  135. package/dist/graphrag/__tests__/vector-search.test.js.map +1 -0
  136. package/dist/graphrag/drift.d.ts +22 -0
  137. package/dist/graphrag/drift.d.ts.map +1 -0
  138. package/dist/graphrag/drift.js +204 -0
  139. package/dist/graphrag/drift.js.map +1 -0
  140. package/dist/graphrag/embeddings.d.ts +15 -0
  141. package/dist/graphrag/embeddings.d.ts.map +1 -0
  142. package/dist/graphrag/embeddings.js +107 -0
  143. package/dist/graphrag/embeddings.js.map +1 -0
  144. package/dist/graphrag/graph-rag.d.ts +17 -1
  145. package/dist/graphrag/graph-rag.d.ts.map +1 -1
  146. package/dist/graphrag/graph-rag.js +170 -2
  147. package/dist/graphrag/graph-rag.js.map +1 -1
  148. package/dist/graphrag/hybrid.d.ts +8 -0
  149. package/dist/graphrag/hybrid.d.ts.map +1 -0
  150. package/dist/graphrag/hybrid.js +203 -0
  151. package/dist/graphrag/hybrid.js.map +1 -0
  152. package/dist/graphrag/incremental-index.d.ts +18 -0
  153. package/dist/graphrag/incremental-index.d.ts.map +1 -0
  154. package/dist/graphrag/incremental-index.js +159 -0
  155. package/dist/graphrag/incremental-index.js.map +1 -0
  156. package/dist/graphrag/index.d.ts +1 -1
  157. package/dist/graphrag/index.d.ts.map +1 -1
  158. package/dist/graphrag/json-graph.d.ts +2 -1
  159. package/dist/graphrag/json-graph.d.ts.map +1 -1
  160. package/dist/graphrag/json-graph.js +14 -0
  161. package/dist/graphrag/json-graph.js.map +1 -1
  162. package/dist/graphrag/knowledge-graph.d.ts +5 -0
  163. package/dist/graphrag/knowledge-graph.d.ts.map +1 -1
  164. package/dist/graphrag/neo4j-graph.d.ts +2 -1
  165. package/dist/graphrag/neo4j-graph.d.ts.map +1 -1
  166. package/dist/graphrag/neo4j-graph.js +40 -5
  167. package/dist/graphrag/neo4j-graph.js.map +1 -1
  168. package/dist/graphrag/requirement-ingest.d.ts +4 -1
  169. package/dist/graphrag/requirement-ingest.d.ts.map +1 -1
  170. package/dist/graphrag/requirement-ingest.js +18 -8
  171. package/dist/graphrag/requirement-ingest.js.map +1 -1
  172. package/dist/graphrag/types.d.ts +1 -0
  173. package/dist/graphrag/types.d.ts.map +1 -1
  174. package/dist/graphrag/vector-search.d.ts +10 -0
  175. package/dist/graphrag/vector-search.d.ts.map +1 -0
  176. package/dist/graphrag/vector-search.js +38 -0
  177. package/dist/graphrag/vector-search.js.map +1 -0
  178. package/dist/guard/__tests__/boundary.test.d.ts +2 -0
  179. package/dist/guard/__tests__/boundary.test.d.ts.map +1 -0
  180. package/dist/guard/__tests__/boundary.test.js +37 -0
  181. package/dist/guard/__tests__/boundary.test.js.map +1 -0
  182. package/dist/guard/__tests__/guard-command.test.d.ts +2 -0
  183. package/dist/guard/__tests__/guard-command.test.d.ts.map +1 -0
  184. package/dist/guard/__tests__/guard-command.test.js +88 -0
  185. package/dist/guard/__tests__/guard-command.test.js.map +1 -0
  186. package/dist/guard/__tests__/guard-config.test.d.ts +2 -0
  187. package/dist/guard/__tests__/guard-config.test.d.ts.map +1 -0
  188. package/dist/guard/__tests__/guard-config.test.js +34 -0
  189. package/dist/guard/__tests__/guard-config.test.js.map +1 -0
  190. package/dist/guard/__tests__/guard-integration.test.d.ts +2 -0
  191. package/dist/guard/__tests__/guard-integration.test.d.ts.map +1 -0
  192. package/dist/guard/__tests__/guard-integration.test.js +218 -0
  193. package/dist/guard/__tests__/guard-integration.test.js.map +1 -0
  194. package/dist/guard/__tests__/guard-types.test.d.ts +2 -0
  195. package/dist/guard/__tests__/guard-types.test.d.ts.map +1 -0
  196. package/dist/guard/__tests__/guard-types.test.js +28 -0
  197. package/dist/guard/__tests__/guard-types.test.js.map +1 -0
  198. package/dist/guard/__tests__/provenance.test.d.ts +2 -0
  199. package/dist/guard/__tests__/provenance.test.d.ts.map +1 -0
  200. package/dist/guard/__tests__/provenance.test.js +80 -0
  201. package/dist/guard/__tests__/provenance.test.js.map +1 -0
  202. package/dist/guard/__tests__/scan.test.d.ts +2 -0
  203. package/dist/guard/__tests__/scan.test.d.ts.map +1 -0
  204. package/dist/guard/__tests__/scan.test.js +62 -0
  205. package/dist/guard/__tests__/scan.test.js.map +1 -0
  206. package/dist/guard/__tests__/unicode.test.d.ts +2 -0
  207. package/dist/guard/__tests__/unicode.test.d.ts.map +1 -0
  208. package/dist/guard/__tests__/unicode.test.js +75 -0
  209. package/dist/guard/__tests__/unicode.test.js.map +1 -0
  210. package/dist/guard/boundary.d.ts +9 -0
  211. package/dist/guard/boundary.d.ts.map +1 -0
  212. package/dist/guard/boundary.js +17 -0
  213. package/dist/guard/boundary.js.map +1 -0
  214. package/dist/guard/config.d.ts +60 -0
  215. package/dist/guard/config.d.ts.map +1 -0
  216. package/dist/guard/config.js +64 -0
  217. package/dist/guard/config.js.map +1 -0
  218. package/dist/guard/pipeline.d.ts +13 -0
  219. package/dist/guard/pipeline.d.ts.map +1 -0
  220. package/dist/guard/pipeline.js +120 -0
  221. package/dist/guard/pipeline.js.map +1 -0
  222. package/dist/guard/provenance.d.ts +18 -0
  223. package/dist/guard/provenance.d.ts.map +1 -0
  224. package/dist/guard/provenance.js +108 -0
  225. package/dist/guard/provenance.js.map +1 -0
  226. package/dist/guard/scan.d.ts +6 -0
  227. package/dist/guard/scan.d.ts.map +1 -0
  228. package/dist/guard/scan.js +84 -0
  229. package/dist/guard/scan.js.map +1 -0
  230. package/dist/guard/types.d.ts +28 -0
  231. package/dist/guard/types.d.ts.map +1 -0
  232. package/dist/guard/types.js +2 -0
  233. package/dist/guard/types.js.map +1 -0
  234. package/dist/guard/unicode.d.ts +8 -0
  235. package/dist/guard/unicode.d.ts.map +1 -0
  236. package/dist/guard/unicode.js +126 -0
  237. package/dist/guard/unicode.js.map +1 -0
  238. package/dist/mcp-server/server.d.ts.map +1 -1
  239. package/dist/mcp-server/server.js +8 -1
  240. package/dist/mcp-server/server.js.map +1 -1
  241. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  242. package/dist/utils/UpdateApplier.js +3 -1
  243. package/dist/utils/UpdateApplier.js.map +1 -1
  244. package/dist/utils/project-generator.d.ts.map +1 -1
  245. package/dist/utils/project-generator.js +36 -5
  246. package/dist/utils/project-generator.js.map +1 -1
  247. package/dist/verification/__tests__/telemetry.test.js +3 -0
  248. package/dist/verification/__tests__/telemetry.test.js.map +1 -1
  249. package/dist/verification/config.d.ts +82 -0
  250. package/dist/verification/config.d.ts.map +1 -1
  251. package/dist/verification/config.js +146 -0
  252. package/dist/verification/config.js.map +1 -1
  253. package/package.json +5 -1
  254. package/templates/ide/antigravity/.agents/skills/dare-guard/SKILL.md +16 -0
  255. package/templates/ide/claude/.claude/commands/dare-guard.md +16 -0
  256. package/templates/ide/cursor/.cursor/commands/dare-guard.md +16 -0
@@ -0,0 +1,100 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { mockDriver } from '../drivers/mock.js';
6
+ import { noopDriver } from '../drivers/noop.js';
7
+ import { safeSpawn } from '../../exec/safe-spawn.js';
8
+ async function initGitRepo(dir) {
9
+ await safeSpawn('git', ['init'], { cwd: dir, timeoutSeconds: 30 });
10
+ await safeSpawn('git', ['add', '.'], { cwd: dir, timeoutSeconds: 30 });
11
+ await safeSpawn('git', ['commit', '-m', 'baseline', '--allow-empty'], {
12
+ cwd: dir,
13
+ timeoutSeconds: 30,
14
+ env: {
15
+ ...process.env,
16
+ GIT_AUTHOR_NAME: 'dare-test',
17
+ GIT_AUTHOR_EMAIL: 'test@dare.local',
18
+ GIT_COMMITTER_NAME: 'dare-test',
19
+ GIT_COMMITTER_EMAIL: 'test@dare.local',
20
+ },
21
+ });
22
+ }
23
+ describe('mockDriver', () => {
24
+ let worktree;
25
+ beforeEach(async () => {
26
+ worktree = await fs.mkdtemp(path.join(os.tmpdir(), 'dare-mock-wt-'));
27
+ await initGitRepo(worktree);
28
+ });
29
+ afterEach(async () => {
30
+ await fs.remove(worktree).catch(() => undefined);
31
+ });
32
+ it('should_apply_fixture_patch', async () => {
33
+ const result = await mockDriver.run({
34
+ taskId: 'mock-fixture-task',
35
+ spec: '# spec',
36
+ steering: [],
37
+ worktree,
38
+ budgetRemaining: 1000,
39
+ signal: new AbortController().signal,
40
+ });
41
+ expect(result.status).toBe('implemented');
42
+ expect((await fs.readFile(path.join(worktree, 'applied.txt'), 'utf8')).trim()).toBe('mock-fixture-applied');
43
+ });
44
+ it('should_be_deterministic', async () => {
45
+ const input = {
46
+ taskId: 'mock-fixture-task',
47
+ spec: '# spec',
48
+ steering: [],
49
+ worktree,
50
+ budgetRemaining: 1000,
51
+ signal: new AbortController().signal,
52
+ };
53
+ const a = await mockDriver.run(input);
54
+ const b = await mockDriver.run(input);
55
+ expect(a.summary).toBe(b.summary);
56
+ expect(a.usage).toEqual(b.usage);
57
+ });
58
+ it('should_report_zero_usage', async () => {
59
+ const result = await mockDriver.run({
60
+ taskId: 'mock-fixture-task',
61
+ spec: '# spec',
62
+ steering: [],
63
+ worktree,
64
+ budgetRemaining: 1000,
65
+ signal: new AbortController().signal,
66
+ });
67
+ expect(result.usage).toEqual({
68
+ inputTokens: 0,
69
+ outputTokens: 0,
70
+ costUsd: 0,
71
+ model: 'mock',
72
+ });
73
+ });
74
+ it('should_abort_on_signal', async () => {
75
+ const controller = new AbortController();
76
+ controller.abort();
77
+ const result = await mockDriver.run({
78
+ taskId: 'mock-fixture-task',
79
+ spec: '# spec',
80
+ steering: [],
81
+ worktree,
82
+ budgetRemaining: 1000,
83
+ signal: controller.signal,
84
+ });
85
+ expect(result.status).toBe('aborted');
86
+ });
87
+ it('noop_returns_aborted', async () => {
88
+ const result = await noopDriver.run({
89
+ taskId: 'any',
90
+ spec: '# spec',
91
+ steering: [],
92
+ worktree,
93
+ budgetRemaining: 1000,
94
+ signal: new AbortController().signal,
95
+ });
96
+ expect(result.status).toBe('aborted');
97
+ expect(noopDriver.requiresNetwork).toBe(false);
98
+ });
99
+ });
100
+ //# sourceMappingURL=mock-driver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-driver.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/mock-driver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=no-llm-in-core.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-llm-in-core.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/no-llm-in-core.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, it, expect } from 'vitest';
5
+ const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
6
+ const ALLOWED_REL = path.join('src', 'agent', 'drivers', 'claude.ts');
7
+ const FORBIDDEN = /(?:import|require)\s*\(?['"]@anthropic-ai|from\s+['"]@anthropic-ai/;
8
+ function walkTsFiles(dir, base = pkgRoot) {
9
+ const entries = readdirSync(dir, { withFileTypes: true });
10
+ const files = [];
11
+ for (const entry of entries) {
12
+ const full = path.join(dir, entry.name);
13
+ if (entry.isDirectory()) {
14
+ if (entry.name === '__tests__' || entry.name === 'node_modules')
15
+ continue;
16
+ files.push(...walkTsFiles(full, base));
17
+ continue;
18
+ }
19
+ if (!entry.name.endsWith('.ts'))
20
+ continue;
21
+ if (entry.name.endsWith('.test.ts') || entry.name.endsWith('.spec.ts'))
22
+ continue;
23
+ files.push(path.relative(base, full));
24
+ }
25
+ return files;
26
+ }
27
+ function listSourceFiles() {
28
+ return walkTsFiles(path.join(pkgRoot, 'src')).filter((f) => path.normalize(f) !== path.normalize(ALLOWED_REL));
29
+ }
30
+ function findLlmSdkImports() {
31
+ return listSourceFiles().filter((rel) => {
32
+ const content = readFileSync(path.join(pkgRoot, rel), 'utf8');
33
+ return FORBIDDEN.test(content);
34
+ });
35
+ }
36
+ describe('no-llm-in-core', () => {
37
+ it('passes_on_clean_tree', () => {
38
+ const offenders = findLlmSdkImports();
39
+ expect(offenders, `LLM SDK imported outside ${ALLOWED_REL}`).toEqual([]);
40
+ });
41
+ it('detects_planted_import', () => {
42
+ const sample = "import Anthropic from '@anthropic-ai/sdk';";
43
+ expect(FORBIDDEN.test(sample)).toBe(true);
44
+ });
45
+ });
46
+ //# sourceMappingURL=no-llm-in-core.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-llm-in-core.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/no-llm-in-core.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TokenUsage } from './driver.js';
2
+ export declare class BudgetTracker {
3
+ private readonly totalTokens;
4
+ private spentTokens;
5
+ private spentUsd;
6
+ constructor(totalTokens: number | null);
7
+ add(usage: TokenUsage): void;
8
+ remaining(): number;
9
+ exhausted(): boolean;
10
+ get spent(): {
11
+ tokens: number;
12
+ usd: number;
13
+ };
14
+ }
15
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IAHxC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAK;gBAEQ,WAAW,EAAE,MAAM,GAAG,IAAI;IAEvD,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAK5B,SAAS,IAAI,MAAM;IAMnB,SAAS,IAAI,OAAO;IAIpB,IAAI,KAAK,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAE3C;CACF"}
@@ -0,0 +1,23 @@
1
+ export class BudgetTracker {
2
+ constructor(totalTokens) {
3
+ this.totalTokens = totalTokens;
4
+ this.spentTokens = 0;
5
+ this.spentUsd = 0;
6
+ }
7
+ add(usage) {
8
+ this.spentTokens += usage.inputTokens + usage.outputTokens;
9
+ this.spentUsd += usage.costUsd;
10
+ }
11
+ remaining() {
12
+ return this.totalTokens === null
13
+ ? Number.POSITIVE_INFINITY
14
+ : Math.max(0, this.totalTokens - this.spentTokens);
15
+ }
16
+ exhausted() {
17
+ return this.remaining() <= 0;
18
+ }
19
+ get spent() {
20
+ return { tokens: this.spentTokens, usd: this.spentUsd };
21
+ }
22
+ }
23
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IAIxB,YAA6B,WAA0B;QAA1B,gBAAW,GAAX,WAAW,CAAe;QAH/C,gBAAW,GAAG,CAAC,CAAC;QAChB,aAAQ,GAAG,CAAC,CAAC;IAEqC,CAAC;IAE3D,GAAG,CAAC,KAAiB;QACnB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC;QAC3D,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI;YAC9B,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ import type { GuardedArtifact } from '../guard/types.js';
2
+ export interface TokenUsage {
3
+ readonly inputTokens: number;
4
+ readonly outputTokens: number;
5
+ /** estimado a partir do modelo */
6
+ readonly costUsd: number;
7
+ readonly model: string;
8
+ }
9
+ /**
10
+ * Entrada para {@link AgentDriver.run}.
11
+ *
12
+ * Pré-condição: `spec` e cada item de `steering` já passaram pelo guard (verdict ≠ FAIL).
13
+ */
14
+ export interface AgentRunInput {
15
+ readonly taskId: string;
16
+ /** EXECUTION/task-*.md já validado pelo guard */
17
+ readonly spec: string;
18
+ /** só artefatos PASS/WARN */
19
+ readonly steering: ReadonlyArray<GuardedArtifact>;
20
+ readonly worktree: string;
21
+ readonly budgetRemaining: number;
22
+ /** cancelamento por budget/aprovação */
23
+ readonly signal: AbortSignal;
24
+ }
25
+ /**
26
+ * Resultado de uma execução de agente.
27
+ *
28
+ * Pós-condição: em `status: 'implemented'` há patch aplicável no `worktree`;
29
+ * `usage` sempre preenchido.
30
+ */
31
+ export interface AgentRunResult {
32
+ readonly status: 'implemented' | 'failed' | 'aborted';
33
+ readonly worktree: string;
34
+ /** não-autoritativo */
35
+ readonly summary: string;
36
+ readonly usage: TokenUsage;
37
+ /** alimenta decideNextAction */
38
+ readonly failureSignature?: string;
39
+ }
40
+ export interface AgentDriver {
41
+ /** 'mock' | 'noop' | 'claude' */
42
+ readonly id: string;
43
+ readonly requiresNetwork: boolean;
44
+ run(input: AgentRunInput): Promise<AgentRunResult>;
45
+ }
46
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/agent/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/agent/driver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import type { AgentDriver } from '../driver.js';
2
+ export interface ClaudeDriverOptions {
3
+ readonly model: string;
4
+ readonly apiKeyEnv?: string;
5
+ readonly maxTokens?: number;
6
+ }
7
+ export declare class AgentSdkMissingError extends Error {
8
+ readonly code: "AGENT_SDK_MISSING";
9
+ constructor();
10
+ }
11
+ type ClaudeMessageResponse = {
12
+ readonly usage?: {
13
+ readonly input_tokens?: number;
14
+ readonly output_tokens?: number;
15
+ };
16
+ readonly content?: ReadonlyArray<{
17
+ readonly type?: string;
18
+ readonly text?: string;
19
+ }>;
20
+ };
21
+ type ClaudeClient = {
22
+ readonly messages: {
23
+ create(payload: {
24
+ readonly model: string;
25
+ readonly max_tokens: number;
26
+ readonly messages: ReadonlyArray<{
27
+ readonly role: 'user';
28
+ readonly content: string;
29
+ }>;
30
+ }, requestOptions?: {
31
+ readonly signal?: AbortSignal;
32
+ }): Promise<ClaudeMessageResponse>;
33
+ };
34
+ };
35
+ type ClaudeSdkModule = {
36
+ readonly default: new (options: {
37
+ readonly apiKey: string;
38
+ }) => ClaudeClient;
39
+ };
40
+ export declare function setClaudeSdkImporterForTests(importer: (() => Promise<ClaudeSdkModule>) | null): void;
41
+ export declare function createClaudeDriver(opts: ClaudeDriverOptions): Promise<AgentDriver>;
42
+ export {};
43
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,cAAc,CAAC;AAE3E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,mBAAmB,CAAU;;CAQ9C;AAED,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,QAAQ,EAAE;QACjB,MAAM,CACJ,OAAO,EAAE;YACP,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;YACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;gBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACvF,EACD,cAAc,CAAC,EAAE;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,GACjD,OAAO,CAAC,qBAAqB,CAAC,CAAC;KACnC,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,YAAY,CAAC;CAC9E,CAAC;AAqBF,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,GAChD,IAAI,CAEN;AA2DD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsExF"}
@@ -0,0 +1,134 @@
1
+ export class AgentSdkMissingError extends Error {
2
+ constructor() {
3
+ super("Optional dependency '@anthropic-ai/sdk' not installed. Run: npm i @anthropic-ai/sdk — or use --dry-run.");
4
+ this.code = 'AGENT_SDK_MISSING';
5
+ this.name = 'AgentSdkMissingError';
6
+ }
7
+ }
8
+ const DEFAULT_API_KEY_ENV = 'ANTHROPIC_API_KEY';
9
+ const DEFAULT_MAX_TOKENS = 1200;
10
+ const MODEL_COST_PER_MILLION = [
11
+ { matcher: /haiku/i, inputUsd: 0.8, outputUsd: 4 },
12
+ { matcher: /sonnet/i, inputUsd: 3, outputUsd: 15 },
13
+ { matcher: /opus/i, inputUsd: 15, outputUsd: 75 },
14
+ ];
15
+ async function importClaudeSdk() {
16
+ return (await import('@anthropic-ai/sdk'));
17
+ }
18
+ let sdkImporter = importClaudeSdk;
19
+ export function setClaudeSdkImporterForTests(importer) {
20
+ sdkImporter = importer ?? importClaudeSdk;
21
+ }
22
+ function estimateCostUsd(model, inputTokens, outputTokens) {
23
+ const pricing = MODEL_COST_PER_MILLION.find((entry) => entry.matcher.test(model)) ?? MODEL_COST_PER_MILLION[1];
24
+ const inputCost = (inputTokens / 1000000) * pricing.inputUsd;
25
+ const outputCost = (outputTokens / 1000000) * pricing.outputUsd;
26
+ return Number((inputCost + outputCost).toFixed(6));
27
+ }
28
+ function summarizeContent(response) {
29
+ const chunks = response.content
30
+ ?.filter((chunk) => chunk.type === 'text' && typeof chunk.text === 'string')
31
+ .map((chunk) => chunk.text?.trim() ?? '')
32
+ .filter(Boolean) ?? [];
33
+ return chunks.length > 0 ? chunks.join('\n') : 'claude run completed';
34
+ }
35
+ function usageFromResponse(model, response) {
36
+ const inputTokens = Math.max(0, Math.trunc(response.usage?.input_tokens ?? 0));
37
+ const outputTokens = Math.max(0, Math.trunc(response.usage?.output_tokens ?? 0));
38
+ return {
39
+ inputTokens,
40
+ outputTokens,
41
+ costUsd: estimateCostUsd(model, inputTokens, outputTokens),
42
+ model,
43
+ };
44
+ }
45
+ function zeroUsage(model) {
46
+ return {
47
+ inputTokens: 0,
48
+ outputTokens: 0,
49
+ costUsd: 0,
50
+ model,
51
+ };
52
+ }
53
+ function buildPrompt(input) {
54
+ const steeringList = input.steering.length > 0
55
+ ? input.steering
56
+ .map((artifact) => `- ${artifact.path} (${artifact.origin}/${artifact.channel})`)
57
+ .join('\n')
58
+ : '- none';
59
+ return [
60
+ `Task: ${input.taskId}`,
61
+ `Worktree: ${input.worktree}`,
62
+ `Budget remaining tokens: ${input.budgetRemaining}`,
63
+ 'Steering artifacts:',
64
+ steeringList,
65
+ '',
66
+ 'Specification:',
67
+ input.spec,
68
+ ].join('\n');
69
+ }
70
+ export async function createClaudeDriver(opts) {
71
+ let sdk;
72
+ try {
73
+ sdk = await sdkImporter();
74
+ }
75
+ catch {
76
+ throw new AgentSdkMissingError();
77
+ }
78
+ const apiKeyEnv = opts.apiKeyEnv ?? DEFAULT_API_KEY_ENV;
79
+ const apiKey = process.env[apiKeyEnv];
80
+ if (!apiKey) {
81
+ throw new Error(`Missing Claude API key in env var ${apiKeyEnv}.`);
82
+ }
83
+ const client = new sdk.default({ apiKey });
84
+ return {
85
+ id: 'claude',
86
+ requiresNetwork: true,
87
+ async run(input) {
88
+ if (input.signal.aborted) {
89
+ return {
90
+ status: 'aborted',
91
+ worktree: input.worktree,
92
+ summary: 'claude aborted by signal',
93
+ usage: zeroUsage(opts.model),
94
+ };
95
+ }
96
+ try {
97
+ const response = await client.messages.create({
98
+ model: opts.model,
99
+ max_tokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,
100
+ messages: [
101
+ {
102
+ role: 'user',
103
+ content: buildPrompt(input),
104
+ },
105
+ ],
106
+ }, { signal: input.signal });
107
+ return {
108
+ status: 'implemented',
109
+ worktree: input.worktree,
110
+ summary: summarizeContent(response),
111
+ usage: usageFromResponse(opts.model, response),
112
+ };
113
+ }
114
+ catch (error) {
115
+ if (input.signal.aborted) {
116
+ return {
117
+ status: 'aborted',
118
+ worktree: input.worktree,
119
+ summary: 'claude aborted by signal',
120
+ usage: zeroUsage(opts.model),
121
+ };
122
+ }
123
+ return {
124
+ status: 'failed',
125
+ worktree: input.worktree,
126
+ summary: 'claude run failed',
127
+ usage: zeroUsage(opts.model),
128
+ failureSignature: error instanceof Error ? error.name : 'ClaudeRunError',
129
+ };
130
+ }
131
+ },
132
+ };
133
+ }
134
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/agent/drivers/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentDriver } from '../driver.js';
2
+ export declare const mockDriver: AgentDriver;
3
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/mock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsChD,eAAO,MAAM,UAAU,EAAE,WAsBxB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import fs from 'fs-extra';
4
+ import { safeSpawn } from '../../exec/safe-spawn.js';
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const FIXTURES_DIR = path.join(__dirname, '..', '__fixtures__', 'patches');
7
+ const ZERO_USAGE = {
8
+ inputTokens: 0,
9
+ outputTokens: 0,
10
+ costUsd: 0,
11
+ model: 'mock',
12
+ };
13
+ async function applyFixturePatch(worktree, taskId) {
14
+ const patchPath = path.join(FIXTURES_DIR, `${taskId}.diff`);
15
+ if (!(await fs.pathExists(patchPath)))
16
+ return false;
17
+ await fs.ensureDir(worktree);
18
+ const patch = await fs.readFile(patchPath, 'utf8');
19
+ const tmpPatch = path.join(worktree, '.dare-mock.patch');
20
+ await fs.writeFile(tmpPatch, patch);
21
+ const apply = await safeSpawn('git', ['apply', '--whitespace=nowarn', tmpPatch], {
22
+ cwd: worktree,
23
+ timeoutSeconds: 30,
24
+ maxChars: 8000,
25
+ });
26
+ await fs.remove(tmpPatch).catch(() => undefined);
27
+ if (apply.code !== 0) {
28
+ const err = apply.stderr.trim();
29
+ if (err.includes('already exists in working directory'))
30
+ return true;
31
+ throw new Error(`mock patch apply failed: ${err}`);
32
+ }
33
+ return true;
34
+ }
35
+ export const mockDriver = {
36
+ id: 'mock',
37
+ requiresNetwork: false,
38
+ async run(input) {
39
+ if (input.signal.aborted) {
40
+ return {
41
+ status: 'aborted',
42
+ worktree: input.worktree,
43
+ summary: 'mock aborted by signal',
44
+ usage: { ...ZERO_USAGE },
45
+ };
46
+ }
47
+ await applyFixturePatch(input.worktree, input.taskId);
48
+ return {
49
+ status: 'implemented',
50
+ worktree: input.worktree,
51
+ summary: `mock applied for ${input.taskId}`,
52
+ usage: { ...ZERO_USAGE },
53
+ };
54
+ },
55
+ };
56
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/agent/drivers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;AAE3E,MAAM,UAAU,GAAG;IACjB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,MAAM;CACL,CAAC;AAEX,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,MAAc;IAEd,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,EAAE;QAC/E,GAAG,EAAE,QAAQ;QACb,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YAAE,OAAO,IAAI,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,EAAE,EAAE,MAAM;IACV,eAAe,EAAE,KAAK;IACtB,KAAK,CAAC,GAAG,CAAC,KAAK;QACb,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,wBAAwB;gBACjC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE;aACzB,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAEtD,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,oBAAoB,KAAK,CAAC,MAAM,EAAE;YAC3C,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE;SACzB,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentDriver } from '../driver.js';
2
+ export declare const noopDriver: AgentDriver;
3
+ //# sourceMappingURL=noop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,UAAU,EAAE,WAWxB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const noopDriver = {
2
+ id: 'noop',
3
+ requiresNetwork: false,
4
+ async run(input) {
5
+ return {
6
+ status: 'aborted',
7
+ worktree: input.worktree,
8
+ summary: 'noop',
9
+ usage: { inputTokens: 0, outputTokens: 0, costUsd: 0, model: 'noop' },
10
+ };
11
+ },
12
+ };
13
+ //# sourceMappingURL=noop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../src/agent/drivers/noop.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,EAAE,EAAE,MAAM;IACV,eAAe,EAAE,KAAK;IACtB,KAAK,CAAC,GAAG,CAAC,KAAK;QACb,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;SACtE,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { KnowledgeGraph } from '../graphrag/knowledge-graph.js';
2
+ import type { TokenUsage } from './driver.js';
3
+ export declare function recordCostTelemetry(graph: KnowledgeGraph, taskId: string, total: TokenUsage, attempts: number): void;
4
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/agent/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,IAAI,CAqBN"}
@@ -0,0 +1,25 @@
1
+ function resolveTaskNodeId(taskId) {
2
+ return taskId.startsWith('task:') ? taskId : `task:${taskId}`;
3
+ }
4
+ export function recordCostTelemetry(graph, taskId, total, attempts) {
5
+ const canonicalTaskId = resolveTaskNodeId(taskId);
6
+ const node = graph.getNode(canonicalTaskId) ?? graph.getNode(taskId);
7
+ if (!node)
8
+ return;
9
+ graph.addNode({
10
+ ...node,
11
+ metadata: {
12
+ ...node.metadata,
13
+ inputTokens: total.inputTokens,
14
+ outputTokens: total.outputTokens,
15
+ costUsd: total.costUsd,
16
+ model: total.model,
17
+ attempts,
18
+ },
19
+ });
20
+ const pendingFlush = graph.flush?.();
21
+ if (pendingFlush) {
22
+ void pendingFlush.catch(() => undefined);
23
+ }
24
+ }
25
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/agent/telemetry.ts"],"names":[],"mappings":"AAGA,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAqB,EACrB,MAAc,EACd,KAAiB,EACjB,QAAgB;IAEhB,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,KAAK,CAAC,OAAO,CAAC;QACZ,GAAG,IAAI;QACP,QAAQ,EAAE;YACR,GAAG,IAAI,CAAC,QAAQ;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ;SACT;KACF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACrC,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
package/dist/bin/dare.js CHANGED
@@ -21,6 +21,7 @@ import { benchCommand } from '../commands/bench.js';
21
21
  import { steeringCommand } from '../commands/steering.js';
22
22
  import { hooksCommand } from '../commands/hooks.js';
23
23
  import { patternsCommand } from '../commands/patterns.js';
24
+ import { guardCommand } from '../commands/guard.js';
24
25
  import { skillCommand } from '../skills/index.js';
25
26
  import { welcomeCommand } from '../commands/welcome.js';
26
27
  import { printBanner } from '../utils/banner.js';
@@ -52,6 +53,7 @@ program.addCommand(benchCommand);
52
53
  program.addCommand(steeringCommand);
53
54
  program.addCommand(hooksCommand);
54
55
  program.addCommand(patternsCommand);
56
+ program.addCommand(guardCommand);
55
57
  program.addCommand(skillCommand);
56
58
  program.addCommand(welcomeCommand);
57
59
  // Show banner + help when invoked with no subcommand