Docs
Effect Doctor finds Effect v4 mistakes that TypeScript and general linters accept. It reads local files, edits nothing, and sends nothing.
Install
Run it at the root of a project that depends on Effect 4.
$ npx dr-effect@latest .The project needs its packages installed. Type-aware checks use the same packages as the build. Pass --project to select a different tsconfig.json; project references are followed.
Findings
Every finding is a required fix. error is a defect that shows at runtime. warning is a skipped Effect idiom. The run exits 1 when it finds either, 0 when it finds nothing, and 2 when analysis did not complete.
The rule set is fixed. There is no configuration file, no rule option, and no way to turn a rule off. Suppression comments are themselves reported. See the rule list.
Coding agents
The agent format groups findings by rule with file, line, column, message, and fingerprint, and ends with the command to rerun.
$ npx dr-effect@latest . --format agentInstall the skill so an agent runs the scan and acts on it:
$ npx skills add ocarinalabs/effect-doctorCompare a change
Compare a candidate checkout with a baseline. The report lists only the findings the change introduced and the findings it resolved, so an existing backlog does not block new work.
$ npx dr-effect@latest compare ../baseline .Pull requests
The GitHub Action compares each pull request with its base, adds review comments and a summary, and fails the job on introduced findings.
permissions:
contents: read
issues: write
pull-requests: write
statuses: write
steps:
- uses: actions/checkout@v5
with: { fetch-depth: 0 }
- run: npm ci
- uses: ocarinalabs/effect-doctor@v0.1.0Node API
import { Effect } from "effect";
import { scanProject } from "dr-effect";
const report = await Effect.runPromise(scanProject({ root: "." }));
console.log(report.summary);--format json prints the same sealed report the API returns.
Toolchain
Each release pins Effect, Effect TSGo, Oxlint, and TypeScript, so two machines that run the same version produce the same report. Each analyzer may run for two minutes; raise that with --analyzer-timeout "10 minutes".