@dewtech/dare-cli 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +2 -0
  2. package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
  3. package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
  4. package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
  5. package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
  6. package/dist/__tests__/dag-runner/state-store.test.js +74 -0
  7. package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
  8. package/dist/__tests__/ide-command-parity.test.js +1 -0
  9. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  10. package/dist/__tests__/project-generator.test.d.ts +2 -0
  11. package/dist/__tests__/project-generator.test.d.ts.map +1 -0
  12. package/dist/__tests__/project-generator.test.js +56 -0
  13. package/dist/__tests__/project-generator.test.js.map +1 -0
  14. package/dist/bin/dare.js +2 -0
  15. package/dist/bin/dare.js.map +1 -1
  16. package/dist/commands/__tests__/bench.spec.d.ts +2 -0
  17. package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
  18. package/dist/commands/__tests__/bench.spec.js +106 -0
  19. package/dist/commands/__tests__/bench.spec.js.map +1 -0
  20. package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
  21. package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
  22. package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
  23. package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
  24. package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
  25. package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
  26. package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
  27. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
  28. package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
  29. package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
  30. package/dist/commands/__tests__/execute.verify.spec.js +150 -0
  31. package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
  32. package/dist/commands/bench.d.ts +10 -0
  33. package/dist/commands/bench.d.ts.map +1 -0
  34. package/dist/commands/bench.js +64 -0
  35. package/dist/commands/bench.js.map +1 -0
  36. package/dist/commands/execute-verification.d.ts +51 -0
  37. package/dist/commands/execute-verification.d.ts.map +1 -0
  38. package/dist/commands/execute-verification.js +201 -0
  39. package/dist/commands/execute-verification.js.map +1 -0
  40. package/dist/commands/execute.d.ts.map +1 -1
  41. package/dist/commands/execute.js +139 -2
  42. package/dist/commands/execute.js.map +1 -1
  43. package/dist/dag-runner/ralph-loop.d.ts +9 -9
  44. package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
  45. package/dist/dag-runner/ralph-loop.js +89 -113
  46. package/dist/dag-runner/ralph-loop.js.map +1 -1
  47. package/dist/dag-runner/state-store.d.ts +14 -1
  48. package/dist/dag-runner/state-store.d.ts.map +1 -1
  49. package/dist/dag-runner/state-store.js +39 -8
  50. package/dist/dag-runner/state-store.js.map +1 -1
  51. package/dist/exec/npm-invoke.d.ts +8 -0
  52. package/dist/exec/npm-invoke.d.ts.map +1 -0
  53. package/dist/exec/npm-invoke.js +45 -0
  54. package/dist/exec/npm-invoke.js.map +1 -0
  55. package/dist/exec/safe-spawn.d.ts +21 -0
  56. package/dist/exec/safe-spawn.d.ts.map +1 -0
  57. package/dist/exec/safe-spawn.js +108 -0
  58. package/dist/exec/safe-spawn.js.map +1 -0
  59. package/dist/graphrag/types.d.ts +2 -2
  60. package/dist/graphrag/types.d.ts.map +1 -1
  61. package/dist/stacks/dna-emitter.d.ts.map +1 -1
  62. package/dist/stacks/dna-emitter.js +1 -10
  63. package/dist/stacks/dna-emitter.js.map +1 -1
  64. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  65. package/dist/utils/UpdateApplier.js +8 -0
  66. package/dist/utils/UpdateApplier.js.map +1 -1
  67. package/dist/utils/logger.d.ts +7 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +23 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/path-safety.d.ts +22 -0
  72. package/dist/utils/path-safety.d.ts.map +1 -0
  73. package/dist/utils/path-safety.js +83 -0
  74. package/dist/utils/path-safety.js.map +1 -0
  75. package/dist/utils/project-generator.d.ts.map +1 -1
  76. package/dist/utils/project-generator.js +2 -0
  77. package/dist/utils/project-generator.js.map +1 -1
  78. package/dist/utils/stack-bootstrap.js +2 -2
  79. package/dist/utils/stack-bootstrap.js.map +1 -1
  80. package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
  81. package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
  82. package/dist/verification/__tests__/anti-tamper.test.js +73 -0
  83. package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
  84. package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
  85. package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
  86. package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
  87. package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
  88. package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
  89. package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
  90. package/dist/verification/__tests__/bench-harness.test.js +75 -0
  91. package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
  92. package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
  93. package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
  94. package/dist/verification/__tests__/bench-report.test.js +73 -0
  95. package/dist/verification/__tests__/bench-report.test.js.map +1 -0
  96. package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
  97. package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
  98. package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
  99. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
  100. package/dist/verification/__tests__/config.test.d.ts +2 -0
  101. package/dist/verification/__tests__/config.test.d.ts.map +1 -0
  102. package/dist/verification/__tests__/config.test.js +50 -0
  103. package/dist/verification/__tests__/config.test.js.map +1 -0
  104. package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
  105. package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
  106. package/dist/verification/__tests__/decay-policy.test.js +130 -0
  107. package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
  108. package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
  109. package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
  110. package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
  111. package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
  112. package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
  113. package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
  114. package/dist/verification/__tests__/failure-signature.test.js +40 -0
  115. package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
  116. package/dist/verification/__tests__/logger.test.d.ts +2 -0
  117. package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
  118. package/dist/verification/__tests__/logger.test.js +23 -0
  119. package/dist/verification/__tests__/logger.test.js.map +1 -0
  120. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
  121. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
  122. package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
  123. package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
  124. package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
  125. package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
  126. package/dist/verification/__tests__/mutation-infection.test.js +101 -0
  127. package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
  128. package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
  129. package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
  130. package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
  131. package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
  132. package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
  133. package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
  134. package/dist/verification/__tests__/mutation-registry.test.js +28 -0
  135. package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
  136. package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
  137. package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
  138. package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
  139. package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
  140. package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
  141. package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
  142. package/dist/verification/__tests__/no-shell-true.test.js +43 -0
  143. package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
  144. package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
  145. package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
  146. package/dist/verification/__tests__/path-safety.test.js +59 -0
  147. package/dist/verification/__tests__/path-safety.test.js.map +1 -0
  148. package/dist/verification/__tests__/prerank.test.d.ts +2 -0
  149. package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
  150. package/dist/verification/__tests__/prerank.test.js +44 -0
  151. package/dist/verification/__tests__/prerank.test.js.map +1 -0
  152. package/dist/verification/__tests__/runner.test.d.ts +2 -0
  153. package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
  154. package/dist/verification/__tests__/runner.test.js +200 -0
  155. package/dist/verification/__tests__/runner.test.js.map +1 -0
  156. package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
  157. package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
  158. package/dist/verification/__tests__/safe-spawn.test.js +36 -0
  159. package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
  160. package/dist/verification/__tests__/security.test.d.ts +2 -0
  161. package/dist/verification/__tests__/security.test.d.ts.map +1 -0
  162. package/dist/verification/__tests__/security.test.js +79 -0
  163. package/dist/verification/__tests__/security.test.js.map +1 -0
  164. package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
  165. package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
  166. package/dist/verification/__tests__/selector-pareto.test.js +77 -0
  167. package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
  168. package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
  169. package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
  170. package/dist/verification/__tests__/telemetry.test.js +116 -0
  171. package/dist/verification/__tests__/telemetry.test.js.map +1 -0
  172. package/dist/verification/__tests__/type-check.test.d.ts +2 -0
  173. package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
  174. package/dist/verification/__tests__/type-check.test.js +52 -0
  175. package/dist/verification/__tests__/type-check.test.js.map +1 -0
  176. package/dist/verification/__tests__/worktree.test.d.ts +2 -0
  177. package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
  178. package/dist/verification/__tests__/worktree.test.js +41 -0
  179. package/dist/verification/__tests__/worktree.test.js.map +1 -0
  180. package/dist/verification/bench/fixtures.d.ts +11 -0
  181. package/dist/verification/bench/fixtures.d.ts.map +1 -0
  182. package/dist/verification/bench/fixtures.js +66 -0
  183. package/dist/verification/bench/fixtures.js.map +1 -0
  184. package/dist/verification/bench/harness.d.ts +19 -0
  185. package/dist/verification/bench/harness.d.ts.map +1 -0
  186. package/dist/verification/bench/harness.js +138 -0
  187. package/dist/verification/bench/harness.js.map +1 -0
  188. package/dist/verification/bench/report.d.ts +53 -0
  189. package/dist/verification/bench/report.d.ts.map +1 -0
  190. package/dist/verification/bench/report.js +47 -0
  191. package/dist/verification/bench/report.js.map +1 -0
  192. package/dist/verification/best-of-n/runner.d.ts +29 -0
  193. package/dist/verification/best-of-n/runner.d.ts.map +1 -0
  194. package/dist/verification/best-of-n/runner.js +76 -0
  195. package/dist/verification/best-of-n/runner.js.map +1 -0
  196. package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
  197. package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
  198. package/dist/verification/best-of-n/selector/pareto.js +65 -0
  199. package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
  200. package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
  201. package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
  202. package/dist/verification/best-of-n/selector/prerank.js +32 -0
  203. package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
  204. package/dist/verification/best-of-n/worktree.d.ts +9 -0
  205. package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
  206. package/dist/verification/best-of-n/worktree.js +100 -0
  207. package/dist/verification/best-of-n/worktree.js.map +1 -0
  208. package/dist/verification/config.d.ts +24 -0
  209. package/dist/verification/config.d.ts.map +1 -0
  210. package/dist/verification/config.js +168 -0
  211. package/dist/verification/config.js.map +1 -0
  212. package/dist/verification/decay/policy.d.ts +16 -0
  213. package/dist/verification/decay/policy.d.ts.map +1 -0
  214. package/dist/verification/decay/policy.js +64 -0
  215. package/dist/verification/decay/policy.js.map +1 -0
  216. package/dist/verification/decay/signature.d.ts +6 -0
  217. package/dist/verification/decay/signature.d.ts.map +1 -0
  218. package/dist/verification/decay/signature.js +18 -0
  219. package/dist/verification/decay/signature.js.map +1 -0
  220. package/dist/verification/gates/anti-tamper.d.ts +16 -0
  221. package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
  222. package/dist/verification/gates/anti-tamper.js +142 -0
  223. package/dist/verification/gates/anti-tamper.js.map +1 -0
  224. package/dist/verification/gates/fail-to-pass.d.ts +39 -0
  225. package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
  226. package/dist/verification/gates/fail-to-pass.js +173 -0
  227. package/dist/verification/gates/fail-to-pass.js.map +1 -0
  228. package/dist/verification/gates/mutation/adapter.d.ts +34 -0
  229. package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
  230. package/dist/verification/gates/mutation/adapter.js +22 -0
  231. package/dist/verification/gates/mutation/adapter.js.map +1 -0
  232. package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
  233. package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
  234. package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
  235. package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
  236. package/dist/verification/gates/mutation/infection.d.ts +28 -0
  237. package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
  238. package/dist/verification/gates/mutation/infection.js +149 -0
  239. package/dist/verification/gates/mutation/infection.js.map +1 -0
  240. package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
  241. package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
  242. package/dist/verification/gates/mutation/mutmut.js +148 -0
  243. package/dist/verification/gates/mutation/mutmut.js.map +1 -0
  244. package/dist/verification/gates/mutation/stryker.d.ts +19 -0
  245. package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
  246. package/dist/verification/gates/mutation/stryker.js +103 -0
  247. package/dist/verification/gates/mutation/stryker.js.map +1 -0
  248. package/dist/verification/gates/type-check.d.ts +11 -0
  249. package/dist/verification/gates/type-check.d.ts.map +1 -0
  250. package/dist/verification/gates/type-check.js +84 -0
  251. package/dist/verification/gates/type-check.js.map +1 -0
  252. package/dist/verification/registry.d.ts +6 -0
  253. package/dist/verification/registry.d.ts.map +1 -0
  254. package/dist/verification/registry.js +49 -0
  255. package/dist/verification/registry.js.map +1 -0
  256. package/dist/verification/runner.d.ts +27 -0
  257. package/dist/verification/runner.d.ts.map +1 -0
  258. package/dist/verification/runner.js +173 -0
  259. package/dist/verification/runner.js.map +1 -0
  260. package/dist/verification/telemetry.d.ts +18 -0
  261. package/dist/verification/telemetry.d.ts.map +1 -0
  262. package/dist/verification/telemetry.js +71 -0
  263. package/dist/verification/telemetry.js.map +1 -0
  264. package/dist/verification/types.d.ts +89 -0
  265. package/dist/verification/types.d.ts.map +1 -0
  266. package/dist/verification/types.js +3 -0
  267. package/dist/verification/types.js.map +1 -0
  268. package/package.json +5 -3
  269. package/templates/UPDATE-MANIFEST.json +20 -0
  270. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
  271. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
  272. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
