@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.
- package/README.md +5 -1
- package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
- package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
- package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/state-store.test.js +74 -0
- package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
- package/dist/__tests__/ensure-skills.test.d.ts +2 -0
- package/dist/__tests__/ensure-skills.test.d.ts.map +1 -0
- package/dist/__tests__/ensure-skills.test.js +67 -0
- package/dist/__tests__/ensure-skills.test.js.map +1 -0
- package/dist/__tests__/ide-command-parity.test.d.ts +2 -0
- package/dist/__tests__/ide-command-parity.test.d.ts.map +1 -0
- package/dist/__tests__/ide-command-parity.test.js +59 -0
- package/dist/__tests__/ide-command-parity.test.js.map +1 -0
- package/dist/__tests__/project-generator.test.d.ts +2 -0
- package/dist/__tests__/project-generator.test.d.ts.map +1 -0
- package/dist/__tests__/project-generator.test.js +56 -0
- package/dist/__tests__/project-generator.test.js.map +1 -0
- package/dist/__tests__/reverse-collection.test.d.ts +2 -0
- package/dist/__tests__/reverse-collection.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-collection.test.js +87 -0
- package/dist/__tests__/reverse-collection.test.js.map +1 -0
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/__tests__/bench.spec.d.ts +2 -0
- package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/bench.spec.js +106 -0
- package/dist/commands/__tests__/bench.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
- package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
- package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
- package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/execute.verify.spec.js +150 -0
- package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
- package/dist/commands/bench.d.ts +10 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +64 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/dna.d.ts.map +1 -1
- package/dist/commands/dna.js +4 -0
- package/dist/commands/dna.js.map +1 -1
- package/dist/commands/execute-verification.d.ts +51 -0
- package/dist/commands/execute-verification.d.ts.map +1 -0
- package/dist/commands/execute-verification.js +201 -0
- package/dist/commands/execute-verification.js.map +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +139 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +4 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/reverse.d.ts.map +1 -1
- package/dist/commands/reverse.js +27 -8
- package/dist/commands/reverse.js.map +1 -1
- package/dist/dag-runner/ralph-loop.d.ts +9 -9
- package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
- package/dist/dag-runner/ralph-loop.js +89 -113
- package/dist/dag-runner/ralph-loop.js.map +1 -1
- package/dist/dag-runner/state-store.d.ts +14 -1
- package/dist/dag-runner/state-store.d.ts.map +1 -1
- package/dist/dag-runner/state-store.js +39 -8
- package/dist/dag-runner/state-store.js.map +1 -1
- package/dist/exec/npm-invoke.d.ts +8 -0
- package/dist/exec/npm-invoke.d.ts.map +1 -0
- package/dist/exec/npm-invoke.js +45 -0
- package/dist/exec/npm-invoke.js.map +1 -0
- package/dist/exec/safe-spawn.d.ts +21 -0
- package/dist/exec/safe-spawn.d.ts.map +1 -0
- package/dist/exec/safe-spawn.js +108 -0
- package/dist/exec/safe-spawn.js.map +1 -0
- package/dist/graphrag/types.d.ts +2 -2
- package/dist/graphrag/types.d.ts.map +1 -1
- package/dist/stacks/dna-emitter.d.ts.map +1 -1
- package/dist/stacks/dna-emitter.js +1 -10
- package/dist/stacks/dna-emitter.js.map +1 -1
- package/dist/utils/UpdateApplier.d.ts.map +1 -1
- package/dist/utils/UpdateApplier.js +8 -0
- package/dist/utils/UpdateApplier.js.map +1 -1
- package/dist/utils/datamodel.d.ts.map +1 -1
- package/dist/utils/datamodel.js +97 -20
- package/dist/utils/datamodel.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-safety.d.ts +22 -0
- package/dist/utils/path-safety.d.ts.map +1 -0
- package/dist/utils/path-safety.js +83 -0
- package/dist/utils/path-safety.js.map +1 -0
- package/dist/utils/project-generator.d.ts +21 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +71 -0
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/reverse-facts.d.ts +3 -2
- package/dist/utils/reverse-facts.d.ts.map +1 -1
- package/dist/utils/reverse-facts.js +89 -8
- package/dist/utils/reverse-facts.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +2 -2
- package/dist/utils/stack-bootstrap.js.map +1 -1
- package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
- package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
- package/dist/verification/__tests__/anti-tamper.test.js +73 -0
- package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
- package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
- package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
- package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-harness.test.js +75 -0
- package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
- package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
- package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
- package/dist/verification/__tests__/bench-report.test.js +73 -0
- package/dist/verification/__tests__/bench-report.test.js.map +1 -0
- package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
- package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
- package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
- package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
- package/dist/verification/__tests__/config.test.d.ts +2 -0
- package/dist/verification/__tests__/config.test.d.ts.map +1 -0
- package/dist/verification/__tests__/config.test.js +50 -0
- package/dist/verification/__tests__/config.test.js.map +1 -0
- package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
- package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
- package/dist/verification/__tests__/decay-policy.test.js +130 -0
- package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
- package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
- package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
- package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
- package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
- package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
- package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
- package/dist/verification/__tests__/failure-signature.test.js +40 -0
- package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
- package/dist/verification/__tests__/logger.test.d.ts +2 -0
- package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
- package/dist/verification/__tests__/logger.test.js +23 -0
- package/dist/verification/__tests__/logger.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
- package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-infection.test.js +101 -0
- package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
- package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-registry.test.js +28 -0
- package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
- package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
- package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
- package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
- package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
- package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
- package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
- package/dist/verification/__tests__/no-shell-true.test.js +43 -0
- package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
- package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
- package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
- package/dist/verification/__tests__/path-safety.test.js +59 -0
- package/dist/verification/__tests__/path-safety.test.js.map +1 -0
- package/dist/verification/__tests__/prerank.test.d.ts +2 -0
- package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
- package/dist/verification/__tests__/prerank.test.js +44 -0
- package/dist/verification/__tests__/prerank.test.js.map +1 -0
- package/dist/verification/__tests__/runner.test.d.ts +2 -0
- package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
- package/dist/verification/__tests__/runner.test.js +200 -0
- package/dist/verification/__tests__/runner.test.js.map +1 -0
- package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
- package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
- package/dist/verification/__tests__/safe-spawn.test.js +36 -0
- package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
- package/dist/verification/__tests__/security.test.d.ts +2 -0
- package/dist/verification/__tests__/security.test.d.ts.map +1 -0
- package/dist/verification/__tests__/security.test.js +79 -0
- package/dist/verification/__tests__/security.test.js.map +1 -0
- package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
- package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
- package/dist/verification/__tests__/selector-pareto.test.js +77 -0
- package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
- package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
- package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/verification/__tests__/telemetry.test.js +116 -0
- package/dist/verification/__tests__/telemetry.test.js.map +1 -0
- package/dist/verification/__tests__/type-check.test.d.ts +2 -0
- package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
- package/dist/verification/__tests__/type-check.test.js +52 -0
- package/dist/verification/__tests__/type-check.test.js.map +1 -0
- package/dist/verification/__tests__/worktree.test.d.ts +2 -0
- package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
- package/dist/verification/__tests__/worktree.test.js +41 -0
- package/dist/verification/__tests__/worktree.test.js.map +1 -0
- package/dist/verification/bench/fixtures.d.ts +11 -0
- package/dist/verification/bench/fixtures.d.ts.map +1 -0
- package/dist/verification/bench/fixtures.js +66 -0
- package/dist/verification/bench/fixtures.js.map +1 -0
- package/dist/verification/bench/harness.d.ts +19 -0
- package/dist/verification/bench/harness.d.ts.map +1 -0
- package/dist/verification/bench/harness.js +138 -0
- package/dist/verification/bench/harness.js.map +1 -0
- package/dist/verification/bench/report.d.ts +53 -0
- package/dist/verification/bench/report.d.ts.map +1 -0
- package/dist/verification/bench/report.js +47 -0
- package/dist/verification/bench/report.js.map +1 -0
- package/dist/verification/best-of-n/runner.d.ts +29 -0
- package/dist/verification/best-of-n/runner.d.ts.map +1 -0
- package/dist/verification/best-of-n/runner.js +76 -0
- package/dist/verification/best-of-n/runner.js.map +1 -0
- package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
- package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
- package/dist/verification/best-of-n/selector/pareto.js +65 -0
- package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
- package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
- package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
- package/dist/verification/best-of-n/selector/prerank.js +32 -0
- package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
- package/dist/verification/best-of-n/worktree.d.ts +9 -0
- package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
- package/dist/verification/best-of-n/worktree.js +100 -0
- package/dist/verification/best-of-n/worktree.js.map +1 -0
- package/dist/verification/config.d.ts +24 -0
- package/dist/verification/config.d.ts.map +1 -0
- package/dist/verification/config.js +168 -0
- package/dist/verification/config.js.map +1 -0
- package/dist/verification/decay/policy.d.ts +16 -0
- package/dist/verification/decay/policy.d.ts.map +1 -0
- package/dist/verification/decay/policy.js +64 -0
- package/dist/verification/decay/policy.js.map +1 -0
- package/dist/verification/decay/signature.d.ts +6 -0
- package/dist/verification/decay/signature.d.ts.map +1 -0
- package/dist/verification/decay/signature.js +18 -0
- package/dist/verification/decay/signature.js.map +1 -0
- package/dist/verification/gates/anti-tamper.d.ts +16 -0
- package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
- package/dist/verification/gates/anti-tamper.js +142 -0
- package/dist/verification/gates/anti-tamper.js.map +1 -0
- package/dist/verification/gates/fail-to-pass.d.ts +39 -0
- package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
- package/dist/verification/gates/fail-to-pass.js +173 -0
- package/dist/verification/gates/fail-to-pass.js.map +1 -0
- package/dist/verification/gates/mutation/adapter.d.ts +34 -0
- package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
- package/dist/verification/gates/mutation/adapter.js +22 -0
- package/dist/verification/gates/mutation/adapter.js.map +1 -0
- package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
- package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
- package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
- package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
- package/dist/verification/gates/mutation/infection.d.ts +28 -0
- package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
- package/dist/verification/gates/mutation/infection.js +149 -0
- package/dist/verification/gates/mutation/infection.js.map +1 -0
- package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
- package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
- package/dist/verification/gates/mutation/mutmut.js +148 -0
- package/dist/verification/gates/mutation/mutmut.js.map +1 -0
- package/dist/verification/gates/mutation/stryker.d.ts +19 -0
- package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
- package/dist/verification/gates/mutation/stryker.js +103 -0
- package/dist/verification/gates/mutation/stryker.js.map +1 -0
- package/dist/verification/gates/type-check.d.ts +11 -0
- package/dist/verification/gates/type-check.d.ts.map +1 -0
- package/dist/verification/gates/type-check.js +84 -0
- package/dist/verification/gates/type-check.js.map +1 -0
- package/dist/verification/registry.d.ts +6 -0
- package/dist/verification/registry.d.ts.map +1 -0
- package/dist/verification/registry.js +49 -0
- package/dist/verification/registry.js.map +1 -0
- package/dist/verification/runner.d.ts +27 -0
- package/dist/verification/runner.d.ts.map +1 -0
- package/dist/verification/runner.js +173 -0
- package/dist/verification/runner.js.map +1 -0
- package/dist/verification/telemetry.d.ts +18 -0
- package/dist/verification/telemetry.d.ts.map +1 -0
- package/dist/verification/telemetry.js +71 -0
- package/dist/verification/telemetry.js.map +1 -0
- package/dist/verification/types.d.ts +89 -0
- package/dist/verification/types.d.ts.map +1 -0
- package/dist/verification/types.js +3 -0
- package/dist/verification/types.js.map +1 -0
- package/package.json +5 -3
- package/templates/UPDATE-MANIFEST.json +20 -0
- package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
- package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -0
- package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -0
- package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -0
- package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -0
- package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -0
- package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -0
- package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -0
- package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -0
- package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -0
- package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
- package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -0
- package/templates/ide/claude/.claude/commands/dare-dag.md +27 -0
- package/templates/ide/claude/.claude/commands/dare-discover.md +28 -0
- package/templates/ide/claude/.claude/commands/dare-graph.md +30 -0
- package/templates/ide/claude/.claude/commands/dare-info.md +26 -0
- package/templates/ide/claude/.claude/commands/dare-init.md +30 -0
- package/templates/ide/claude/.claude/commands/dare-skill.md +30 -0
- package/templates/ide/claude/.claude/commands/dare-update.md +28 -0
- package/templates/ide/claude/.claude/commands/dare-validate.md +28 -0
- package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -0
- package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
- package/templates/ide/cursor/.cursor/commands/{generate-blueprint.md → dare-blueprint.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -0
- package/templates/ide/cursor/.cursor/commands/{run-dag.md → dare-dag-run.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/{dag-viz.md → dare-dag-viz.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -0
- package/templates/ide/cursor/.cursor/commands/{generate-design.md → dare-design.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -0
- package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -0
- package/templates/ide/cursor/.cursor/commands/{generate-docker-compose.md → dare-docker-compose.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/{generate-dockerfile.md → dare-dockerfile.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/{execute-task.md → dare-execute.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -0
- package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -0
- package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -0
- package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -0
- package/templates/ide/cursor/.cursor/commands/{refine-task.md → dare-refine.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -0
- package/templates/ide/cursor/.cursor/commands/{review-task.md → dare-review.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -0
- package/templates/ide/cursor/.cursor/commands/{generate-tasks.md → dare-tasks.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/{telemetry-report.md → dare-telemetry.md} +1 -1
- package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -0
- package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -0
- package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -0
- /package/templates/ide/cursor/.cursor/commands/{generate-bugfix-design.md → dare-bugfix-design.md} +0 -0
- /package/templates/ide/cursor/.cursor/commands/{generate-feature-design.md → dare-feature-design.md} +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { failureSignature } from '../decay/signature.js';
|
|
3
|
+
describe('failureSignature', () => {
|
|
4
|
+
it('should_be_stable_across_paths_and_lines', () => {
|
|
5
|
+
const a = failureSignature({
|
|
6
|
+
failedAspect: 'test',
|
|
7
|
+
stderr: 'Error at /home/user/proj/src/foo.ts:42:10 TypeError',
|
|
8
|
+
});
|
|
9
|
+
const b = failureSignature({
|
|
10
|
+
failedAspect: 'test',
|
|
11
|
+
stderr: 'Error at C:\\Users\\proj\\src\\foo.ts:99:10 TypeError',
|
|
12
|
+
});
|
|
13
|
+
expect(a).toBe(b);
|
|
14
|
+
});
|
|
15
|
+
it('should_differ_for_different_errors', () => {
|
|
16
|
+
const a = failureSignature({
|
|
17
|
+
failedAspect: 'test',
|
|
18
|
+
stderr: 'TypeError: boom',
|
|
19
|
+
});
|
|
20
|
+
const b = failureSignature({
|
|
21
|
+
failedAspect: 'test',
|
|
22
|
+
stderr: 'AssertionError: expected 1',
|
|
23
|
+
});
|
|
24
|
+
expect(a).not.toBe(b);
|
|
25
|
+
});
|
|
26
|
+
it('should_be_8_hex', () => {
|
|
27
|
+
const sig = failureSignature({
|
|
28
|
+
failedAspect: 'mutation',
|
|
29
|
+
stderr: 'failed',
|
|
30
|
+
});
|
|
31
|
+
expect(sig).toMatch(/^[0-9a-f]{8}$/);
|
|
32
|
+
});
|
|
33
|
+
it('should_factor_in_aspect', () => {
|
|
34
|
+
const stderr = 'same error message';
|
|
35
|
+
const a = failureSignature({ failedAspect: 'test', stderr });
|
|
36
|
+
const b = failureSignature({ failedAspect: 'lint', stderr });
|
|
37
|
+
expect(a).not.toBe(b);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=failure-signature.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-signature.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/failure-signature.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACzB,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,qDAAqD;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACzB,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACzB,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,iBAAiB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACzB,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,4BAA4B;SACrC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,gBAAgB,CAAC;YAC3B,YAAY,EAAE,UAAU;YACxB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,oBAAoB,CAAC;QACpC,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/logger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
2
|
+
describe('logger', () => {
|
|
3
|
+
const prev = process.env.DARE_LOG_LEVEL;
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.resetModules();
|
|
6
|
+
if (prev === undefined)
|
|
7
|
+
delete process.env.DARE_LOG_LEVEL;
|
|
8
|
+
else
|
|
9
|
+
process.env.DARE_LOG_LEVEL = prev;
|
|
10
|
+
});
|
|
11
|
+
it('should_create_child_with_scope', async () => {
|
|
12
|
+
const { createLogger } = await import('../../utils/logger.js');
|
|
13
|
+
const child = createLogger('verification');
|
|
14
|
+
expect(child.bindings().scope).toBe('verification');
|
|
15
|
+
});
|
|
16
|
+
it('should_respect_level_env', async () => {
|
|
17
|
+
process.env.DARE_LOG_LEVEL = 'warn';
|
|
18
|
+
vi.resetModules();
|
|
19
|
+
const { createLogger } = await import('../../utils/logger.js');
|
|
20
|
+
expect(createLogger('test-level').level).toBe('warn');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../../src/verification/__tests__/logger.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE7D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;;YACrD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC;QACpC,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC/D,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-cargo-mutants.test.d.ts","sourceRoot":"","sources":["../../../src/verification/__tests__/mutation-cargo-mutants.test.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|