@dewtech/dare-cli 3.6.0 → 3.8.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 (193) hide show
  1. package/README.md +10 -0
  2. package/dist/__tests__/ide-command-parity.test.js +1 -0
  3. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  4. package/dist/__tests__/patterns-no-llm.test.d.ts +2 -0
  5. package/dist/__tests__/patterns-no-llm.test.d.ts.map +1 -0
  6. package/dist/__tests__/patterns-no-llm.test.js +31 -0
  7. package/dist/__tests__/patterns-no-llm.test.js.map +1 -0
  8. package/dist/__tests__/patterns-path-confinement.test.d.ts +2 -0
  9. package/dist/__tests__/patterns-path-confinement.test.d.ts.map +1 -0
  10. package/dist/__tests__/patterns-path-confinement.test.js +58 -0
  11. package/dist/__tests__/patterns-path-confinement.test.js.map +1 -0
  12. package/dist/__tests__/patterns.test.d.ts +2 -0
  13. package/dist/__tests__/patterns.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns.test.js +102 -0
  15. package/dist/__tests__/patterns.test.js.map +1 -0
  16. package/dist/bin/dare.js +2 -0
  17. package/dist/bin/dare.js.map +1 -1
  18. package/dist/commands/__tests__/design-interactive.test.d.ts +2 -0
  19. package/dist/commands/__tests__/design-interactive.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/design-interactive.test.js +44 -0
  21. package/dist/commands/__tests__/design-interactive.test.js.map +1 -0
  22. package/dist/commands/__tests__/execute.formal.spec.d.ts +2 -0
  23. package/dist/commands/__tests__/execute.formal.spec.d.ts.map +1 -0
  24. package/dist/commands/__tests__/execute.formal.spec.js +81 -0
  25. package/dist/commands/__tests__/execute.formal.spec.js.map +1 -0
  26. package/dist/commands/__tests__/patterns.test.d.ts +2 -0
  27. package/dist/commands/__tests__/patterns.test.d.ts.map +1 -0
  28. package/dist/commands/__tests__/patterns.test.js +55 -0
  29. package/dist/commands/__tests__/patterns.test.js.map +1 -0
  30. package/dist/commands/design.d.ts.map +1 -1
  31. package/dist/commands/design.js +38 -8
  32. package/dist/commands/design.js.map +1 -1
  33. package/dist/commands/execute-verification.d.ts +15 -1
  34. package/dist/commands/execute-verification.d.ts.map +1 -1
  35. package/dist/commands/execute-verification.js +43 -4
  36. package/dist/commands/execute-verification.js.map +1 -1
  37. package/dist/commands/execute.d.ts.map +1 -1
  38. package/dist/commands/execute.js +27 -3
  39. package/dist/commands/execute.js.map +1 -1
  40. package/dist/commands/graph.d.ts.map +1 -1
  41. package/dist/commands/graph.js +2 -0
  42. package/dist/commands/graph.js.map +1 -1
  43. package/dist/commands/patterns.d.ts +3 -0
  44. package/dist/commands/patterns.d.ts.map +1 -0
  45. package/dist/commands/patterns.js +124 -0
  46. package/dist/commands/patterns.js.map +1 -0
  47. package/dist/graphrag/__tests__/pattern-ingest.test.d.ts +2 -0
  48. package/dist/graphrag/__tests__/pattern-ingest.test.d.ts.map +1 -0
  49. package/dist/graphrag/__tests__/pattern-ingest.test.js +49 -0
  50. package/dist/graphrag/__tests__/pattern-ingest.test.js.map +1 -0
  51. package/dist/graphrag/__tests__/types.test.js +7 -2
  52. package/dist/graphrag/__tests__/types.test.js.map +1 -1
  53. package/dist/graphrag/pattern-ingest.d.ts +10 -0
  54. package/dist/graphrag/pattern-ingest.d.ts.map +1 -0
  55. package/dist/graphrag/pattern-ingest.js +77 -0
  56. package/dist/graphrag/pattern-ingest.js.map +1 -0
  57. package/dist/graphrag/types.d.ts +15 -4
  58. package/dist/graphrag/types.d.ts.map +1 -1
  59. package/dist/graphrag/types.js +5 -0
  60. package/dist/graphrag/types.js.map +1 -1
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/steering/__tests__/loader.test.js +15 -0
  66. package/dist/steering/__tests__/loader.test.js.map +1 -1
  67. package/dist/steering/loader.d.ts.map +1 -1
  68. package/dist/steering/loader.js +11 -0
  69. package/dist/steering/loader.js.map +1 -1
  70. package/dist/utils/__tests__/design-questionnaire.test.d.ts +2 -0
  71. package/dist/utils/__tests__/design-questionnaire.test.d.ts.map +1 -0
  72. package/dist/utils/__tests__/design-questionnaire.test.js +72 -0
  73. package/dist/utils/__tests__/design-questionnaire.test.js.map +1 -0
  74. package/dist/utils/__tests__/pattern-detector.test.d.ts +2 -0
  75. package/dist/utils/__tests__/pattern-detector.test.d.ts.map +1 -0
  76. package/dist/utils/__tests__/pattern-detector.test.js +81 -0
  77. package/dist/utils/__tests__/pattern-detector.test.js.map +1 -0
  78. package/dist/utils/__tests__/pattern-facts.test.d.ts +2 -0
  79. package/dist/utils/__tests__/pattern-facts.test.d.ts.map +1 -0
  80. package/dist/utils/__tests__/pattern-facts.test.js +55 -0
  81. package/dist/utils/__tests__/pattern-facts.test.js.map +1 -0
  82. package/dist/utils/design-questionnaire.d.ts +22 -0
  83. package/dist/utils/design-questionnaire.d.ts.map +1 -0
  84. package/dist/utils/design-questionnaire.js +151 -0
  85. package/dist/utils/design-questionnaire.js.map +1 -0
  86. package/dist/utils/path-safety.d.ts.map +1 -1
  87. package/dist/utils/path-safety.js +6 -1
  88. package/dist/utils/path-safety.js.map +1 -1
  89. package/dist/utils/pattern-detector.d.ts +39 -0
  90. package/dist/utils/pattern-detector.d.ts.map +1 -0
  91. package/dist/utils/pattern-detector.js +291 -0
  92. package/dist/utils/pattern-detector.js.map +1 -0
  93. package/dist/utils/pattern-facts.d.ts +7 -0
  94. package/dist/utils/pattern-facts.d.ts.map +1 -0
  95. package/dist/utils/pattern-facts.js +86 -0
  96. package/dist/utils/pattern-facts.js.map +1 -0
  97. package/dist/verification/__tests__/best-of-n-runner.test.js +2 -15
  98. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -1
  99. package/dist/verification/__tests__/config.formal.test.d.ts +2 -0
  100. package/dist/verification/__tests__/config.formal.test.d.ts.map +1 -0
  101. package/dist/verification/__tests__/config.formal.test.js +38 -0
  102. package/dist/verification/__tests__/config.formal.test.js.map +1 -0
  103. package/dist/verification/config.d.ts +3 -1
  104. package/dist/verification/config.d.ts.map +1 -1
  105. package/dist/verification/config.js +31 -0
  106. package/dist/verification/config.js.map +1 -1
  107. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts +2 -0
  108. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts.map +1 -0
  109. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js +55 -0
  110. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js.map +1 -0
  111. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts +2 -0
  112. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts.map +1 -0
  113. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js +70 -0
  114. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js.map +1 -0
  115. package/dist/verification/gates/formal/__tests__/marker.test.d.ts +2 -0
  116. package/dist/verification/gates/formal/__tests__/marker.test.d.ts.map +1 -0
  117. package/dist/verification/gates/formal/__tests__/marker.test.js +55 -0
  118. package/dist/verification/gates/formal/__tests__/marker.test.js.map +1 -0
  119. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts +2 -0
  120. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts.map +1 -0
  121. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js +35 -0
  122. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js.map +1 -0
  123. package/dist/verification/gates/formal/__tests__/registry.test.d.ts +2 -0
  124. package/dist/verification/gates/formal/__tests__/registry.test.d.ts.map +1 -0
  125. package/dist/verification/gates/formal/__tests__/registry.test.js +22 -0
  126. package/dist/verification/gates/formal/__tests__/registry.test.js.map +1 -0
  127. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts +2 -0
  128. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts.map +1 -0
  129. package/dist/verification/gates/formal/__tests__/runner-formal.test.js +112 -0
  130. package/dist/verification/gates/formal/__tests__/runner-formal.test.js.map +1 -0
  131. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts +2 -0
  132. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts.map +1 -0
  133. package/dist/verification/gates/formal/__tests__/security-formal.test.js +195 -0
  134. package/dist/verification/gates/formal/__tests__/security-formal.test.js.map +1 -0
  135. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts +2 -0
  136. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts.map +1 -0
  137. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js +27 -0
  138. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js.map +1 -0
  139. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts +2 -0
  140. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts.map +1 -0
  141. package/dist/verification/gates/formal/__tests__/verified-rate.test.js +52 -0
  142. package/dist/verification/gates/formal/__tests__/verified-rate.test.js.map +1 -0
  143. package/dist/verification/gates/formal/anti-bypass.d.ts +20 -0
  144. package/dist/verification/gates/formal/anti-bypass.d.ts.map +1 -0
  145. package/dist/verification/gates/formal/anti-bypass.js +53 -0
  146. package/dist/verification/gates/formal/anti-bypass.js.map +1 -0
  147. package/dist/verification/gates/formal/backend.d.ts +38 -0
  148. package/dist/verification/gates/formal/backend.d.ts.map +1 -0
  149. package/dist/verification/gates/formal/backend.js +26 -0
  150. package/dist/verification/gates/formal/backend.js.map +1 -0
  151. package/dist/verification/gates/formal/dafny.d.ts +18 -0
  152. package/dist/verification/gates/formal/dafny.d.ts.map +1 -0
  153. package/dist/verification/gates/formal/dafny.js +131 -0
  154. package/dist/verification/gates/formal/dafny.js.map +1 -0
  155. package/dist/verification/gates/formal/lean.d.ts +17 -0
  156. package/dist/verification/gates/formal/lean.d.ts.map +1 -0
  157. package/dist/verification/gates/formal/lean.js +61 -0
  158. package/dist/verification/gates/formal/lean.js.map +1 -0
  159. package/dist/verification/gates/formal/marker.d.ts +15 -0
  160. package/dist/verification/gates/formal/marker.d.ts.map +1 -0
  161. package/dist/verification/gates/formal/marker.js +73 -0
  162. package/dist/verification/gates/formal/marker.js.map +1 -0
  163. package/dist/verification/gates/formal/registry.d.ts +7 -0
  164. package/dist/verification/gates/formal/registry.d.ts.map +1 -0
  165. package/dist/verification/gates/formal/registry.js +31 -0
  166. package/dist/verification/gates/formal/registry.js.map +1 -0
  167. package/dist/verification/gates/formal/runner.d.ts +31 -0
  168. package/dist/verification/gates/formal/runner.d.ts.map +1 -0
  169. package/dist/verification/gates/formal/runner.js +118 -0
  170. package/dist/verification/gates/formal/runner.js.map +1 -0
  171. package/dist/verification/gates/formal/verus.d.ts +17 -0
  172. package/dist/verification/gates/formal/verus.d.ts.map +1 -0
  173. package/dist/verification/gates/formal/verus.js +65 -0
  174. package/dist/verification/gates/formal/verus.js.map +1 -0
  175. package/dist/verification/runner.d.ts.map +1 -1
  176. package/dist/verification/runner.js +14 -0
  177. package/dist/verification/runner.js.map +1 -1
  178. package/dist/verification/telemetry.d.ts +3 -0
  179. package/dist/verification/telemetry.d.ts.map +1 -1
  180. package/dist/verification/telemetry.js +47 -0
  181. package/dist/verification/telemetry.js.map +1 -1
  182. package/dist/verification/types.d.ts +42 -1
  183. package/dist/verification/types.d.ts.map +1 -1
  184. package/package.json +1 -1
  185. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +4 -0
  186. package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +11 -0
  187. package/templates/ide/antigravity/.agents/skills/dare-patterns/SKILL.md +9 -0
  188. package/templates/ide/claude/.claude/commands/dare-blueprint.md +4 -0
  189. package/templates/ide/claude/.claude/commands/dare-design.md +10 -0
  190. package/templates/ide/claude/.claude/commands/dare-patterns.md +12 -0
  191. package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +4 -2
  192. package/templates/ide/cursor/.cursor/commands/dare-design.md +9 -3
  193. package/templates/ide/cursor/.cursor/commands/dare-patterns.md +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dafny.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/dafny.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMlE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAyCD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GAAG,UAAU,CA8Bb;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAS9D;AAmDD,eAAO,MAAM,YAAY,EAAE,aAK1B,CAAC;AAEF,eAAO,MAAM,OAAO,eAAe,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { safeSpawn } from '../../../exec/safe-spawn.js';
