@dewtech/dare-cli 3.2.0 → 3.4.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 (839) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +764 -762
  3. package/dist/__tests__/confidence.test.js +13 -13
  4. package/dist/__tests__/dag-converter.test.js +56 -56
  5. package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
  6. package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
  7. package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
  8. package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
  9. package/dist/__tests__/dag-runner/state-store.test.js +74 -0
  10. package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
  11. package/dist/__tests__/ide-command-parity.test.js +1 -0
  12. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  13. package/dist/__tests__/mcp-server/server.test.js +3 -16
  14. package/dist/__tests__/mcp-server/server.test.js.map +1 -1
  15. package/dist/__tests__/project-generator.test.d.ts +2 -0
  16. package/dist/__tests__/project-generator.test.d.ts.map +1 -0
  17. package/dist/__tests__/project-generator.test.js +56 -0
  18. package/dist/__tests__/project-generator.test.js.map +1 -0
  19. package/dist/__tests__/refine.test.js +49 -49
  20. package/dist/__tests__/reverse-collection.test.js +6 -6
  21. package/dist/__tests__/review.test.js +38 -38
  22. package/dist/__tests__/security-hardening.test.d.ts +2 -0
  23. package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
  24. package/dist/__tests__/security-hardening.test.js +101 -0
  25. package/dist/__tests__/security-hardening.test.js.map +1 -0
  26. package/dist/__tests__/validate.test.js +65 -65
  27. package/dist/bin/dare.js +2 -0
  28. package/dist/bin/dare.js.map +1 -1
  29. package/dist/commands/__tests__/bench.spec.d.ts +2 -0
  30. package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
  31. package/dist/commands/__tests__/bench.spec.js +106 -0
  32. package/dist/commands/__tests__/bench.spec.js.map +1 -0
  33. package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
  34. package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
  35. package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
  36. package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
  37. package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
  38. package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
  39. package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
  40. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
  41. package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
  42. package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
  43. package/dist/commands/__tests__/execute.verify.spec.js +150 -0
  44. package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
  45. package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
  46. package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
  47. package/dist/commands/__tests__/init-validation.test.js +81 -0
  48. package/dist/commands/__tests__/init-validation.test.js.map +1 -0
  49. package/dist/commands/__tests__/init.integration.spec.js +6 -4
  50. package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
  51. package/dist/commands/__tests__/init.spec.d.ts +2 -0
  52. package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
  53. package/dist/commands/__tests__/init.spec.js +88 -0
  54. package/dist/commands/__tests__/init.spec.js.map +1 -0
  55. package/dist/commands/bench.d.ts +10 -0
  56. package/dist/commands/bench.d.ts.map +1 -0
  57. package/dist/commands/bench.js +64 -0
  58. package/dist/commands/bench.js.map +1 -0
  59. package/dist/commands/blueprint.js +122 -122
  60. package/dist/commands/design.js +20 -20
  61. package/dist/commands/execute-verification.d.ts +51 -0
  62. package/dist/commands/execute-verification.d.ts.map +1 -0
  63. package/dist/commands/execute-verification.js +201 -0
  64. package/dist/commands/execute-verification.js.map +1 -0
  65. package/dist/commands/execute.d.ts.map +1 -1
  66. package/dist/commands/execute.js +139 -2
  67. package/dist/commands/execute.js.map +1 -1
  68. package/dist/commands/init-validation.d.ts +22 -0
  69. package/dist/commands/init-validation.d.ts.map +1 -0
  70. package/dist/commands/init-validation.js +54 -0
  71. package/dist/commands/init-validation.js.map +1 -0
  72. package/dist/commands/init.d.ts.map +1 -1
  73. package/dist/commands/init.js +26 -10
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/dag-runner/ralph-loop.d.ts +9 -9
  76. package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
  77. package/dist/dag-runner/ralph-loop.js +89 -113
  78. package/dist/dag-runner/ralph-loop.js.map +1 -1
  79. package/dist/dag-runner/state-store.d.ts +14 -1
  80. package/dist/dag-runner/state-store.d.ts.map +1 -1
  81. package/dist/dag-runner/state-store.js +39 -8
  82. package/dist/dag-runner/state-store.js.map +1 -1
  83. package/dist/exec/npm-invoke.d.ts +8 -0
  84. package/dist/exec/npm-invoke.d.ts.map +1 -0
  85. package/dist/exec/npm-invoke.js +45 -0
  86. package/dist/exec/npm-invoke.js.map +1 -0
  87. package/dist/exec/safe-spawn.d.ts +21 -0
  88. package/dist/exec/safe-spawn.d.ts.map +1 -0
  89. package/dist/exec/safe-spawn.js +108 -0
  90. package/dist/exec/safe-spawn.js.map +1 -0
  91. package/dist/graphrag/graph-rag.js +24 -24
  92. package/dist/graphrag/types.d.ts +2 -2
  93. package/dist/graphrag/types.d.ts.map +1 -1
  94. package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
  95. package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
  96. package/dist/mcp-server/__tests__/auth.test.js +72 -0
  97. package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
  98. package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
  99. package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
  100. package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
  101. package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
  102. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
  103. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
  104. package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
  105. package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
  106. package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
  107. package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
  108. package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
  109. package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
  110. package/dist/mcp-server/bin/server.js +18 -6
  111. package/dist/mcp-server/bin/server.js.map +1 -1
  112. package/dist/mcp-server/boot-config.d.ts +6 -0
  113. package/dist/mcp-server/boot-config.d.ts.map +1 -0
  114. package/dist/mcp-server/boot-config.js +17 -0
  115. package/dist/mcp-server/boot-config.js.map +1 -0
  116. package/dist/mcp-server/middleware/auth.d.ts +10 -0
  117. package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
  118. package/dist/mcp-server/middleware/auth.js +44 -0
  119. package/dist/mcp-server/middleware/auth.js.map +1 -0
  120. package/dist/mcp-server/middleware/cors.d.ts +6 -0
  121. package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
  122. package/dist/mcp-server/middleware/cors.js +30 -0
  123. package/dist/mcp-server/middleware/cors.js.map +1 -0
  124. package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
  125. package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
  126. package/dist/mcp-server/middleware/error-handler.js +14 -0
  127. package/dist/mcp-server/middleware/error-handler.js.map +1 -0
  128. package/dist/mcp-server/server.d.ts +7 -2
  129. package/dist/mcp-server/server.d.ts.map +1 -1
  130. package/dist/mcp-server/server.js +185 -105
  131. package/dist/mcp-server/server.js.map +1 -1
  132. package/dist/skills/registry-mock.json +109 -109
  133. package/dist/skills/tests/manifest.spec.js +20 -20
  134. package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
  135. package/dist/stacks/dna-emitter.d.ts.map +1 -1
  136. package/dist/stacks/dna-emitter.js +70 -79
  137. package/dist/stacks/dna-emitter.js.map +1 -1
  138. package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
  139. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  140. package/dist/utils/UpdateApplier.js +8 -0
  141. package/dist/utils/UpdateApplier.js.map +1 -1
  142. package/dist/utils/logger.d.ts +7 -0
  143. package/dist/utils/logger.d.ts.map +1 -0
  144. package/dist/utils/logger.js +23 -0
  145. package/dist/utils/logger.js.map +1 -0
  146. package/dist/utils/path-safety.d.ts +22 -0
  147. package/dist/utils/path-safety.d.ts.map +1 -0
  148. package/dist/utils/path-safety.js +83 -0
  149. package/dist/utils/path-safety.js.map +1 -0
  150. package/dist/utils/project-generator.d.ts.map +1 -1
  151. package/dist/utils/project-generator.js +256 -252
  152. package/dist/utils/project-generator.js.map +1 -1
  153. package/dist/utils/stack-bootstrap.js +373 -373
  154. package/dist/utils/stack-bootstrap.js.map +1 -1
  155. package/dist/utils/templates.js +394 -394
  156. package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
  157. package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
  158. package/dist/verification/__tests__/anti-tamper.test.js +73 -0
  159. package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
  160. package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
  161. package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
  162. package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
  163. package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
  164. package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
  165. package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
  166. package/dist/verification/__tests__/bench-harness.test.js +75 -0
  167. package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
  168. package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
  169. package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
  170. package/dist/verification/__tests__/bench-report.test.js +73 -0
  171. package/dist/verification/__tests__/bench-report.test.js.map +1 -0
  172. package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
  173. package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
  174. package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
  175. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
  176. package/dist/verification/__tests__/config.test.d.ts +2 -0
  177. package/dist/verification/__tests__/config.test.d.ts.map +1 -0
  178. package/dist/verification/__tests__/config.test.js +50 -0
  179. package/dist/verification/__tests__/config.test.js.map +1 -0
  180. package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
  181. package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
  182. package/dist/verification/__tests__/decay-policy.test.js +130 -0
  183. package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
  184. package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
  185. package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
  186. package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
  187. package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
  188. package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
  189. package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
  190. package/dist/verification/__tests__/failure-signature.test.js +40 -0
  191. package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
  192. package/dist/verification/__tests__/logger.test.d.ts +2 -0
  193. package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
  194. package/dist/verification/__tests__/logger.test.js +23 -0
  195. package/dist/verification/__tests__/logger.test.js.map +1 -0
  196. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
  197. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
  198. package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
  199. package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
  200. package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
  201. package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
  202. package/dist/verification/__tests__/mutation-infection.test.js +101 -0
  203. package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
  204. package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
  205. package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
  206. package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
  207. package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
  208. package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
  209. package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
  210. package/dist/verification/__tests__/mutation-registry.test.js +28 -0
  211. package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
  212. package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
  213. package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
  214. package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
  215. package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
  216. package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
  217. package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
  218. package/dist/verification/__tests__/no-shell-true.test.js +43 -0
  219. package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
  220. package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
  221. package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
  222. package/dist/verification/__tests__/path-safety.test.js +59 -0
  223. package/dist/verification/__tests__/path-safety.test.js.map +1 -0
  224. package/dist/verification/__tests__/prerank.test.d.ts +2 -0
  225. package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
  226. package/dist/verification/__tests__/prerank.test.js +44 -0
  227. package/dist/verification/__tests__/prerank.test.js.map +1 -0
  228. package/dist/verification/__tests__/runner.test.d.ts +2 -0
  229. package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
  230. package/dist/verification/__tests__/runner.test.js +200 -0
  231. package/dist/verification/__tests__/runner.test.js.map +1 -0
  232. package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
  233. package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
  234. package/dist/verification/__tests__/safe-spawn.test.js +36 -0
  235. package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
  236. package/dist/verification/__tests__/security.test.d.ts +2 -0
  237. package/dist/verification/__tests__/security.test.d.ts.map +1 -0
  238. package/dist/verification/__tests__/security.test.js +79 -0
  239. package/dist/verification/__tests__/security.test.js.map +1 -0
  240. package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
  241. package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
  242. package/dist/verification/__tests__/selector-pareto.test.js +77 -0
  243. package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
  244. package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
  245. package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
  246. package/dist/verification/__tests__/telemetry.test.js +116 -0
  247. package/dist/verification/__tests__/telemetry.test.js.map +1 -0
  248. package/dist/verification/__tests__/type-check.test.d.ts +2 -0
  249. package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
  250. package/dist/verification/__tests__/type-check.test.js +52 -0
  251. package/dist/verification/__tests__/type-check.test.js.map +1 -0
  252. package/dist/verification/__tests__/worktree.test.d.ts +2 -0
  253. package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
  254. package/dist/verification/__tests__/worktree.test.js +41 -0
  255. package/dist/verification/__tests__/worktree.test.js.map +1 -0
  256. package/dist/verification/bench/fixtures.d.ts +11 -0
  257. package/dist/verification/bench/fixtures.d.ts.map +1 -0
  258. package/dist/verification/bench/fixtures.js +66 -0
  259. package/dist/verification/bench/fixtures.js.map +1 -0
  260. package/dist/verification/bench/harness.d.ts +19 -0
  261. package/dist/verification/bench/harness.d.ts.map +1 -0
  262. package/dist/verification/bench/harness.js +138 -0
  263. package/dist/verification/bench/harness.js.map +1 -0
  264. package/dist/verification/bench/report.d.ts +53 -0
  265. package/dist/verification/bench/report.d.ts.map +1 -0
  266. package/dist/verification/bench/report.js +47 -0
  267. package/dist/verification/bench/report.js.map +1 -0
  268. package/dist/verification/best-of-n/runner.d.ts +29 -0
  269. package/dist/verification/best-of-n/runner.d.ts.map +1 -0
  270. package/dist/verification/best-of-n/runner.js +76 -0
  271. package/dist/verification/best-of-n/runner.js.map +1 -0
  272. package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
  273. package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
  274. package/dist/verification/best-of-n/selector/pareto.js +65 -0
  275. package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
  276. package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
  277. package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
  278. package/dist/verification/best-of-n/selector/prerank.js +32 -0
  279. package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
  280. package/dist/verification/best-of-n/worktree.d.ts +9 -0
  281. package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
  282. package/dist/verification/best-of-n/worktree.js +100 -0
  283. package/dist/verification/best-of-n/worktree.js.map +1 -0
  284. package/dist/verification/config.d.ts +24 -0
  285. package/dist/verification/config.d.ts.map +1 -0
  286. package/dist/verification/config.js +168 -0
  287. package/dist/verification/config.js.map +1 -0
  288. package/dist/verification/decay/policy.d.ts +16 -0
  289. package/dist/verification/decay/policy.d.ts.map +1 -0
  290. package/dist/verification/decay/policy.js +64 -0
  291. package/dist/verification/decay/policy.js.map +1 -0
  292. package/dist/verification/decay/signature.d.ts +6 -0
  293. package/dist/verification/decay/signature.d.ts.map +1 -0
  294. package/dist/verification/decay/signature.js +18 -0
  295. package/dist/verification/decay/signature.js.map +1 -0
  296. package/dist/verification/gates/anti-tamper.d.ts +16 -0
  297. package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
  298. package/dist/verification/gates/anti-tamper.js +142 -0
  299. package/dist/verification/gates/anti-tamper.js.map +1 -0
  300. package/dist/verification/gates/fail-to-pass.d.ts +39 -0
  301. package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
  302. package/dist/verification/gates/fail-to-pass.js +173 -0
  303. package/dist/verification/gates/fail-to-pass.js.map +1 -0
  304. package/dist/verification/gates/mutation/adapter.d.ts +34 -0
  305. package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
  306. package/dist/verification/gates/mutation/adapter.js +22 -0
  307. package/dist/verification/gates/mutation/adapter.js.map +1 -0
  308. package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
  309. package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
  310. package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
  311. package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
  312. package/dist/verification/gates/mutation/infection.d.ts +28 -0
  313. package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
  314. package/dist/verification/gates/mutation/infection.js +149 -0
  315. package/dist/verification/gates/mutation/infection.js.map +1 -0
  316. package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
  317. package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
  318. package/dist/verification/gates/mutation/mutmut.js +148 -0
  319. package/dist/verification/gates/mutation/mutmut.js.map +1 -0
  320. package/dist/verification/gates/mutation/stryker.d.ts +19 -0
  321. package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
  322. package/dist/verification/gates/mutation/stryker.js +103 -0
  323. package/dist/verification/gates/mutation/stryker.js.map +1 -0
  324. package/dist/verification/gates/type-check.d.ts +11 -0
  325. package/dist/verification/gates/type-check.d.ts.map +1 -0
  326. package/dist/verification/gates/type-check.js +84 -0
  327. package/dist/verification/gates/type-check.js.map +1 -0
  328. package/dist/verification/registry.d.ts +6 -0
  329. package/dist/verification/registry.d.ts.map +1 -0
  330. package/dist/verification/registry.js +49 -0
  331. package/dist/verification/registry.js.map +1 -0
  332. package/dist/verification/runner.d.ts +27 -0
  333. package/dist/verification/runner.d.ts.map +1 -0
  334. package/dist/verification/runner.js +173 -0
  335. package/dist/verification/runner.js.map +1 -0
  336. package/dist/verification/telemetry.d.ts +18 -0
  337. package/dist/verification/telemetry.d.ts.map +1 -0
  338. package/dist/verification/telemetry.js +71 -0
  339. package/dist/verification/telemetry.js.map +1 -0
  340. package/dist/verification/types.d.ts +89 -0
  341. package/dist/verification/types.d.ts.map +1 -0
  342. package/dist/verification/types.js +3 -0
  343. package/dist/verification/types.js.map +1 -0
  344. package/package.json +96 -91
  345. package/templates/DARE-dag-example.yaml +280 -280
  346. package/templates/UPDATE-MANIFEST.json +68 -48
  347. package/templates/backend/node-nestjs/.env.example +9 -9
  348. package/templates/backend/node-nestjs/nest-cli.json +8 -8
  349. package/templates/backend/node-nestjs/package.json +50 -50
  350. package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
  351. package/templates/backend/node-nestjs/src/app.module.ts +15 -15
  352. package/templates/backend/node-nestjs/src/app.service.ts +8 -8
  353. package/templates/backend/node-nestjs/src/main.ts +24 -24
  354. package/templates/backend/node-nestjs/tsconfig.json +21 -21
  355. package/templates/backend/php-laravel/.env.example +22 -22
  356. package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
  357. package/templates/backend/php-laravel/composer.json +40 -40
  358. package/templates/backend/python-fastapi/.env.example +4 -4
  359. package/templates/backend/python-fastapi/app/api/router.py +8 -8
  360. package/templates/backend/python-fastapi/app/core/config.py +20 -20
  361. package/templates/backend/python-fastapi/main.py +35 -35
  362. package/templates/backend/python-fastapi/requirements.txt +13 -13
  363. package/templates/backend/rust-axum/.env.example +3 -3
  364. package/templates/backend/rust-axum/Cargo.toml +23 -23
  365. package/templates/backend/rust-axum/src/errors.rs +30 -30
  366. package/templates/backend/rust-axum/src/main.rs +32 -32
  367. package/templates/backend/rust-axum/src/routes.rs +6 -6
  368. package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
  369. package/templates/frontend/leptos-csr/Cargo.toml +16 -16
  370. package/templates/frontend/leptos-csr/Trunk.toml +10 -10
  371. package/templates/frontend/leptos-csr/index.html +11 -11
  372. package/templates/frontend/leptos-csr/src/lib.rs +20 -20
  373. package/templates/frontend/leptos-csr/style/main.scss +19 -19
  374. package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
  375. package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
  376. package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
  377. package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
  378. package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
  379. package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
  380. package/templates/frontend/react/index.html +12 -12
  381. package/templates/frontend/react/package.json +35 -35
  382. package/templates/frontend/react/src/App.tsx +25 -25
  383. package/templates/frontend/react/src/main.tsx +9 -9
  384. package/templates/frontend/vue/package.json +32 -32
  385. package/templates/frontend/vue/src/App.vue +7 -7
  386. package/templates/frontend/vue/src/main.ts +10 -10
  387. package/templates/frontend/vue/src/router/index.ts +14 -14
  388. package/templates/frontend/vue/src/views/HomeView.vue +6 -6
  389. package/templates/hooks/pre-commit-dare-validate +24 -24
  390. package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -152
  391. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
  392. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
  393. package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
  394. package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
  395. package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
  396. package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
  397. package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
  398. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
  399. package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
  400. package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
  401. package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
  402. package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
  403. package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
  404. package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
  405. package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
  406. package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
  407. package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
  408. package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
  409. package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
  410. package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
  411. package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
  412. package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
  413. package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
  414. package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
  415. package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
  416. package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
  417. package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
  418. package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
  419. package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
  420. package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
  421. package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
  422. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
  423. package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
  424. package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
  425. package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
  426. package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
  427. package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
  428. package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
  429. package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
  430. package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
  431. package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
  432. package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
  433. package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
  434. package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
  435. package/templates/ide/antigravity/templates/TASKS-template.md +26 -26
  436. package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
  437. package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
  438. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
  439. package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
  440. package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
  441. package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
  442. package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
  443. package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
  444. package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -117
  445. package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
  446. package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
  447. package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
  448. package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
  449. package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
  450. package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
  451. package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
  452. package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
  453. package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
  454. package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
  455. package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
  456. package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
  457. package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
  458. package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
  459. package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
  460. package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
  461. package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
  462. package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
  463. package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
  464. package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
  465. package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
  466. package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
  467. package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
  468. package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
  469. package/templates/ide/claude/.claude/commands/dare-skill.md +30 -30
  470. package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
  471. package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
  472. package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
  473. package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
  474. package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
  475. package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
  476. package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
  477. package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
  478. package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
  479. package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
  480. package/templates/ide/claude/.claude/settings.example.json +35 -35
  481. package/templates/ide/claude/CLAUDE.md +146 -146
  482. package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
  483. package/templates/ide/claude/templates/DESIGN-template.md +129 -129
  484. package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
  485. package/templates/ide/claude/templates/TASKS-template.md +26 -26
  486. package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
  487. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
  488. package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
  489. package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
  490. package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
  491. package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
  492. package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
  493. package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
  494. package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
  495. package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
  496. package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
  497. package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
  498. package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
  499. package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
  500. package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
  501. package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
  502. package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
  503. package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
  504. package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
  505. package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
  506. package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
  507. package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
  508. package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
  509. package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
  510. package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
  511. package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
  512. package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
  513. package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
  514. package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
  515. package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
  516. package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
  517. package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
  518. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
  519. package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
  520. package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
  521. package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
  522. package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
  523. package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
  524. package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
  525. package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
  526. package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
  527. package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
  528. package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
  529. package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
  530. package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
  531. package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
  532. package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
  533. package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
  534. package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
  535. package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
  536. package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
  537. package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
  538. package/templates/ide/cursor/.cursor/rules/skill-telemetry.mdc +156 -156
  539. package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
  540. package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
  541. package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
  542. package/templates/ide/cursor/templates/TASKS-template.md +26 -26
  543. package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
  544. package/templates/shared/docker-compose.yml +41 -41
  545. package/templates/stacks/go-gin/.dare/skills.yml +11 -11
  546. package/templates/stacks/go-gin/.env.example +24 -24
  547. package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
  548. package/templates/stacks/go-gin/README.md.tpl +38 -38
  549. package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
  550. package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
  551. package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
  552. package/templates/stacks/go-gin/db/queries/users.sql +23 -23
  553. package/templates/stacks/go-gin/gitignore +7 -7
  554. package/templates/stacks/go-gin/go.mod.tpl +17 -17
  555. package/templates/stacks/go-gin/internal/config/config.go +41 -41
  556. package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
  557. package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
  558. package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
  559. package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
  560. package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
  561. package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
  562. package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
  563. package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
  564. package/templates/stacks/go-gin/internal/model/user.go +17 -17
  565. package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
  566. package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
  567. package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
  568. package/templates/stacks/go-gin/llms.txt.tpl +54 -54
  569. package/templates/stacks/go-gin/openapi.json.tpl +46 -46
  570. package/templates/stacks/go-gin/sqlc.yaml +14 -14
  571. package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
  572. package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
  573. package/templates/stacks/go-stdlib/.env.example +24 -24
  574. package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
  575. package/templates/stacks/go-stdlib/README.md.tpl +41 -41
  576. package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
  577. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
  578. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
  579. package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
  580. package/templates/stacks/go-stdlib/gitignore +6 -6
  581. package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
  582. package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
  583. package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
  584. package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
  585. package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
  586. package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
  587. package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
  588. package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
  589. package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
  590. package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
  591. package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
  592. package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
  593. package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
  594. package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
  595. package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
  596. package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
  597. package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
  598. package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
  599. package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
  600. package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
  601. package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
  602. package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
  603. package/templates/stacks/mcp-go/.env.example +14 -14
  604. package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
  605. package/templates/stacks/mcp-go/README.md.tpl +50 -50
  606. package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
  607. package/templates/stacks/mcp-go/gitignore +6 -6
  608. package/templates/stacks/mcp-go/go.mod.tpl +9 -9
  609. package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
  610. package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
  611. package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
  612. package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
  613. package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
  614. package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
  615. package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
  616. package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
  617. package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
  618. package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
  619. package/templates/stacks/mcp-node-ts/.env.example +16 -16
  620. package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
  621. package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
  622. package/templates/stacks/mcp-node-ts/gitignore +7 -7
  623. package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
  624. package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
  625. package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
  626. package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
  627. package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
  628. package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
  629. package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
  630. package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
  631. package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
  632. package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
  633. package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
  634. package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
  635. package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
  636. package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
  637. package/templates/stacks/mcp-python/.env.example +14 -14
  638. package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
  639. package/templates/stacks/mcp-python/README.md.j2 +49 -49
  640. package/templates/stacks/mcp-python/gitignore +12 -12
  641. package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
  642. package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
  643. package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
  644. package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
  645. package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
  646. package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
  647. package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
  648. package/templates/stacks/mcp-python/src/transports/http.py +12 -12
  649. package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
  650. package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
  651. package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
  652. package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
  653. package/templates/stacks/mcp-rust/.env.example +14 -14
  654. package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
  655. package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
  656. package/templates/stacks/mcp-rust/README.md.tera +50 -50
  657. package/templates/stacks/mcp-rust/gitignore +5 -5
  658. package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
  659. package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
  660. package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
  661. package/templates/stacks/mcp-rust/src/lib.rs +6 -6
  662. package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
  663. package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
  664. package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
  665. package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
  666. package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
  667. package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
  668. package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
  669. package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
  670. package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
  671. package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
  672. package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
  673. package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
  674. package/templates/stacks/node-nestjs/.env.example +21 -21
  675. package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
  676. package/templates/stacks/node-nestjs/README.md.hbs +35 -35
  677. package/templates/stacks/node-nestjs/gitignore +7 -7
  678. package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
  679. package/templates/stacks/node-nestjs/nest-cli.json +16 -16
  680. package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
  681. package/templates/stacks/node-nestjs/package.json.hbs +57 -57
  682. package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
  683. package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
  684. package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
  685. package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
  686. package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
  687. package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
  688. package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
  689. package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
  690. package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
  691. package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
  692. package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
  693. package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
  694. package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
  695. package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
  696. package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
  697. package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
  698. package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
  699. package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
  700. package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
  701. package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
  702. package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
  703. package/templates/stacks/node-nestjs/tsconfig.json +28 -28
  704. package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
  705. package/templates/stacks/php-laravel/.env.example +41 -41
  706. package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
  707. package/templates/stacks/php-laravel/README.md.hbs +36 -36
  708. package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
  709. package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
  710. package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
  711. package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
  712. package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
  713. package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
  714. package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
  715. package/templates/stacks/php-laravel/app/Models/User.php +44 -44
  716. package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
  717. package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
  718. package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
  719. package/templates/stacks/php-laravel/artisan +12 -12
  720. package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
  721. package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
  722. package/templates/stacks/php-laravel/composer.json.hbs +58 -58
  723. package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
  724. package/templates/stacks/php-laravel/config/reverb.php +34 -34
  725. package/templates/stacks/php-laravel/config/sanctum.php +15 -15
  726. package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
  727. package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
  728. package/templates/stacks/php-laravel/gitignore +23 -23
  729. package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
  730. package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
  731. package/templates/stacks/php-laravel/phpstan.neon +9 -9
  732. package/templates/stacks/php-laravel/routes/api.php +13 -13
  733. package/templates/stacks/php-laravel/routes/channels.php +7 -7
  734. package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
  735. package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
  736. package/templates/stacks/php-laravel/tests/Pest.php +5 -5
  737. package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
  738. package/templates/stacks/python-fastapi/.env.example +21 -21
  739. package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
  740. package/templates/stacks/python-fastapi/README.md.j2 +35 -35
  741. package/templates/stacks/python-fastapi/alembic/env.py +46 -46
  742. package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
  743. package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
  744. package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
  745. package/templates/stacks/python-fastapi/app/core/config.py +24 -24
  746. package/templates/stacks/python-fastapi/app/core/security.py +34 -34
  747. package/templates/stacks/python-fastapi/app/db/session.py +22 -22
  748. package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
  749. package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
  750. package/templates/stacks/python-fastapi/app/models/user.py +30 -30
  751. package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
  752. package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
  753. package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
  754. package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
  755. package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
  756. package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
  757. package/templates/stacks/python-fastapi/gitignore +12 -12
  758. package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
  759. package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
  760. package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
  761. package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
  762. package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
  763. package/templates/stacks/ruby-rails-8/.env.example +20 -20
  764. package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
  765. package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
  766. package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
  767. package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
  768. package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
  769. package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
  770. package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
  771. package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
  772. package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
  773. package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
  774. package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
  775. package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
  776. package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
  777. package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
  778. package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
  779. package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
  780. package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
  781. package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
  782. package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
  783. package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
  784. package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
  785. package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
  786. package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
  787. package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
  788. package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
  789. package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
  790. package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
  791. package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
  792. package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
  793. package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
  794. package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
  795. package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
  796. package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
  797. package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
  798. package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
  799. package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
  800. package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
  801. package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
  802. package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
  803. package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
  804. package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
  805. package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
  806. package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
  807. package/templates/stacks/rust-axum/.env.example +26 -26
  808. package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
  809. package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
  810. package/templates/stacks/rust-axum/README.md.tera +37 -37
  811. package/templates/stacks/rust-axum/gitignore +5 -5
  812. package/templates/stacks/rust-axum/llms.txt.tera +54 -54
  813. package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
  814. package/templates/stacks/rust-axum/openapi.json.tera +46 -46
  815. package/templates/stacks/rust-axum/src/config.rs +45 -45
  816. package/templates/stacks/rust-axum/src/errors.rs +48 -48
  817. package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
  818. package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
  819. package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
  820. package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
  821. package/templates/stacks/rust-axum/src/lib.rs +19 -19
  822. package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
  823. package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
  824. package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
  825. package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
  826. package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
  827. package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
  828. package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
  829. package/templates/stacks/rust-axum/src/models/user.rs +13 -13
  830. package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
  831. package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
  832. package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
  833. package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
  834. package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
  835. package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
  836. package/dist/commands/new.d.ts +0 -16
  837. package/dist/commands/new.d.ts.map +0 -1
  838. package/dist/commands/new.js +0 -104
  839. package/dist/commands/new.js.map +0 -1
