01
Who catches a raw hex in className="bg-[#1a5276]"?
Stylelint never sees this. It runs on CSS files, not JSX string literals, so a Tailwind arbitrary value inside a React className is invisible to it — even with postcss-lit or template parsers, the string isn’t CSS yet at lint time.
Deslint’s no-arbitrary-colors rule flags it at the JSX level, before Tailwind expands it. The full story is in the hidden cost of Tailwind arbitrary values.
Verdict: deslint.
02
Who enforces ordering inside an authored tokens.css?
Stylelint. This is its home turf. If you author CSS custom properties, keep a design-token file, or maintain a utility stylesheet, stylelint’s rule ecosystem — declaration-block-no-redundant-longhand-properties, order/properties-order, selector-max-specificity — is unmatched.
Deslint doesn’t parse CSS. It deliberately doesn’t compete here. If someone sells you “replace your stylelint,” they’re selling you something worse.
Verdict: stylelint.
03
Who catches a style={{ color: '#fa0a3e' }} inline prop?
Stylelint can, but only if you wire up a template-literal plugin and the value is in a tagged template or CSS-in-JS string. A plain object-literal style prop on a React element is outside its scope.
Deslint’s no-inline-styles and no-raw-hex were written specifically for this case — it’s the single most common drift pattern in AI-generated React code.
Verdict: deslint.
04
Who imports your Figma tokens and enforces them?
Neither does it end-to-end, but the gap is narrower for deslint. Deslint’s .deslintrc.json accepts a design-system config (palette, spacing scale, type scale) which the rules then enforce across JSX. Tokens Studio / Style Dictionary export to that shape in one step.
Stylelint can lint custom properties you’ve already authored, but it has no concept of “this component used a color that isn’t in the palette.” That’s a JSX-level question.
Verdict: deslint, for the cross-component enforcement. Stylelint for the token file itself.
05
Who integrates with AI coding agents (Claude Code, Cursor, Windsurf)?
Deslint ships an MCP server that plugs directly into Claude Code, Cursor, Windsurf, and Codex. The agent can run analyze_project, enforce_budget, and compliance_check before it finalizes a generation — the lint happens inside the authoring loop, not after.
Stylelint is a post-hoc linter with no MCP surface. You can wire it into a CI gate or editor plugin, but the agent doesn’t see it during generation.
Verdict: deslint.
06
Who works with CI, editor, and SARIF/GitHub code-scanning?
Both. Stylelint has first-class editor plugins, a stable CLI, and mature CI patterns. Deslint ships an ESLint plugin, a standalone CLI (deslint scan), a GitHub Action, and SARIF output for GitHub Advanced Security and Azure DevOps.
Neither one replaces the other at the CI layer. You can (and should) run them both in the same pipeline — they gate different surfaces.
Verdict: both — they coexist cleanly.