@dewtech/dare-cli 3.2.0 → 3.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 (272) hide show
  1. package/README.md +2 -0
  2. package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
  3. package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
  4. package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
  5. package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
  6. package/dist/__tests__/dag-runner/state-store.test.js +74 -0
  7. package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
  8. package/dist/__tests__/ide-command-parity.test.js +1 -0
  9. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  10. package/dist/__tests__/project-generator.test.d.ts +2 -0
  11. package/dist/__tests__/project-generator.test.d.ts.map +1 -0
  12. package/dist/__tests__/project-generator.test.js +56 -0
  13. package/dist/__tests__/project-generator.test.js.map +1 -0
  14. package/dist/bin/dare.js +2 -0
  15. package/dist/bin/dare.js.map +1 -1
  16. package/dist/commands/__tests__/bench.spec.d.ts +2 -0
  17. package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
  18. package/dist/commands/__tests__/bench.spec.js +106 -0
  19. package/dist/commands/__tests__/bench.spec.js.map +1 -0
  20. package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
  21. package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
  22. package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
  23. package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
  24. package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
  25. package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
  26. package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
  27. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
  28. package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
  29. package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
  30. package/dist/commands/__tests__/execute.verify.spec.js +150 -0
  31. package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
  32. package/dist/commands/bench.d.ts +10 -0
  33. package/dist/commands/bench.d.ts.map +1 -0
  34. package/dist/commands/bench.js +64 -0
  35. package/dist/commands/bench.js.map +1 -0
  36. package/dist/commands/execute-verification.d.ts +51 -0
  37. package/dist/commands/execute-verification.d.ts.map +1 -0
  38. package/dist/commands/execute-verification.js +201 -0
  39. package/dist/commands/execute-verification.js.map +1 -0
  40. package/dist/commands/execute.d.ts.map +1 -1
  41. package/dist/commands/execute.js +139 -2
  42. package/dist/commands/execute.js.map +1 -1
  43. package/dist/dag-runner/ralph-loop.d.ts +9 -9
  44. package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
  45. package/dist/dag-runner/ralph-loop.js +89 -113
  46. package/dist/dag-runner/ralph-loop.js.map +1 -1
  47. package/dist/dag-runner/state-store.d.ts +14 -1
  48. package/dist/dag-runner/state-store.d.ts.map +1 -1
  49. package/dist/dag-runner/state-store.js +39 -8
  50. package/dist/dag-runner/state-store.js.map +1 -1
  51. package/dist/exec/npm-invoke.d.ts +8 -0
  52. package/dist/exec/npm-invoke.d.ts.map +1 -0
  53. package/dist/exec/npm-invoke.js +45 -0
  54. package/dist/exec/npm-invoke.js.map +1 -0
  55. package/dist/exec/safe-spawn.d.ts +21 -0
  56. package/dist/exec/safe-spawn.d.ts.map +1 -0
  57. package/dist/exec/safe-spawn.js +108 -0
  58. package/dist/exec/safe-spawn.js.map +1 -0
  59. package/dist/graphrag/types.d.ts +2 -2
  60. package/dist/graphrag/types.d.ts.map +1 -1
  61. package/dist/stacks/dna-emitter.d.ts.map +1 -1
  62. package/dist/stacks/dna-emitter.js +1 -10
  63. package/dist/stacks/dna-emitter.js.map +1 -1
  64. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  65. package/dist/utils/UpdateApplier.js +8 -0
  66. package/dist/utils/UpdateApplier.js.map +1 -1
  67. package/dist/utils/logger.d.ts +7 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +23 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/path-safety.d.ts +22 -0
  72. package/dist/utils/path-safety.d.ts.map +1 -0
  73. package/dist/utils/path-safety.js +83 -0
  74. package/dist/utils/path-safety.js.map +1 -0
  75. package/dist/utils/project-generator.d.ts.map +1 -1
  76. package/dist/utils/project-generator.js +2 -0
  77. package/dist/utils/project-generator.js.map +1 -1
  78. package/dist/utils/stack-bootstrap.js +2 -2
  79. package/dist/utils/stack-bootstrap.js.map +1 -1
  80. package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
  81. package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
  82. package/dist/verification/__tests__/anti-tamper.test.js +73 -0
  83. package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
  84. package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
  85. package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
  86. package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
  87. package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
  88. package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
  89. package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
  90. package/dist/verification/__tests__/bench-harness.test.js +75 -0
  91. package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
  92. package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
  93. package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
  94. package/dist/verification/__tests__/bench-report.test.js +73 -0
  95. package/dist/verification/__tests__/bench-report.test.js.map +1 -0
  96. package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
  97. package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
  98. package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
  99. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
  100. package/dist/verification/__tests__/config.test.d.ts +2 -0
  101. package/dist/verification/__tests__/config.test.d.ts.map +1 -0
  102. package/dist/verification/__tests__/config.test.js +50 -0
  103. package/dist/verification/__tests__/config.test.js.map +1 -0
  104. package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
  105. package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
  106. package/dist/verification/__tests__/decay-policy.test.js +130 -0
  107. package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
  108. package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
  109. package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
  110. package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
  111. package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
  112. package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
  113. package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
  114. package/dist/verification/__tests__/failure-signature.test.js +40 -0
  115. package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
  116. package/dist/verification/__tests__/logger.test.d.ts +2 -0
  117. package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
  118. package/dist/verification/__tests__/logger.test.js +23 -0
  119. package/dist/verification/__tests__/logger.test.js.map +1 -0
  120. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
  121. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
  122. package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
  123. package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
  124. package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
  125. package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
  126. package/dist/verification/__tests__/mutation-infection.test.js +101 -0
  127. package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
  128. package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
  129. package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
  130. package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
  131. package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
  132. package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
  133. package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
  134. package/dist/verification/__tests__/mutation-registry.test.js +28 -0
  135. package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
  136. package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
  137. package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
  138. package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
  139. package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
  140. package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
  141. package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
  142. package/dist/verification/__tests__/no-shell-true.test.js +43 -0
  143. package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
  144. package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
  145. package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
  146. package/dist/verification/__tests__/path-safety.test.js +59 -0
  147. package/dist/verification/__tests__/path-safety.test.js.map +1 -0
  148. package/dist/verification/__tests__/prerank.test.d.ts +2 -0
  149. package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
  150. package/dist/verification/__tests__/prerank.test.js +44 -0
  151. package/dist/verification/__tests__/prerank.test.js.map +1 -0
  152. package/dist/verification/__tests__/runner.test.d.ts +2 -0
  153. package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
  154. package/dist/verification/__tests__/runner.test.js +200 -0
  155. package/dist/verification/__tests__/runner.test.js.map +1 -0
  156. package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
  157. package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
  158. package/dist/verification/__tests__/safe-spawn.test.js +36 -0
  159. package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
  160. package/dist/verification/__tests__/security.test.d.ts +2 -0
  161. package/dist/verification/__tests__/security.test.d.ts.map +1 -0
  162. package/dist/verification/__tests__/security.test.js +79 -0
  163. package/dist/verification/__tests__/security.test.js.map +1 -0
  164. package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
  165. package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
  166. package/dist/verification/__tests__/selector-pareto.test.js +77 -0
  167. package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
  168. package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
  169. package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
  170. package/dist/verification/__tests__/telemetry.test.js +116 -0
  171. package/dist/verification/__tests__/telemetry.test.js.map +1 -0
  172. package/dist/verification/__tests__/type-check.test.d.ts +2 -0
  173. package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
  174. package/dist/verification/__tests__/type-check.test.js +52 -0
  175. package/dist/verification/__tests__/type-check.test.js.map +1 -0
  176. package/dist/verification/__tests__/worktree.test.d.ts +2 -0
  177. package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
  178. package/dist/verification/__tests__/worktree.test.js +41 -0
  179. package/dist/verification/__tests__/worktree.test.js.map +1 -0
  180. package/dist/verification/bench/fixtures.d.ts +11 -0
  181. package/dist/verification/bench/fixtures.d.ts.map +1 -0
  182. package/dist/verification/bench/fixtures.js +66 -0
  183. package/dist/verification/bench/fixtures.js.map +1 -0
  184. package/dist/verification/bench/harness.d.ts +19 -0
  185. package/dist/verification/bench/harness.d.ts.map +1 -0
  186. package/dist/verification/bench/harness.js +138 -0
  187. package/dist/verification/bench/harness.js.map +1 -0
  188. package/dist/verification/bench/report.d.ts +53 -0
  189. package/dist/verification/bench/report.d.ts.map +1 -0
  190. package/dist/verification/bench/report.js +47 -0
  191. package/dist/verification/bench/report.js.map +1 -0
  192. package/dist/verification/best-of-n/runner.d.ts +29 -0
  193. package/dist/verification/best-of-n/runner.d.ts.map +1 -0
  194. package/dist/verification/best-of-n/runner.js +76 -0
  195. package/dist/verification/best-of-n/runner.js.map +1 -0
  196. package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
  197. package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
  198. package/dist/verification/best-of-n/selector/pareto.js +65 -0
  199. package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
  200. package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
  201. package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
  202. package/dist/verification/best-of-n/selector/prerank.js +32 -0
  203. package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
  204. package/dist/verification/best-of-n/worktree.d.ts +9 -0
  205. package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
  206. package/dist/verification/best-of-n/worktree.js +100 -0
  207. package/dist/verification/best-of-n/worktree.js.map +1 -0
  208. package/dist/verification/config.d.ts +24 -0
  209. package/dist/verification/config.d.ts.map +1 -0
  210. package/dist/verification/config.js +168 -0
  211. package/dist/verification/config.js.map +1 -0
  212. package/dist/verification/decay/policy.d.ts +16 -0
  213. package/dist/verification/decay/policy.d.ts.map +1 -0
  214. package/dist/verification/decay/policy.js +64 -0
  215. package/dist/verification/decay/policy.js.map +1 -0
  216. package/dist/verification/decay/signature.d.ts +6 -0
  217. package/dist/verification/decay/signature.d.ts.map +1 -0
  218. package/dist/verification/decay/signature.js +18 -0
  219. package/dist/verification/decay/signature.js.map +1 -0
  220. package/dist/verification/gates/anti-tamper.d.ts +16 -0
  221. package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
  222. package/dist/verification/gates/anti-tamper.js +142 -0
  223. package/dist/verification/gates/anti-tamper.js.map +1 -0
  224. package/dist/verification/gates/fail-to-pass.d.ts +39 -0
  225. package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
  226. package/dist/verification/gates/fail-to-pass.js +173 -0
  227. package/dist/verification/gates/fail-to-pass.js.map +1 -0
  228. package/dist/verification/gates/mutation/adapter.d.ts +34 -0
  229. package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
  230. package/dist/verification/gates/mutation/adapter.js +22 -0
  231. package/dist/verification/gates/mutation/adapter.js.map +1 -0
  232. package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
  233. package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
  234. package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
  235. package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
  236. package/dist/verification/gates/mutation/infection.d.ts +28 -0
  237. package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
  238. package/dist/verification/gates/mutation/infection.js +149 -0
  239. package/dist/verification/gates/mutation/infection.js.map +1 -0
  240. package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
  241. package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
  242. package/dist/verification/gates/mutation/mutmut.js +148 -0
  243. package/dist/verification/gates/mutation/mutmut.js.map +1 -0
  244. package/dist/verification/gates/mutation/stryker.d.ts +19 -0
  245. package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
  246. package/dist/verification/gates/mutation/stryker.js +103 -0
  247. package/dist/verification/gates/mutation/stryker.js.map +1 -0
  248. package/dist/verification/gates/type-check.d.ts +11 -0
  249. package/dist/verification/gates/type-check.d.ts.map +1 -0
  250. package/dist/verification/gates/type-check.js +84 -0
  251. package/dist/verification/gates/type-check.js.map +1 -0
  252. package/dist/verification/registry.d.ts +6 -0
  253. package/dist/verification/registry.d.ts.map +1 -0
  254. package/dist/verification/registry.js +49 -0
  255. package/dist/verification/registry.js.map +1 -0
  256. package/dist/verification/runner.d.ts +27 -0
  257. package/dist/verification/runner.d.ts.map +1 -0
  258. package/dist/verification/runner.js +173 -0
  259. package/dist/verification/runner.js.map +1 -0
  260. package/dist/verification/telemetry.d.ts +18 -0
  261. package/dist/verification/telemetry.d.ts.map +1 -0
  262. package/dist/verification/telemetry.js +71 -0
  263. package/dist/verification/telemetry.js.map +1 -0
  264. package/dist/verification/types.d.ts +89 -0
  265. package/dist/verification/types.d.ts.map +1 -0
  266. package/dist/verification/types.js +3 -0
  267. package/dist/verification/types.js.map +1 -0
  268. package/package.json +5 -3
  269. package/templates/UPDATE-MANIFEST.json +20 -0
  270. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
  271. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
  272. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
