@dewtech/dare-cli 3.1.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 (345) hide show
  1. package/README.md +5 -1
  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__/ensure-skills.test.d.ts +2 -0
  9. package/dist/__tests__/ensure-skills.test.d.ts.map +1 -0
  10. package/dist/__tests__/ensure-skills.test.js +67 -0
  11. package/dist/__tests__/ensure-skills.test.js.map +1 -0
  12. package/dist/__tests__/ide-command-parity.test.d.ts +2 -0
  13. package/dist/__tests__/ide-command-parity.test.d.ts.map +1 -0
  14. package/dist/__tests__/ide-command-parity.test.js +59 -0
  15. package/dist/__tests__/ide-command-parity.test.js.map +1 -0
  16. package/dist/__tests__/project-generator.test.d.ts +2 -0
  17. package/dist/__tests__/project-generator.test.d.ts.map +1 -0
  18. package/dist/__tests__/project-generator.test.js +56 -0
  19. package/dist/__tests__/project-generator.test.js.map +1 -0
  20. package/dist/__tests__/reverse-collection.test.d.ts +2 -0
  21. package/dist/__tests__/reverse-collection.test.d.ts.map +1 -0
  22. package/dist/__tests__/reverse-collection.test.js +87 -0
  23. package/dist/__tests__/reverse-collection.test.js.map +1 -0
  24. package/dist/bin/dare.js +2 -0
  25. package/dist/bin/dare.js.map +1 -1
  26. package/dist/commands/__tests__/bench.spec.d.ts +2 -0
  27. package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
  28. package/dist/commands/__tests__/bench.spec.js +106 -0
  29. package/dist/commands/__tests__/bench.spec.js.map +1 -0
  30. package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
  31. package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
  32. package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
  33. package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
  34. package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
  35. package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
  36. package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
  37. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
  38. package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
  39. package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
  40. package/dist/commands/__tests__/execute.verify.spec.js +150 -0
  41. package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
  42. package/dist/commands/bench.d.ts +10 -0
  43. package/dist/commands/bench.d.ts.map +1 -0
  44. package/dist/commands/bench.js +64 -0
  45. package/dist/commands/bench.js.map +1 -0
  46. package/dist/commands/dna.d.ts.map +1 -1
  47. package/dist/commands/dna.js +4 -0
  48. package/dist/commands/dna.js.map +1 -1
  49. package/dist/commands/execute-verification.d.ts +51 -0
  50. package/dist/commands/execute-verification.d.ts.map +1 -0
  51. package/dist/commands/execute-verification.js +201 -0
  52. package/dist/commands/execute-verification.js.map +1 -0
  53. package/dist/commands/execute.d.ts.map +1 -1
  54. package/dist/commands/execute.js +139 -2
  55. package/dist/commands/execute.js.map +1 -1
  56. package/dist/commands/migrate.d.ts.map +1 -1
  57. package/dist/commands/migrate.js +4 -0
  58. package/dist/commands/migrate.js.map +1 -1
  59. package/dist/commands/reverse.d.ts.map +1 -1
  60. package/dist/commands/reverse.js +27 -8
  61. package/dist/commands/reverse.js.map +1 -1
  62. package/dist/dag-runner/ralph-loop.d.ts +9 -9
  63. package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
  64. package/dist/dag-runner/ralph-loop.js +89 -113
  65. package/dist/dag-runner/ralph-loop.js.map +1 -1
  66. package/dist/dag-runner/state-store.d.ts +14 -1
  67. package/dist/dag-runner/state-store.d.ts.map +1 -1
  68. package/dist/dag-runner/state-store.js +39 -8
  69. package/dist/dag-runner/state-store.js.map +1 -1
  70. package/dist/exec/npm-invoke.d.ts +8 -0
  71. package/dist/exec/npm-invoke.d.ts.map +1 -0
  72. package/dist/exec/npm-invoke.js +45 -0
  73. package/dist/exec/npm-invoke.js.map +1 -0
  74. package/dist/exec/safe-spawn.d.ts +21 -0
  75. package/dist/exec/safe-spawn.d.ts.map +1 -0
  76. package/dist/exec/safe-spawn.js +108 -0
  77. package/dist/exec/safe-spawn.js.map +1 -0
  78. package/dist/graphrag/types.d.ts +2 -2
  79. package/dist/graphrag/types.d.ts.map +1 -1
  80. package/dist/stacks/dna-emitter.d.ts.map +1 -1
  81. package/dist/stacks/dna-emitter.js +1 -10
  82. package/dist/stacks/dna-emitter.js.map +1 -1
  83. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  84. package/dist/utils/UpdateApplier.js +8 -0
  85. package/dist/utils/UpdateApplier.js.map +1 -1
  86. package/dist/utils/datamodel.d.ts.map +1 -1
  87. package/dist/utils/datamodel.js +97 -20
  88. package/dist/utils/datamodel.js.map +1 -1
  89. package/dist/utils/logger.d.ts +7 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +23 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/path-safety.d.ts +22 -0
  94. package/dist/utils/path-safety.d.ts.map +1 -0
  95. package/dist/utils/path-safety.js +83 -0
  96. package/dist/utils/path-safety.js.map +1 -0
  97. package/dist/utils/project-generator.d.ts +21 -0
  98. package/dist/utils/project-generator.d.ts.map +1 -1
  99. package/dist/utils/project-generator.js +71 -0
  100. package/dist/utils/project-generator.js.map +1 -1
  101. package/dist/utils/reverse-facts.d.ts +3 -2
  102. package/dist/utils/reverse-facts.d.ts.map +1 -1
  103. package/dist/utils/reverse-facts.js +89 -8
  104. package/dist/utils/reverse-facts.js.map +1 -1
  105. package/dist/utils/stack-bootstrap.js +2 -2
  106. package/dist/utils/stack-bootstrap.js.map +1 -1
  107. package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
  108. package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
  109. package/dist/verification/__tests__/anti-tamper.test.js +73 -0
  110. package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
  111. package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
  112. package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
  113. package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
  114. package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
  115. package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
  116. package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
  117. package/dist/verification/__tests__/bench-harness.test.js +75 -0
  118. package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
  119. package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
  120. package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
  121. package/dist/verification/__tests__/bench-report.test.js +73 -0
  122. package/dist/verification/__tests__/bench-report.test.js.map +1 -0
  123. package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
  124. package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
  125. package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
  126. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
  127. package/dist/verification/__tests__/config.test.d.ts +2 -0
  128. package/dist/verification/__tests__/config.test.d.ts.map +1 -0
  129. package/dist/verification/__tests__/config.test.js +50 -0
  130. package/dist/verification/__tests__/config.test.js.map +1 -0
  131. package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
  132. package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
  133. package/dist/verification/__tests__/decay-policy.test.js +130 -0
  134. package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
  135. package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
  136. package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
  137. package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
  138. package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
  139. package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
  140. package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
  141. package/dist/verification/__tests__/failure-signature.test.js +40 -0
  142. package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
  143. package/dist/verification/__tests__/logger.test.d.ts +2 -0
  144. package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
  145. package/dist/verification/__tests__/logger.test.js +23 -0
  146. package/dist/verification/__tests__/logger.test.js.map +1 -0
  147. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
  148. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
  149. package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
  150. package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
  151. package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
  152. package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
  153. package/dist/verification/__tests__/mutation-infection.test.js +101 -0
  154. package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
  155. package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
  156. package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
  157. package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
  158. package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
  159. package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
  160. package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
  161. package/dist/verification/__tests__/mutation-registry.test.js +28 -0
  162. package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
  163. package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
  164. package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
  165. package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
  166. package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
  167. package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
  168. package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
  169. package/dist/verification/__tests__/no-shell-true.test.js +43 -0
  170. package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
  171. package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
  172. package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
  173. package/dist/verification/__tests__/path-safety.test.js +59 -0
  174. package/dist/verification/__tests__/path-safety.test.js.map +1 -0
  175. package/dist/verification/__tests__/prerank.test.d.ts +2 -0
  176. package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
  177. package/dist/verification/__tests__/prerank.test.js +44 -0
  178. package/dist/verification/__tests__/prerank.test.js.map +1 -0
  179. package/dist/verification/__tests__/runner.test.d.ts +2 -0
  180. package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
  181. package/dist/verification/__tests__/runner.test.js +200 -0
  182. package/dist/verification/__tests__/runner.test.js.map +1 -0
  183. package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
  184. package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
  185. package/dist/verification/__tests__/safe-spawn.test.js +36 -0
  186. package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
  187. package/dist/verification/__tests__/security.test.d.ts +2 -0
  188. package/dist/verification/__tests__/security.test.d.ts.map +1 -0
  189. package/dist/verification/__tests__/security.test.js +79 -0
  190. package/dist/verification/__tests__/security.test.js.map +1 -0
  191. package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
  192. package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
  193. package/dist/verification/__tests__/selector-pareto.test.js +77 -0
  194. package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
  195. package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
  196. package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
  197. package/dist/verification/__tests__/telemetry.test.js +116 -0
  198. package/dist/verification/__tests__/telemetry.test.js.map +1 -0
  199. package/dist/verification/__tests__/type-check.test.d.ts +2 -0
  200. package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
  201. package/dist/verification/__tests__/type-check.test.js +52 -0
  202. package/dist/verification/__tests__/type-check.test.js.map +1 -0
  203. package/dist/verification/__tests__/worktree.test.d.ts +2 -0
  204. package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
  205. package/dist/verification/__tests__/worktree.test.js +41 -0
  206. package/dist/verification/__tests__/worktree.test.js.map +1 -0
  207. package/dist/verification/bench/fixtures.d.ts +11 -0
  208. package/dist/verification/bench/fixtures.d.ts.map +1 -0
  209. package/dist/verification/bench/fixtures.js +66 -0
  210. package/dist/verification/bench/fixtures.js.map +1 -0
  211. package/dist/verification/bench/harness.d.ts +19 -0
  212. package/dist/verification/bench/harness.d.ts.map +1 -0
  213. package/dist/verification/bench/harness.js +138 -0
  214. package/dist/verification/bench/harness.js.map +1 -0
  215. package/dist/verification/bench/report.d.ts +53 -0
  216. package/dist/verification/bench/report.d.ts.map +1 -0
  217. package/dist/verification/bench/report.js +47 -0
  218. package/dist/verification/bench/report.js.map +1 -0
  219. package/dist/verification/best-of-n/runner.d.ts +29 -0
  220. package/dist/verification/best-of-n/runner.d.ts.map +1 -0
  221. package/dist/verification/best-of-n/runner.js +76 -0
  222. package/dist/verification/best-of-n/runner.js.map +1 -0
  223. package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
  224. package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
  225. package/dist/verification/best-of-n/selector/pareto.js +65 -0
  226. package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
  227. package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
  228. package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
  229. package/dist/verification/best-of-n/selector/prerank.js +32 -0
  230. package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
  231. package/dist/verification/best-of-n/worktree.d.ts +9 -0
  232. package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
  233. package/dist/verification/best-of-n/worktree.js +100 -0
  234. package/dist/verification/best-of-n/worktree.js.map +1 -0
  235. package/dist/verification/config.d.ts +24 -0
  236. package/dist/verification/config.d.ts.map +1 -0
  237. package/dist/verification/config.js +168 -0
  238. package/dist/verification/config.js.map +1 -0
  239. package/dist/verification/decay/policy.d.ts +16 -0
  240. package/dist/verification/decay/policy.d.ts.map +1 -0
  241. package/dist/verification/decay/policy.js +64 -0
  242. package/dist/verification/decay/policy.js.map +1 -0
  243. package/dist/verification/decay/signature.d.ts +6 -0
  244. package/dist/verification/decay/signature.d.ts.map +1 -0
  245. package/dist/verification/decay/signature.js +18 -0
  246. package/dist/verification/decay/signature.js.map +1 -0
  247. package/dist/verification/gates/anti-tamper.d.ts +16 -0
  248. package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
  249. package/dist/verification/gates/anti-tamper.js +142 -0
  250. package/dist/verification/gates/anti-tamper.js.map +1 -0
  251. package/dist/verification/gates/fail-to-pass.d.ts +39 -0
  252. package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
  253. package/dist/verification/gates/fail-to-pass.js +173 -0
  254. package/dist/verification/gates/fail-to-pass.js.map +1 -0
  255. package/dist/verification/gates/mutation/adapter.d.ts +34 -0
  256. package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
  257. package/dist/verification/gates/mutation/adapter.js +22 -0
  258. package/dist/verification/gates/mutation/adapter.js.map +1 -0
  259. package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
  260. package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
  261. package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
  262. package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
  263. package/dist/verification/gates/mutation/infection.d.ts +28 -0
  264. package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
  265. package/dist/verification/gates/mutation/infection.js +149 -0
  266. package/dist/verification/gates/mutation/infection.js.map +1 -0
  267. package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
  268. package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
  269. package/dist/verification/gates/mutation/mutmut.js +148 -0
  270. package/dist/verification/gates/mutation/mutmut.js.map +1 -0
  271. package/dist/verification/gates/mutation/stryker.d.ts +19 -0
  272. package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
  273. package/dist/verification/gates/mutation/stryker.js +103 -0
  274. package/dist/verification/gates/mutation/stryker.js.map +1 -0
  275. package/dist/verification/gates/type-check.d.ts +11 -0
  276. package/dist/verification/gates/type-check.d.ts.map +1 -0
  277. package/dist/verification/gates/type-check.js +84 -0
  278. package/dist/verification/gates/type-check.js.map +1 -0
  279. package/dist/verification/registry.d.ts +6 -0
  280. package/dist/verification/registry.d.ts.map +1 -0
  281. package/dist/verification/registry.js +49 -0
  282. package/dist/verification/registry.js.map +1 -0
  283. package/dist/verification/runner.d.ts +27 -0
  284. package/dist/verification/runner.d.ts.map +1 -0
  285. package/dist/verification/runner.js +173 -0
  286. package/dist/verification/runner.js.map +1 -0
  287. package/dist/verification/telemetry.d.ts +18 -0
  288. package/dist/verification/telemetry.d.ts.map +1 -0
  289. package/dist/verification/telemetry.js +71 -0
  290. package/dist/verification/telemetry.js.map +1 -0
  291. package/dist/verification/types.d.ts +89 -0
  292. package/dist/verification/types.d.ts.map +1 -0
  293. package/dist/verification/types.js +3 -0
  294. package/dist/verification/types.js.map +1 -0
  295. package/package.json +5 -3
  296. package/templates/UPDATE-MANIFEST.json +20 -0
  297. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
  298. package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -0
  299. package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -0
  300. package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -0
  301. package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -0
  302. package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -0
  303. package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -0
  304. package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -0
  305. package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -0
  306. package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -0
  307. package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -0
  308. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
  309. package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -0
  310. package/templates/ide/claude/.claude/commands/dare-dag.md +27 -0
  311. package/templates/ide/claude/.claude/commands/dare-discover.md +28 -0
  312. package/templates/ide/claude/.claude/commands/dare-graph.md +30 -0
  313. package/templates/ide/claude/.claude/commands/dare-info.md +26 -0
  314. package/templates/ide/claude/.claude/commands/dare-init.md +30 -0
  315. package/templates/ide/claude/.claude/commands/dare-skill.md +30 -0
  316. package/templates/ide/claude/.claude/commands/dare-update.md +28 -0
  317. package/templates/ide/claude/.claude/commands/dare-validate.md +28 -0
  318. package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -0
  319. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
  320. package/templates/ide/cursor/.cursor/commands/{generate-blueprint.md → dare-blueprint.md} +1 -1
  321. package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -0
  322. package/templates/ide/cursor/.cursor/commands/{run-dag.md → dare-dag-run.md} +1 -1
  323. package/templates/ide/cursor/.cursor/commands/{dag-viz.md → dare-dag-viz.md} +1 -1
  324. package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -0
  325. package/templates/ide/cursor/.cursor/commands/{generate-design.md → dare-design.md} +1 -1
  326. package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -0
  327. package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -0
  328. package/templates/ide/cursor/.cursor/commands/{generate-docker-compose.md → dare-docker-compose.md} +1 -1
  329. package/templates/ide/cursor/.cursor/commands/{generate-dockerfile.md → dare-dockerfile.md} +1 -1
  330. package/templates/ide/cursor/.cursor/commands/{execute-task.md → dare-execute.md} +1 -1
  331. package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -0
  332. package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -0
  333. package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -0
  334. package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -0
  335. package/templates/ide/cursor/.cursor/commands/{refine-task.md → dare-refine.md} +1 -1
  336. package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -0
  337. package/templates/ide/cursor/.cursor/commands/{review-task.md → dare-review.md} +1 -1
  338. package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -0
  339. package/templates/ide/cursor/.cursor/commands/{generate-tasks.md → dare-tasks.md} +1 -1
  340. package/templates/ide/cursor/.cursor/commands/{telemetry-report.md → dare-telemetry.md} +1 -1
  341. package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -0
  342. package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -0
  343. package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -0
  344. /package/templates/ide/cursor/.cursor/commands/{generate-bugfix-design.md → dare-bugfix-design.md} +0 -0
  345. /package/templates/ide/cursor/.cursor/commands/{generate-feature-design.md → dare-feature-design.md} +0 -0
