# stryker-mutator/stryker-js — codebase unpack

> Canonical page: https://codevetter.com/unpack/stryker-js

This is a deterministic Repo Unpack scan of stryker-mutator/stryker-js — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: f2a49ff02437e3b7fe2682dba808ac93039895bf (2026-09-11)
- Last upstream commit: feat(vitest-runner): report test locations (#6188)
- Generated by codevetter 1.15.0 on 2026-10-02
- 2239 files scanned · 5.3 MB

Source inspection; upstream code and tests were not executed.

## Languages

- TypeScript: 883 files
- JavaScript: 617 files
- JSON: 372 files
- Markdown: 69 files
- HTML: 26 files
- Svelte: 13 files
- Sass: 11 files
- Vue: 9 files

## Repository structure

- packages/ — 1240 files
- e2e/ — 850 files
- perf/ — 85 files
- docs/ — 27 files
- .github/ — 10 files
- tasks/ — 4 files
- .devcontainer/ — 1 files
- .travis/ — 1 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Source layout — packages/

- packages/core/ — 88 files
- packages/cucumber-runner/ — 59 files
- packages/vitest-runner/ — 99 files

## Package

- package.json: stryker-parent — 42 declared dependencies

## Structural health signals

Average score 8.1/10 across 96 files; 6 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- f2a49ff02437 (2026-09-11) feat(vitest-runner): report test locations (#6188)
- e873a24ea7fe (2026-09-11) fix(instrumenter): crash when mutating ts non null expression in babel >= 8 (#6221)
- f9225709e9d1 (2026-08-31) chore(deps): update dependency webpack-cli to v7.2.3 (#6206)
- 6a9691578b59 (2026-08-31) chore(deps): update dependency @vitejs/plugin-react to v6.1.1 (#6204)
- 53accf8faf0d (2026-08-31) chore(deps): update typescript-eslint monorepo to v8.68.0 (#6202)

## Overview

StrykerJS is a mutation-testing framework for developers assessing whether JavaScript and TypeScript tests detect deliberate changes to production code. It instruments multiple mutants into source files, runs baseline tests, then schedules individual mutants through configurable test runners and optional checkers. This monorepo contains the public plugin API, execution engine, language instrumenter, framework adapters, reporting tools, and integration fixtures; its distinctive mechanisms include per-test mutant coverage, incremental result reuse, and an editor-facing mutation server.

## System map

The repository builds and publishes a family of Node.js packages coordinated by pnpm, Lerna, and TypeScript project references. Core owns the CLI and execution lifecycle, while the API and instrumenter define integration contracts and source transformation. Runtime work crosses parent-process, worker-process, filesystem, and optional network boundaries. Persistence consists of project copies, backups, and report files in the inspected paths.
- The executable sets process.title to 'stryker' and invokes StrykerCli.run(); the core package exposes its compiled index and installs bin/stryker.js as the stryker command. — [packages/core/bin/stryker.js#L1-L6](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/bin/stryker.js#L1-L6) [packages/core/package.json#L12-L14](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/package.json#L12-L14) [packages/core/package.json#L65-L67](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/package.json#L65-L67)
- The parent is a private ESM package requiring Node >=22 and pnpm@11.5.1; pnpm workspaces include packages, e2e, and individual e2e fixture packages. — [package.json#L2-L5](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/package.json#L2-L5) [package.json#L72-L74](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/package.json#L72-L74) [pnpm-workspace.yaml#L1-L4](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/pnpm-workspace.yaml#L1-L4)
- TypeScript project references separate core, API, util, instrumenter, create-stryker, eight runner packages, typescript-checker, and test-helpers. — [tsconfig.json#L3-L17](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/tsconfig.json#L3-L17)
- Stryker.run executes preparation, instrumentation, baseline testing, and mutation execution sequentially through typed-inject contexts; runMutationTest disposes its root injector in finally. — [packages/core/src/stryker.ts#L40-L52](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L40-L52) [packages/core/src/stryker.ts#L64-L84](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L64-L84)
- The public API exports separate check, core, ignore, logging, plugin, report, and test-runner entrypoints rather than one root export. — [packages/api/package.json#L19-L26](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/package.json#L19-L26)
- ChildProcessProxy forks a worker with configurable Node arguments and inherited environment, then sends options, file descriptions, plugin paths, module/export identity, and working directory through IPC. — [packages/core/src/child-proxy/child-process-proxy.ts#L63-L108](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/child-proxy/child-process-proxy.ts#L63-L108)
- ProjectFile caches original and current content independently; FileSystem forwards Node filesystem operations through an RxJS queue limited to 256 concurrent actions. — [packages/core/src/fs/project-file.ts#L15-L18](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-file.ts#L15-L18) [packages/core/src/fs/project-file.ts#L48-L66](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-file.ts#L48-L66) [packages/core/src/fs/file-system.ts#L7-L7](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/file-system.ts#L7-L7) [packages/core/src/fs/file-system.ts#L32-L60](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/file-system.ts#L32-L60)
- Root build generates schemas/types before tsc -b, tests run through Lerna, and tag-triggered publishing builds packages before lerna publish from-git with npm provenance permission. — [package.json#L57-L60](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/package.json#L57-L60) [.github/workflows/publish.yml#L3-L22](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/publish.yml#L3-L22) [lerna.json#L3-L13](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/lerna.json#L3-L13)

## Feature catalog

The main user surfaces are CLI commands, a programmatic mutation run, reports, and a mutation-server protocol. Users can select files and source ranges, choose framework integrations, suppress mutants, and control baseline or incremental execution. Reporter choices cover terminal feedback, local artifacts, and dashboard publication. Framework UI examples are integration targets rather than the central product interface.
- stryker run accepts a configuration path and invokes Stryker.runMutationTest; stryker init creates an initializer and disposes its injector after initialization. — [packages/core/src/stryker-cli.ts#L48-L86](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-cli.ts#L48-L86)
- serve supports stdio or socket channels, socket address/port options, and forwarded run options; runServer remains a deprecated socket-server command. — [packages/core/src/stryker-cli.ts#L88-L155](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-cli.ts#L88-L155)
- Project selection supports mutation globs, exclusions, explicit test-file patterns, and line/column mutation ranges; unmatched explicit test patterns produce warnings. — [packages/core/src/fs/project-reader.ts#L124-L142](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L124-L142) [packages/core/src/fs/project-reader.ts#L167-L193](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L167-L193) [packages/core/src/fs/project-reader.ts#L295-L332](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L295-L332)
- Language dispatch recognizes JS/JSX/MJS/CJS, TS/MTS/CTS, TSX, Vue/HTML/HTM, and Svelte; unknown extensions produce a parser-registration error. — [packages/instrumenter/src/parsers/create-parser.ts#L24-L43](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/parsers/create-parser.ts#L24-L43) [packages/instrumenter/src/parsers/create-parser.ts#L48-L75](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/parsers/create-parser.ts#L48-L75)
- Workspace integrations include Cucumber, Jasmine, Jest, Karma, Mocha, TAP, Vitest, and TypeScript checking; the built-in command runner defaults conceptually to npm test and rejects explicit testFiles. — [e2e/package.json#L15-L24](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/e2e/package.json#L15-L24) [packages/core/src/test-runner/command-test-runner.ts#L27-L31](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/test-runner/command-test-runner.ts#L27-L31) [packages/core/src/test-runner/command-test-runner.ts#L67-L72](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/test-runner/command-test-runner.ts#L67-L72)
- Mutants can be suppressed through excludedMutations, Stryker disable comments, or Ignore plugins; suppressed mutants remain visible in reports without contributing to the score. — [docs/disable-mutants.md#L46-L68](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/docs/disable-mutants.md#L46-L68) [docs/disable-mutants.md#L87-L98](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/docs/disable-mutants.md#L87-L98) [packages/instrumenter/src/transformers/babel-transformer.ts#L54-L62](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/transformers/babel-transformer.ts#L54-L62)
- Execution supports dryRunOnly, allowEmpty, coverage-based test selection, ignoreStatic, and incremental result reuse; force prevents reuse of existing mutant statuses. — [packages/core/src/process/4-mutation-test-executor.ts#L89-L102](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L89-L102) [packages/core/src/mutants/mutant-test-planner.ts#L88-L137](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L88-L137) [packages/core/src/mutants/incremental-differ.ts#L168-L195](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/incremental-differ.ts#L168-L195)
- Built-in reporters include clear-text, progress, append-only progress, dots, event-recorder, HTML, JSON, and dashboard; dashboard reportType selects a full report or mutation score, and thresholds.break can fail the run. — [packages/core/src/reporters/index.ts#L19-L39](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/index.ts#L19-L39) [packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts#L56-L66](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts#L56-L66) [packages/core/src/reporters/mutation-test-report-helper.ts#L202-L217](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L202-L217)

## Data flow

Configuration and filesystem selection establish the project model before source transformation begins. Instrumentation produces modified files and mutant metadata, while the baseline test runner supplies test results, coverage, and timing. The planner converts these inputs into early results or executable run options, and the executor streams outcomes into reporting. Reports preserve original source and test relationships, and incremental mode feeds that persisted information into later planning.
- ConfigReader loads a discovered or explicit JSON/JavaScript configuration, deep-merges CLI options with precedence, and validates it; preparation adds plugin schemas, validates again, then deep-freezes options. — [packages/core/src/config/config-reader.ts#L49-L80](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/config/config-reader.ts#L49-L80) [packages/core/src/process/1-prepare-executor.ts#L70-L95](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/1-prepare-executor.ts#L70-L95)
- ProjectReader crawls from process.cwd(), applies ordered ignore rules, resolves mutation/test descriptions, reads an optional incremental report, and constructs Project. — [packages/core/src/fs/project-reader.ts#L94-L108](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L94-L108) [packages/core/src/fs/project-reader.ts#L375-L409](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L375-L409)
- ProjectFile.toInstrumenterFile supplies name, mutation scope, and current text; Instrumenter parses each file, transforms its AST, prints instrumented text, and returns files plus API mutants. — [packages/core/src/fs/project-file.ts#L36-L45](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-file.ts#L36-L45) [packages/instrumenter/src/instrumenter.ts#L45-L81](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/instrumenter.ts#L45-L81)
- MutantInstrumenterExecutor stores generated text in ProjectFile, runs preprocessors, initializes the checker pool, then initializes Sandbox; unchanged sandbox files are copied while changed text is written. — [packages/core/src/process/2-mutant-instrumenter-executor.ts#L75-L105](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/2-mutant-instrumenter-executor.ts#L75-L105) [packages/core/src/process/2-mutant-instrumenter-executor.ts#L117-L120](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/2-mutant-instrumenter-executor.ts#L117-L120) [packages/core/src/fs/project-file.ts#L28-L32](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-file.ts#L28-L32)
- DryRunExecutor passes sandbox mutation/test paths, coverage mode, bail preference, and timeout to dryRun; it remaps returned test filenames and derives net time and nonnegative overhead. — [packages/core/src/process/3-dry-run-executor.ts#L152-L180](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L152-L180) [packages/core/src/process/3-dry-run-executor.ts#L188-L205](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L188-L205) [packages/core/src/process/3-dry-run-executor.ts#L231-L243](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L231-L243)
- MutantTestPlanner produces covered-test filters or full-test plans; timeout equals timeoutFactor × netTime + timeoutMS + overhead, hitLimit is 100 × baseline hits, and hot swapping requires a filter and nonstatic coverage. — [packages/core/src/mutants/mutant-test-planner.ts#L100-L136](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L100-L136) [packages/core/src/mutants/mutant-test-planner.ts#L169-L218](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L169-L218) [packages/core/src/mutants/mutant-test-planner.ts#L30-L37](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L30-L37)
- Mutation execution separates early results, checker failures, empty-filter NoCoverage results, and test-runner outcomes, merges them into an array, and calls reportAll before reporter.wrapUp. — [packages/core/src/process/4-mutation-test-executor.ts#L102-L120](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L102-L120) [packages/core/src/process/4-mutation-test-executor.ts#L124-L165](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L124-L165)
- Report assembly remaps test IDs, includes original mutation/test sources, config, cwd, thresholds, and framework metadata; incremental loading converts report positions back to zero-based internal coordinates before diffing. — [packages/core/src/reporters/mutation-test-report-helper.ts#L230-L254](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L230-L254) [packages/core/src/reporters/mutation-test-report-helper.ts#L314-L339](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L314-L339) [packages/core/src/fs/project-reader.ts#L418-L452](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L418-L452) [packages/core/src/fs/project-reader.ts#L487-L492](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L487-L492)

## Behavior traces

The inspected flows cover CLI startup and preparation, mutation execution, incremental persistence/reuse, and server discovery/execution. These traces follow concrete function calls and preserve conditions that change the route through execution. Baseline failures stop mutation testing, while ignored or cached mutants bypass runner execution. Cleanup and asynchronous reporter completion are explicit parts of the lifecycle.
- Startup follows bin/stryker.js → StrykerCli.run → run action → Stryker.runMutationTest → logging/injector setup → Stryker.run → PrepareExecutor.execute. — [packages/core/bin/stryker.js#L2-L6](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/bin/stryker.js#L2-L6) [packages/core/src/stryker-cli.ts#L48-L73](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-cli.ts#L48-L73) [packages/core/src/stryker.ts#L40-L49](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L40-L49) [packages/core/src/stryker.ts#L64-L67](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L64-L67)
- Preparation follows ConfigReader.readConfig → PluginLoader.load → MetaSchemaBuilder.buildMetaSchema → OptionsValidator.validate → ProjectReader.read → TemporaryDirectory.initialize; an empty project throws ConfigError. — [packages/core/src/process/1-prepare-executor.ts#L63-L95](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/1-prepare-executor.ts#L63-L95) [packages/core/src/process/1-prepare-executor.ts#L100-L120](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/1-prepare-executor.ts#L100-L120)
- Instrumentation follows readFilesToMutate → Instrumenter.instrument → writeInstrumentedFiles → preprocess.preprocess → checkerPool.init → Sandbox.init; Sandbox fills files, runs buildCommand, then creates dependency symlinks. — [packages/core/src/process/2-mutant-instrumenter-executor.ts#L62-L105](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/2-mutant-instrumenter-executor.ts#L62-L105) [packages/core/src/sandbox/sandbox.ts#L74-L78](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L74-L78)
- Baseline execution schedules executeDryRun → testRunner.dryRun → capabilities → validateResultCompleted → path remapping → timing calculation → onDryRunCompleted; failed tests, errors, timeouts, or disallowed empty runs stop progression. — [packages/core/src/process/3-dry-run-executor.ts#L92-L103](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L92-L103) [packages/core/src/process/3-dry-run-executor.ts#L119-L140](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L119-L140) [packages/core/src/process/3-dry-run-executor.ts#L166-L181](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L166-L181)
- Primary mutation execution follows makePlan → executeEarlyResult → executeCheck → executeNoCoverage → executeRunInTestRunner → reportAll → wrapUp; dryRunOnly and allowed empty baselines return before this chain. — [packages/core/src/process/4-mutation-test-executor.ts#L89-L121](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L89-L121)
- Incremental reuse follows ProjectReader.readIncrementalReport → MutantTestPlanner.incrementalDiff/readAllOriginalFiles → IncrementalDiffer.diff → planMutant; eligible old statuses become early results unless force is enabled. — [packages/core/src/fs/project-reader.ts#L103-L107](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L103-L107) [packages/core/src/mutants/mutant-test-planner.ts#L78-L99](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L78-L99) [packages/core/src/mutants/mutant-test-planner.ts#L271-L292](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L271-L292) [packages/core/src/mutants/incremental-differ.ts#L168-L195](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/incremental-differ.ts#L168-L195)
- Persistence follows reportOne accumulation → reportAll → mutationTestReport → metrics calculation → onMutationTestReportReady → optional writeIncrementalReport → threshold evaluation; interruption saves partial results only when incremental is enabled and results exist. — [packages/core/src/reporters/mutation-test-report-helper.ts#L81-L94](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L81-L94) [packages/core/src/reporters/mutation-test-report-helper.ts#L163-L166](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L163-L166) [packages/core/src/reporters/mutation-test-report-helper.ts#L178-L199](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L178-L199)
- Server start installs framed JSON-RPC methods; configure records a config path, discover prepares and instruments selected files, and mutationTest calls Stryker.run with a reporter override that emits progress notifications before an empty final result. — [packages/core/src/stryker-server.ts#L116-L147](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L116-L147) [packages/core/src/stryker-server.ts#L216-L256](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L216-L256) [packages/core/src/stryker-server.ts#L277-L319](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L277-L319)

## Testing signals

Tests and CI were inspected, not executed; no passing result or coverage percentage is asserted. Core uses compiled Mocha tests with Chai, Sinon, promise assertions, and snapshots. The inspected suites exercise orchestration branches, incremental reuse, HTML serialization, and real server transports, while e2e fixtures cover several frontend/framework configurations. This inventory is bounded and does not establish exhaustive coverage or the absence of additional tests.
- Core test runs c8 over unit and integration scripts; Mocha targets dist/test, uses a 60-second integration timeout, loads compiled setup, and forbids focused tests when CI is set. — [packages/core/package.json#L16-L22](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/package.json#L16-L22) [packages/core/.mocharc.cjs#L1-L5](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/.mocharc.cjs#L1-L5)
- Core setup installs Sinon-Chai, Chai-as-promised, and Chai-Jest snapshots; after each test it disposes/reset injectors, restores Sinon, and restores cwd. — [packages/core/test/setup.ts#L3-L35](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/setup.ts#L3-L35)
- MutationTestExecutor unit tests explicitly assert that ignored mutants skip checkers/runners and empty test filters produce NoCoverage without mutantRun. — [packages/core/test/unit/process/4-mutation-test-executor.spec.ts#L183-L245](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/unit/process/4-mutation-test-executor.spec.ts#L183-L245)
- IncrementalDiffer tests distinguish reuse after test removal/addition and invalidate Killed results when the killing test disappears; an unchanged killer also supports static-mutant reuse. — [packages/core/test/unit/mutants/incremental-differ.spec.ts#L937-L976](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/unit/mutants/incremental-differ.spec.ts#L937-L976)
- HTML reporter tests check serialized report output, splitting of script tags in embedded source, and wrapUp rejection when writing fails; these inspected assertions use a write stub rather than proving browser execution safety. — [packages/core/test/unit/reporters/html-reporter.spec.ts#L31-L90](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/unit/reporters/html-reporter.spec.ts#L31-L90)
- Server integration tests spawn the CLI over socket and stdio and share configure/discover/mutation assertions; they also exercise parallel mutation requests and temporary-directory cleanup. — [packages/core/test/integration/stryker-server.it.spec.ts#L31-L92](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/integration/stryker-server.it.spec.ts#L31-L92) [packages/core/test/integration/stryker-server.it.spec.ts#L95-L152](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/integration/stryker-server.it.spec.ts#L95-L152)
- The e2e harness filters fixture names, supports concurrency/resume, skips incompatible Node/platform fixtures, and retries per fixture; inspected Vite fixtures include Vue, Svelte/jsdom, and React browser-mode Chromium. — [e2e/tasks/run-e2e-tests.js#L26-L51](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/e2e/tasks/run-e2e-tests.js#L26-L51) [e2e/tasks/run-e2e-tests.js#L168-L189](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/e2e/tasks/run-e2e-tests.js#L168-L189) [e2e/test/svelte-js-vitest/vite.config.js#L1-L11](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/e2e/test/svelte-js-vitest/vite.config.js#L1-L11) [packages/vitest-runner/testResources/vi-mock/vite.config.ts#L8-L20](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/vitest-runner/testResources/vi-mock/vite.config.ts#L8-L20)
- CI config schedules build/lint/test on Node 22/24 across Ubuntu/Windows and separate e2e jobs; mutation CI names selected package scopes, while performance runs are manually triggered and upload report artifacts. — [.github/workflows/ci.yml#L11-L27](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/ci.yml#L11-L27) [.github/workflows/ci.yml#L45-L75](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/ci.yml#L45-L75) [.github/workflows/mutation-testing.yml#L17-L42](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/mutation-testing.yml#L17-L42) [.github/workflows/performance.yml#L3-L30](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/performance.yml#L3-L30)

## Risk map

The inspected sensitive boundaries are imported project code, shell commands, inherited worker environments, filesystem writes, JSON-RPC, and dashboard uploads. The sandbox is a project execution directory with dependency links and an optional in-place mode. Observations here describe source behavior and review hotspots, not confirmed vulnerabilities. Partial inspection does not establish a repository-wide absence of authentication, validation, or security tests.
- JavaScript configuration and plugin descriptors execute through dynamic module imports, including resolved absolute/relative paths; configuration or plugin selection therefore crosses a trusted-code execution boundary. — [packages/core/src/config/config-reader.ts#L168-L175](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/config/config-reader.ts#L168-L175) [packages/core/src/di/plugin-loader.ts#L104-L120](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/di/plugin-loader.ts#L104-L120) [packages/core/src/di/plugin-loader.ts#L169-L177](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/di/plugin-loader.ts#L169-L177)
- CommandTestRunner passes configured command text to child_process.exec with the current environment; Sandbox also executes buildCommand. These are intentional shell/process execution surfaces requiring trusted project configuration. — [packages/core/src/test-runner/command-test-runner.ts#L94-L106](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/test-runner/command-test-runner.ts#L94-L106) [packages/core/src/sandbox/sandbox.ts#L102-L114](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L102-L114)
- inPlace selects cwd, backs up changed files, overwrites originals, and restores backups on disposal; original-file recovery is a high-impact lifecycle boundary. — [packages/core/src/sandbox/sandbox.ts#L55-L64](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L55-L64) [packages/core/src/sandbox/sandbox.ts#L166-L195](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L166-L195) [packages/core/src/fs/project-file.ts#L69-L94](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-file.ts#L69-L94)
- Sandbox shares node_modules through symlinks and may locate dependencies in parent directories, while worker forks inherit process.env; the inspected mechanisms provide execution separation without removing host dependencies or environment access. — [packages/core/src/sandbox/sandbox.ts#L118-L156](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L118-L156) [packages/core/src/child-proxy/child-process-proxy.ts#L75-L84](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/child-proxy/child-process-proxy.ts#L75-L84)
- The inspected server start path registers configure/discover/mutationTest directly and accepts socket connections without an authentication check there; CLI defaults to localhost but permits an address override. — [packages/core/src/stryker-server.ts#L127-L149](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L127-L149) [packages/core/src/stryker-server.ts#L188-L199](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L188-L199) [packages/core/src/stryker-cli.ts#L111-L119](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-cli.ts#L111-L119)
- Incremental reports are JSON-parsed without schema/version validation, explicitly noted by a TODO, and their configured path is written with recursive parent-directory creation; malformed cache input can propagate errors beyond simple parsing. — [packages/core/src/fs/project-reader.ts#L412-L432](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L412-L432) [packages/core/src/fs/project-reader.ts#L453-L465](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L453-L465) [packages/core/src/reporters/mutation-test-report-helper.ts#L189-L199](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L189-L199)
- Full dashboard uploads can include original sources, tests, configuration, and projectRoot; DashboardReporterClient sends an X-Api-Key from STRYKER_DASHBOARD_API_KEY to configured baseUrl and trace-logs the serialized report. — [packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts#L56-L66](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts#L56-L66) [packages/core/src/reporters/mutation-test-report-helper.ts#L243-L254](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/mutation-test-report-helper.ts#L243-L254) [packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts#L41-L57](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts#L41-L57) [packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts#L73-L82](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts#L73-L82)
- Vitest integration branches on framework versions, accesses ctx.state internals, and clears filesMap as an acknowledged hack; baseline path remapping separately assumes type-check suppression shifts test lines by exactly one. — [packages/vitest-runner/src/vitest-test-runner.ts#L94-L118](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/vitest-runner/src/vitest-test-runner.ts#L94-L118) [packages/vitest-runner/src/vitest-test-runner.ts#L290-L294](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/vitest-runner/src/vitest-test-runner.ts#L290-L294) [packages/core/src/process/3-dry-run-executor.ts#L196-L204](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L196-L204)

## Extension points

The primary supported extension mechanism is a typed plugin contract for runners, checkers, reporters, and ignorers. Plugin modules contribute declarations and optional validation schemas, and typed-inject constructs their instances. Internal registries and factory functions offer separate seams for mutation operators, parsers, preprocessors, and initialization presets. These internal seams should not be confused with public plugin categories.
- PluginInterfaces maps Reporter, TestRunner, Checker, and Ignore kinds to their contracts; declareClassPlugin, declareFactoryPlugin, and declareValuePlugin construct typed declarations. — [packages/api/src/plugin/plugins.ts#L78-L94](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/src/plugin/plugins.ts#L78-L94) [packages/api/src/plugin/plugins.ts#L103-L147](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/src/plugin/plugins.ts#L103-L147)
- PluginLoader accepts module names, file paths/URLs, and simple wildcard expressions, collecting strykerPlugins and strykerValidationSchema; preparation combines configured, framework, reporter, and appendPlugins descriptors. — [packages/core/src/di/plugin-loader.ts#L53-L59](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/di/plugin-loader.ts#L53-L59) [packages/core/src/di/plugin-loader.ts#L169-L182](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/di/plugin-loader.ts#L169-L182) [packages/core/src/process/1-prepare-executor.ts#L70-L85](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/1-prepare-executor.ts#L70-L85)
- PluginCreator resolves names case-insensitively within a kind and invokes the factory/class through the injector or returns a value; missing registrations produce diagnostic errors listing loaded plugins. — [packages/core/src/di/plugin-creator.ts#L28-L64](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/di/plugin-creator.ts#L28-L64)
- A TestRunner implements capabilities, dryRun, and mutantRun with optional init/dispose; createTestRunnerFactory wraps plugin runners with retry, reload, reuse-limit, timeout, and child-process layers. — [packages/api/src/test-runner/test-runner.ts#L6-L11](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/src/test-runner/test-runner.ts#L6-L11) [packages/core/src/test-runner/index.ts#L47-L72](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/test-runner/index.ts#L47-L72)
- A Checker implements init and check plus optional group; MutationTestExecutor applies configured checkers in sequence, buffering/grouping mutants and converting failed checks to early results. — [packages/api/src/check/checker.ts#L5-L21](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/src/check/checker.ts#L5-L21) [packages/core/src/process/4-mutation-test-executor.ts#L181-L197](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L181-L197) [packages/core/src/process/4-mutation-test-executor.ts#L227-L250](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/4-mutation-test-executor.ts#L227-L250)
- Reporter hooks cover baseline completion, plan readiness, individual mutants, final report/metrics, and asynchronous wrapUp; the built-in reporter list demonstrates class and factory registrations. — [packages/api/src/report/reporter.ts#L11-L46](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/api/src/report/reporter.ts#L11-L46) [packages/core/src/reporters/index.ts#L19-L39](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/reporters/index.ts#L19-L39)
- NodeMutator supplies a name, iterable AST replacements, and optional subtree filter; allMutators registers operators, and babelTransform invokes filters on exit before mutant placement. — [packages/instrumenter/src/mutators/node-mutator.ts#L9-L15](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/mutators/node-mutator.ts#L9-L15) [packages/instrumenter/src/mutators/mutate.ts#L20-L38](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/mutators/mutate.ts#L20-L38) [packages/instrumenter/src/transformers/babel-transformer.ts#L105-L151](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/transformers/babel-transformer.ts#L105-L151)
- Additional formats require parser dispatch changes; preprocessing composes DisableTypeChecksPreprocessor and TSConfigPreprocessor, while createInitializers explicitly registers Angular, React, Svelte, and Vue presets. — [packages/instrumenter/src/parsers/create-parser.ts#L31-L43](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/parsers/create-parser.ts#L31-L43) [packages/instrumenter/src/parsers/create-parser.ts#L55-L75](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/parsers/create-parser.ts#L55-L75) [packages/core/src/sandbox/create-preprocessor.ts#L17-L26](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/create-preprocessor.ts#L17-L26) [packages/core/src/initializer/custom-initializers/index.ts#L21-L29](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/initializer/custom-initializers/index.ts#L21-L29)

## Contributor handoff

Begin with the affected package and its API contract, then follow the execution stage that owns the behavior. Tests and CI were inspected, not executed, and this brief is a bounded source inventory rather than a complete coverage assessment. Future executable work should use repository scripts and compile current sources before selecting tests that run from dist. Preserve cleanup, coordinate conversion, runner activation, and report compatibility when making small changes.
- Use package.json and pnpm-workspace.yaml as the package-manager authority, then read the affected package manifest; the contribution guide states that package-local tests are faster and assume compiled sources. — [package.json#L2-L5](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/package.json#L2-L5) [pnpm-workspace.yaml#L1-L4](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/pnpm-workspace.yaml#L1-L4) [CONTRIBUTING.md#L30-L43](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/CONTRIBUTING.md#L30-L43)
- For core behavior, read Stryker.run and the four executors before editing: each stage returns an injector containing dependencies needed by the next stage. — [packages/core/src/stryker.ts#L64-L84](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L64-L84) [packages/core/src/process/1-prepare-executor.ts#L117-L130](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/1-prepare-executor.ts#L117-L130) [packages/core/src/process/3-dry-run-executor.ts#L105-L116](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/process/3-dry-run-executor.ts#L105-L116)
- Tests and CI were inspected, not executed for this brief; future authorized verification can begin with core test:unit or test:integration after compilation, using their existing dist/test targets. — [packages/core/package.json#L16-L22](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/package.json#L16-L22) [.github/workflows/ci.yml#L24-L27](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/.github/workflows/ci.yml#L24-L27)
- Schema changes should modify source JSON and use the existing generator; it emits src-generated types, marks them generated, and treats default-bearing schema properties as required in generated output. — [tasks/generate-json-schema-to-ts.js#L18-L45](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/tasks/generate-json-schema-to-ts.js#L18-L45) [tasks/generate-json-schema-to-ts.js#L159-L167](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/tasks/generate-json-schema-to-ts.js#L159-L167) [package.json#L57-L58](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/package.json#L57-L58)
- Preserve coordinate conventions: mutation-range lines become zero-based, instrumentation shifts lines for Babel, report loading subtracts one from line/column, and server range ends adjust protocol columns. — [packages/core/src/fs/project-reader.ts#L299-L319](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L299-L319) [packages/instrumenter/src/instrumenter.ts#L86-L99](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/instrumenter/src/instrumenter.ts#L86-L99) [packages/core/src/fs/project-reader.ts#L487-L492](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/fs/project-reader.ts#L487-L492) [packages/core/src/stryker-server.ts#L324-L333](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker-server.ts#L324-L333)
- Runner changes must preserve static/runtime activation and reload semantics; the planner permits hot swapping only for filtered nonstatic mutants, while the plugin guide distinguishes activation before versus after environment loading. — [packages/core/src/mutants/mutant-test-planner.ts#L189-L218](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/mutants/mutant-test-planner.ts#L189-L218) [docs/guides/create-a-plugin.md#L308-L339](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/docs/guides/create-a-plugin.md#L308-L339)
- Sandbox and disposal edits require attention to inPlace restoration and error retention: Stryker keeps temporary artifacts after errors unless cleanTempDir is 'always', while Sandbox restores backed-up originals during disposal. — [packages/core/src/stryker.ts#L87-L100](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/stryker.ts#L87-L100) [packages/core/src/sandbox/sandbox.ts#L181-L195](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/src/sandbox/sandbox.ts#L181-L195)
- Use a selected e2e fixture for framework changes and distinguish adapter behavior from orchestration mocks; the harness supports a positional glob, and Vitest's version-dependent pool settings and internal state reset need review when compatibility changes. — [e2e/tasks/run-e2e-tests.js#L26-L51](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/e2e/tasks/run-e2e-tests.js#L26-L51) [packages/core/test/unit/process/4-mutation-test-executor.spec.ts#L83-L126](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/core/test/unit/process/4-mutation-test-executor.spec.ts#L83-L126) [packages/vitest-runner/src/vitest-test-runner.ts#L94-L118](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/vitest-runner/src/vitest-test-runner.ts#L94-L118) [packages/vitest-runner/src/vitest-test-runner.ts#L290-L294](https://github.com/stryker-mutator/stryker-js/blob/f2a49ff02437e3b7fe2682dba808ac93039895bf/packages/vitest-runner/src/vitest-test-runner.ts#L290-L294)

Source repository: https://github.com/stryker-mutator/stryker-js
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/stryker-js.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