@@ -0,0 +1,28 @@
1
+ import type { MutationAdapter, MutationRunInput, MutationRunOutput } from './adapter.js';
2
+ export declare const INFECTION_REPORT_REL = "infection.json";
3
+ interface InfectionStats {
4
+ readonly killedCount?: number;
5
+ readonly escapedCount?: number;
6
+ readonly notTestedCount?: number;
7
+ readonly timeOutCount?: number;
8
+ readonly errorCount?: number;
9
+ }
10
+ export interface InfectionReport {
11
+ readonly stats?: InfectionStats;
12
+ readonly killed?: ReadonlyArray<unknown> | number;
13
+ readonly escaped?: ReadonlyArray<unknown> | number;
14
+ readonly timeouted?: ReadonlyArray<unknown>;
15
+ readonly uncovered?: ReadonlyArray<unknown>;
16
+ readonly notCovered?: ReadonlyArray<unknown> | number;
17
+ }
18
+ /** Parse `infection.json` logger output into normalized output. */
19
+ export declare function parseInfectionReport(report: InfectionReport, timedOut?: boolean): MutationRunOutput;
20
+ /** Resolve Infection binary: project vendor first, then global. */
21
+ export declare function resolveInfectionBin(cwd: string): string;
22
+ /** Build Infection argv (exported for tests). */
23
+ export declare function buildInfectionArgv(input: MutationRunInput): string[];
24
+ export declare const infectionAdapter: MutationAdapter;
25
+ /** Registry export (task-030). */
26
+ export declare const adapter: MutationAdapter;
27
+ export {};
28
+ //# sourceMappingURL=infection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infection.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/infection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAKrD,UAAU,cAAc;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;CACvD;AAuBD,mEAAmE;AACnE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EACvB,QAAQ,UAAQ,GACf,iBAAiB,CAkDnB;AAMD,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAcpE;AAwBD,eAAO,MAAM,gBAAgB,EAAE,eAmC9B,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,OAAO,iBAAmB,CAAC"}
@@ -0,0 +1,149 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { safeSpawn } from '../../../exec/safe-spawn.js';
4
+ import { MutationToolNotFoundError, mutationScore, } from './adapter.js';
5
+ export const INFECTION_REPORT_REL = 'infection.json';
6
+ const MIN_INFECTION_VERSION = [0, 29, 0];
7
+ const PHP_EXT = /\.php$/i;
8
+ function parseVersionTuple(text) {
9
+ const match = text.match(/(\d+)\.(\d+)\.(\d+)/);
10
+ if (!match)
11
+ return null;
12
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
13
+ }
14
+ function versionGte(version, minimum) {
15
+ for (let i = 0; i < 3; i += 1) {
16
+ if (version[i] > minimum[i])
17
+ return true;
18
+ if (version[i] < minimum[i])
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ function arrayLen(value) {
24
+ return value?.length ?? 0;
25
+ }
26
+ /** Parse `infection.json` logger output into normalized output. */
27
+ export function parseInfectionReport(report, timedOut = false) {
28
+ let killed = 0;
29
+ let survived = 0;
30
+ let noCoverage = 0;
31
+ if (report.stats) {
32
+ killed =
33
+ (report.stats.killedCount ?? 0) +
34
+ (report.stats.timeOutCount ?? 0) +
35
+ (report.stats.errorCount ?? 0);
36
+ survived = report.stats.escapedCount ?? 0;
37
+ noCoverage = report.stats.notTestedCount ?? 0;
38
+ }
39
+ else if (typeof report.killed === 'number') {
40
+ killed = report.killed;
41
+ survived =
42
+ typeof report.escaped === 'number' ? report.escaped : 0;
43
+ noCoverage =
44
+ typeof report.notCovered === 'number' ? report.notCovered : 0;
45
+ }
46
+ else {
47
+ killed =
48
+ arrayLen(Array.isArray(report.killed) ? report.killed : undefined) +
49
+ arrayLen(report.timeouted);
50
+ survived = arrayLen(Array.isArray(report.escaped) ? report.escaped : undefined);
51
+ noCoverage = arrayLen(report.uncovered);
52
+ if (noCoverage === 0) {
53
+ noCoverage = arrayLen(Array.isArray(report.notCovered) ? report.notCovered : undefined);
54
+ }
55
+ }
56
+ const output = {
57
+ killed,
58
+ survived,
59
+ noCoverage,
60
+ timedOut,
61
+ tool: 'infection',
62
+ score: mutationScore({
63
+ killed,
64
+ survived,
65
+ noCoverage,
66
+ timedOut,
67
+ tool: 'infection',
68
+ score: 0,
69
+ }),
70
+ };
71
+ return output;
72
+ }
73
+ function mutablePhpFiles(changedFiles) {
74
+ return [...new Set(changedFiles.filter((f) => PHP_EXT.test(f)))];
75
+ }
76
+ /** Resolve Infection binary: project vendor first, then global. */
77
+ export function resolveInfectionBin(cwd) {
78
+ const winBat = path.join(cwd, 'vendor', 'bin', 'infection.bat');
79
+ const vendorBin = path.join(cwd, 'vendor', 'bin', 'infection');
80
+ if (fs.existsSync(winBat))
81
+ return winBat;
82
+ if (fs.existsSync(vendorBin))
83
+ return vendorBin;
84
+ return 'infection';
85
+ }
86
+ /** Build Infection argv (exported for tests). */
87
+ export function buildInfectionArgv(input) {
88
+ const argv = [
89
+ '--only-covering-test-cases',
90
+ '--logger-json=infection.json',
91
+ '--no-progress',
92
+ ];
93
+ if (input.incremental) {
94
+ for (const file of mutablePhpFiles(input.changedFiles)) {
95
+ argv.push(`--filter=${file}`);
96
+ }
97
+ }
98
+ return argv;
99
+ }
100
+ async function probeInfection(cwd) {
101
+ const bin = resolveInfectionBin(cwd);
102
+ const result = await safeSpawn(bin, ['--version'], {
103
+ cwd,
104
+ timeoutSeconds: 30,
105
+ maxChars: 2000,
106
+ });
107
+ if (result.code !== 0)
108
+ return false;
109
+ const version = parseVersionTuple(`${result.stdout}\n${result.stderr}`);
110
+ if (!version)
111
+ return true;
112
+ return versionGte(version, MIN_INFECTION_VERSION);
113
+ }
114
+ async function readInfectionReport(cwd) {
115
+ const reportPath = path.join(cwd, INFECTION_REPORT_REL);
116
+ if (!(await fs.pathExists(reportPath))) {
117
+ return {};
118
+ }
119
+ return (await fs.readJson(reportPath));
120
+ }
121
+ export const infectionAdapter = {
122
+ tool: 'infection',
123
+ stacks: ['php-laravel'],
124
+ async isAvailable(cwd) {
125
+ return probeInfection(cwd);
126
+ },
127
+ async run(input) {
128
+ if (!(await probeInfection(input.cwd))) {
129
+ throw new MutationToolNotFoundError('infection');
130
+ }
131
+ const bin = resolveInfectionBin(input.cwd);
132
+ const spawnResult = await safeSpawn(bin, buildInfectionArgv(input), {
133
+ cwd: input.cwd,
134
+ timeoutSeconds: input.timeoutSeconds,
135
+ maxChars: 8000,
136
+ });
137
+ const report = await readInfectionReport(input.cwd);
138
+ const output = parseInfectionReport(report, spawnResult.timedOut);
139
+ if (spawnResult.code !== 0 &&
140
+ !spawnResult.timedOut &&
141
+ output.killed + output.survived === 0) {
142
+ throw new Error(`Infection exited with code ${spawnResult.code}: ${spawnResult.stderr.trim()}`);
143
+ }
144
+ return output;
145
+ },
146
+ };
147
+ /** Registry export (task-030). */
148
+ export const adapter = infectionAdapter;
149
+ //# sourceMappingURL=infection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infection.js","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/infection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { MutationAdapter, MutationRunInput, MutationRunOutput } from './adapter.js';
2
+ export declare const MUTMUT_CICD_STATS_REL: string;
3
+ interface MutmutCicdStats {
4
+ readonly killed?: number;
5
+ readonly survived?: number;
6
+ readonly skipped?: number;
7
+ readonly timeout?: number;
8
+ readonly no_tests?: number;
9
+ readonly total?: number;
10
+ }
11
+ interface MutmutResultEntry {
12
+ readonly status?: string;
13
+ }
14
+ export type MutmutReport = MutmutCicdStats | ReadonlyArray<MutmutResultEntry>;
15
+ /** Parse mutmut JSON report (`results --json` or cicd stats) into normalized output. */
16
+ export declare function parseMutmutReport(report: MutmutReport, timedOut?: boolean): MutationRunOutput;
17
+ /** Build argv for `mutmut run` (exported for tests). */
18
+ export declare function buildMutmutArgv(input: MutationRunInput): string[];
19
+ export declare const mutmutAdapter: MutationAdapter;
20
+ /** Registry export (task-030). */
21
+ export declare const adapter: MutationAdapter;
22
+ export {};
23
+ //# sourceMappingURL=mutmut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutmut.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/mutmut.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AAKF,UAAU,eAAe;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAwB9E,wFAAwF;AACxF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,QAAQ,UAAQ,GACf,iBAAiB,CAoCnB;AAQD,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAUjE;AAmDD,eAAO,MAAM,aAAa,EAAE,eAuC3B,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,OAAO,iBAAgB,CAAC"}
@@ -0,0 +1,148 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { safeSpawn } from '../../../exec/safe-spawn.js';
4
+ import { resolvePythonBin } from '../../../dag-runner/ralph-loop.js';
5
+ import { MutationToolNotFoundError, mutationScore, } from './adapter.js';
6
+ export const MUTMUT_CICD_STATS_REL = path.join('mutants', 'mutmut-cicd-stats.json');
7
+ const MIN_MUTMUT_VERSION = [3, 2, 0];
8
+ const PY_EXT = /\.py$/i;
9
+ function parseVersionTuple(text) {
10
+ const match = text.match(/(\d+)\.(\d+)\.(\d+)/);
11
+ if (!match)
12
+ return null;
13
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
14
+ }
15
+ function versionGte(version, minimum) {
16
+ for (let i = 0; i < 3; i += 1) {
17
+ if (version[i] > minimum[i])
18
+ return true;
19
+ if (version[i] < minimum[i])
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ function isKilledStatus(status) {
25
+ const normalized = status.toLowerCase();
26
+ return normalized === 'killed' || normalized === 'timeout';
27
+ }
28
+ /** Parse mutmut JSON report (`results --json` or cicd stats) into normalized output. */
29
+ export function parseMutmutReport(report, timedOut = false) {
30
+ let killed = 0;
31
+ let survived = 0;
32
+ let noCoverage = 0;
33
+ if (Array.isArray(report)) {
34
+ for (const entry of report) {
35
+ const status = (entry.status ?? '').toLowerCase();
36
+ if (isKilledStatus(status))
37
+ killed += 1;
38
+ else if (status === 'survived')
39
+ survived += 1;
40
+ else if (status === 'no tests' || status === 'no_tests')
41
+ noCoverage += 1;
42
+ }
43
+ }
44
+ else {
45
+ const stats = report;
46
+ killed = (stats.killed ?? 0) + (stats.timeout ?? 0);
47
+ survived = stats.survived ?? 0;
48
+ noCoverage = stats.no_tests ?? 0;
49
+ }
50
+ const output = {
51
+ killed,
52
+ survived,
53
+ noCoverage,
54
+ timedOut,
55
+ tool: 'mutmut',
56
+ score: mutationScore({
57
+ killed,
58
+ survived,
59
+ noCoverage,
60
+ timedOut,
61
+ tool: 'mutmut',
62
+ score: 0,
63
+ }),
64
+ };
65
+ return output;
66
+ }
67
+ function mutableChangedFiles(changedFiles) {
68
+ return [...new Set(changedFiles.filter((f) => PY_EXT.test(f)))];
69
+ }
70
+ /** Build argv for `mutmut run` (exported for tests). */
71
+ export function buildMutmutArgv(input) {
72
+ const argv = ['run'];
73
+ if (input.incremental) {
74
+ for (const file of mutableChangedFiles(input.changedFiles)) {
75
+ argv.push('--paths-to-mutate', file);
76
+ }
77
+ }
78
+ return argv;
79
+ }
80
+ async function probeMutmut(cwd) {
81
+ const bin = resolvePythonBin(cwd, 'mutmut');
82
+ const result = await safeSpawn(bin, ['--version'], {
83
+ cwd,
84
+ timeoutSeconds: 30,
85
+ maxChars: 2000,
86
+ });
87
+ if (result.code !== 0)
88
+ return false;
89
+ const version = parseVersionTuple(`${result.stdout}\n${result.stderr}`);
90
+ if (!version)
91
+ return true;
92
+ return versionGte(version, MIN_MUTMUT_VERSION);
93
+ }
94
+ async function readMutmutReport(cwd, bin, timeoutSeconds) {
95
+ const resultsTimeout = Math.min(timeoutSeconds, 120);
96
+ const jsonResult = await safeSpawn(bin, ['results', '--json'], {
97
+ cwd,
98
+ timeoutSeconds: resultsTimeout,
99
+ maxChars: 500000,
100
+ });
101
+ if (jsonResult.code === 0 && jsonResult.stdout.trim()) {
102
+ try {
103
+ return JSON.parse(jsonResult.stdout);
104
+ }
105
+ catch {
106
+ // fall through to cicd stats
107
+ }
108
+ }
109
+ await safeSpawn(bin, ['export_cicd_stats'], {
110
+ cwd,
111
+ timeoutSeconds: resultsTimeout,
112
+ maxChars: 8000,
113
+ });
114
+ const statsPath = path.join(cwd, MUTMUT_CICD_STATS_REL);
115
+ if (await fs.pathExists(statsPath)) {
116
+ return (await fs.readJson(statsPath));
117
+ }
118
+ return { killed: 0, survived: 0, skipped: 0 };
119
+ }
120
+ export const mutmutAdapter = {
121
+ tool: 'mutmut',
122
+ stacks: ['python-fastapi', 'mcp-server-python'],
123
+ async isAvailable(cwd) {
124
+ return probeMutmut(cwd);
125
+ },
126
+ async run(input) {
127
+ if (!(await probeMutmut(input.cwd))) {
128
+ throw new MutationToolNotFoundError('mutmut');
129
+ }
130
+ const bin = resolvePythonBin(input.cwd, 'mutmut');
131
+ const spawnResult = await safeSpawn(bin, buildMutmutArgv(input), {
132
+ cwd: input.cwd,
133
+ timeoutSeconds: input.timeoutSeconds,
134
+ maxChars: 8000,
135
+ });
136
+ const report = await readMutmutReport(input.cwd, bin, input.timeoutSeconds);
137
+ const output = parseMutmutReport(report, spawnResult.timedOut);
138
+ if (spawnResult.code !== 0 &&
139
+ !spawnResult.timedOut &&
140
+ output.killed + output.survived === 0) {
141
+ throw new Error(`mutmut exited with code ${spawnResult.code}: ${spawnResult.stderr.trim()}`);
142
+ }
143
+ return output;
144
+ },
145
+ };
146
+ /** Registry export (task-030). */
147
+ export const adapter = mutmutAdapter;
148
+ //# sourceMappingURL=mutmut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutmut.js","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/mutmut.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MutationAdapter, MutationRunInput, MutationRunOutput } from './adapter.js';
2
+ export declare const STRYKER_REPORT_REL: string;
3
+ interface StrykerMutant {
4
+ readonly status?: string;
5
+ }
6
+ interface StrykerReport {
7
+ readonly files?: Record<string, {
8
+ readonly mutants?: ReadonlyArray<StrykerMutant>;
9
+ }>;
10
+ }
11
+ /** Parse Stryker JSON report (mutation-testing-report-schema) into normalized output. */
12
+ export declare function parseStrykerReport(report: StrykerReport, timedOut?: boolean): MutationRunOutput;
13
+ /** Build npm exec argv for `stryker run` (exported for tests). */
14
+ export declare function buildStrykerArgv(input: MutationRunInput): string[];
15
+ export declare const strykerAdapter: MutationAdapter;
16
+ /** Registry export (task-030). */
17
+ export declare const adapter: MutationAdapter;
18
+ export {};
19
+ //# sourceMappingURL=stryker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stryker.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/stryker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAMtB,eAAO,MAAM,kBAAkB,QAI9B,CAAC;AAIF,UAAU,aAAa;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CACrB,MAAM,EACN;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;KAAE,CACpD,CAAC;CACH;AAMD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,QAAQ,UAAQ,GACf,iBAAiB,CA+BnB;AAQD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAelE;AAoBD,eAAO,MAAM,cAAc,EAAE,eA+B5B,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,103 @@
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 { MutationToolNotFoundError, mutationScore, } from './adapter.js';
6
+ export const STRYKER_REPORT_REL = path.join('reports', 'mutation', 'mutation.json');
7
+ const MUTATABLE_EXT = /\.(tsx?|jsx?|mjs|cjs)$/i;
8
+ function isKilledStatus(status) {
9
+ return status === 'Killed' || status === 'Timeout';
10
+ }
11
+ /** Parse Stryker JSON report (mutation-testing-report-schema) into normalized output. */
12
+ export function parseStrykerReport(report, timedOut = false) {
13
+ let killed = 0;
14
+ let survived = 0;
15
+ let noCoverage = 0;
16
+ for (const file of Object.values(report.files ?? {})) {
17
+ for (const mutant of file.mutants ?? []) {
18
+ const status = mutant.status ?? '';
19
+ if (isKilledStatus(status))
20
+ killed += 1;
21
+ else if (status === 'Survived')
22
+ survived += 1;
23
+ else if (status === 'NoCoverage')
24
+ noCoverage += 1;
25
+ }
26
+ }
27
+ const output = {
28
+ killed,
29
+ survived,
30
+ noCoverage,
31
+ timedOut,
32
+ tool: 'stryker',
33
+ score: mutationScore({
34
+ killed,
35
+ survived,
36
+ noCoverage,
37
+ timedOut,
38
+ tool: 'stryker',
39
+ score: 0,
40
+ }),
41
+ };
42
+ return output;
43
+ }
44
+ function mutableChangedFiles(changedFiles) {
45
+ return changedFiles.filter((f) => MUTATABLE_EXT.test(f));
46
+ }
47
+ /** Build npm exec argv for `stryker run` (exported for tests). */
48
+ export function buildStrykerArgv(input) {
49
+ const argv = ['exec', '--no', 'stryker', 'run', '--reporters', 'json'];
50
+ if (input.maxMutants > 0) {
51
+ argv.push('--maxMutants', String(input.maxMutants));
52
+ }
53
+ if (input.incremental) {
54
+ argv.push('--incremental');
55
+ for (const file of mutableChangedFiles(input.changedFiles)) {
56
+ argv.push('--mutate', file);
57
+ }
58
+ }
59
+ return argv;
60
+ }
61
+ async function probeStryker(cwd) {
62
+ const npm = npmInvoke(['exec', '--no', 'stryker', '--version']);
63
+ const result = await safeSpawn(npm.command, npm.args, {
64
+ cwd,
65
+ timeoutSeconds: 30,
66
+ maxChars: 2000,
67
+ });
68
+ return result.code === 0;
69
+ }
70
+ async function readStrykerReport(cwd) {
71
+ const reportPath = path.join(cwd, STRYKER_REPORT_REL);
72
+ if (!(await fs.pathExists(reportPath))) {
73
+ return { files: {} };
74
+ }
75
+ return (await fs.readJson(reportPath));
76
+ }
77
+ export const strykerAdapter = {
78
+ tool: 'stryker',
79
+ stacks: ['node-nestjs', 'react', 'vue', 'mcp-server-node-ts'],
80
+ async isAvailable(cwd) {
81
+ return probeStryker(cwd);
82
+ },
83
+ async run(input) {
84
+ if (!(await probeStryker(input.cwd))) {
85
+ throw new MutationToolNotFoundError('stryker');
86
+ }
87
+ const npm = npmInvoke(buildStrykerArgv(input));
88
+ const spawnResult = await safeSpawn(npm.command, npm.args, {
89
+ cwd: input.cwd,
90
+ timeoutSeconds: input.timeoutSeconds,
91
+ maxChars: 8000,
92
+ });
93
+ const report = await readStrykerReport(input.cwd);
94
+ const output = parseStrykerReport(report, spawnResult.timedOut);
95
+ if (spawnResult.code !== 0 && !spawnResult.timedOut && output.killed + output.survived === 0) {
96
+ throw new Error(`Stryker exited with code ${spawnResult.code}: ${spawnResult.stderr.trim()}`);
97
+ }
98
+ return output;
99
+ },
100
+ };
101
+ /** Registry export (task-030). */
102
+ export const adapter = strykerAdapter;
103
+ //# sourceMappingURL=stryker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stryker.js","sourceRoot":"","sources":["../../../../src/verification/gates/mutation/stryker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AspectResult } from '../types.js';
2
+ export declare function typeCommandFor(stack: string, cwd: string): {
3
+ command: string;
4
+ args: string[];
5
+ } | null;
6
+ export declare function checkTypes(args: {
7
+ readonly stack: string;
8
+ readonly cwd: string;
9
+ readonly timeoutSeconds: number;
10
+ }): Promise<AspectResult>;
11
+ //# sourceMappingURL=type-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-check.d.ts","sourceRoot":"","sources":["../../../src/verification/gates/type-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAyB5C;AAcD,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,YAAY,CAAC,CAgDxB"}
@@ -0,0 +1,84 @@
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 { resolvePythonBin } from '../../dag-runner/ralph-loop.js';
6
+ export function typeCommandFor(stack, cwd) {
7
+ switch (stack) {
8
+ case 'node-nestjs':
9
+ case 'react':
10
+ case 'vue':
11
+ case 'mcp-server-node-ts': {
12
+ const npm = npmInvoke(['exec', 'tsc', '--noEmit']);
13
+ return { command: npm.command, args: npm.args };
14
+ }
15
+ case 'python-fastapi':
16
+ case 'mcp-server-python':
17
+ return {
18
+ command: resolvePythonBin(cwd, 'mypy'),
19
+ args: ['.'],
20
+ };
21
+ case 'php-laravel': {
22
+ const phpstan = path.join(cwd, 'vendor', 'bin', 'phpstan');
23
+ const phpstanBat = `${phpstan}.bat`;
24
+ if (fs.existsSync(phpstanBat))
25
+ return { command: phpstanBat, args: ['analyse'] };
26
+ if (fs.existsSync(phpstan))
27
+ return { command: phpstan, args: ['analyse'] };
28
+ return null;
29
+ }
30
+ default:
31
+ return null;
32
+ }
33
+ }
34
+ async function isToolPresent(command, cwd) {
35
+ const result = await safeSpawn(command, ['--version'], {
36
+ cwd,
37
+ timeoutSeconds: 15,
38
+ maxChars: 1000,
39
+ });
40
+ return result.code === 0;
41
+ }
42
+ export async function checkTypes(args) {
43
+ const start = Date.now();
44
+ const cmd = typeCommandFor(args.stack, args.cwd);
45
+ if (!cmd) {
46
+ return {
47
+ aspect: 'type',
48
+ verdict: 'SKIP',
49
+ reason: `no type-checker for ${args.stack}`,
50
+ durationMs: Date.now() - start,
51
+ };
52
+ }
53
+ if ((args.stack === 'python-fastapi' || args.stack === 'mcp-server-python') &&
54
+ !(await isToolPresent(cmd.command, args.cwd))) {
55
+ return {
56
+ aspect: 'type',
57
+ verdict: 'SKIP',
58
+ reason: 'mypy not available',
59
+ durationMs: Date.now() - start,
60
+ };
61
+ }
62
+ const result = await safeSpawn(cmd.command, cmd.args, {
63
+ cwd: args.cwd,
64
+ timeoutSeconds: args.timeoutSeconds,
65
+ maxChars: 4000,
66
+ });
67
+ const durationMs = Date.now() - start;
68
+ if (result.code === 0) {
69
+ return {
70
+ aspect: 'type',
71
+ verdict: 'PASS',
72
+ reason: 'type-check passed',
73
+ durationMs,
74
+ };
75
+ }
76
+ const detail = (result.stderr || result.stdout).trim().slice(0, 500);
77
+ return {
78
+ aspect: 'type',
79
+ verdict: 'FAIL',
80
+ reason: detail || `type-check failed (exit ${result.code})`,
81
+ durationMs,
82
+ };
83
+ }
84
+ //# sourceMappingURL=type-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-check.js","sourceRoot":"","sources":["../../../src/verification/gates/type-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { MutationAdapter } from './gates/mutation/adapter.js';
2
+ /** Resolve mutation adapter for a project stack (lazy-loaded per tool). */
3
+ export declare function adapterForStack(stack: string): Promise<MutationAdapter>;
4
+ /** All registered mutation adapters (loads each tool at most once). */
5
+ export declare function listMutationAdapters(): Promise<ReadonlyArray<MutationAdapter>>;
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/verification/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA+CnE,2EAA2E;AAC3E,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,uEAAuE;AACvE,wBAAsB,oBAAoB,IAAI,OAAO,CACnD,aAAa,CAAC,eAAe,CAAC,CAC/B,CAEA"}