@@ -0,0 +1,64 @@
1
+ const SATURATION_ACTION = {
2
+ 'fresh-start': 'FRESH_START',
3
+ replan: 'REPLAN',
4
+ escalate: 'ESCALATE',
5
+ };
6
+ /** True when the last `window` attempts share the same non-null failureSignature. */
7
+ export function isSaturated(history, window) {
8
+ if (window < 1 || history.length < window)
9
+ return false;
10
+ const slice = history.slice(-window);
11
+ const signature = slice[0]?.failureSignature;
12
+ if (!signature)
13
+ return false;
14
+ return slice.every((record) => record.failureSignature === signature);
15
+ }
16
+ /** Canonical loop decision (RF-06) — deterministic, no LLM. */
17
+ export function decideNextAction(args) {
18
+ const { result, current, history, loop } = args;
19
+ if (result.passed) {
20
+ return {
21
+ action: 'DONE',
22
+ attempt: current.n,
23
+ saturated: false,
24
+ reason: 'verification passed',
25
+ };
26
+ }
27
+ if (current.n >= loop.maxAttempts) {
28
+ return {
29
+ action: 'ESCALATE',
30
+ attempt: current.n,
31
+ saturated: false,
32
+ reason: 'max attempts reached',
33
+ failureSignature: current.failureSignature,
34
+ };
35
+ }
36
+ const saturated = isSaturated(history, loop.saturationWindow);
37
+ if (saturated) {
38
+ const action = SATURATION_ACTION[loop.onSaturation];
39
+ return {
40
+ action,
41
+ attempt: current.n,
42
+ saturated: true,
43
+ reason: `failure saturation: ${loop.onSaturation}`,
44
+ failureSignature: current.failureSignature,
45
+ };
46
+ }
47
+ if (loop.policy === 'fixed' && current.n < loop.maxAttempts) {
48
+ return {
49
+ action: 'CONTINUE',
50
+ attempt: current.n,
51
+ saturated: false,
52
+ reason: 'fixed policy: continue',
53
+ failureSignature: current.failureSignature,
54
+ };
55
+ }
56
+ return {
57
+ action: 'CONTINUE',
58
+ attempt: current.n,
59
+ saturated: false,
60
+ reason: 'decay policy: continue',
61
+ failureSignature: current.failureSignature,
62
+ };
63
+ }
64
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/verification/decay/policy.ts"],"names":[],"mappings":"AAYA,MAAM,iBAAiB,GAEnB;IACF,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,WAAW,CACzB,OAAqC,EACrC,MAAc;IAEd,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;QAAE,OAAO,KAAK,CAAC;IAExD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC;AACxE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,IAKhC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEhD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,qBAAqB;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,sBAAsB;YAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO;YACL,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,uBAAuB,IAAI,CAAC,YAAY,EAAE;YAClD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5D,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,wBAAwB;YAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC;QAClB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,wBAAwB;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Stable 8-hex failure signature for saturation detection (RF-06). */
2
+ export declare function failureSignature(input: {
3
+ readonly failedAspect: string;
4
+ readonly stderr: string;
5
+ }): string;
6
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/verification/decay/signature.ts"],"names":[],"mappings":"AAsBA,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAIT"}
@@ -0,0 +1,18 @@
1
+ import { createHash } from 'node:crypto';
2
+ function normalizeStderr(stderr) {
3
+ let normalized = stderr.toLowerCase();
4
+ normalized = normalized.replace(/\/(?:[\w.-]+\/)+[\w.-]+/g, '<path>');
5
+ normalized = normalized.replace(/[a-z]:\\(?:[\w.-]+\\)+[\w.-]*/gi, '<path>');
6
+ normalized = normalized.replace(/\d{4}-\d{2}-\d{2}t[\d:.]+z?/g, '<ts>');
7
+ normalized = normalized.replace(/\b[0-9a-f]{8,}\b/g, '<hex>');
8
+ normalized = normalized.replace(/:\d+:/g, ':<line>:');
9
+ normalized = normalized.replace(/\s+/g, ' ').trim();
10
+ return normalized;
11
+ }
12
+ /** Stable 8-hex failure signature for saturation detection (RF-06). */
13
+ export function failureSignature(input) {
14
+ const normalized = normalizeStderr(input.stderr);
15
+ const payload = `${input.failedAspect}\n${normalized}`;
16
+ return createHash('sha256').update(payload).digest('hex').slice(0, 8);
17
+ }
18
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/verification/decay/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,0BAA0B,EAC1B,QAAQ,CACT,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,iCAAiC,EACjC,QAAQ,CACT,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,8BAA8B,EAC9B,MAAM,CACP,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC9D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AspectResult } from '../types.js';
2
+ export interface TamperSnapshot {
3
+ readonly assertionCount: number;
4
+ readonly testFiles: ReadonlyArray<string>;
5
+ readonly coveragePct?: number;
6
+ }
7
+ export declare function snapshotTests(args: {
8
+ readonly cwd: string;
9
+ readonly testGlob: string;
10
+ }): Promise<TamperSnapshot>;
11
+ export declare function checkAntiTamper(args: {
12
+ readonly baseline: TamperSnapshot;
13
+ readonly cwd: string;
14
+ readonly testGlob: string;
15
+ }): Promise<AspectResult>;
16
+ //# sourceMappingURL=anti-tamper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-tamper.d.ts","sourceRoot":"","sources":["../../../src/verification/gates/anti-tamper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA+FD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAU1B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,YAAY,CAAC,CAwDxB"}
@@ -0,0 +1,142 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ const SKIP_PATTERNS = [
4
+ /\bit\.skip\s*\(/,
5
+ /\bit\.only\s*\(/,
6
+ /\bdescribe\.only\s*\(/,
7
+ /\bdescribe\.skip\s*\(/,
8
+ /\bxit\s*\(/,
9
+ /\bxdescribe\s*\(/,
10
+ /@pytest\.mark\.skip/,
11
+ ];
12
+ function stripJsComments(content) {
13
+ return content
14
+ .replace(/\/\*[\s\S]*?\*\//g, '')
15
+ .replace(/\/\/.*$/gm, '');
16
+ }
17
+ function hasSkipMarker(content) {
18
+ return SKIP_PATTERNS.some((pattern) => pattern.test(content));
19
+ }
20
+ function countAssertions(content, ext) {
21
+ if (ext === '.py') {
22
+ const assertKw = (content.match(/\bassert\b/g) ?? []).length;
23
+ const selfAssert = (content.match(/\bself\.assert\w+/g) ?? []).length;
24
+ const pytestRaises = (content.match(/pytest\.raises\s*\(/g) ?? []).length;
25
+ return assertKw + selfAssert + pytestRaises;
26
+ }
27
+ if (ext === '.rs') {
28
+ return (content.match(/\bassert(?:_eq|_ne)?!\s*\(/g) ?? []).length;
29
+ }
30
+ if (ext === '.php') {
31
+ return (content.match(/\$this->assert\w+/g) ?? []).length;
32
+ }
33
+ const stripped = stripJsComments(content);
34
+ const expect = (stripped.match(/\bexpect\s*\(/g) ?? []).length;
35
+ const assertCalls = (stripped.match(/\bassert\s*\(/g) ?? []).length;
36
+ const matchers = (stripped.match(/\.to(?:Be|Equal|StrictEqual|Throw|Match|Contain)\s*\(/g) ??
37
+ []).length;
38
+ return expect + assertCalls + matchers;
39
+ }
40
+ function fileExt(file) {
41
+ return path.extname(file).toLowerCase();
42
+ }
43
+ async function collectTestFiles(cwd, testGlob) {
44
+ const direct = path.join(cwd, testGlob);
45
+ if (await fs.pathExists(direct)) {
46
+ const stat = await fs.stat(direct);
47
+ if (stat.isFile())
48
+ return [testGlob.replace(/\\/g, '/')];
49
+ }
50
+ const found = [];
51
+ const suffixes = [
52
+ '.test.ts',
53
+ '.test.js',
54
+ '.spec.ts',
55
+ '.spec.js',
56
+ '_test.py',
57
+ '_test.rs',
58
+ ];
59
+ async function walk(dir) {
60
+ let entries;
61
+ try {
62
+ entries = await fs.readdir(dir, { withFileTypes: true });
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ for (const entry of entries) {
68
+ if (entry.name === 'node_modules' || entry.name === '.git')
69
+ continue;
70
+ const abs = path.join(dir, entry.name);
71
+ if (entry.isDirectory()) {
72
+ await walk(abs);
73
+ continue;
74
+ }
75
+ const rel = path.relative(cwd, abs).replace(/\\/g, '/');
76
+ if (suffixes.some((s) => rel.endsWith(s)))
77
+ found.push(rel);
78
+ }
79
+ }
80
+ await walk(cwd);
81
+ return [...new Set(found)].sort();
82
+ }
83
+ export async function snapshotTests(args) {
84
+ const testFiles = await collectTestFiles(args.cwd, args.testGlob);
85
+ let assertionCount = 0;
86
+ for (const file of testFiles) {
87
+ const content = await fs.readFile(path.join(args.cwd, file), 'utf8');
88
+ assertionCount += countAssertions(content, fileExt(file));
89
+ }
90
+ return { assertionCount, testFiles };
91
+ }
92
+ export async function checkAntiTamper(args) {
93
+ const start = Date.now();
94
+ const current = await snapshotTests({
95
+ cwd: args.cwd,
96
+ testGlob: args.testGlob,
97
+ });
98
+ for (const file of args.baseline.testFiles) {
99
+ if (!current.testFiles.includes(file)) {
100
+ return {
101
+ aspect: 'anti-tamper',
102
+ verdict: 'FAIL',
103
+ reason: `test file removed: ${file}`,
104
+ durationMs: Date.now() - start,
105
+ };
106
+ }
107
+ const content = await fs.readFile(path.join(args.cwd, file), 'utf8');
108
+ if (hasSkipMarker(content)) {
109
+ return {
110
+ aspect: 'anti-tamper',
111
+ verdict: 'FAIL',
112
+ reason: `test weakened with skip/only in ${file}`,
113
+ durationMs: Date.now() - start,
114
+ };
115
+ }
116
+ }
117
+ if (current.assertionCount < args.baseline.assertionCount) {
118
+ return {
119
+ aspect: 'anti-tamper',
120
+ verdict: 'FAIL',
121
+ reason: `assertion count dropped: ${args.baseline.assertionCount} → ${current.assertionCount}`,
122
+ durationMs: Date.now() - start,
123
+ };
124
+ }
125
+ if (args.baseline.coveragePct !== undefined &&
126
+ current.coveragePct !== undefined &&
127
+ current.coveragePct < args.baseline.coveragePct - 1) {
128
+ return {
129
+ aspect: 'anti-tamper',
130
+ verdict: 'FAIL',
131
+ reason: `coverage dropped: ${args.baseline.coveragePct}% → ${current.coveragePct}%`,
132
+ durationMs: Date.now() - start,
133
+ };
134
+ }
135
+ return {
136
+ aspect: 'anti-tamper',
137
+ verdict: 'PASS',
138
+ reason: 'test suite not weakened',
139
+ durationMs: Date.now() - start,
140
+ };
141
+ }
142
+ //# sourceMappingURL=anti-tamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-tamper.js","sourceRoot":"","sources":["../../../src/verification/gates/anti-tamper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { AspectResult } from '../types.js';
2
+ import type { TamperSnapshot } from './anti-tamper.js';
3
+ export interface FailToPassBaseline {
4
+ readonly recordedAt: string;
5
+ readonly ranAgainst: string;
6
+ readonly failed: ReadonlyArray<string>;
7
+ readonly allFailed: boolean;
8
+ }
9
+ export interface VerificationArtifact {
10
+ readonly specGlob?: string;
11
+ readonly failToPassBaseline?: FailToPassBaseline;
12
+ readonly tamperSnapshot?: TamperSnapshot;
13
+ }
14
+ export declare class FailToPassMissingError extends Error {
15
+ readonly taskId: string;
16
+ constructor(taskId: string);
17
+ }
18
+ export declare function readVerificationArtifact(cwd: string, taskId: string): Promise<VerificationArtifact | undefined>;
19
+ /** Map stack → test runner argv for a spec glob/path. */
20
+ export declare function testCommandFor(stack: string, specGlob: string): {
21
+ command: string;
22
+ args: string[];
23
+ };
24
+ /**
25
+ * Record baseline: spec must fail entirely against pre-implementation code.
26
+ */
27
+ export declare function recordFailToPassBaseline(args: {
28
+ readonly taskId: string;
29
+ readonly cwd: string;
30
+ readonly specGlob: string;
31
+ }): Promise<FailToPassBaseline>;
32
+ /**
33
+ * Verify fail-to-pass gate at task completion.
34
+ */
35
+ export declare function checkFailToPass(args: {
36
+ readonly taskId: string;
37
+ readonly cwd: string;
38
+ }): Promise<AspectResult>;
39
+ //# sourceMappingURL=fail-to-pass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail-to-pass.d.ts","sourceRoot":"","sources":["../../../src/verification/gates/fail-to-pass.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;CAK3B;AAQD,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAI3C;AA8BD,yDAAyD;AACzD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAyBrC;AA+DD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4B9B;AAoBD;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCxB"}
@@ -0,0 +1,173 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { safeSpawn } from '../../exec/safe-spawn.js';
4
+ import { npmInvoke } from '../../exec/npm-invoke.js';
5
+ import { resolveStackFromConfig } from '../../dag-runner/ralph-loop.js';
6
+ export class FailToPassMissingError extends Error {
7
+ constructor(taskId) {
8
+ super(`fail-to-pass baseline missing for task ${taskId}`);
9
+ this.name = 'FailToPassMissingError';
10
+ this.taskId = taskId;
11
+ }
12
+ }
13
+ const BASELINE_DIR = '.dare/verification';
14
+ function artifactPath(cwd, taskId) {
15
+ return path.join(cwd, BASELINE_DIR, `${taskId}.json`);
16
+ }
17
+ export async function readVerificationArtifact(cwd, taskId) {
18
+ const file = artifactPath(cwd, taskId);
19
+ if (!(await fs.pathExists(file)))
20
+ return undefined;
21
+ return (await fs.readJson(file));
22
+ }
23
+ async function readArtifact(cwd, taskId) {
24
+ return readVerificationArtifact(cwd, taskId);
25
+ }
26
+ async function writeArtifact(cwd, taskId, patch) {
27
+ const file = artifactPath(cwd, taskId);
28
+ await fs.ensureDir(path.dirname(file));
29
+ const prev = (await readArtifact(cwd, taskId)) ?? {};
30
+ await fs.writeJson(file, { ...prev, ...patch }, { spaces: 2 });
31
+ }
32
+ async function gitHead(cwd) {
33
+ const result = await safeSpawn('git', ['rev-parse', 'HEAD'], {
34
+ cwd,
35
+ timeoutSeconds: 30,
36
+ maxChars: 200,
37
+ });
38
+ if (result.code === 0)
39
+ return result.stdout.trim();
40
+ return 'unknown';
41
+ }
42
+ /** Map stack → test runner argv for a spec glob/path. */
43
+ export function testCommandFor(stack, specGlob) {
44
+ switch (stack) {
45
+ case 'node-nestjs':
46
+ case 'react':
47
+ case 'vue':
48
+ case 'mcp-server-node-ts':
49
+ return npmInvoke(['exec', 'vitest', 'run', specGlob, '--reporter=json']);
50
+ case 'python-fastapi':
51
+ case 'mcp-server-python':
52
+ return {
53
+ command: 'pytest',
54
+ args: [specGlob, '-q', '--tb=short'],
55
+ };
56
+ case 'rust-axum':
57
+ case 'rust-leptos':
58
+ case 'rust-leptos-csr':
59
+ return { command: 'cargo', args: ['test', '--quiet', specGlob] };
60
+ case 'php-laravel':
61
+ return { command: 'php', args: ['artisan', 'test', specGlob] };
62
+ case 'go-gin':
63
+ case 'go-stdlib':
64
+ return { command: 'go', args: ['test', specGlob] };
65
+ default:
66
+ throw new Error(`No fail-to-pass test runner for stack: ${stack}`);
67
+ }
68
+ }
69
+ function testId(file, name) {
70
+ return `${file}::${name}`;
71
+ }
72
+ function parseVitestJson(stdout) {
73
+ const passed = [];
74
+ const failed = [];
75
+ try {
76
+ const report = JSON.parse(stdout);
77
+ for (const fileResult of report.testResults ?? []) {
78
+ const file = fileResult.name ?? 'unknown';
79
+ for (const assertion of fileResult.assertionResults ?? []) {
80
+ const id = testId(file, assertion.fullName ?? 'unknown');
81
+ if (assertion.status === 'passed')
82
+ passed.push(id);
83
+ else if (assertion.status === 'failed')
84
+ failed.push(id);
85
+ }
86
+ }
87
+ }
88
+ catch {
89
+ // fallback: no structured results
90
+ }
91
+ return { passed, failed };
92
+ }
93
+ async function runSpecSuite(cwd, stack, specGlob) {
94
+ const { command, args } = testCommandFor(stack, specGlob);
95
+ const result = await safeSpawn(command, args, {
96
+ cwd,
97
+ timeoutSeconds: 300,
98
+ maxChars: 200000,
99
+ });
100
+ const { passed, failed } = parseVitestJson(result.stdout);
101
+ return {
102
+ exitCode: result.code,
103
+ passed,
104
+ failed,
105
+ stderr: result.stderr,
106
+ };
107
+ }
108
+ /**
109
+ * Record baseline: spec must fail entirely against pre-implementation code.
110
+ */
111
+ export async function recordFailToPassBaseline(args) {
112
+ const stack = await resolveStackFromConfig(args.cwd);
113
+ const run = await runSpecSuite(args.cwd, stack, args.specGlob);
114
+ if (run.passed.length > 0) {
115
+ throw new Error(`fail-to-pass baseline requires all tests to fail; passed: ${run.passed.join(', ')}`);
116
+ }
117
+ if (run.failed.length === 0 && run.exitCode === 0) {
118
+ throw new Error('fail-to-pass baseline requires a failing spec (all tests must fail before implementation)');
119
+ }
120
+ const baseline = {
121
+ recordedAt: new Date().toISOString(),
122
+ ranAgainst: await gitHead(args.cwd),
123
+ failed: run.failed.length > 0 ? run.failed : [`${args.specGlob}::(suite)`],
124
+ allFailed: true,
125
+ };
126
+ await writeArtifact(args.cwd, args.taskId, {
127
+ specGlob: args.specGlob,
128
+ failToPassBaseline: baseline,
129
+ });
130
+ return baseline;
131
+ }
132
+ function failAspect(reason, durationMs = 0) {
133
+ return {
134
+ aspect: 'fail-to-pass',
135
+ verdict: 'FAIL',
136
+ reason,
137
+ durationMs,
138
+ };
139
+ }
140
+ function passAspect(reason, durationMs) {
141
+ return {
142
+ aspect: 'fail-to-pass',
143
+ verdict: 'PASS',
144
+ reason,
145
+ durationMs,
146
+ };
147
+ }
148
+ /**
149
+ * Verify fail-to-pass gate at task completion.
150
+ */
151
+ export async function checkFailToPass(args) {
152
+ const start = Date.now();
153
+ const artifact = await readArtifact(args.cwd, args.taskId);
154
+ const baseline = artifact?.failToPassBaseline;
155
+ const specGlob = artifact?.specGlob;
156
+ if (!baseline || !specGlob) {
157
+ return failAspect('no baseline recorded');
158
+ }
159
+ const stack = await resolveStackFromConfig(args.cwd);
160
+ const run = await runSpecSuite(args.cwd, stack, specGlob);
161
+ const durationMs = Date.now() - start;
162
+ if (run.failed.length > 0) {
163
+ return failAspect(`tests still failing: ${run.failed.join(', ')}`, durationMs);
164
+ }
165
+ if (run.exitCode !== 0) {
166
+ return failAspect(`spec suite did not pass (exit ${run.exitCode})`, durationMs);
167
+ }
168
+ if (!baseline.allFailed) {
169
+ return failAspect('baseline was not allFailed', durationMs);
170
+ }
171
+ return passAspect('all baseline tests now pass', durationMs);
172
+ }
173
+ //# sourceMappingURL=fail-to-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail-to-pass.js","sourceRoot":"","sources":["../../../src/verification/gates/fail-to-pass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { MutationTool } from '../../types.js';
2
+ export interface MutationRunInput {
3
+ readonly cwd: string;
4
+ readonly changedFiles: ReadonlyArray<string>;
5
+ readonly incremental: boolean;
6
+ readonly maxMutants: number;
7
+ readonly timeoutSeconds: number;
8
+ }
9
+ export interface MutationRunOutput {
10
+ /** killed/(killed+survived). NaN when no mutants — caller treats as SKIP. */
11
+ readonly score: number;
12
+ readonly killed: number;
13
+ readonly survived: number;
14
+ readonly noCoverage: number;
15
+ readonly timedOut: boolean;
16
+ readonly tool: MutationTool;
17
+ }
18
+ export interface MutationAdapter {
19
+ readonly tool: MutationTool;
20
+ readonly stacks: ReadonlyArray<string>;
21
+ isAvailable(cwd: string): Promise<boolean>;
22
+ run(input: MutationRunInput): Promise<MutationRunOutput>;
23
+ }
24
+ export declare class MutationToolNotFoundError extends Error {
25
+ readonly tool: MutationTool;
26
+ constructor(tool: MutationTool);
27
+ }
28
+ export declare class UnknownMutationStackError extends Error {
29
+ readonly stack: string;
30
+ constructor(stack: string);
31
+ }
32
+ /** Normalized mutation score for reporting gates. */
33
+ export declare function mutationScore(output: MutationRunOutput): number;
34
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC1D;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;gBAEhB,IAAI,EAAE,YAAY;CAK/B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;CAK1B;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,22 @@
1
+ export class MutationToolNotFoundError extends Error {
2
+ constructor(tool) {
3
+ super(`Mutation tool not available: ${tool}`);
4
+ this.name = 'MutationToolNotFoundError';
5
+ this.tool = tool;
6
+ }
7
+ }
8
+ export class UnknownMutationStackError extends Error {
9
+ constructor(stack) {
10
+ super(`No mutation adapter registered for stack: ${stack}`);
11
+ this.name = 'UnknownMutationStackError';
12
+ this.stack = stack;
13
+ }
14
+ }
15
+ /** Normalized mutation score for reporting gates. */
16
+ export function mutationScore(output) {
17
+ const denom = output.killed + output.survived;
18
+ if (denom === 0)
19
+ return Number.NaN;
20
+ return output.killed / denom;
21
+ }
22
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/adapter.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAGlD,YAAY,IAAkB;QAC5B,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAGlD,YAAY,KAAa;QACvB,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,MAAyB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC9C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { MutationAdapter, MutationRunInput, MutationRunOutput } from './adapter.js';
2
+ export declare const OUTCOMES_REL: string;
3
+ interface CargoMutantsSummary {
4
+ readonly caught?: number;
5
+ readonly missed?: number;
6
+ readonly unviable?: number;
7
+ readonly timeout?: number;
8
+ }
9
+ interface CargoMutantsOutcomeEntry {
10
+ readonly outcome?: string;
11
+ }
12
+ export interface CargoMutantsOutcomesFile {
13
+ readonly summary?: CargoMutantsSummary;
14
+ readonly outcomes?: ReadonlyArray<CargoMutantsOutcomeEntry>;
15
+ readonly caught?: number;
16
+ readonly missed?: number;
17
+ readonly unviable?: number;
18
+ readonly timeout?: number;
19
+ }
20
+ /** Parse `mutants.out/outcomes.json` into normalized output. */
21
+ export declare function parseCargoMutantsReport(report: CargoMutantsOutcomesFile, timedOut?: boolean): MutationRunOutput;
22
+ /** Build `cargo mutants` argv (exported for tests). */
23
+ export declare function buildCargoMutantsArgv(input: MutationRunInput, inDiffPath?: string): string[];
24
+ export declare const cargoMutantsAdapter: MutationAdapter;
25
+ /** Registry export (task-030). */
26
+ export declare const adapter: MutationAdapter;
27
+ export {};
28
+ //# sourceMappingURL=cargo-mutants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo-mutants.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/cargo-mutants.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,YAAY,QAA4C,CAAC;AAMtE,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2BD,gEAAgE;AAChE,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,EAChC,QAAQ,UAAQ,GACf,iBAAiB,CAwCnB;AAED,uDAAuD;AACvD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,EAAE,CAaV;AAwDD,eAAO,MAAM,mBAAmB,EAAE,eA8CjC,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,OAAO,iBAAsB,CAAC"}