Effect Doctor

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 agent

Install the skill so an agent runs the scan and acts on it:

$ npx skills add ocarinalabs/effect-doctor

Compare 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.0

Node 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".