@@ -0,0 +1,49 @@
1
+ import { UnknownMutationStackError } from './gates/mutation/adapter.js';
2
+ const STACK_TO_TOOL = {
3
+ 'node-nestjs': 'stryker',
4
+ react: 'stryker',
5
+ vue: 'stryker',
6
+ 'mcp-server-node-ts': 'stryker',
7
+ 'python-fastapi': 'mutmut',
8
+ 'mcp-server-python': 'mutmut',
9
+ 'rust-axum': 'cargo-mutants',
10
+ 'rust-leptos': 'cargo-mutants',
11
+ 'rust-leptos-csr': 'cargo-mutants',
12
+ 'php-laravel': 'infection',
13
+ };
14
+ const TOOL_LOADERS = {
15
+ stryker: async () => (await import('./gates/mutation/stryker.js')).adapter,
16
+ mutmut: async () => (await import('./gates/mutation/mutmut.js')).adapter,
17
+ 'cargo-mutants': async () => (await import('./gates/mutation/cargo-mutants.js')).adapter,
18
+ infection: async () => (await import('./gates/mutation/infection.js')).adapter,
19
+ };
20
+ const TOOL_ORDER = [
21
+ 'stryker',
22
+ 'mutmut',
23
+ 'cargo-mutants',
24
+ 'infection',
25
+ ];
26
+ const adapterCache = new Map();
27
+ async function loadAdapter(tool) {
28
+ let cached = adapterCache.get(tool);
29
+ if (cached)
30
+ return cached;
31
+ cached = await TOOL_LOADERS[tool]();
32
+ adapterCache.set(tool, cached);
33
+ return cached;
34
+ }
35
+ function toolForStack(stack) {
36
+ return STACK_TO_TOOL[stack];
37
+ }
38
+ /** Resolve mutation adapter for a project stack (lazy-loaded per tool). */
39
+ export async function adapterForStack(stack) {
40
+ const tool = toolForStack(stack);
41
+ if (!tool)
42
+ throw new UnknownMutationStackError(stack);
43
+ return loadAdapter(tool);
44
+ }
45
+ /** All registered mutation adapters (loads each tool at most once). */
46
+ export async function listMutationAdapters() {
47
+ return Promise.all(TOOL_ORDER.map((tool) => loadAdapter(tool)));
48
+ }
49
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/verification/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,aAAa,GAA2C;IAC5D,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,oBAAoB,EAAE,SAAS;IAC/B,gBAAgB,EAAE,QAAQ;IAC1B,mBAAmB,EAAE,QAAQ;IAC7B,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,eAAe;IAC9B,iBAAiB,EAAE,eAAe;IAClC,aAAa,EAAE,WAAW;CAC3B,CAAC;AAEF,MAAM,YAAY,GAEd;IACF,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO;IAC1E,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO;IACxE,eAAe,EAAE,KAAK,IAAI,EAAE,CAC1B,CAAC,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC,OAAO;IAC7D,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,OAAO;CAC/E,CAAC;AAEF,MAAM,UAAU,GAAgC;IAC9C,SAAS;IACT,QAAQ;IACR,eAAe;IACf,WAAW;CACZ,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiC,CAAC;AAE9D,KAAK,UAAU,WAAW,CAAC,IAAkB;IAC3C,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IACpC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa;IAEb,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAGxC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { VerificationConfig, VerificationResult } from './types.js';
2
+ import { checkFailToPass, readVerificationArtifact } from './gates/fail-to-pass.js';
3
+ import { checkAntiTamper } from './gates/anti-tamper.js';
4
+ import { checkTypes } from './gates/type-check.js';
5
+ import { adapterForStack } from './registry.js';
6
+ export interface RunVerificationOptions {
7
+ readonly taskId: string;
8
+ readonly stack: string;
9
+ readonly cwd: string;
10
+ readonly config: VerificationConfig;
11
+ readonly changedFiles: ReadonlyArray<string>;
12
+ readonly onProgress?: (e: {
13
+ aspect: string;
14
+ phase: 'start' | 'pass' | 'fail' | 'skip';
15
+ }) => void;
16
+ }
17
+ export interface VerificationDeps {
18
+ readonly readArtifact: typeof readVerificationArtifact;
19
+ readonly checkFailToPass: typeof checkFailToPass;
20
+ readonly checkAntiTamper: typeof checkAntiTamper;
21
+ readonly checkTypes: typeof checkTypes;
22
+ readonly adapterForStack: typeof adapterForStack;
23
+ }
24
+ export declare const defaultVerificationDeps: VerificationDeps;
25
+ export declare function createRunVerification(deps?: VerificationDeps): (opts: RunVerificationOptions) => Promise<VerificationResult>;
26
+ export declare const runVerification: (opts: RunVerificationOptions) => Promise<VerificationResult>;
27
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/verification/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EAEf,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,WAAW,sBAAsB;IACrC,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,kBAAkB,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;KAC3C,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC;IACvD,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;IACjD,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,OAAO,UAAU,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;CAClD;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAMrC,CAAC;AA8FF,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,gBAA0C,GAC/C,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAkH/D;AAED,eAAO,MAAM,eAAe,SApHlB,sBAAsB,KAAK,OAAO,CAAC,kBAAkB,CAoHT,CAAC"}
@@ -0,0 +1,173 @@
1
+ import { checkFailToPass, FailToPassMissingError, readVerificationArtifact, } from './gates/fail-to-pass.js';
2
+ import { checkAntiTamper } from './gates/anti-tamper.js';
3
+ import { checkTypes } from './gates/type-check.js';
4
+ import { adapterForStack } from './registry.js';
5
+ import { MutationToolNotFoundError } from './gates/mutation/adapter.js';
6
+ import { createLogger } from '../utils/logger.js';
7
+ const log = createLogger('verification');
8
+ export const defaultVerificationDeps = {
9
+ readArtifact: readVerificationArtifact,
10
+ checkFailToPass,
11
+ checkAntiTamper,
12
+ checkTypes,
13
+ adapterForStack,
14
+ };
15
+ function notify(onProgress, aspect, phase) {
16
+ onProgress?.({ aspect, phase });
17
+ }
18
+ function logAspect(result) {
19
+ log.info({
20
+ aspect: result.aspect,
21
+ verdict: result.verdict,
22
+ score: result.score,
23
+ reason: result.reason,
24
+ durationMs: result.durationMs,
25
+ }, 'verification aspect');
26
+ }
27
+ function computePassed(aspects) {
28
+ return aspects.every((a) => a.verdict === 'PASS' || a.verdict === 'SKIP');
29
+ }
30
+ function finish(taskId, aspects, startedAt) {
31
+ const mutation = aspects.find((a) => a.aspect === 'mutation');
32
+ return {
33
+ taskId,
34
+ passed: computePassed(aspects),
35
+ aspects,
36
+ mutationScore: mutation?.score,
37
+ durationMs: Date.now() - startedAt,
38
+ };
39
+ }
40
+ async function runMutationAspect(opts, deps) {
41
+ const start = Date.now();
42
+ const { config, stack, cwd, changedFiles } = opts;
43
+ const adapter = await deps.adapterForStack(stack);
44
+ const available = await adapter.isAvailable(cwd);
45
+ if (!available) {
46
+ throw new MutationToolNotFoundError(adapter.tool);
47
+ }
48
+ const output = await adapter.run({
49
+ cwd,
50
+ changedFiles,
51
+ incremental: config.mutation.incremental,
52
+ maxMutants: config.mutation.maxMutants,
53
+ timeoutSeconds: config.mutation.timeoutSeconds,
54
+ });
55
+ const durationMs = Date.now() - start;
56
+ if (Number.isNaN(output.score)) {
57
+ return {
58
+ aspect: 'mutation',
59
+ verdict: 'SKIP',
60
+ reason: 'zero mutants evaluated',
61
+ durationMs,
62
+ };
63
+ }
64
+ if (output.score < config.mutation.minScore) {
65
+ return {
66
+ aspect: 'mutation',
67
+ verdict: 'FAIL',
68
+ score: output.score,
69
+ reason: `mutation score ${output.score.toFixed(4)} < minScore ${config.mutation.minScore}`,
70
+ durationMs,
71
+ };
72
+ }
73
+ return {
74
+ aspect: 'mutation',
75
+ verdict: 'PASS',
76
+ score: output.score,
77
+ reason: `mutation score ${output.score.toFixed(4)}`,
78
+ durationMs,
79
+ };
80
+ }
81
+ export function createRunVerification(deps = defaultVerificationDeps) {
82
+ return async function runVerification(opts) {
83
+ const startedAt = Date.now();
84
+ const { taskId, cwd, config } = opts;
85
+ const aspects = [];
86
+ if (!config.enabled) {
87
+ return {
88
+ taskId,
89
+ passed: true,
90
+ aspects: [],
91
+ durationMs: Date.now() - startedAt,
92
+ };
93
+ }
94
+ const artifact = await deps.readArtifact(cwd, taskId);
95
+ if (config.failToPass.required) {
96
+ notify(opts.onProgress, 'fail-to-pass', 'start');
97
+ if (!artifact?.failToPassBaseline || !artifact.specGlob) {
98
+ throw new FailToPassMissingError(taskId);
99
+ }
100
+ const ftp = await deps.checkFailToPass({ taskId, cwd });
101
+ aspects.push(ftp);
102
+ logAspect(ftp);
103
+ notify(opts.onProgress, 'fail-to-pass', ftp.verdict === 'PASS' ? 'pass' : 'fail');
104
+ if (ftp.verdict === 'FAIL') {
105
+ return finish(taskId, aspects, startedAt);
106
+ }
107
+ }
108
+ if (config.antiTamper.enabled) {
109
+ notify(opts.onProgress, 'anti-tamper', 'start');
110
+ if (!artifact?.tamperSnapshot) {
111
+ const skipped = {
112
+ aspect: 'anti-tamper',
113
+ verdict: 'SKIP',
114
+ reason: 'no tamper snapshot',
115
+ durationMs: 0,
116
+ };
117
+ aspects.push(skipped);
118
+ logAspect(skipped);
119
+ notify(opts.onProgress, 'anti-tamper', 'skip');
120
+ }
121
+ else {
122
+ const testGlob = artifact.specGlob ?? '**/*.test.ts';
123
+ const at = await deps.checkAntiTamper({
124
+ baseline: artifact.tamperSnapshot,
125
+ cwd,
126
+ testGlob,
127
+ });
128
+ aspects.push(at);
129
+ logAspect(at);
130
+ notify(opts.onProgress, 'anti-tamper', at.verdict === 'PASS'
131
+ ? 'pass'
132
+ : at.verdict === 'SKIP'
133
+ ? 'skip'
134
+ : 'fail');
135
+ if (at.verdict === 'FAIL') {
136
+ return finish(taskId, aspects, startedAt);
137
+ }
138
+ }
139
+ }
140
+ if (config.typeCheck.enabled) {
141
+ notify(opts.onProgress, 'type', 'start');
142
+ const tc = await deps.checkTypes({
143
+ stack: opts.stack,
144
+ cwd,
145
+ timeoutSeconds: 120,
146
+ });
147
+ aspects.push(tc);
148
+ logAspect(tc);
149
+ notify(opts.onProgress, 'type', tc.verdict === 'PASS'
150
+ ? 'pass'
151
+ : tc.verdict === 'SKIP'
152
+ ? 'skip'
153
+ : 'fail');
154
+ if (tc.verdict === 'FAIL') {
155
+ return finish(taskId, aspects, startedAt);
156
+ }
157
+ }
158
+ if (config.mutation.enabled) {
159
+ notify(opts.onProgress, 'mutation', 'start');
160
+ const mut = await runMutationAspect(opts, deps);
161
+ aspects.push(mut);
162
+ logAspect(mut);
163
+ notify(opts.onProgress, 'mutation', mut.verdict === 'PASS'
164
+ ? 'pass'
165
+ : mut.verdict === 'SKIP'
166
+ ? 'skip'
167
+ : 'fail');
168
+ }
169
+ return finish(taskId, aspects, startedAt);
170
+ };
171
+ }
172
+ export const runVerification = createRunVerification();
173
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/verification/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { KnowledgeGraph } from '../graphrag/knowledge-graph.js';
2
+ import type { VerificationResult } from './types.js';
3
+ export interface VerificationTelemetrySummary {
4
+ readonly passed: boolean;
5
+ readonly mutationScore?: number;
6
+ readonly aspects: ReadonlyArray<{
7
+ readonly aspect: string;
8
+ readonly verdict: string;
9
+ readonly score?: number;
10
+ }>;
11
+ readonly durationMs: number;
12
+ }
13
+ /**
14
+ * Records verification verdict in GraphRAG: gate node + verified_by edge.
15
+ * Falls back to task.metadata.verification when the backend rejects new types.
16
+ */
17
+ export declare function recordVerification(graph: KnowledgeGraph, result: VerificationResult): void;
18
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/verification/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKrD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAkED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,kBAAkB,GACzB,IAAI,CASN"}
@@ -0,0 +1,71 @@
1
+ const GATE_NODE_TYPE = 'gate';
2
+ const VERIFIED_BY_EDGE = 'verified_by';
3
+ function summarizeResult(result) {
4
+ return {
5
+ passed: result.passed,
6
+ mutationScore: result.mutationScore,
7
+ aspects: result.aspects.map((a) => ({
8
+ aspect: a.aspect,
9
+ verdict: a.verdict,
10
+ score: a.score,
11
+ })),
12
+ durationMs: result.durationMs,
13
+ };
14
+ }
15
+ function gateNode(taskId, result) {
16
+ return {
17
+ id: `gate:${taskId}`,
18
+ type: GATE_NODE_TYPE,
19
+ label: `verification ${taskId}`,
20
+ metadata: {
21
+ passed: result.passed,
22
+ mutationScore: result.mutationScore,
23
+ aspects: result.aspects,
24
+ durationMs: result.durationMs,
25
+ },
26
+ };
27
+ }
28
+ function verifiedByEdge(taskId) {
29
+ return {
30
+ id: `edge:${taskId}:verified_by`,
31
+ sourceId: `task:${taskId}`,
32
+ targetId: `gate:${taskId}`,
33
+ type: VERIFIED_BY_EDGE,
34
+ };
35
+ }
36
+ function fallbackToTaskMetadata(graph, taskId, result) {
37
+ const taskNodeId = `task:${taskId}`;
38
+ const existing = graph.getNode(taskNodeId);
39
+ const summary = summarizeResult(result);
40
+ if (!existing) {
41
+ graph.addNode({
42
+ id: taskNodeId,
43
+ type: 'task',
44
+ label: taskId,
45
+ metadata: { verification: summary },
46
+ });
47
+ return;
48
+ }
49
+ graph.addNode({
50
+ ...existing,
51
+ metadata: {
52
+ ...existing.metadata,
53
+ verification: summary,
54
+ },
55
+ });
56
+ }
57
+ /**
58
+ * Records verification verdict in GraphRAG: gate node + verified_by edge.
59
+ * Falls back to task.metadata.verification when the backend rejects new types.
60
+ */
61
+ export function recordVerification(graph, result) {
62
+ const taskId = result.taskId;
63
+ try {
64
+ graph.addNode(gateNode(taskId, result));
65
+ graph.addEdge(verifiedByEdge(taskId));
66
+ }
67
+ catch {
68
+ fallbackToTaskMetadata(graph, taskId, result);
69
+ }
70
+ }
71
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/verification/telemetry.ts"],"names":[],"mappings":"AAIA,MAAM,cAAc,GAAG,MAAe,CAAC;AACvC,MAAM,gBAAgB,GAAG,aAAsB,CAAC;AAahD,SAAS,eAAe,CAAC,MAA0B;IACjD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,MAA0B;IAC1D,OAAO;QACL,EAAE,EAAE,QAAQ,MAAM,EAAE;QACpB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,gBAAgB,MAAM,EAAE;QAC/B,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO;QACL,EAAE,EAAE,QAAQ,MAAM,cAAc;QAChC,QAAQ,EAAE,QAAQ,MAAM,EAAE;QAC1B,QAAQ,EAAE,QAAQ,MAAM,EAAE;QAC1B,IAAI,EAAE,gBAAgB;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAqB,EACrB,MAAc,EACd,MAA0B;IAE1B,MAAM,UAAU,GAAG,QAAQ,MAAM,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,OAAO,CAAC;YACZ,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;SACpC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,CAAC,OAAO,CAAC;QACZ,GAAG,QAAQ;QACX,QAAQ,EAAE;YACR,GAAG,QAAQ,CAAC,QAAQ;YACpB,YAAY,EAAE,OAAO;SACtB;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAqB,EACrB,MAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE7B,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,89 @@
1
+ export type LoopPolicy = 'decay' | 'fixed';
2
+ export type SaturationAction = 'fresh-start' | 'replan' | 'escalate';
3
+ export type MutationTool = 'stryker' | 'mutmut' | 'cargo-mutants' | 'infection';
4
+ export interface MutationConfig {
5
+ readonly enabled: boolean;
6
+ /** 0..1. Bloqueia DONE se score < minScore. Default 0.70. */
7
+ readonly minScore: number;
8
+ /** Só muta arquivos do git diff da task. Default true (RNF-01). */
9
+ readonly incremental: boolean;
10
+ /** Teto de mutantes por execução. Default 200. */
11
+ readonly maxMutants: number;
12
+ /** Timeout total do gate de mutação, em segundos. Default 900. */
13
+ readonly timeoutSeconds: number;
14
+ }
15
+ export interface LoopConfig {
16
+ readonly policy: LoopPolicy;
17
+ /** Teto duro de tentativas. Veredito ESCALATE ao atingir. Default 5. */
18
+ readonly maxAttempts: number;
19
+ /** Nº de tentativas com a MESMA assinatura → saturado. Default 3 (≤3, idea-3). */
20
+ readonly saturationWindow: number;
21
+ /** Ação ao saturar antes do teto. Default 'fresh-start'. */
22
+ readonly onSaturation: SaturationAction;
23
+ }
24
+ export interface BestOfNConfig {
25
+ readonly default: number;
26
+ readonly max: number;
27
+ /** Orçamento de tokens (null = sem teto no CLI; agente respeita). */
28
+ readonly budgetTokens: number | null;
29
+ }
30
+ export interface VerificationConfig {
31
+ readonly enabled: boolean;
32
+ readonly mutation: MutationConfig;
33
+ readonly failToPass: {
34
+ readonly required: boolean;
35
+ };
36
+ readonly antiTamper: {
37
+ readonly enabled: boolean;
38
+ };
39
+ readonly typeCheck: {
40
+ readonly enabled: boolean;
41
+ };
42
+ readonly loop: LoopConfig;
43
+ readonly bestOfN: BestOfNConfig;
44
+ readonly prerank: {
45
+ readonly enabled: boolean;
46
+ };
47
+ }
48
+ export type Aspect = 'build' | 'test' | 'lint' | 'type' | 'fail-to-pass' | 'anti-tamper' | 'mutation';
49
+ export type Verdict = 'PASS' | 'FAIL' | 'SKIP';
50
+ export interface AspectResult {
51
+ readonly aspect: Aspect;
52
+ readonly verdict: Verdict;
53
+ readonly score?: number;
54
+ readonly reason: string;
55
+ readonly durationMs: number;
56
+ }
57
+ export interface VerificationResult {
58
+ readonly taskId: string;
59
+ readonly passed: boolean;
60
+ readonly aspects: ReadonlyArray<AspectResult>;
61
+ readonly mutationScore?: number;
62
+ readonly durationMs: number;
63
+ }
64
+ export type LoopAction = 'CONTINUE' | 'FRESH_START' | 'REPLAN' | 'ESCALATE' | 'DONE';
65
+ export interface AttemptRecord {
66
+ readonly n: number;
67
+ readonly at: string;
68
+ readonly passed: boolean;
69
+ readonly failureSignature?: string;
70
+ readonly failedAspect?: Aspect;
71
+ }
72
+ export interface LoopVerdict {
73
+ readonly action: LoopAction;
74
+ readonly attempt: number;
75
+ readonly saturated: boolean;
76
+ readonly reason: string;
77
+ readonly failureSignature?: string;
78
+ }
79
+ export interface CandidateWorktree {
80
+ readonly id: string;
81
+ readonly path: string;
82
+ readonly branch: string;
83
+ }
84
+ export interface Candidate {
85
+ readonly id: string;
86
+ readonly worktree: CandidateWorktree;
87
+ readonly verification: VerificationResult;
88
+ }
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verification/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,eAAe,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CACjD;AAID,MAAM,MAAM,MAAM,GACd,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,cAAc,GACd,aAAa,GACb,UAAU,CAAC;AACf,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAID,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAErF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;CAC3C"}
@@ -0,0 +1,3 @@
1
+ /* ── Config (validada por zod em config.ts) ─────────────────────────── */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/verification/types.ts"],"names":[],"mappings":"AAAA,2EAA2E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dewtech/dare-cli",
3
- "version": "3.2.0",
3
+ "version": "3.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",
@@ -24,7 +24,7 @@
24
24
  "build": "tsx scripts/sync-implementations.ts && tsc && node -e \"require('fs-extra').copySync('src/skills/registry-mock.json','dist/skills/registry-mock.json')\"",
