Shell commands
verify_shell_execAllow / deny per-pattern with built-in detection for rm -rf /, curl | sh, reverse shells, and history rewrites.
Deslint is the verification layer for AI-generated code. Deterministic rules. Reproducible attestations. Runs inside the agent loop and at the merge gate.
Wires Deslint into Claude Code, Cursor, Codex, or Windsurf — auto-detects the agent config. Prefer ESLint, CLI, or the GitHub Action? See all install paths →
Cursor rewrote your checkout. Claude Code added a settings page. Codex generated the signup form. QA every AI-generated frontend in one command — design-token drift, broken responsive layouts, accessibility gaps, dark-mode regressions, and the safety basics (XSS, missing rel, sandbox) — before it goes live.
No SaaS roundtrip, no upload step, no API key. ESLint plugin + local CLI, offline-capable, air-gap friendly.
Nothing to opt out of because nothing is being collected — no usage, no rule triggers, no anonymous counts.
Every rule is pure AST pattern matching. Same input always produces the same output — the only way compliance is defensible.
Visual proof
One mockup below: dark-mode breaks. Three more — responsive reflow, contrast, and the invisible accessibility gaps — live on the proof page, with a 40-second recorded loop you can share.
AI generated hardcoded colours. The preview looks fine. Flip to dark mode and the page breaks.
deslint/dark-mode-coverageWCAG 1.4.3 · 1.4.11Auto-fix: adds dark: variantsThe self-correction loop
The @deslint/mcp server speaks the Model Context Protocol over stdio — the same transport Cursor and Claude Code already use. Your assistant calls verify_before_write with the candidate file content, gets back passed + violations + a recommendedAction, and corrects its own output before the file is written to disk — not after.
Built for agent throughput. In-process Linter.verify (no temp file, no engine spin-up), preloaded on startup, with module-level caches. Cold start ~1s; warm calls 3–7ms; identical-content re-checks ~0.05ms with cached: true. The /deslint-fix prompt template hard-caps verify at twice per file per turn — never an indefinite retry loop.
Your AI stays on your terms. Deslint itself runs zero LLMs — it's the deterministic check in the loop, not another model in the stack.
verify_before_write · verify_shell_exec · analyze · fix · compliance · budget · stats
cached config + in-process Linter.verify · no engine spin-up
stdio transport · no network · no LLM
Set up deslint for your AI coding agent
The same MCP gate that pre-checks file writes now pre-checks the other ways an agent touches your machine. Your AI calls verify_shell_exec before running any command. Deslint reads .deslint/policy.yml and returns allow / warn / deny in under a millisecond. Same input, same verdict. Same policy file covers every interceptor as it ships.
verify_shell_execAllow / deny per-pattern with built-in detection for rm -rf /, curl | sh, reverse shells, and history rewrites.
verify_outbound_requestAllowlist hosts the agent may call; block private/loopback/metadata IPs (SSRF) at runtime.
verify_file_readConfine reads to project root; flag .env, secrets directories, and credential stores.
verify_secret_accessIntercept process.env.* reads; flag access to unallowlisted secret keys at runtime.
verify_git_opBlock force-push to protected branches; block history rewrites and tag deletes.
cached policy + result · in-process regex
rm -rf / · curl|sh · reverse shell · history rewrite · …
local YAML policy · stdio MCP · no network
One engine, every surface
Configure Deslint once in your flat config. Every surface — IDE, terminal, GitHub Action, and the MCP agent loop above — runs the same deterministic rule engine against the same config. No duplicated rules, no divergent results, no "it passed locally" drift.
01 · In your editor
ESLint v10 flat config plugin. Drop into any existing setup — no new toolchain, no peer-dep war. Errors and autofixes appear in Cursor, VS Code, WebStorm, and every ESLint-aware IDE instantly.
#1a5276 — use bg-primary insteadbg-[#1a5276] with bg-primary02 · In your terminal
One command scans every file, produces a 0–100 Design Health Score, and tells you what to do next: auto-fix low-risk drift, decide token candidates, review WCAG risks, or start with the highest design debt.
03 · In your pull requests
GitHub Action runs the same engine as your local scan. Posts a score, inline review comments, and a Fix Plan that separates auto-fixable drift from token decisions and accessibility merge risks.
Real OSS proof
We cloned shadcn-ui/ui, ran the published npm package, then rendered the captured terminal output into this short video. No synthetic repo, no invented numbers.
deslint fix --all.What it catches
AI code compiles. It passes your tests. It renders. Then it ships a hardcoded Stripe key, a SQL string concatenated with req.body, a useEffect(async…) that leaks subscriptions, a contrast ratio that fails an audit, and a redirect to req.query.next. Deslint catches all of it before the commit lands.
Arbitrary hex values, `text-[#abc]` escapes, off-palette tokens. Maps every color back to your Tailwind config or W3C tokens.
no-arbitrary-colorsno-inline-stylesOff-scale padding, margins, and gaps. Enforces your 4/8px grid — no more `p-[13px]` creeping in.
no-arbitrary-spacingFont sizes outside your type scale, mixed weights, arbitrary line heights — hierarchy that reads like a ransom note.
no-arbitrary-typographyheading-hierarchyMissing mobile breakpoints, desktop-only flex rows, fixed widths. Catches layouts AI forgot to make responsive.
responsive-requiredno-magic-numbers-layoutMissing alt text, bad contrast, label-less inputs, no focus states, heading skips. Mapped to WCAG 2.2 + 2.1 AA criteria.
image-alt-texta11y-color-contrastform-labelsHardcoded light-only colors, backgrounds without `dark:` variants, text that vanishes on a dark theme.
dark-mode-coverageProvider-fingerprinted API keys (AWS, GitHub, Stripe, Google, Slack, OpenAI, Anthropic, JWT, PEM) plus high-entropy literals bound to a secret-named identifier.
no-hardcoded-secretsSQL built by `+` concat, `child_process.exec` with a `${path}`, `eval(req.body.code)`, `fetch(req.body.url)`, and `fs.readFile(req.query.file)`.
no-sql-injectionno-shell-injectionno-evalno-ssrfno-path-traversalMissing httpOnly/secure/sameSite on cookies, `cors({ origin:"*", credentials:true })`, `rejectUnauthorized:false`, JWTs minted without `expiresIn`.
secure-cookiesno-permissive-corsno-disabled-tlsrequire-jwt-expiryNew in v0.10 — the Agent Action Firewall pre-gates the shell commands your AI proposes. `rm -rf /`, `curl … | sh`, reverse shells, and `git push --force` are denied before they run, with a deterministic verdict in under a millisecond.
verify_shell_execfirewall:builtin-checks`useEffect(async …)` (cleanup never runs), async Express handlers with no try/catch, `Object.assign(user, req.body)`, `throw new Error("not implemented")`, `fetch("http://localhost:3000")` shipping to prod.
no-async-useeffectno-floating-promise-handlerno-unsafe-mass-assignmentno-placeholder-codeno-hardcoded-localhostWhat deslint checks
Design, accessibility, runtime safety, and agent-action gating — ten categories of check that ESLint, type-checkers, and security scanners don’t cover on their own. One config, enforced in-editor, in CI, and deterministically.
Arbitrary hex colors, spacing, radius, z-index, and type scale get flagged and rewritten to your design tokens.
Every accessibility violation cites the exact success criterion it fails — no guessing which spec line applies.
Fixed widths, missing breakpoints, and unhandled overflow get caught before they break on a real phone.
Every surface color is checked for its paired dark: variant, so themes don’t ship half-finished.
Buttons, inputs, and form controls are audited for hover, focus-visible, disabled, and error-state coverage.
Hardcoded API keys, SQL/shell injection, path traversal, SSRF, open redirects, weak crypto, and disabled TLS — caught in the same lint pass.
Pre-execution gating for shell commands the agent proposes. Built-in detection for rm -rf /, curl|sh, reverse shells, and history rewrites — sub-1ms warm.
Splatting `req.body` into a model is flagged; route handlers without an async error guard are caught before they hang production.
`process.env.SECRET` reads from `"use client"` files, server-only imports in client bundles, and JSX hydration-mismatch sources all get caught.
Deterministic rewrites auto-apply; anything context-dependent becomes a suggestion, not a silent edit to your code.
Drop into any Tailwind project. Works with React, Vue, Svelte, Angular, and HTML. Local, deterministic, zero cloud.