@@ -0,0 +1,138 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import fs from 'fs-extra';
4
+ import { safeSpawn } from '../../exec/safe-spawn.js';
5
+ import { assertRelativeSafe } from '../../utils/path-safety.js';
6
+ import { testCommandFor } from '../gates/fail-to-pass.js';
7
+ import { loadSuite } from './fixtures.js';
8
+ import { computeFixtureResult, } from './report.js';
9
+ function parseVitestJson(stdout) {
10
+ const passed = [];
11
+ const failed = [];
12
+ try {
13
+ const report = JSON.parse(stdout);
14
+ for (const fileResult of report.testResults ?? []) {
15
+ for (const assertion of fileResult.assertionResults ?? []) {
16
+ const name = assertion.fullName ?? 'unknown';
17
+ if (assertion.status === 'passed')
18
+ passed.push(name);
19
+ else if (assertion.status === 'failed')
20
+ failed.push(name);
21
+ }
22
+ }
23
+ }
24
+ catch {
25
+ // unstructured output
26
+ }
27
+ return { passed, failed };
28
+ }
29
+ async function defaultRunTestSuite(cwd, stack) {
30
+ const { command, args } = testCommandFor(stack, '**/*.{spec,test}.{ts,tsx,js}');
31
+ const result = await safeSpawn(command, args, {
32
+ cwd,
33
+ timeoutSeconds: 300,
34
+ maxChars: 200000,
35
+ });
36
+ return parseVitestJson(result.stdout);
37
+ }
38
+ function normalizePatch(content) {
39
+ return content
40
+ .replace(/^--- a\/repo\//gm, '--- a/')
41
+ .replace(/^\+\+\+ b\/repo\//gm, '+++ b/')
42
+ .replace(/^diff --git a\/repo\//gm, 'diff --git a/');
43
+ }
44
+ async function defaultApplyPatch(cwd, patchPath) {
45
+ const raw = await fs.readFile(patchPath, 'utf8');
46
+ const normalized = normalizePatch(raw);
47
+ const tmpPatch = path.join(cwd, '.dare-patch.tmp');
48
+ await fs.writeFile(tmpPatch, normalized);
49
+ const result = await safeSpawn('git', ['apply', '--whitespace=nowarn', tmpPatch], {
50
+ cwd,
51
+ timeoutSeconds: 60,
52
+ maxChars: 8000,
53
+ });
54
+ await fs.remove(tmpPatch).catch(() => undefined);
55
+ if (result.code !== 0) {
56
+ throw new Error(`patch apply failed: ${result.stderr.trim()}`);
57
+ }
58
+ }
59
+ async function readTestList(fixtureDir, file) {
60
+ const content = await fs.readFile(path.join(fixtureDir, file), 'utf8');
61
+ return content
62
+ .split('\n')
63
+ .map((l) => l.trim())
64
+ .filter(Boolean);
65
+ }
66
+ function countListedTests(listed, passed) {
67
+ let passCount = 0;
68
+ for (const name of listed) {
69
+ if (passed.some((p) => p.includes(name) || name.includes(p)))
70
+ passCount++;
71
+ }
72
+ return { passed: passCount, total: listed.length };
73
+ }
74
+ const defaultDeps = {
75
+ runTestSuite: defaultRunTestSuite,
76
+ copyRepo: async (src, dest) => fs.copy(src, dest),
77
+ applyPatch: defaultApplyPatch,
78
+ };
79
+ export function createRunFixture(deps = {}) {
80
+ const d = { ...defaultDeps, ...deps };
81
+ return async function runFixture(meta, baseDir) {
82
+ assertRelativeSafe(meta.id);
83
+ const fixtureDir = path.join(baseDir, meta.id);
84
+ const repoSrc = path.join(fixtureDir, 'repo');
85
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'dare-bench-'));
86
+ const started = Date.now();
87
+ try {
88
+ await d.copyRepo(repoSrc, tmpDir);
89
+ await safeSpawn('git', ['init'], { cwd: tmpDir, timeoutSeconds: 30 });
90
+ await safeSpawn('git', ['add', '.'], { cwd: tmpDir, timeoutSeconds: 30 });
91
+ await safeSpawn('git', ['commit', '-m', 'baseline'], {
92
+ cwd: tmpDir,
93
+ timeoutSeconds: 30,
94
+ env: {
95
+ ...process.env,
96
+ GIT_AUTHOR_NAME: 'dare-bench',
97
+ GIT_AUTHOR_EMAIL: 'bench@dare.local',
98
+ GIT_COMMITTER_NAME: 'dare-bench',
99
+ GIT_COMMITTER_EMAIL: 'bench@dare.local',
100
+ },
101
+ });
102
+ await d.applyPatch(tmpDir, path.join(fixtureDir, meta.patch));
103
+ const run = await d.runTestSuite(tmpDir, meta.stack);
104
+ const f2pList = await readTestList(fixtureDir, meta.failToPass);
105
+ const p2pList = await readTestList(fixtureDir, meta.passToPass);
106
+ const raw = {
107
+ id: meta.id,
108
+ stack: meta.stack,
109
+ failToPass: countListedTests(f2pList, run.passed),
110
+ passToPass: countListedTests(p2pList, run.passed),
111
+ durationMs: Date.now() - started,
112
+ };
113
+ return computeFixtureResult(raw);
114
+ }
115
+ finally {
116
+ await fs.remove(tmpDir).catch(() => undefined);
117
+ }
118
+ };
119
+ }
120
+ export const runFixture = createRunFixture();
121
+ function matchesFilter(id, filter) {
122
+ if (!filter)
123
+ return true;
124
+ const re = new RegExp('^' + filter.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
125
+ return re.test(id);
126
+ }
127
+ export async function runSuite(suiteDir, opts = {}) {
128
+ const fixtures = await loadSuite(suiteDir);
129
+ const runOne = createRunFixture(opts.deps);
130
+ const results = [];
131
+ for (const meta of fixtures) {
132
+ if (!matchesFilter(meta.id, opts.filter))
133
+ continue;
134
+ results.push(await runOne(meta, suiteDir));
135
+ }
136
+ return results;
137
+ }
138
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/verification/bench/harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface FixtureResult {
2
+ readonly id: string;
3
+ readonly stack: string;
4
+ readonly fixRate: number;
5
+ readonly passToPassRegressed: boolean;
6
+ readonly solved: boolean;
7
+ readonly failToPass: {
8
+ readonly passed: number;
9
+ readonly total: number;
10
+ };
11
+ readonly passToPass: {
12
+ readonly passed: number;
13
+ readonly total: number;
14
+ };
15
+ readonly durationMs: number;
16
+ }
17
+ export interface BenchReport {
18
+ readonly schemaVersion: 1;
19
+ readonly ranAt: string;
20
+ readonly suite: string;
21
+ readonly totals: {
22
+ readonly fixtures: number;
23
+ readonly solved: number;
24
+ readonly solveRate: number;
25
+ };
26
+ readonly results: ReadonlyArray<FixtureResult>;
27
+ readonly regression?: {
28
+ readonly baselineSolveRate: number;
29
+ readonly deltaPp: number;
30
+ readonly failed: boolean;
31
+ };
32
+ }
33
+ export interface RawFixtureCounts {
34
+ readonly id: string;
35
+ readonly stack: string;
36
+ readonly failToPass: {
37
+ readonly passed: number;
38
+ readonly total: number;
39
+ };
40
+ readonly passToPass: {
41
+ readonly passed: number;
42
+ readonly total: number;
43
+ };
44
+ readonly durationMs: number;
45
+ }
46
+ export declare function computeFixtureResult(raw: RawFixtureCounts): FixtureResult;
47
+ export declare function buildReport(results: ReadonlyArray<FixtureResult>, opts: {
48
+ readonly suite: string;
49
+ readonly baseline?: BenchReport;
50
+ readonly failOnRegressionPp?: number;
51
+ readonly ranAt?: string;
52
+ }): BenchReport;
53
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/verification/bench/report.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAmBzE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,EACrC,IAAI,EAAE;IACJ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,WAAW,CA4Bb"}
@@ -0,0 +1,47 @@
1
+ export function computeFixtureResult(raw) {
2
+ const passToPassRegressed = raw.passToPass.passed < raw.passToPass.total;
3
+ const fixRate = passToPassRegressed
4
+ ? 0
5
+ : raw.failToPass.total === 0
6
+ ? 1
7
+ : raw.failToPass.passed / raw.failToPass.total;
8
+ const solved = fixRate === 1 && !passToPassRegressed;
9
+ return {
10
+ id: raw.id,
11
+ stack: raw.stack,
12
+ fixRate,
13
+ passToPassRegressed,
14
+ solved,
15
+ failToPass: raw.failToPass,
16
+ passToPass: raw.passToPass,
17
+ durationMs: raw.durationMs,
18
+ };
19
+ }
20
+ export function buildReport(results, opts) {
21
+ const solved = results.filter((r) => r.solved).length;
22
+ const solveRate = results.length === 0 ? 0 : solved / results.length;
23
+ const regression = opts.baseline
24
+ ? (() => {
25
+ const deltaPp = (solveRate - opts.baseline.totals.solveRate) * 100;
26
+ const threshold = opts.failOnRegressionPp ?? 3;
27
+ return {
28
+ baselineSolveRate: opts.baseline.totals.solveRate,
29
+ deltaPp,
30
+ failed: -deltaPp > threshold,
31
+ };
32
+ })()
33
+ : undefined;
34
+ return {
35
+ schemaVersion: 1,
36
+ ranAt: opts.ranAt ?? new Date().toISOString(),
37
+ suite: opts.suite,
38
+ totals: {
39
+ fixtures: results.length,
40
+ solved,
41
+ solveRate,
42
+ },
43
+ results: [...results],
44
+ regression,
45
+ };
46
+ }
47
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/verification/bench/report.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,MAAM,mBAAmB,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;IACzE,MAAM,OAAO,GAAG,mBAAmB;QACjC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAErD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO;QACP,mBAAmB;QACnB,MAAM;QACN,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAqC,EACrC,IAKC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;QAC9B,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC/C,OAAO;gBACL,iBAAiB,EAAE,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC,SAAS;gBAClD,OAAO;gBACP,MAAM,EAAE,CAAC,OAAO,GAAG,SAAS;aAC7B,CAAC;QACJ,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,MAAM;YACxB,MAAM;YACN,SAAS;SACV;QACD,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Candidate, VerificationConfig } from '../types.js';
2
+ import { runVerification as defaultRunVerification } from '../runner.js';
3
+ import { gitChangedFiles } from '../../commands/execute-verification.js';
4
+ import { createWorktree as defaultCreateWorktree, removeWorktree as defaultRemoveWorktree, type Worktree } from './worktree.js';
5
+ export interface RunBestOfNArgs {
6
+ readonly taskId: string;
7
+ readonly repoRoot: string;
8
+ readonly n: number;
9
+ readonly stack: string;
10
+ readonly config: VerificationConfig;
11
+ readonly fillCandidate: (wt: Worktree) => Promise<void>;
12
+ }
13
+ export interface RunBestOfNDeps {
14
+ readonly runVerification: typeof defaultRunVerification;
15
+ readonly createWorktree: typeof defaultCreateWorktree;
16
+ readonly removeWorktree: typeof defaultRemoveWorktree;
17
+ readonly gitChangedFiles: typeof gitChangedFiles;
18
+ readonly promoteWinner: (repoRoot: string, winner: Worktree) => Promise<void>;
19
+ }
20
+ export declare function promoteWinnerPatch(repoRoot: string, winner: Worktree): Promise<void>;
21
+ export declare function createRunBestOfN(deps?: Partial<RunBestOfNDeps>): (args: RunBestOfNArgs) => Promise<{
22
+ winner: Candidate;
23
+ discarded: ReadonlyArray<Candidate>;
24
+ }>;
25
+ export declare const runBestOfN: (args: RunBestOfNArgs) => Promise<{
26
+ winner: Candidate;
27
+ discarded: ReadonlyArray<Candidate>;
28
+ }>;
29
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/verification/best-of-n/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAEL,eAAe,IAAI,sBAAsB,EAC1C,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EACL,cAAc,IAAI,qBAAqB,EACvC,cAAc,IAAI,qBAAqB,EACvC,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAKvB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,sBAAsB,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,OAAO,qBAAqB,CAAC;IACtD,QAAQ,CAAC,cAAc,EAAE,OAAO,qBAAqB,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,OAAO,eAAe,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,IAAI,CAAC,CAoBf;AAUD,wBAAgB,gBAAgB,CAC9B,IAAI,GAAE,OAAO,CAAC,cAAc,CAAM,GACjC,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC,CA8CD;AAED,eAAO,MAAM,UAAU,SAnDb,cAAc,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACrC,CAgD2C,CAAC"}
@@ -0,0 +1,76 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { runVerification as defaultRunVerification, } from '../runner.js';
4
+ import { gitChangedFiles } from '../../commands/execute-verification.js';
5
+ import { safeSpawn } from '../../exec/safe-spawn.js';
6
+ import { createLogger } from '../../utils/logger.js';
7
+ import { createWorktree as defaultCreateWorktree, removeWorktree as defaultRemoveWorktree, } from './worktree.js';
8
+ import { selectByPareto } from './selector/pareto.js';
9
+ const log = createLogger('best-of-n');
10
+ export async function promoteWinnerPatch(repoRoot, winner) {
11
+ const diff = await safeSpawn('git', ['diff', 'HEAD', winner.branch], {
12
+ cwd: repoRoot,
13
+ timeoutSeconds: 120,
14
+ maxChars: 500000,
15
+ });
16
+ if (!diff.stdout.trim())
17
+ return;
18
+ const patchPath = path.join(repoRoot, '.dare', 'winner.patch');
19
+ await fs.ensureDir(path.dirname(patchPath));
20
+ await fs.writeFile(patchPath, diff.stdout);
21
+ const apply = await safeSpawn('git', ['apply', patchPath], {
22
+ cwd: repoRoot,
23
+ timeoutSeconds: 120,
24
+ maxChars: 8000,
25
+ });
26
+ if (apply.code !== 0) {
27
+ throw new Error(`git apply failed: ${apply.stderr.trim()}`);
28
+ }
29
+ }
30
+ const defaultDeps = {
31
+ runVerification: defaultRunVerification,
32
+ createWorktree: defaultCreateWorktree,
33
+ removeWorktree: defaultRemoveWorktree,
34
+ gitChangedFiles,
35
+ promoteWinner: promoteWinnerPatch,
36
+ };
37
+ export function createRunBestOfN(deps = {}) {
38
+ const d = { ...defaultDeps, ...deps };
39
+ return async function runBestOfN(args) {
40
+ const worktrees = [];
41
+ const candidates = [];
42
+ const verifyConfig = { ...args.config, enabled: true };
43
+ try {
44
+ for (let i = 1; i <= args.n; i++) {
45
+ const id = `cand-${i}`;
46
+ const wt = await d.createWorktree(args.repoRoot, id);
47
+ worktrees.push(wt);
48
+ log.info({ id, path: wt.path }, 'worktree created');
49
+ await args.fillCandidate(wt);
50
+ const wtCwd = path.resolve(args.repoRoot, wt.path);
51
+ const changedFiles = await d.gitChangedFiles(wtCwd);
52
+ const verification = await d.runVerification({
53
+ taskId: args.taskId,
54
+ stack: args.stack,
55
+ cwd: wtCwd,
56
+ config: verifyConfig,
57
+ changedFiles,
58
+ });
59
+ candidates.push({ id, worktree: wt, verification });
60
+ }
61
+ const winner = selectByPareto(candidates);
62
+ await d.promoteWinner(args.repoRoot, winner.worktree);
63
+ const discarded = candidates.filter((c) => c.id !== winner.id);
64
+ return { winner, discarded };
65
+ }
66
+ finally {
67
+ for (const wt of worktrees) {
68
+ await d.removeWorktree(args.repoRoot, wt).catch((err) => {
69
+ log.warn({ id: wt.id, err: err instanceof Error ? err.message : String(err) }, 'worktree cleanup failed');
70
+ });
71
+ }
72
+ }
73
+ };
74
+ }
75
+ export const runBestOfN = createRunBestOfN();
76
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/verification/best-of-n/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Candidate } from '../../types.js';
2
+ export declare class NoViableCandidateError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ /**
6
+ * Pareto-dominant candidate over test/lint/type/mutation aspects.
7
+ * Candidates with any FAIL aspect are discarded first.
8
+ */
9
+ export declare function selectByPareto(candidates: ReadonlyArray<Candidate>): Candidate;
10
+ //# sourceMappingURL=pareto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pareto.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAK5E,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,SAA8D;CAIlF;AA6CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,CAuB9E"}
@@ -0,0 +1,65 @@
1
+ const PARETO_ASPECTS = ['test', 'lint', 'type', 'mutation'];
2
+ export class NoViableCandidateError extends Error {
3
+ constructor(message = 'no viable candidate: all candidates have a failing aspect') {
4
+ super(message);
5
+ this.name = 'NoViableCandidateError';
6
+ }
7
+ }
8
+ function hasFailingAspect(result) {
9
+ return result.aspects.some((a) => a.verdict === 'FAIL');
10
+ }
11
+ function aspectValue(result, aspect) {
12
+ if (aspect === 'mutation') {
13
+ const mut = result.aspects.find((a) => a.aspect === 'mutation');
14
+ return result.mutationScore ?? mut?.score ?? 0;
15
+ }
16
+ const row = result.aspects.find((a) => a.aspect === aspect);
17
+ if (!row || row.verdict === 'SKIP')
18
+ return 0.5;
19
+ if (row.verdict === 'PASS')
20
+ return 1;
21
+ return 0;
22
+ }
23
+ function aspectVector(result) {
24
+ return {
25
+ test: aspectValue(result, 'test'),
26
+ lint: aspectValue(result, 'lint'),
27
+ type: aspectValue(result, 'type'),
28
+ mutation: aspectValue(result, 'mutation'),
29
+ };
30
+ }
31
+ function dominates(a, b) {
32
+ let strictlyBetter = false;
33
+ for (const key of PARETO_ASPECTS) {
34
+ if (a[key] < b[key])
35
+ return false;
36
+ if (a[key] > b[key])
37
+ strictlyBetter = true;
38
+ }
39
+ return strictlyBetter;
40
+ }
41
+ function compareCandidates(a, b) {
42
+ const scoreA = a.verification.mutationScore ?? 0;
43
+ const scoreB = b.verification.mutationScore ?? 0;
44
+ if (scoreB !== scoreA)
45
+ return scoreB - scoreA;
46
+ return a.id.localeCompare(b.id);
47
+ }
48
+ /**
49
+ * Pareto-dominant candidate over test/lint/type/mutation aspects.
50
+ * Candidates with any FAIL aspect are discarded first.
51
+ */
52
+ export function selectByPareto(candidates) {
53
+ const viable = candidates.filter((c) => !hasFailingAspect(c.verification));
54
+ if (viable.length === 0) {
55
+ throw new NoViableCandidateError();
56
+ }
57
+ const scored = viable.map((candidate) => ({
58
+ candidate,
59
+ vector: aspectVector(candidate.verification),
60
+ }));
61
+ const nonDominated = scored.filter(({ vector }, index) => !scored.some((other, otherIndex) => index !== otherIndex && dominates(other.vector, vector)));
62
+ const pool = nonDominated.length > 0 ? nonDominated.map((s) => s.candidate) : viable;
63
+ return [...pool].sort(compareCandidates)[0];
64
+ }
65
+ //# sourceMappingURL=pareto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pareto.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
3
+ * it only produces scores in [0, 1] for reordering before verification.
4
+ */
5
+ export interface PrerankInput {
6
+ readonly id: string;
7
+ readonly diff: string;
8
+ }
9
+ export interface PrerankScore {
10
+ readonly id: string;
11
+ readonly score: number;
12
+ }
13
+ /** Documented invariant for security tests (RS-07). */
14
+ export declare const PRERANK_NEVER_AUTHORIZES_DONE: true;
15
+ /**
16
+ * Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
17
+ */
18
+ export declare function prerank(inputs: ReadonlyArray<PrerankInput>): PrerankScore[];
19
+ /** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
20
+ export declare function reorderByPrerank<T extends {
21
+ id: string;
22
+ }>(items: ReadonlyArray<T>, scores: ReadonlyArray<PrerankScore>): T[];
23
+ //# sourceMappingURL=prerank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerank.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,uDAAuD;AACvD,eAAO,MAAM,6BAA6B,EAAG,IAAa,CAAC;AAM3D;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,EAAE,CAe3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAClC,CAAC,EAAE,CAKL"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
3
+ * it only produces scores in [0, 1] for reordering before verification.
4
+ */
5
+ /** Documented invariant for security tests (RS-07). */
6
+ export const PRERANK_NEVER_AUTHORIZES_DONE = true;
7
+ function clamp01(n) {
8
+ return Math.max(0, Math.min(1, n));
9
+ }
10
+ /**
11
+ * Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
12
+ */
13
+ export function prerank(inputs) {
14
+ return inputs.map(({ id, diff }) => {
15
+ const changedLines = diff
16
+ .split('\n')
17
+ .filter((l) => l.startsWith('+') || l.startsWith('-')).length;
18
+ const hunks = (diff.match(/^@@/gm) ?? []).length;
19
+ const testTouches = (diff.match(/\.(spec|test)\./gi) ?? []).length;
20
+ const sizePenalty = Math.min(1, changedLines / 200);
21
+ const hunkPenalty = Math.min(1, hunks / 20);
22
+ const testBonus = Math.min(0.3, testTouches * 0.1);
23
+ const score = clamp01(1 - sizePenalty * 0.5 - hunkPenalty * 0.2 + testBonus);
24
+ return { id, score };
25
+ });
26
+ }
27
+ /** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
28
+ export function reorderByPrerank(items, scores) {
29
+ const scoreMap = new Map(scores.map((s) => [s.id, s.score]));
30
+ return [...items].sort((a, b) => (scoreMap.get(b.id) ?? 0) - (scoreMap.get(a.id) ?? 0));
31
+ }
32
+ //# sourceMappingURL=prerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerank.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,uDAAuD;AACvD,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAa,CAAC;AAE3D,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmC;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,IAAI;aACtB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAEnE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;QAE7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAC9B,KAAuB,EACvB,MAAmC;IAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface Worktree {
2
+ readonly id: string;
3
+ readonly path: string;
4
+ readonly branch: string;
5
+ }
6
+ export declare function createWorktree(repoRoot: string, id: string): Promise<Worktree>;
7
+ export declare function removeWorktree(repoRoot: string, wt: Worktree): Promise<void>;
8
+ export declare function listWorktrees(repoRoot: string): Promise<ReadonlyArray<Worktree>>;
9
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../../src/verification/best-of-n/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA+BD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ,GACX,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAkDlC"}
@@ -0,0 +1,100 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { safeSpawn } from '../../exec/safe-spawn.js';
4
+ import { assertRelativeSafe } from '../../utils/path-safety.js';
5
+ const WORKTREE_ROOT = '.dare/worktrees';
6
+ function worktreeRelPath(id) {
7
+ const rel = path.posix.join(WORKTREE_ROOT, id);
8
+ assertRelativeSafe(rel);
9
+ return rel;
10
+ }
11
+ function branchName(id) {
12
+ assertRelativeSafe(id);
13
+ if (id.includes('/') || id.includes('\\')) {
14
+ throw new Error(`unsafe worktree id: ${id}`);
15
+ }
16
+ return `dare/cand-${id}`;
17
+ }
18
+ async function git(repoRoot, args, timeoutSeconds = 120) {
19
+ const result = await safeSpawn('git', args, {
20
+ cwd: repoRoot,
21
+ timeoutSeconds,
22
+ maxChars: 8000,
23
+ });
24
+ return { code: result.code, stderr: result.stderr };
25
+ }
26
+ export async function createWorktree(repoRoot, id) {
27
+ const rel = worktreeRelPath(id);
28
+ const absPath = path.resolve(repoRoot, rel);
29
+ const branch = branchName(id);
30
+ await fs.ensureDir(path.dirname(absPath));
31
+ const add = await git(repoRoot, [
32
+ 'worktree',
33
+ 'add',
34
+ '-b',
35
+ branch,
36
+ absPath,
37
+ 'HEAD',
38
+ ]);
39
+ if (add.code !== 0) {
40
+ throw new Error(`git worktree add failed for ${id}: ${add.stderr.trim()}`);
41
+ }
42
+ return { id, path: rel, branch };
43
+ }
44
+ export async function removeWorktree(repoRoot, wt) {
45
+ assertRelativeSafe(wt.path);
46
+ const absPath = path.resolve(repoRoot, wt.path);
47
+ const remove = await git(repoRoot, ['worktree', 'remove', '--force', absPath]);
48
+ if (remove.code !== 0) {
49
+ throw new Error(`git worktree remove failed for ${wt.id}: ${remove.stderr.trim()}`);
50
+ }
51
+ await git(repoRoot, ['branch', '-D', wt.branch]).catch(() => undefined);
52
+ await fs.remove(absPath).catch(() => undefined);
53
+ }
54
+ export async function listWorktrees(repoRoot) {
55
+ const result = await safeSpawn('git', ['worktree', 'list', '--porcelain'], { cwd: repoRoot, timeoutSeconds: 60, maxChars: 16000 });
56
+ if (result.code !== 0) {
57
+ throw new Error(`git worktree list failed: ${result.stderr.trim()}`);
58
+ }
59
+ const out = [];
60
+ const prefix = path.resolve(repoRoot, WORKTREE_ROOT) + path.sep;
61
+ let absPath = '';
62
+ let branch = '';
63
+ const flush = () => {
64
+ if (!absPath)
65
+ return;
66
+ const normalized = path.resolve(absPath);
67
+ if (!normalized.startsWith(prefix)) {
68
+ absPath = '';
69
+ branch = '';
70
+ return;
71
+ }
72
+ const rel = path.relative(repoRoot, normalized).replace(/\\/g, '/');
73
+ const id = path.basename(rel);
74
+ out.push({
75
+ id,
76
+ path: rel,
77
+ branch: branch || branchName(id),
78
+ });
79
+ absPath = '';
80
+ branch = '';
81
+ };
82
+ for (const line of result.stdout.split(/\r?\n/)) {
83
+ if (line.startsWith('worktree ')) {
84
+ flush();
85
+ absPath = line.slice('worktree '.length).trim();
86
+ }
87
+ else if (line.startsWith('branch ')) {
88
+ branch = line
89
+ .slice('branch '.length)
90
+ .trim()
91
+ .replace(/^refs\/heads\//, '');
92
+ }
93
+ else if (line === '') {
94
+ flush();
95
+ }
96
+ }
97
+ flush();
98
+ return out;
99
+ }
100
+ //# sourceMappingURL=worktree.js.map