25
25
  "dev": "tsx watch src/bin/dare.ts",
26
26
  "test": "vitest run",
27
- "lint": "eslint src --ext .ts",
27
+ "lint": "eslint src",
28
28
  "format": "prettier --write src"
29
29
  },
30
30
  "dependencies": {
@@ -44,9 +44,11 @@
44
44
  "pino": "^8.16.0",
45
45
  "pino-pretty": "^10.2.0",
46
46
  "sql.js": "^1.11.0",
47
- "yaml": "^2.3.1"
47
+ "yaml": "^2.3.1",
48
+ "zod": "^3.23.8"
48
49
  },
49
50
  "devDependencies": {
51
+ "@stryker-mutator/core": "8.7.1",
50
52
  "@types/cors": "^2.8.13",
51
53
  "@types/express": "^4.17.0",
52
54
  "@types/figlet": "^1.5.8",
@@ -43,6 +43,26 @@
43
43
  "optional": false
44
44
  }
45
45
  ]
46
+ },
47
+ "3.3.0": {
48
+ "releasedAt": "2026-06-07",
49
+ "summary": "Reliable Verification Core — mutation, fail-to-pass, decay, best-of-N",
50
+ "changelog": "Adiciona bloco `verification` em dare.config.json (opt-in, enabled:false por padrão) com defaults para mutation, fail-to-pass, anti-tamper, type-check, loop decay, best-of-N e prerank. Projetos existentes recebem o bloco via migration `add-verification-defaults`.",
51
+ "changes": [
52
+ {
53
+ "type": "added",
54
+ "path": "dare.config.json#verification",
55
+ "description": "Adiciona objeto `verification` (enabled:false + defaults) — gate opt-in pós-Ralph Loop",
56
+ "appliesTo": ["*"]
57
+ }
58
+ ],
59
+ "migrations": [
60
+ {
61
+ "id": "add-verification-defaults",
62
+ "description": "Adiciona `verification` com defaults (enabled:false) em projetos pré-3.3 — opt-in, não ativa verificação automaticamente",
63
+ "optional": false
64
+ }
65
+ ]
46
66
  }