2
+ import { FormalBackendError, FormalToolNotFoundError } from './backend.js';
3
+ const DAFNY_BIN = 'dafny';
4
+ const MIN_VERSION = '4.0.0';
5
+ function classifyStage(output) {
6
+ const lower = output.toLowerCase();
7
+ const hasSpec = /\brequires\b/.test(lower) ||
8
+ /precondition might not hold/.test(lower) ||
9
+ /precondition could not be proved/.test(lower);
10
+ const hasImpl = /\bensures\b/.test(lower) ||
11
+ /postcondition might not hold/.test(lower) ||
12
+ /postcondition could not be proved/.test(lower) ||
13
+ /assertion might not hold/.test(lower);
14
+ if (hasSpec && hasImpl)
15
+ return 'both';
16
+ if (hasSpec)
17
+ return 'spec';
18
+ if (hasImpl)
19
+ return 'impl';
20
+ return 'impl';
21
+ }
22
+ function extractStableReason(output) {
23
+ const lines = output.split(/\r?\n/);
24
+ const patterns = [
25
+ /postcondition might not hold/i,
26
+ /precondition might not hold/i,
27
+ /assertion might not hold/i,
28
+ /postcondition could not be proved/i,
29
+ /precondition could not be proved/i,
30
+ /(\d+) errors?\b/i,
31
+ ];
32
+ for (const line of lines) {
33
+ const trimmed = line.trim().replace(/\s+/g, ' ');
34
+ if (!trimmed)
35
+ continue;
36
+ for (const p of patterns) {
37
+ if (p.test(trimmed))
38
+ return trimmed.slice(0, 200);
39
+ }
40
+ }
41
+ const errCount = output.match(/(\d+) errors?\b/i);
42
+ if (errCount)
43
+ return `dafny: ${errCount[0]}`;
44
+ return 'dafny: proof rejected';
45
+ }
46
+ /** Parse Dafny stdout/stderr + exit code into a deterministic verdict core. */
47
+ export function parseDafnyOutput(args) {
48
+ const combined = `${args.stdout}\n${args.stderr}`;
49
+ if (args.timedOut) {
50
+ return { verified: false, stage: 'none', reason: 'proof timed out' };
51
+ }
52
+ const errorMatch = combined.match(/(\d+) errors?\b/i);
53
+ const errorCount = errorMatch ? Number.parseInt(errorMatch[1] ?? '0', 10) : 0;
54
+ const hasProofFailure = errorCount > 0 ||
55
+ /assertion might not hold/i.test(combined) ||
56
+ /postcondition might not hold/i.test(combined) ||
57
+ /precondition might not hold/i.test(combined) ||
58
+ /postcondition could not be proved/i.test(combined) ||
59
+ /precondition could not be proved/i.test(combined);
60
+ if (hasProofFailure) {
61
+ return {
62
+ verified: false,
63
+ stage: classifyStage(combined),
64
+ reason: extractStableReason(combined),
65
+ };
66
+ }
67
+ if (args.code === 0 && /\bverified\b/i.test(combined)) {
68
+ return { verified: true, stage: 'none', reason: 'dafny: verified' };
69
+ }
70
+ return { verified: false, stage: 'none', reason: 'dafny: unparseable' };
71
+ }
72
+ export function buildDafnyArgv(input) {
73
+ return [
74
+ 'verify',
75
+ input.specPath,
76
+ '--solver-path',
77
+ 'z3',
78
+ '--verification-time-limit',
79
+ String(input.proofTimeoutSeconds),
80
+ ];
81
+ }
82
+ async function probeDafny(cwd) {
83
+ const r = await safeSpawn(DAFNY_BIN, ['--version'], {
84
+ cwd,
85
+ timeoutSeconds: 30,
86
+ maxChars: 2000,
87
+ });
88
+ return r.code === 0;
89
+ }
90
+ async function isAvailable(cwd) {
91
+ return probeDafny(cwd);
92
+ }
93
+ async function run(input) {
94
+ const start = Date.now();
95
+ if (!(await isAvailable(input.cwd))) {
96
+ throw new FormalToolNotFoundError('dafny');
97
+ }
98
+ const argv = buildDafnyArgv(input);
99
+ const r = await safeSpawn(DAFNY_BIN, argv, {
100
+ cwd: input.cwd,
101
+ timeoutSeconds: input.proofTimeoutSeconds,
102
+ maxChars: 8000,
103
+ });
104
+ const parse = parseDafnyOutput({
105
+ stdout: r.stdout,
106
+ stderr: r.stderr,
107
+ code: r.code,
108
+ timedOut: r.timedOut,
109
+ });
110
+ if (r.code !== 0 && !r.timedOut && parse.reason === 'dafny: unparseable') {
111
+ throw new FormalBackendError(`dafny exited ${r.code}`, r.stderr);
112
+ }
113
+ return {
114
+ backend: 'dafny',
115
+ verified: parse.verified,
116
+ stage: parse.stage,
117
+ bypassDetected: false,
118
+ repairIterations: 0,
119
+ solverExitCode: r.code,
120
+ reason: parse.reason,
121
+ durationMs: Date.now() - start,
122
+ };
123
+ }
124
+ export const dafnyBackend = {
125
+ backend: 'dafny',
126
+ minVersion: MIN_VERSION,
127
+ isAvailable,
128
+ run,
129
+ };
130
+ export const backend = dafnyBackend;
131
+ //# sourceMappingURL=dafny.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dafny.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/dafny.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FormalStage } from '../../types.js';
2
+ import type { FormalBackend, FormalRunInput } from './backend.js';
3
+ export interface LeanParse {
4
+ readonly verified: boolean;
5
+ readonly stage: FormalStage;
6
+ readonly reason: string;
7
+ }
8
+ export declare function parseLeanOutput(args: {
9
+ readonly stdout: string;
10
+ readonly stderr: string;
11
+ readonly code: number;
12
+ readonly timedOut: boolean;
13
+ }): LeanParse;
14
+ export declare function buildLeanArgv(input: FormalRunInput): string[];
15
+ export declare const leanBackend: FormalBackend;
16
+ export declare const backend: FormalBackend;
17
+ //# sourceMappingURL=lean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lean.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/lean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMlE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GAAG,SAAS,CAYZ;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAE7D;AAqCD,eAAO,MAAM,WAAW,EAAE,aAKzB,CAAC;AAEF,eAAO,MAAM,OAAO,eAAc,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { safeSpawn } from '../../../exec/safe-spawn.js';
2
+ import { FormalBackendError, FormalToolNotFoundError } from './backend.js';
3
+ const LAKE_BIN = 'lake';
4
+ const MIN_VERSION = '4.0.0';
5
+ export function parseLeanOutput(args) {
6
+ const combined = `${args.stdout}\n${args.stderr}`;
7
+ if (args.timedOut) {
8
+ return { verified: false, stage: 'none', reason: 'proof timed out' };
9
+ }
10
+ if (/\bsorry\b/i.test(combined) || /\berror:/i.test(combined)) {
11
+ return { verified: false, stage: 'impl', reason: 'lean: proof rejected' };
12
+ }
13
+ if (args.code === 0) {
14
+ return { verified: true, stage: 'none', reason: 'lean: verified' };
15
+ }
16
+ return { verified: false, stage: 'none', reason: 'lean: unparseable' };
17
+ }
18
+ export function buildLeanArgv(input) {
19
+ return ['env', 'lean', input.specPath];
20
+ }
21
+ async function isAvailable(cwd) {
22
+ const r = await safeSpawn(LAKE_BIN, ['--version'], {
23
+ cwd,
24
+ timeoutSeconds: 30,
25
+ maxChars: 2000,
26
+ });
27
+ return r.code === 0;
28
+ }
29
+ async function run(input) {
30
+ const start = Date.now();
31
+ if (!(await isAvailable(input.cwd))) {
32
+ throw new FormalToolNotFoundError('lean', input.target.file);
33
+ }
34
+ const r = await safeSpawn(LAKE_BIN, buildLeanArgv(input), {
35
+ cwd: input.cwd,
36
+ timeoutSeconds: input.proofTimeoutSeconds,
37
+ maxChars: 8000,
38
+ });
39
+ const parse = parseLeanOutput(r);
40
+ if (r.code !== 0 && !r.timedOut && parse.reason === 'lean: unparseable') {
41
+ throw new FormalBackendError(`lean exited ${r.code}`, r.stderr);
42
+ }
43
+ return {
44
+ backend: 'lean',
45
+ verified: parse.verified,
46
+ stage: parse.stage,
47
+ bypassDetected: false,
48
+ repairIterations: 0,
49
+ solverExitCode: r.code,
50
+ reason: parse.reason,
51
+ durationMs: Date.now() - start,
52
+ };
53
+ }
54
+ export const leanBackend = {
55
+ backend: 'lean',
56
+ minVersion: MIN_VERSION,
57
+ isAvailable,
58
+ run,
59
+ };
60
+ export const backend = leanBackend;
61
+ //# sourceMappingURL=lean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lean.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/lean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CriticalModuleMarker, FormalGateConfig } from '../../types.js';
2
+ /**
3
+ * Une marcação por tag (@dare-formal no changedFiles) e por config
4
+ * (verification.formal.modules no formato "path::symbol"). Valida cada
5
+ * file com assertRelativeSafe (RS-01). Deduplica por (file, symbol).
6
+ *
7
+ * Pura sobre (cwd, changedFiles, config). Sem LLM, sem rede. readFile READ-ONLY.
8
+ * Pós: lista de alvos críticos; VAZIA ⇒ aspecto formal vira SKIP (O-03).
9
+ */
10
+ export declare function resolveFormalTargets(args: {
11
+ readonly cwd: string;
12
+ readonly changedFiles: ReadonlyArray<string>;
13
+ readonly config: FormalGateConfig;
14
+ }): Promise<ReadonlyArray<CriticalModuleMarker>>;
15
+ //# sourceMappingURL=marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/marker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA8B7E;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;CACnC,GAAG,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAsC/C"}
@@ -0,0 +1,73 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import { assertRelativeSafe } from '../../../utils/path-safety.js';
4
+ /** Tag de marcação no código-fonte (A-11). Aceita `@dare-formal` e `@dare-formal: <symbol>`. */
5
+ const FORMAL_TAG = /@dare-formal(?::\s*([A-Za-z_$][\w$]*))?/;
6
+ /** Captura o nome de função/método na linha (ou nas próximas) após a tag. */
7
+ const SYMBOL_NEAR = /\b(?:function|async function|class)\s+([A-Za-z_$][\w$]*)|\b([A-Za-z_$][\w$]*)\s*(?:=\s*(?:async\s*)?\(|\()/;
8
+ function markerKey(file, symbol) {
9
+ return `${file}::${symbol ?? '*'}`;
10
+ }
11
+ function parseConfigModule(entry) {
12
+ const sep = entry.indexOf('::');
13
+ if (sep === -1)
14
+ return { file: entry.trim() };
15
+ return {
16
+ file: entry.slice(0, sep).trim(),
17
+ symbol: entry.slice(sep + 2).trim() || undefined,
18
+ };
19
+ }
20
+ function extractSymbolNear(lines, startIndex) {
21
+ for (let i = startIndex; i < Math.min(lines.length, startIndex + 4); i++) {
22
+ const match = lines[i]?.match(SYMBOL_NEAR);
23
+ if (match)
24
+ return match[1] ?? match[2];
25
+ }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * Une marcação por tag (@dare-formal no changedFiles) e por config
30
+ * (verification.formal.modules no formato "path::symbol"). Valida cada
31
+ * file com assertRelativeSafe (RS-01). Deduplica por (file, symbol).
32
+ *
33
+ * Pura sobre (cwd, changedFiles, config). Sem LLM, sem rede. readFile READ-ONLY.
34
+ * Pós: lista de alvos críticos; VAZIA ⇒ aspecto formal vira SKIP (O-03).
35
+ */
36
+ export async function resolveFormalTargets(args) {
37
+ const seen = new Set();
38
+ const out = [];
39
+ const push = (marker) => {
40
+ const key = markerKey(marker.file, marker.symbol);
41
+ if (seen.has(key))
42
+ return;
43
+ seen.add(key);
44
+ out.push(marker);
45
+ };
46
+ for (const entry of args.config.modules) {
47
+ const { file, symbol } = parseConfigModule(entry);
48
+ assertRelativeSafe(file);
49
+ push({ file, symbol, source: 'config' });
50
+ }
51
+ for (const rel of args.changedFiles) {
52
+ assertRelativeSafe(rel);
53
+ const abs = path.resolve(args.cwd, rel);
54
+ let content;
55
+ try {
56
+ content = await fs.readFile(abs, 'utf8');
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ const lines = content.split(/\r?\n/);
62
+ for (let i = 0; i < lines.length; i++) {
63
+ const tagMatch = lines[i]?.match(FORMAL_TAG);
64
+ if (!tagMatch)
65
+ continue;
66
+ const explicit = tagMatch[1];
67
+ const symbol = explicit ?? extractSymbolNear(lines, i);
68
+ push({ file: rel, symbol, source: 'tag' });
69
+ }
70
+ }
71
+ return Object.freeze(out);
72
+ }
73
+ //# sourceMappingURL=marker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/marker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FormalGateConfig } from '../../types.js';
2
+ import type { FormalBackend } from './backend.js';
3
+ /** Resolve o backend formal por config; lazy-load por import(). throws UnknownFormalBackendError. */
4
+ export declare function backendForConfig(cfg: FormalGateConfig): Promise<FormalBackend>;
5
+ /** Todos os backends registrados (carrega cada módulo no máximo uma vez). */
6
+ export declare function listFormalBackends(): Promise<ReadonlyArray<FormalBackend>>;
7
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoC,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAyBlD,qGAAqG;AACrG,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAKpF;AAED,6EAA6E;AAC7E,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAEhF"}
@@ -0,0 +1,31 @@
1
+ import { UnknownFormalBackendError } from './backend.js';
2
+ const BACKEND_LOADERS = {
3
+ dafny: async () => (await import('./dafny.js')).backend,
4
+ verus: async () => (await import('./verus.js')).backend,
5
+ lean: async () => (await import('./lean.js')).backend,
6
+ };
7
+ const BACKEND_ORDER = ['dafny', 'verus', 'lean'];
8
+ const backendCache = new Map();
9
+ async function loadBackend(id) {
10
+ const cached = backendCache.get(id);
11
+ if (cached)
12
+ return cached;
13
+ const loader = BACKEND_LOADERS[id];
14
+ if (!loader)
15
+ throw new UnknownFormalBackendError(String(id));
16
+ const loaded = await loader();
17
+ backendCache.set(id, loaded);
18
+ return loaded;
19
+ }
20
+ /** Resolve o backend formal por config; lazy-load por import(). throws UnknownFormalBackendError. */
21
+ export async function backendForConfig(cfg) {
22
+ if (!(cfg.backend in BACKEND_LOADERS)) {
23
+ throw new UnknownFormalBackendError(String(cfg.backend));
24
+ }
25
+ return loadBackend(cfg.backend);
26
+ }
27
+ /** Todos os backends registrados (carrega cada módulo no máximo uma vez). */
28
+ export async function listFormalBackends() {
29
+ return Promise.all(BACKEND_ORDER.map((id) => loadBackend(id)));
30
+ }
31
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,eAAe,GAEjB;IACF,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;IACvD,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;IACvD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;CACtD,CAAC;AAEF,MAAM,aAAa,GAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEjF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkC,CAAC;AAE/D,KAAK,UAAU,WAAW,CAAC,EAAmB;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAqB;IAC1D,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { AspectResult, FormalGateConfig, FormalVerdict } from '../../types.js';
2
+ import { resolveFormalTargets } from './marker.js';
3
+ import { backendForConfig } from './registry.js';
4
+ import { detectBypass } from './anti-bypass.js';
5
+ export interface FormalRunnerDeps {
6
+ readonly resolveFormalTargets: typeof resolveFormalTargets;
7
+ readonly backendForConfig: typeof backendForConfig;
8
+ readonly detectBypass: typeof detectBypass;
9
+ readonly readSource: (cwd: string, relPath: string) => Promise<string>;
10
+ readonly persistFormalProof: (cwd: string, taskId: string, proof: FormalVerdict) => Promise<void>;
11
+ }
12
+ export declare const defaultFormalRunnerDeps: FormalRunnerDeps;
13
+ /**
14
+ * Aspecto formal — marker → isAvailable → run → anti-bypass → AspectResult.
15
+ * Loop PREFACE NÃO roda aqui (A-8); a skill itera fora do CLI.
16
+ */
17
+ export declare function createCheckFormal(deps?: Partial<FormalRunnerDeps>): (args: {
18
+ readonly taskId: string;
19
+ readonly stack: string;
20
+ readonly cwd: string;
21
+ readonly config: FormalGateConfig;
22
+ readonly changedFiles: ReadonlyArray<string>;
23
+ }) => Promise<AspectResult>;
24
+ export declare const checkFormal: (args: {
25
+ readonly taskId: string;
26
+ readonly stack: string;
27
+ readonly cwd: string;
28
+ readonly config: FormalGateConfig;
29
+ readonly changedFiles: ReadonlyArray<string>;
30
+ }) => Promise<AspectResult>;
31
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EAEZ,gBAAgB,EAChB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAmB1B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,OAAO,YAAY,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAOrC,CAAC;AAsBF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACnC,CAAC,IAAI,EAAE;IACR,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9C,KAAK,OAAO,CAAC,YAAY,CAAC,CA2F1B;AAED,eAAO,MAAM,WAAW,SAnGd;IACR,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9C,KAAK,OAAO,CAAC,YAAY,CA6FoB,CAAC"}
@@ -0,0 +1,118 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { resolveFormalTargets } from './marker.js';
4
+ import { backendForConfig } from './registry.js';
5
+ import { detectBypass, formatBypassRejection, } from './anti-bypass.js';
6
+ import { FormalToolNotFoundError } from './backend.js';
7
+ const VERIFICATION_DIR = '.dare/verification';
8
+ async function persistFormalProof(cwd, taskId, proof) {
9
+ const file = path.join(cwd, VERIFICATION_DIR, `${taskId}.json`);
10
+ await fs.ensureDir(path.dirname(file));
11
+ const prev = (await fs.pathExists(file))
12
+ ? (await fs.readJson(file))
13
+ : {};
14
+ await fs.writeJson(file, { ...prev, formalProof: proof }, { spaces: 2 });
15
+ }
16
+ export const defaultFormalRunnerDeps = {
17
+ resolveFormalTargets,
18
+ backendForConfig,
19
+ detectBypass,
20
+ readSource: async (cwd, relPath) => fs.readFile(path.resolve(cwd, relPath), 'utf8'),
21
+ persistFormalProof,
22
+ };
23
+ function targetLabel(marker) {
24
+ return marker.symbol ? `${marker.file}::${marker.symbol}` : marker.file;
25
+ }
26
+ function formalRunInput(taskId, cwd, target, proofTimeoutSeconds) {
27
+ const specPath = path.join('EXECUTION', `${taskId}.formal`, 'spec.dfy');
28
+ return {
29
+ cwd,
30
+ target,
31
+ specPath,
32
+ implPath: target.file,
33
+ proofTimeoutSeconds,
34
+ };
35
+ }
36
+ /**
37
+ * Aspecto formal — marker → isAvailable → run → anti-bypass → AspectResult.
38
+ * Loop PREFACE NÃO roda aqui (A-8); a skill itera fora do CLI.
39
+ */
40
+ export function createCheckFormal(deps = {}) {
41
+ const d = { ...defaultFormalRunnerDeps, ...deps };
42
+ return async function checkFormal(args) {
43
+ const start = Date.now();
44
+ const targets = await d.resolveFormalTargets({
45
+ cwd: args.cwd,
46
+ changedFiles: args.changedFiles,
47
+ config: args.config,
48
+ });
49
+ if (targets.length === 0) {
50
+ return {
51
+ aspect: 'formal',
52
+ verdict: 'SKIP',
53
+ reason: 'no marked module',
54
+ durationMs: Date.now() - start,
55
+ };
56
+ }
57
+ const backend = await d.backendForConfig(args.config);
58
+ const available = await backend.isAvailable(args.cwd);
59
+ if (!available) {
60
+ throw new FormalToolNotFoundError(backend.backend, targetLabel(targets[0]));
61
+ }
62
+ let lastVerdict;
63
+ let failReason;
64
+ for (const target of targets) {
65
+ const input = formalRunInput(args.taskId, args.cwd, target, args.config.proofTimeoutSeconds);
66
+ const verdict = await backend.run(input);
67
+ let specSource = '';
68
+ let implSource = '';
69
+ try {
70
+ specSource = await d.readSource(args.cwd, input.specPath);
71
+ }
72
+ catch {
73
+ specSource = '';
74
+ }
75
+ try {
76
+ implSource = await d.readSource(args.cwd, input.implPath);
77
+ }
78
+ catch {
79
+ implSource = '';
80
+ }
81
+ const solverPassed = verdict.verified;
82
+ const bypass = args.config.antiBypass
83
+ ? d.detectBypass({ specSource, implSource })
84
+ : { bypassDetected: false, pattern: undefined };
85
+ const verified = solverPassed && !bypass.bypassDetected;
86
+ const finalVerdict = {
87
+ ...verdict,
88
+ verified,
89
+ bypassDetected: bypass.bypassDetected,
90
+ };
91
+ await d.persistFormalProof(args.cwd, args.taskId, finalVerdict);
92
+ lastVerdict = finalVerdict;
93
+ if (!verified) {
94
+ failReason = bypass.bypassDetected
95
+ ? formatBypassRejection(targetLabel(target), bypass.pattern ?? 'unknown')
96
+ : finalVerdict.reason;
97
+ break;
98
+ }
99
+ }
100
+ const durationMs = Date.now() - start;
101
+ if (lastVerdict?.verified) {
102
+ return {
103
+ aspect: 'formal',
104
+ verdict: 'PASS',
105
+ reason: lastVerdict.reason,
106
+ durationMs,
107
+ };
108
+ }
109
+ return {
110
+ aspect: 'formal',
111
+ verdict: 'FAIL',
112
+ reason: failReason ?? lastVerdict?.reason ?? 'formal verification failed',
113
+ durationMs,
114
+ };
115
+ };
116
+ }
117
+ export const checkFormal = createCheckFormal();
118
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FormalStage } from '../../types.js';
2
+ import type { FormalBackend, FormalRunInput } from './backend.js';
3
+ export interface VerusParse {
4
+ readonly verified: boolean;
5
+ readonly stage: FormalStage;
6
+ readonly reason: string;
7
+ }
8
+ export declare function parseVerusOutput(args: {
9
+ readonly stdout: string;
10
+ readonly stderr: string;
11
+ readonly code: number;
12
+ readonly timedOut: boolean;
13
+ }): VerusParse;
14
+ export declare function buildVerusArgv(input: FormalRunInput): string[];
15
+ export declare const verusBackend: FormalBackend;
16
+ export declare const backend: FormalBackend;
17
+ //# sourceMappingURL=verus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verus.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/verus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMlE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GAAG,UAAU,CAkBb;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAE9D;AAqCD,eAAO,MAAM,YAAY,EAAE,aAK1B,CAAC;AAEF,eAAO,MAAM,OAAO,eAAe,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { safeSpawn } from '../../../exec/safe-spawn.js';
2
+ import { FormalBackendError, FormalToolNotFoundError } from './backend.js';
3
+ const VERUS_BIN = 'verus';
4
+ const MIN_VERSION = '0.0.0';
5
+ export function parseVerusOutput(args) {
6
+ const combined = `${args.stdout}\n${args.stderr}`;
7
+ if (args.timedOut) {
8
+ return { verified: false, stage: 'none', reason: 'proof timed out' };
9
+ }
10
+ const verifiedMatch = /verification results:\s*(\d+)\s+verified,\s*0\s+errors/i.exec(combined);
11
+ if (args.code === 0 && verifiedMatch) {
12
+ return { verified: true, stage: 'none', reason: 'verus: verified' };
13
+ }
14
+ if (/\berror\b/i.test(combined) || /\bfailed\b/i.test(combined)) {
15
+ return { verified: false, stage: 'impl', reason: 'verus: proof rejected' };
16
+ }
17
+ if (args.code !== 0) {
18
+ return { verified: false, stage: 'none', reason: 'verus: unparseable' };
19
+ }
20
+ return { verified: false, stage: 'none', reason: 'verus: unparseable' };
21
+ }
22
+ export function buildVerusArgv(input) {
23
+ return [input.specPath, '--time-limit', String(input.proofTimeoutSeconds)];
24
+ }
25
+ async function isAvailable(cwd) {
26
+ const r = await safeSpawn(VERUS_BIN, ['--version'], {
27
+ cwd,
28
+ timeoutSeconds: 30,
29
+ maxChars: 2000,
30
+ });
31
+ return r.code === 0;
32
+ }
33
+ async function run(input) {
34
+ const start = Date.now();
35
+ if (!(await isAvailable(input.cwd))) {
36
+ throw new FormalToolNotFoundError('verus', input.target.file);
37
+ }
38
+ const r = await safeSpawn(VERUS_BIN, buildVerusArgv(input), {
39
+ cwd: input.cwd,
40
+ timeoutSeconds: input.proofTimeoutSeconds,
41
+ maxChars: 8000,
42
+ });
43
+ const parse = parseVerusOutput(r);
44
+ if (r.code !== 0 && !r.timedOut && parse.reason === 'verus: unparseable') {
45
+ throw new FormalBackendError(`verus exited ${r.code}`, r.stderr);
46
+ }
47
+ return {
48
+ backend: 'verus',
49
+ verified: parse.verified,
50
+ stage: parse.stage,
51
+ bypassDetected: false,
52
+ repairIterations: 0,
53
+ solverExitCode: r.code,
54
+ reason: parse.reason,
55
+ durationMs: Date.now() - start,
56
+ };
57
+ }
58
+ export const verusBackend = {
59
+ backend: 'verus',
60
+ minVersion: MIN_VERSION,
61
+ isAvailable,
62
+ run,
63
+ };
64
+ export const backend = verusBackend;
65
+ //# sourceMappingURL=verus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verus.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/verus.ts"],"names":[],"mappings":"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"}