@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,96 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import * as safeSpawnMod from '../../exec/safe-spawn.js';
6
+ import { cargoMutantsAdapter, parseCargoMutantsReport, buildCargoMutantsArgv, } from '../gates/mutation/cargo-mutants.js';
7
+ import { MutationToolNotFoundError } from '../gates/mutation/adapter.js';
8
+ const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'cargo-mutants.outcomes.json');
9
+ describe('parseCargoMutantsReport', () => {
10
+ it('should_parse_real_outcomes_json', async () => {
11
+ const raw = (await fs.readJson(FIXTURE));
12
+ const output = parseCargoMutantsReport(raw);
13
+ expect(output.killed).toBe(4);
14
+ expect(output.survived).toBe(1);
15
+ expect(output.noCoverage).toBe(2);
16
+ expect(output.score).toBeCloseTo(0.8, 5);
17
+ expect(output.tool).toBe('cargo-mutants');
18
+ });
19
+ it('should_skip_when_zero_mutants', () => {
20
+ const output = parseCargoMutantsReport({});
21
+ expect(output.killed).toBe(0);
22
+ expect(output.survived).toBe(0);
23
+ expect(Number.isNaN(output.score)).toBe(true);
24
+ });
25
+ });
26
+ describe('buildCargoMutantsArgv', () => {
27
+ it('should_include_in_diff_when_incremental', () => {
28
+ const argv = buildCargoMutantsArgv({
29
+ cwd: '/tmp',
30
+ changedFiles: ['src/lib.rs'],
31
+ incremental: true,
32
+ maxMutants: 50,
33
+ timeoutSeconds: 300,
34
+ }, '.dare/mutation-in-diff.patch');
35
+ expect(argv).toContain('--in-diff');
36
+ expect(argv).toContain('.dare/mutation-in-diff.patch');
37
+ expect(argv).toContain('--json');
38
+ expect(argv).toContain('--timeout');
39
+ expect(argv).toContain('300');
40
+ });
41
+ });
42
+ describe('cargoMutantsAdapter', () => {
43
+ beforeEach(() => {
44
+ vi.restoreAllMocks();
45
+ });
46
+ afterEach(() => {
47
+ vi.restoreAllMocks();
48
+ });
49
+ it('should_throw_when_unavailable', async () => {
50
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockResolvedValue({
51
+ code: 1,
52
+ stdout: '',
53
+ stderr: 'not found',
54
+ timedOut: false,
55
+ });
56
+ await expect(cargoMutantsAdapter.run({
57
+ cwd: process.cwd(),
58
+ changedFiles: [],
59
+ incremental: false,
60
+ maxMutants: 10,
61
+ timeoutSeconds: 30,
62
+ })).rejects.toThrow(MutationToolNotFoundError);
63
+ });
64
+ it('should_run_and_parse_report', async () => {
65
+ const fixture = await fs.readJson(FIXTURE);
66
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockImplementation(async (_cmd, args) => {
67
+ if (args[0] === 'mutants' && args[1] === '--version') {
68
+ return {
69
+ code: 0,
70
+ stdout: 'cargo-mutants 25.1.0\n',
71
+ stderr: '',
72
+ timedOut: false,
73
+ };
74
+ }
75
+ return {
76
+ code: 0,
77
+ stdout: '',
78
+ stderr: '',
79
+ timedOut: false,
80
+ };
81
+ });
82
+ vi.spyOn(fs, 'pathExists').mockImplementation(async () => true);
83
+ vi.spyOn(fs, 'readJson').mockResolvedValue(fixture);
84
+ const output = await cargoMutantsAdapter.run({
85
+ cwd: '/tmp/project',
86
+ changedFiles: ['src/lib.rs'],
87
+ incremental: true,
88
+ maxMutants: 200,
89
+ timeoutSeconds: 900,
90
+ });
91
+ expect(output.killed).toBe(4);
92
+ expect(output.survived).toBe(1);
93
+ expect(output.score).toBeCloseTo(0.8, 5);
94
+ });
95
+ });
96
+ //# sourceMappingURL=mutation-cargo-mutants.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-cargo-mutants.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-cargo-mutants.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation-infection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-infection.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-infection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import * as safeSpawnMod from '../../exec/safe-spawn.js';
6
+ import { infectionAdapter, parseInfectionReport, buildInfectionArgv, } from '../gates/mutation/infection.js';
7
+ import { MutationToolNotFoundError } from '../gates/mutation/adapter.js';
8
+ const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'infection.json');
9
+ describe('parseInfectionReport', () => {
10
+ it('should_parse_real_infection_json', async () => {
11
+ const raw = (await fs.readJson(FIXTURE));
12
+ const output = parseInfectionReport(raw);
13
+ expect(output.killed).toBe(6);
14
+ expect(output.survived).toBe(2);
15
+ expect(output.noCoverage).toBe(2);
16
+ expect(output.score).toBeCloseTo(0.75, 5);
17
+ expect(output.tool).toBe('infection');
18
+ });
19
+ it('should_skip_when_zero_mutants', () => {
20
+ const output = parseInfectionReport({});
21
+ expect(output.killed).toBe(0);
22
+ expect(output.survived).toBe(0);
23
+ expect(Number.isNaN(output.score)).toBe(true);
24
+ });
25
+ });
26
+ describe('buildInfectionArgv', () => {
27
+ it('should_apply_filter_for_changed', () => {
28
+ const argv = buildInfectionArgv({
29
+ cwd: '/tmp',
30
+ changedFiles: [
31
+ 'app/Models/User.php',
32
+ 'app/Services/UserService.php',
33
+ 'README.md',
34
+ ],
35
+ incremental: true,
36
+ maxMutants: 50,
37
+ timeoutSeconds: 600,
38
+ });
39
+ expect(argv).toContain('--only-covering-test-cases');
40
+ expect(argv).toContain('--logger-json=infection.json');
41
+ expect(argv).toContain('--no-progress');
42
+ expect(argv).toContain('--filter=app/Models/User.php');
43
+ expect(argv).toContain('--filter=app/Services/UserService.php');
44
+ expect(argv).not.toContain('README.md');
45
+ });
46
+ });
47
+ describe('infectionAdapter', () => {
48
+ beforeEach(() => {
49
+ vi.restoreAllMocks();
50
+ });
51
+ afterEach(() => {
52
+ vi.restoreAllMocks();
53
+ });
54
+ it('should_throw_when_unavailable', async () => {
55
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockResolvedValue({
56
+ code: 1,
57
+ stdout: '',
58
+ stderr: 'not found',
59
+ timedOut: false,
60
+ });
61
+ await expect(infectionAdapter.run({
62
+ cwd: process.cwd(),
63
+ changedFiles: [],
64
+ incremental: false,
65
+ maxMutants: 10,
66
+ timeoutSeconds: 30,
67
+ })).rejects.toThrow(MutationToolNotFoundError);
68
+ });
69
+ it('should_run_and_parse_report', async () => {
70
+ const fixture = await fs.readJson(FIXTURE);
71
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockImplementation(async (_cmd, args) => {
72
+ if (args[0] === '--version') {
73
+ return {
74
+ code: 0,
75
+ stdout: 'Infection - PHP Mutation Testing Framework 0.29.6\n',
76
+ stderr: '',
77
+ timedOut: false,
78
+ };
79
+ }
80
+ return {
81
+ code: 0,
82
+ stdout: '',
83
+ stderr: '',
84
+ timedOut: false,
85
+ };
86
+ });
87
+ vi.spyOn(fs, 'pathExists').mockImplementation(async () => true);
88
+ vi.spyOn(fs, 'readJson').mockResolvedValue(fixture);
89
+ const output = await infectionAdapter.run({
90
+ cwd: '/tmp/project',
91
+ changedFiles: ['app/Models/User.php'],
92
+ incremental: true,
93
+ maxMutants: 200,
94
+ timeoutSeconds: 900,
95
+ });
96
+ expect(output.killed).toBe(6);
97
+ expect(output.survived).toBe(2);
98
+ expect(output.score).toBeCloseTo(0.75, 5);
99
+ });
100
+ });
101
+ //# sourceMappingURL=mutation-infection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-infection.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-infection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation-mutmut.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-mutmut.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-mutmut.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import * as safeSpawnMod from '../../exec/safe-spawn.js';
6
+ import { mutmutAdapter, parseMutmutReport, buildMutmutArgv, } from '../gates/mutation/mutmut.js';
7
+ import { MutationToolNotFoundError } from '../gates/mutation/adapter.js';
8
+ const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'mutmut.results.json');
9
+ describe('parseMutmutReport', () => {
10
+ it('should_parse_real_mutmut_json', async () => {
11
+ const raw = (await fs.readJson(FIXTURE));
12
+ const output = parseMutmutReport(raw);
13
+ expect(output.killed).toBe(5);
14
+ expect(output.survived).toBe(1);
15
+ expect(output.noCoverage).toBe(0);
16
+ expect(output.score).toBeCloseTo(5 / 6, 5);
17
+ expect(output.tool).toBe('mutmut');
18
+ });
19
+ it('should_skip_when_zero_mutants', () => {
20
+ const output = parseMutmutReport({ killed: 0, survived: 0 });
21
+ expect(output.killed).toBe(0);
22
+ expect(output.survived).toBe(0);
23
+ expect(Number.isNaN(output.score)).toBe(true);
24
+ });
25
+ });
26
+ describe('buildMutmutArgv', () => {
27
+ it('should_build_paths_to_mutate', () => {
28
+ const argv = buildMutmutArgv({
29
+ cwd: '/tmp',
30
+ changedFiles: ['src/api.py', 'lib/util.py', 'README.md'],
31
+ incremental: true,
32
+ maxMutants: 50,
33
+ timeoutSeconds: 60,
34
+ });
35
+ expect(argv[0]).toBe('run');
36
+ expect(argv.filter((a) => a === '--paths-to-mutate')).toHaveLength(2);
37
+ expect(argv).toContain('src/api.py');
38
+ expect(argv).toContain('lib/util.py');
39
+ expect(argv).not.toContain('README.md');
40
+ });
41
+ });
42
+ describe('mutmutAdapter', () => {
43
+ beforeEach(() => {
44
+ vi.restoreAllMocks();
45
+ });
46
+ afterEach(() => {
47
+ vi.restoreAllMocks();
48
+ });
49
+ it('should_throw_when_unavailable', async () => {
50
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockResolvedValue({
51
+ code: 1,
52
+ stdout: '',
53
+ stderr: 'not found',
54
+ timedOut: false,
55
+ });
56
+ await expect(mutmutAdapter.run({
57
+ cwd: process.cwd(),
58
+ changedFiles: [],
59
+ incremental: false,
60
+ maxMutants: 10,
61
+ timeoutSeconds: 30,
62
+ })).rejects.toThrow(MutationToolNotFoundError);
63
+ });
64
+ it('should_run_and_parse_report', async () => {
65
+ const fixture = await fs.readJson(FIXTURE);
66
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockImplementation(async (_cmd, args) => {
67
+ if (args[0] === '--version') {
68
+ return {
69
+ code: 0,
70
+ stdout: 'mutmut, version 3.2.3\n',
71
+ stderr: '',
72
+ timedOut: false,
73
+ };
74
+ }
75
+ if (args[0] === 'results' && args[1] === '--json') {
76
+ return {
77
+ code: 0,
78
+ stdout: JSON.stringify(fixture),
79
+ stderr: '',
80
+ timedOut: false,
81
+ };
82
+ }
83
+ return {
84
+ code: 0,
85
+ stdout: '',
86
+ stderr: '',
87
+ timedOut: false,
88
+ };
89
+ });
90
+ const output = await mutmutAdapter.run({
91
+ cwd: '/tmp/project',
92
+ changedFiles: ['src/api.py'],
93
+ incremental: true,
94
+ maxMutants: 200,
95
+ timeoutSeconds: 900,
96
+ });
97
+ expect(output.killed).toBe(5);
98
+ expect(output.survived).toBe(1);
99
+ expect(output.score).toBeCloseTo(5 / 6, 5);
100
+ });
101
+ });
102
+ //# sourceMappingURL=mutation-mutmut.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-mutmut.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-mutmut.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-registry.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { adapterForStack, listMutationAdapters, } from '../registry.js';
3
+ import { UnknownMutationStackError } from '../gates/mutation/adapter.js';
4
+ describe('mutation registry', () => {
5
+ it('should_resolve_stryker_for_node', async () => {
6
+ const adapter = await adapterForStack('node-nestjs');
7
+ expect(adapter.tool).toBe('stryker');
8
+ expect(adapter.stacks).toContain('mcp-server-node-ts');
9
+ });
10
+ it('should_resolve_mutmut_for_python', async () => {
11
+ const adapter = await adapterForStack('python-fastapi');
12
+ expect(adapter.tool).toBe('mutmut');
13
+ });
14
+ it('should_throw_unknown_stack', async () => {
15
+ await expect(adapterForStack('go-gin')).rejects.toThrow(UnknownMutationStackError);
16
+ });
17
+ it('should_list_all_adapters', async () => {
18
+ const adapters = await listMutationAdapters();
19
+ const tools = adapters.map((a) => a.tool).sort();
20
+ expect(tools).toEqual([
21
+ 'cargo-mutants',
22
+ 'infection',
23
+ 'mutmut',
24
+ 'stryker',
25
+ ]);
26
+ });
27
+ });
28
+ //# sourceMappingURL=mutation-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-registry.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-registry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrD,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,eAAe;YACf,WAAW;YACX,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation-stryker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-stryker.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-stryker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import * as safeSpawnMod from '../../exec/safe-spawn.js';
6
+ import { strykerAdapter, parseStrykerReport, buildStrykerArgv, } from '../gates/mutation/stryker.js';
7
+ import { MutationToolNotFoundError } from '../gates/mutation/adapter.js';
8
+ const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'stryker.mutation.json');
9
+ describe('parseStrykerReport', () => {
10
+ it('should_parse_real_stryker_report', async () => {
11
+ const raw = (await fs.readJson(FIXTURE));
12
+ const output = parseStrykerReport(raw);
13
+ expect(output.killed).toBe(3);
14
+ expect(output.survived).toBe(1);
15
+ expect(output.noCoverage).toBe(1);
16
+ expect(output.score).toBeCloseTo(0.75, 5);
17
+ expect(output.tool).toBe('stryker');
18
+ });
19
+ it('should_skip_when_zero_mutants', () => {
20
+ const output = parseStrykerReport({ files: {} });
21
+ expect(output.killed).toBe(0);
22
+ expect(output.survived).toBe(0);
23
+ expect(Number.isNaN(output.score)).toBe(true);
24
+ });
25
+ });
26
+ describe('buildStrykerArgv', () => {
27
+ it('should_build_incremental_argv', () => {
28
+ const argv = buildStrykerArgv({
29
+ cwd: '/tmp',
30
+ changedFiles: ['src/a.ts', 'src/b.js', 'README.md'],
31
+ incremental: true,
32
+ maxMutants: 50,
33
+ timeoutSeconds: 60,
34
+ });
35
+ expect(argv).toContain('--incremental');
36
+ expect(argv.filter((a) => a === '--mutate')).toHaveLength(2);
37
+ expect(argv).toContain('src/a.ts');
38
+ expect(argv).toContain('src/b.js');
39
+ expect(argv).not.toContain('README.md');
40
+ expect(argv).toContain('--maxMutants');
41
+ expect(argv).toContain('50');
42
+ });
43
+ });
44
+ describe('strykerAdapter', () => {
45
+ beforeEach(() => {
46
+ vi.restoreAllMocks();
47
+ });
48
+ afterEach(() => {
49
+ vi.restoreAllMocks();
50
+ });
51
+ it('should_throw_when_unavailable', async () => {
52
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockResolvedValue({
53
+ code: 1,
54
+ stdout: '',
55
+ stderr: 'not found',
56
+ timedOut: false,
57
+ });
58
+ await expect(strykerAdapter.run({
59
+ cwd: process.cwd(),
60
+ changedFiles: [],
61
+ incremental: false,
62
+ maxMutants: 10,
63
+ timeoutSeconds: 30,
64
+ })).rejects.toThrow(MutationToolNotFoundError);
65
+ });
66
+ it('should_run_and_parse_report', async () => {
67
+ const fixture = await fs.readJson(FIXTURE);
68
+ vi.spyOn(safeSpawnMod, 'safeSpawn').mockResolvedValue({
69
+ code: 0,
70
+ stdout: '',
71
+ stderr: '',
72
+ timedOut: false,
73
+ });
74
+ vi.spyOn(fs, 'pathExists').mockImplementation(async () => true);
75
+ vi.spyOn(fs, 'readJson').mockResolvedValue(fixture);
76
+ const output = await strykerAdapter.run({
77
+ cwd: '/tmp/project',
78
+ changedFiles: ['src/math.ts'],
79
+ incremental: true,
80
+ maxMutants: 200,
81
+ timeoutSeconds: 900,
82
+ });
83
+ expect(output.killed).toBe(3);
84
+ expect(output.survived).toBe(1);
85
+ expect(output.score).toBeCloseTo(0.75, 5);
86
+ });
87
+ });
88
+ //# sourceMappingURL=mutation-stryker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-stryker.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-stryker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=no-shell-true.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-shell-true.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/no-shell-true.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const SRC_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../..');
6
+ const SHELL_TRUE = /shell\s*:\s*true/;
7
+ /** No production allowlist after task-010 (RS-06). */
8
+ const ALLOWLIST = new Set();
9
+ function isTestFile(rel) {
10
+ return (rel.includes('__tests__') ||
11
+ rel.endsWith('.spec.ts') ||
12
+ rel.endsWith('.test.ts'));
13
+ }
14
+ async function collectTsFiles(dir, base) {
15
+ const entries = await fs.readdir(dir, { withFileTypes: true });
16
+ const out = [];
17
+ for (const ent of entries) {
18
+ const full = path.join(dir, ent.name);
19
+ const rel = path.relative(base, full).replace(/\\/g, '/');
20
+ if (ent.isDirectory()) {
21
+ out.push(...(await collectTsFiles(full, base)));
22
+ }
23
+ else if (ent.name.endsWith('.ts')) {
24
+ out.push(rel);
25
+ }
26
+ }
27
+ return out;
28
+ }
29
+ describe('no shell:true in production src', () => {
30
+ it('should_find_no_shell_true_in_production', async () => {
31
+ const files = await collectTsFiles(SRC_ROOT, SRC_ROOT);
32
+ const violations = [];
33
+ for (const rel of files) {
34
+ if (isTestFile(rel) || ALLOWLIST.has(path.normalize(rel)))
35
+ continue;
36
+ const content = await fs.readFile(path.join(SRC_ROOT, rel), 'utf8');
37
+ if (SHELL_TRUE.test(content))
38
+ violations.push(rel);
39
+ }
40
+ expect(violations).toEqual([]);
41
+ });
42
+ });
43
+ //# sourceMappingURL=no-shell-true.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-shell-true.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/no-shell-true.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,OAAO,CACR,CAAC;AAEF,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC,sDAAsD;AACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;AAEpC,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YACpE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACpE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-safety.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-safety.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/path-safety.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { describe, it, expect } from 'vitest';
5
+ import { assertRelativeSafe, assertWithinRoot, resolveSafePath, PathEscapeError, PATH_ESCAPE_MESSAGE, } from '../../utils/path-safety.js';
6
+ describe('assertRelativeSafe', () => {
7
+ it('should_accept_relative_safe_path', () => {
8
+ expect(() => assertRelativeSafe('a/b/c.txt')).not.toThrow();
9
+ });
10
+ it('should_reject_absolute', () => {
11
+ expect(() => assertRelativeSafe('/x')).toThrow(/absolute/);
12
+ if (process.platform === 'win32') {
13
+ expect(() => assertRelativeSafe('C:\\x')).toThrow(/absolute/);
14
+ }
15
+ });
16
+ it('should_reject_dotdot', () => {
17
+ expect(() => assertRelativeSafe('../x')).toThrow(/\.\./);
18
+ expect(() => assertRelativeSafe('a/../../b')).toThrow(/\.\./);
19
+ });
20
+ });
21
+ describe('resolveSafePath', () => {
22
+ it('should_resolve_safe_child', () => {
23
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dare-path-safe-'));
24
+ const result = resolveSafePath(root, 'DARE', 'TASKS.md');
25
+ expect(result).toBe(path.resolve(root, 'DARE', 'TASKS.md'));
26
+ expect(() => assertWithinRoot(root, result)).not.toThrow();
27
+ });
28
+ it('should_reject_dotdot_escape', () => {
29
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dare-path-safe-'));
30
+ expect(() => resolveSafePath(root, '..', 'etc', 'passwd')).toThrow(PathEscapeError);
31
+ expect(() => resolveSafePath(root, '..', 'etc', 'passwd')).toThrow(PATH_ESCAPE_MESSAGE);
32
+ });
33
+ it('should_reject_absolute_segment', () => {
34
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dare-path-safe-'));
35
+ expect(() => resolveSafePath(root, '/etc/passwd')).toThrow(/absolute/);
36
+ });
37
+ it('should_reject_outside_root', () => {
38
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dare-path-safe-'));
39
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'dare-path-out-'));
40
+ const escaped = path.join(outside, 'secret.txt');
41
+ expect(() => assertWithinRoot(root, escaped)).toThrow(PathEscapeError);
42
+ expect(() => assertWithinRoot(root, escaped)).toThrow(PATH_ESCAPE_MESSAGE);
43
+ });
44
+ it('should_reject_unc_root', () => {
45
+ if (process.platform !== 'win32')
46
+ return;
47
+ expect(() => resolveSafePath('\\\\server\\share', 'file.txt')).toThrow(PathEscapeError);
48
+ expect(() => resolveSafePath('\\\\server\\share', 'file.txt')).toThrow(/UNC/);
49
+ });
50
+ it('windows_drive_fixture', () => {
51
+ if (process.platform !== 'win32')
52
+ return;
53
+ const root = path.resolve('C:\\proj');
54
+ const inside = resolveSafePath(root, 'DARE', 'TASKS.md');
55
+ expect(inside.toLowerCase()).toBe(path.resolve(root, 'DARE', 'TASKS.md').toLowerCase());
56
+ expect(() => assertWithinRoot(root, 'D:\\other\\file.txt')).toThrow(PathEscapeError);
57
+ });
58
+ });
59
+ //# sourceMappingURL=path-safety.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-safety.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/path-safety.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prerank.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerank.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/prerank.test.ts"],"names":[],"mappings":""}