47
67
  }
48
68
  }
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: dare-bench
3
+ description: Roda o harness determinístico de fixtures de verificação (Fix·Rate, solve-rate, baseline). Mapeia o CLI `dare bench`.
4
+ ---
5
+
6
+ # DARE Bench — harness de verificação
7
+
8
+ Roda fixtures versionadas com patches golden/errados; mede Fix·Rate e solve-rate. Determinístico — sem LLM.
9
+
10
+ ## Como rodar
11
+
12
+ ```bash
13
+ dare bench --suite fixtures/bench --json
14
+ dare bench --suite fixtures/bench --baseline bench-baseline.json --fail-on-regression 3
15
+ ```
16
+
17
+ ## Exit codes
18
+
19
+ - `0` — ok (sem regressão vs baseline)
20
+ - `1` — regressão de solve-rate > limiar
21
+ - `2` — suite inválida
@@ -0,0 +1,18 @@
1
+ # /dare-bench
2
+
3
+ Roda o harness determinístico de fixtures de verificação (`dare bench`) — mede Fix·Rate e solve-rate contra patches versionados.
4
+
5
+ > Este comando expõe o CLI `dare bench` na IDE.
6
+
7
+ ## Como rodar
8
+
9
+ ```bash
10
+ dare bench --suite fixtures/bench --json
11
+ dare bench --suite fixtures/bench --baseline bench-baseline.json --fail-on-regression 3
12
+ ```
13
+
14
+ ## O que fazer
15
+
16
+ 1. Rode `dare bench` com `--json` para relatório estruturado.
17
+ 2. Compare com `--baseline` em CI; exit 1 = regressão > limiar pp.
18
+ 3. Exit 2 = suite inválida/ausente.
@@ -0,0 +1,18 @@
1
+ # Comando: /dare-bench
2
+
3
+ Roda o harness determinístico de fixtures de verificação (`dare bench`) — mede Fix·Rate e solve-rate contra patches versionados.
4
+
5
+ > Este comando expõe o CLI `dare bench` na IDE.
6
+
7
+ ## Como rodar
8
+
9
+ ```bash
10
+ dare bench --suite fixtures/bench --json
11
+ dare bench --suite fixtures/bench --baseline bench-baseline.json --fail-on-regression 3
12
+ ```
13
+
14
+ ## O que fazer
15
+
16
+ 1. Rode `dare bench` com `--json` para relatório estruturado.
17
+ 2. Compare com `--baseline` em CI; exit 1 = regressão > limiar pp.
18
+ 3. Exit 2 = suite inválida/ausente.