driftryanwaits/drift
Your code changed. Your docs didn't.
- Problem
- JSDoc, examples, and markdown fall out of sync with your actual API.
- Detect
drift scanfinds 17 drift types across 4 categories.- Surfaces
- One engine, three truths: TypeScript packages, OpenAPI specs, Clarity contracts.
- Output
- {ok, data, meta} JSON to stdout, with file and line.
- Agents
- Ships as a Claude Code skill and an MCP server — /drift inside any TypeScript project.
Your Code Changed. Your Docs Didn't.
JSDoc says one param, function takes three. @example blocks reference APIs you removed last sprint. Markdown docs import exports that no longer exist. Nobody knows until a user files an issue.
/** @param x - the first number */export function calculate(x, y, opts) {// JSDoc: 1 param. Code: 3 params.}/** @example* transform(input, { mode: "fast" })* // 'mode' option was removed in v2*/export function transform(input) {}
drift scan
23 commands, one engine, three truth surfaces — TypeScript packages, OpenAPI specs, Clarity contracts. 17 drift types across 4 categories: structural (JSDoc vs code), semantic (deprecation, broken links), example (code errors), and prose (stale markdown references, deprecated-API mentions).
drift scan# Extracting API spec...# Checking coverage...# Cross-referencing JSDoc vs code...# Validating examples...# Scanning prose for stale refs...
Structured, Not Prose
All commands output {ok, data, meta} JSON to stdout. Every drift issue includes filePath and line — agents read the diagnosis, then edit code directly. Detection is the tool's job. Mutation is the agent's job.
DRIFT SCANCoverage: ████████░░░░░░░░░░░░ 42%structural 7 issues (param mismatch, type drift)semantic 3 issues (broken @link, deprecation)example 4 issues (typecheck failures)prose 3 issues (stale markdown refs, deprecated mentions)17 drift issues found — each with filePath + line for agent fixes
Built for /drift
Ships as a Claude Code skill and an MCP server. Install the skill, then /drift inside any TypeScript project — or add the MCP server for tool-level access. Every primitive is individually addressable — scan is a convenience, not a gate.
/drift # status check, auto-init/drift fix # lint → fix JSDoc signatures/drift enrich # coverage → add missing JSDoc/drift review # PR documentation impact/drift release # pre-release audit/drift docs/ # scan external docs for stale refs# MCP server — drift_scan, drift_diff, drift_breaking...claude mcp add drift -- drift mcp# Machine-readable command discoverydrift --tools
Adopt It
Entry auto-detects from package.json. Three steps to a CI gate that actually catches doc regressions.
- 1
Run a scan
Full package audit — coverage, lint, prose drift, health.
Terminaldrift scan - 2
Set a baseline
Pick a coverage floor you can actually hold today.
Terminaldrift ci --all --min 80 - 3
Gate pull requests
Add the GitHub Action so regressions fail CI, not code review.
.github/workflows/ci.yml- uses: ryanwaits/drift/action@v1with:min-coverage: 80