chore(deps): update dependency ultracite to v7.10.3 - #182
Conversation
@spectrum-ts/core
@spectrum-ts/elysia
@spectrum-ts/express
@spectrum-ts/fastify
@spectrum-ts/hono
@spectrum-ts/imessage-local
@spectrum-ts/imessage
@spectrum-ts/slack
spectrum-ts
@spectrum-ts/telegram
@spectrum-ts/terminal
@spectrum-ts/whatsapp-business
commit: |
40a3c73 to
67a4a67
Compare
9ecc8be to
c8b7f4b
Compare
| "publint": "^0.3.21", | ||
| "turbo": "^2.10.0", | ||
| "ultracite": "7.8.4", | ||
| "ultracite": "7.9.4", |
There was a problem hiding this comment.
Lint bump fails existing loops
High Severity
Bumping ultracite to 7.9.4 pulls Biome preset changes that make noIncrementDecrement an error. Existing for-loop i++ / depth++ usages remain in the tree, so ultracite check (the CI check job) is likely to fail without source or override updates.
Reviewed by Cursor Bugbot for commit c8b7f4b. Configure here.
c8b7f4b to
492d7bf
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 492d7bf. Configure here.
| "publint": "^0.3.21", | ||
| "turbo": "^2.10.0", | ||
| "ultracite": "7.8.4", | ||
| "ultracite": "7.10.0", |
There was a problem hiding this comment.
Package.json sort assist breaks check
High Severity
Updating ultracite to 7.10.0 enables Biome's useSortedPackageJson assist, which enforces a specific key order in package.json files. Our existing root and workspace manifests do not conform to this order, causing ultracite check to fail.
Reviewed by Cursor Bugbot for commit 492d7bf. Configure here.
492d7bf to
d403152
Compare
d403152 to
1e6d1ce
Compare
1e6d1ce to
c23fa27
Compare


This PR contains the following updates:
7.8.4→7.10.3Release Notes
haydenbleasel/ultracite (ultracite)
v7.10.3Compare Source
Patch Changes
a1fa9c4: Replace the hand-rolled packageexportsmap matching in the config-resolution doctor check with the resolve.exports library, which implements Node's fullPACKAGE_TARGET_RESOLVEalgorithm (wildcard patterns, key-order precedence, conditional exports, and array fallbacks). The manualnode_moduleswalk is kept intentionally — it exists to avoid Bun's auto-install cache resolving specifiers the project's ownnode_modulescan't.414ea80: Replace the hand-rolled monorepo workspace scan in framework detection with the find-workspaces library. Workspace declarations from package.json (array and yarn-classic object form) and pnpm-workspace.yaml — including negated globs — are now resolved by the library instead of manual pattern collection and globbing, and lerna/bolt monorepos are picked up as well.a9a1989: Replace the hand-rolled upward directory walks infindNearestFileanddetectLinterwith the empathic library'sfind.any, which checks candidate names in order within each directory before moving to the parent — the same per-directory precedence the previous implementation enforced manually.27b2707: Use magicast to update ESM lint-staged config files duringultracite init. The config is now edited as an AST instead of being imported and re-serialized, so comments and function-valued entries elsewhere in the config survive the update, and the user's config code is no longer executed. If the Ultracite glob pattern is already owned by a non-array value, or the config isn't a mergeable object literal (e.g.defineConfig(...)), init warns and leaves the file untouched instead of rewriting it. CommonJS configs keep the previous behavior.f2529b8: Rewrite the agent-fix progress renderer on top of log-update, cli-truncate, and string-width. log-update now owns the in-place block rewriting that was previously done with manual cursor-up/clear-line escape sequences, and line truncation is measured by display width instead of code units — so lint messages containing emoji or CJK text can no longer overflow the terminal row and corrupt the animated block.277b9d6: Replace the hand-rolled child-process handling in the agent fix runner with execa. The timeout → SIGTERM → grace period → SIGKILL escalation, stderr capture, and spawn-failure handling now use execa'stimeoutandforceKillAfterDelayoptions, which are battle-tested across platforms (including Windows kill semantics the manual implementation didn't cover). Behavior is unchanged: agent runs still time out after 5 minutes, escalate to SIGKILL after a 10-second grace period, and report a capped stderr tail.1614a80: Drop the direct cross-spawn dependency: all synchronous process spawning (linter runs, tool version checks, editor extension installs, skill installs) now goes through a small adapter over execa's sync API, which owns the Windows spawn semantics cross-spawn provided. The adapter preserves the spawnSync result shape (status/signal/error/stdout), always disables shell interpretation, and always decodes output as UTF-8. execa was already a dependency for the agent fix runner, so this consolidates on one process-spawning library.ac114b4: Replace the glob dependency with fast-glob for the tsconfig.json scan during init. fast-glob was already in the dependency tree via find-workspaces, so this drops glob's transitive dependencies (minipass, path-scurry, etc.) from the install without changing behavior.v7.10.2Compare Source
Patch Changes
1c48c68: Enable Tailwind CSS class sorting (sortTailwindcss) in the Oxfmt preset. Classes inclass/classNameattributes and inclsx,cva,tw,twMerge,cn,twJoin, andtvcalls are now sorted using the same algorithm asprettier-plugin-tailwindcss, matching the behavior of the Prettier preset (which always loads the Tailwind plugin) and the Biome preset'suseSortedClassesrule. Projects without Tailwind installed are unaffected beyond class strings being sorted against the default theme, and oxfmt versions older than 0.35.0 ignore the option.dc78be4: Stop sorting TanStack route option keys in route files. TanStack Router's route option types are order-sensitive (head/componentinferloaderDatafrom properties declared before them), so the BiomeuseSortedKeyssource action rewrotecreateFileRouteliterals into an order that breaks type inference (loaderDatabecomesnever). The Biome TanStack preset now disablesuseSortedKeysfor route files, and the oxlint TanStack preset disablessort-keysthere so route files aren't caught between it andreact-doctor/tanstack-start-route-property-order.v7.10.1Compare Source
Patch Changes
d018b7f: Fix several agent fix mode (fix --claude/--codex) issues: runs no longer abort with ENOBUFS when linter JSON output exceeds 1MB, user-supplied format/reporter flags can no longer override the JSON reporter and break parsing, a stuck agent process is force-killed 10 seconds after the timeout instead of hanging forever, and the progress renderer no longer garbles TTY output when file paths and rule names exceed the terminal width.d018b7f: Fix Biome config migration leaving the legacy bare"extends": ["ultracite"]form in place, which breaks Biome's module resolution since the package has no root export. It's now mapped toultracite/biome/core.d018b7f: Fixultracite doctorreporting spurious failures: config checks now walk up parent directories (matchingcheck/fixand the linters themselves) so monorepo packages inheriting a root config pass,.oxlintrc.jsonis accepted as a valid oxlint config (with a migration suggestion), and Prettier/Stylelint configs declared viapackage.jsonkeys are recognized.d018b7f: Fixultracite initcorrupting existing Prettier/Stylelint/ESLint configs by writing an ESM module into JSON/YAML/TOML/CJS config files (e.g..prettierrc,eslint.config.cjs). Updates now write the default.mjsconfig instead and remove the incompatible file so it can't shadow the new one.d018b7f: Fixultracite check/fixmisrouting space-separated flag values (e.g.--max-warnings 10) into the file list, which scrambled the underlying linter invocation and made formatters fail on bogus targets. Positional files listed before a--separator are also kept as lint targets instead of being reclassified as passthrough, which could silently widen formatter runs to the whole project.d018b7f: Fix Lefthook and pre-commit YAML updates silently doing nothing on common config shapes: the Lefthook job is now inserted correctly whenjobs:isn't the first key underpre-commit:(and no longer matches ajobs:key in a different hook),repos: []in.pre-commit-config.yamlis handled, and shapes that can't be safely edited produce a warning instead of writing the file back unchanged.d018b7f: Fix the Husky integration overwriting an existing.husky/pre-commithook:ultracite initranhusky init, which unconditionally replaces the hook withnpm test. It now runs plainhuskyto set up the hooks infrastructure without touching the hook file.d018b7f: Fixultracite initdestroying user files it couldn't parse or merge: unparseabletsconfig.jsonfiles are no longer replaced with a minimal config, unparseable.vscode/.zedsettings are no longer overwritten wholesale, and lint-staged configs with function-valued entries are left untouched — all now warn and skip instead.d018b7f: Fix re-runningultracite initon an oxlint setup silently enabling the full js-plugins preset — the previously selected JS plugins are now preserved when no new selection is made. Init also no longer flips an explicit"type": "commonjs"in package.json to"module"; it warns instead.d018b7f: Fix switching linters removingstorybookfrom the project's dependencies. It was swept into the removal set as a peer ofeslint-plugin-storybook, but it's a user-facing tool a project may use independently of linting.d018b7f: Fix Stylelint target generation dropping directories with a dot in their name (e.g.app.web) and producing non-matching globs from Windows-style backslash paths. Framework detection also handles negated workspace patterns (!packages/legacy) again.d018b7f: Fix the CLI becoming a silent no-op (exiting 0 without linting anything) when a genericTESTenvironment variable is set, as is common in CI matrices. The internal test guard now usesULTRACITE_TEST.36c7b80: Move @typescript-eslint/utils from dependencies to devDependencies. It was accidentally shipped as a runtime dependency in 7.9.0, pulling eslint and the typescript-eslint packages into every consumer's install (including oxlint-only setups) via npm's automatic peer dependency installation. Nothing in the published package imports it — it only exists to support the workspace-internal rule-parity script.v7.10.0Compare Source
Minor Changes
cd0a36c: Add--claudeand--codexflags toultracite fix. After the normal autofix pass, remaining diagnostics are handed to the Claude Code or Codex CLI non-interactively, one agent run per affected file, with a live per-issue spinner that flips to ✓/✗ once the fix is verified by a re-lint. Fixes that don't survive verification are retried (up to 3 attempts per file) with the fresh diagnostics and feedback that the previous approach failed. Works with all three linter modes (Oxlint, Biome, ESLint); exits non-zero if any issues remain, matching the plainfixcontract.e089510: Scope React Doctor's framework-specific rules to per-framework add-on presets (#752)The
ultracite/oxlint/js-pluginspreset no longer enables React Doctor'snextjs-*and TanStack (query-*,tanstack-start-*) rules for every consumer. Rules likenextjs-no-img-elementandtanstack-start-no-anchor-elementfire on plain<img>/<a>JSX and recommend framework replacements, which falsely errored in Vite + React and other non-Next/non-TanStack projects.Those rules now live in two new add-on presets:
ultracite/oxlint/next/js-pluginsultracite/oxlint/tanstack/js-pluginsultracite initwires the matching add-on automatically when you select the framework together withoxlint-plugin-react-doctor. If you manageoxlint.config.tsby hand and use Next.js or TanStack, add the matching add-on preset toextendsalongsidejs-pluginsto keep those rules — or re-runnpx ultracite init.Also fixes re-running
initon a config that already extendsjs-pluginsproducing a duplicateimport jsPluginsdeclaration.Patch Changes
3320cd8: Update Biome to 2.5.6. No stable (non-nursery) rules were added, removed, or promoted between 2.5.3 and 2.5.6, so the preset configs are unchanged.477cd6e: Update ESLint to 10.8.0 and all ESLint plugins to their latest versions. Highlights:eslint-plugin-react-doctor0.9.3: the react preset expands from 149 to 417 rules, adopting the upstreamrecommendedset (react-router, three.js/r3f, ink, motion, remotion, zustand/valtio/mobx, and more) while excluding rules that duplicate already-enabledreact,react-hooks, andjsx-a11yrules. The next preset gainsnextjs-async-dynamic-api-not-awaitedandnextjs-metadata-url-consistency; the tanstack preset gainstanstack-start-missing-scripts,query-floating-mutate-async, andquery-no-mutation-in-effect-as-read.eslint-plugin-unicorn72: addsno-missing-local-resource,no-multiple-promise-resolver-calls,no-shorthand-property-overrides,no-transition-all,no-unnecessary-string-trim,no-useless-re-export,prefer-then-catch, andrequire-frontmatter-fields. CSS-only rules are excluded from the preset since they fail config validation for JS files.eslint-plugin-sonarjs4.2: adds 11 rules includingno-fixed-wait-in-tests,parameterized-tests,assertions-in-test-cases,prefer-native-lodash-alternative, andexplicit-test-skip.typescript-eslint8.65:@typescript-eslint/no-loop-funcand@typescript-eslint/no-restricted-importswere deprecated upstream in favor of the base rules, which now apply to TypeScript files.eslint-plugin-astro3: removesastro/no-omitted-end-tagsandastro/valid-compile.eslint-plugin-svelte3.22: addsno-bind-value-on-checkable-inputsandno-conflicting-module-names;no-restricted-html-elementsis now off because its schema requires a user-supplied element list.@angular-eslint/eslint-plugin22.1: addsinject-at-topandprefer-service-decorator.b81578b: Fix the useSortedPackageJson action not being executed by turning on assist actions for package.json-like files.9ec454a: Update oxlint to 1.76.0 and oxfmt to 0.61.0. New stable rules added to the presets:oxc/bad-match-all-arg,id-denylist,node/exports-style(core),react/function-component-definitionwith arrow-function components (react), andvitest/padding-around-test-blocks(vitest).node/no-top-level-awaitis off — top-level await is idiomatic in ESM, Astro frontmatter, and build scripts — and the ESLint preset'sn/no-top-level-awaitis now off to match. No rules were removed or promoted out of nursery.ba61c02: Fix generated oxlint.config.ts accessing plugin.name on ExternalPluginEntry without narrowing the string form, which caused a TypeScript error in projects that type-check the config (#753)v7.9.4Compare Source
Patch Changes
f480c12: Upgrade Biome to 2.5.3 to fix the LSP scanner deadlock (#10845) where editors get stuck on "Biome is scanning the project".1d70c40: Fail fast with an actionable message when Biome can't resolveultracite/biome/core. Biome resolves that config out of the project'snode_modules, so it errors with an opaque "module not found" whenever Ultracite isn't installed there — a statenpx ultracite check/bunx ultracite checkhide, because they run the CLI from a temp cache regardless.checkandfixnow detect it before invoking Biome and say what's actually wrong, anddoctorverifies that Ultracite resolves rather than just appearing inpackage.json(#750).38d10bc: Move Biome'snoUnknownAttributerule out of the core preset and into thereactpreset. The rule only recognises React's JSX attribute names, so projects using Solid, Svelte, Vue, or Qwik were incorrectly flagged for framework-standard attributes such asclass.cf723bd: Add interactive and non-interactive selection for optional Oxlint JS plugins during init.v7.9.3Compare Source
Patch Changes
dc6d760: Disable then/no-unpublished-importrule in the ESLint core config. This rule flags imports of packages that aren't listed as published dependencies, but it produces a lot of false positives in practice, so it's now turned off.15ecfba: Fixultracite init --linter eslintinstalling an unusable toolchain. The generated ESLint config importseslint-plugin-storybookunconditionally (which requires thestorybookpeer) and the generated Stylelint config extendsstylelint-config-standard/stylelint-config-idiomatic-order/stylelint-prettier, but none of those packages were installed — so a fresh ESLint setup failed to load with "Cannot find package 'storybook'" or "Could not find stylelint-config-standard". These four packages are now installed with the ESLint linter.2f73a41: Upgrade to oxlint 1.73.0 and oxfmt 0.58.0, and enable the new lint rules they introduce:no-unreachable-loop,unicorn/explicit-timer-delay, andunicorn/no-confusing-array-with.83b2783: Add an[astro]formatter mapping (astro-build.astro-vscode) to the oxlint VS Code editor settings generated byultracite init, since oxfmt doesn't format.astrofiles.d186c53: Move every JS-plugin-based rule set out of the Oxlint core and framework presets and into a single opt-inultracite/oxlint/js-pluginspreset. This coverseslint-plugin-githubandeslint-plugin-sonarjs(previously in core) as well asoxlint-plugin-react-doctor(previously bundled into thereact,next, andtanstackpresets). The core,react,next, andtanstackpresets now run entirely on Oxlint's native Rust rules, so new setups no longer install those dependencies and no longer pay the slower JS-plugin lint pass. To keep the extra ESLint-parity and React Doctor rules, installeslint-plugin-github,eslint-plugin-sonarjs, andoxlint-plugin-react-doctorand extendultracite/oxlint/js-pluginsalongsidecore(and your framework preset).057753e: Add performance benchmarks forultracite check/ultracite fixacross all three providers (oxlint, biome, eslint). A new CI job builds the PR and its base branch on the same runner, benchmarks them interleaved, and fails on a statistically significant regression (median ratio > 1.25x with Mann-Whitney U p < 0.05) so config changes can't silently slow the linters down again.v7.9.2Compare Source
Patch Changes
c335a1f: Add**/node_modulesand**/.gitto the shared ignore patterns. oxlint only skipsnode_moduleswhen a.gitignorelists it, so in projects without one,ultracite fixwould lint and autofix files insidenode_modules— corrupting installed packages (e.g. rewritingvarenum wrappers intypescript/lib/typescript.jsto self-referencingconst, causing "Cannot access 'Comparison' before initialization" when oxlint loads eslint-plugin-sonarjs). Fixes #737.v7.9.1Compare Source
Patch Changes
ecd10cc: Disablesonarjs/no-implicit-dependenciesandgithub/no-implicit-buggy-globalsin the oxlint and ESLint presets. Both produce false positives through oxlint's JS plugin bridge:no-implicit-dependencieshas no dependency-manifest resolution so it flags builtin (bun:test) and workspace imports as missing dependencies, andno-implicit-buggy-globalsmisreads module-scoped declarations such as Astro frontmatter as implicit globals.c76f59d: Disablesonarjs/file-name-differ-from-classin the oxlint and ESLint presets. It fires on any file whose name differs from an exported class, which is noise for the many config and module files that export objects rather than classes.29e30ce: Fold the github and sonarjs rules into the oxlint core preset. The standaloneultracite/oxlint/githubandultracite/oxlint/sonarjspresets are removed — ultracite ships framework presets, not individual plugins. Their rules now live inultracite/oxlint/core, so every oxlint setup gets eslint-plugin-github and eslint-plugin-sonarjs through oxlint's JS plugin bridge, matching how the ESLint preset already bundles them into core.This is a breaking change to generated configs:
ultracite/oxlint/githubandultracite/oxlint/sonarjsno longer exist. Re-runultracite initto regenerateoxlint.config.ts.Also fixed: nine sonarjs rules (
async-test-assertions,hooks-before-test-cases,no-duplicate-test-title,no-empty-test-title,no-floating-point-equality,no-forced-browser-interaction,no-trivial-assertions,prefer-specific-assertions,super-linear-regex) that exist in eslint-plugin-sonarjs but that oxlint's JS plugin bridge does not register. Naming them made oxlint hard-fail config parsing, which brokeultracite fix/checkfor oxlint projects using the sonarjs preset. They are omitted from oxlint core (still enabled in the ESLint preset), and a test now runs oxlint against core to catch this class of regression.The React Doctor, github, and sonarjs plugins are installed into your project's devDependencies at init (as the ESLint plugins already were), rather than bundled as dependencies of ultracite — oxlint resolves JS plugin specifiers from the project root, so they must be installed there directly.
8a4291f: Upgrade to Oxlint 1.72.0 and Oxfmt 0.57.0. Oxfmt 0.57 adds native CSS and GraphQL formatters. The five new non-nursery Oxlint rules from the 1.71/1.72 releases are already covered by the presets (node/no-sync,node/no-mixed-requires,unicorn/prefer-number-coercion,unicorn/max-nested-calls,vue/no-async-in-computed-properties). The markdown:::container-directive fence patch (which keepsproseWrap: "never"from folding fences into prose) was regenerated against the 0.57 bundle.v7.9.0Compare Source
Minor Changes
aea7fc0: Update Biome to 2.5.2 and enable the newly-stabilized rules. This adds coverage for the rules promoted out of nursery in Biome 2.5.0, includingnoShadow,noUnnecessaryConditions,noUnusedInstantiation(formerlynoFloatingClasses),useArrayFind,useDestructuring,useGlobalThis,useErrorCause,noNestedPromises, GraphQL validation rules, and the recommended Vue/Next.js domain rules.2687cf9: Align the ESLint and Biome presets with the oxlint preset, which is now the benchmark for rule decisions across linters. ESLint: rules that oxlint deliberately disables are now off (no-console,no-continue,id-length,new-cap,max-depth,no-implicit-coercion,no-underscore-dangle,init-declarations,n/no-sync,promise/always-return,promise/catch-or-return,import-x/no-commonjs,import-x/no-dynamic-require,import-x/no-nodejs-modules,import-x/unambiguous,import-x/no-anonymous-default-export,@typescript-eslint/explicit-member-accessibility,@typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-require-imports, and theunicornrulesexplicit-length-check,max-nested-calls,no-process-exit,prefer-global-this,prefer-string-raw,prefer-top-level-await);consistent-type-definitionsnow enforcesinterfaceinstead oftype, matching oxlint and Biome;no-voidallows statement position to coexist withno-floating-promises;import-x/no-named-as-defaultis enabled; andcurlyandno-unexpected-multilineare re-enabled pasteslint-config-prettier. Biome:noAwaitInLoopsandnoIncrementDecrementare now errors and theuseSortedKeysassist is on (matchingno-await-in-loop,no-plusplus, andsort-keysin the other presets), whileuseGlobalThisis off (matchingunicorn/prefer-global-this).73c1993: Require ESLint 10 for ESLint setups. The plugin suite upgrade (notablyeslint-plugin-unicorn70 andeslint-plugin-astro2) requires ESLint 10, butultracite initstill installedeslint@^9.0.0, which crashed at config load time. Init now installseslint@^10.0.0and@eslint/js@^10.0.0, and the presets are fixed for ESLint 10 compatibility:settings.react.versionis pinned to19.0.0instead of"detect"(detection uses an API removed in ESLint 10),react/jsx-filename-extensionandreact/forward-ref-uses-refare disabled (their implementations use removed APIs; the former is already off in the oxlint preset and the latter is covered byreact-doctor/no-react19-deprecated-apis), the react config re-applieseslint-config-prettierso JSX formatting rules stay off (several crash under ESLint 10), andimport-x/no-unused-modulesis disabled (it is a warning-emitting no-op under ESLint 10). Note that some plugins (eslint-plugin-github,eslint-plugin-react,eslint-plugin-jsx-a11y,eslint-plugin-solid,@tanstack/eslint-plugin-start) have not yet updated their declared peer ranges to include ESLint 10 even though they work at runtime, so strict package managers may report peer dependency warnings.4cfdf3d: Addeslint-plugin-jsdocto the ESLint preset. The oxlint preset already enforces a set of jsdoc rules, but the ESLint preset had no jsdoc coverage at all. The plugin is now installed byultracite initfor ESLint setups and enables the same rule selection the oxlint preset enforces (check-access,check-property-names,check-tag-names,empty-tags,implements-on-classes,no-defaults, and therequire-*description/name/type rules), keeping the two presets in lockstep.0b8fc12: Upgrade the ESLint plugin suite and enable the new rules that ship with it. Notable bumps:eslint-plugin-unicorn64 → 70 (adds a large batch of new correctness and quality rules),eslint-plugin-astro1 → 2 (addsno-omitted-end-tags, now requires ESLint 10),eslint-plugin-sonarjs4.0 → 4.1 (adds test-assertion and ReDoS rules likesuper-linear-regex),eslint-plugin-svelte3.19 → 3.20 (addsno-at-const-tags), plus@typescript-eslint,eslint-plugin-import-x,eslint-plugin-n,@vitest/eslint-plugin, and others. Two Unicorn rules that were renamed are re-mapped in the config (prefer-dom-node-dataset→dom-node-dataset,prevent-abbreviations→name-replacements). Two new Unicorn rules are disabled:prefer-temporal(sinceTemporalstill lacks broad runtime support) andno-asterisk-prefix-in-documentation-comments(it fights the conventional JSDoc comment style).4440393: Bring the oxlint preset closer to ESLint parity with two new presets that run ESLint plugins through oxlint's JS plugin support:ultracite/oxlint/github(eslint-plugin-github) andultracite/oxlint/sonarjs(eslint-plugin-sonarjs, 187 rules — type-aware rules are excluded since the JS plugin bridge provides no type information, andno-reference-erroris off because the bridge provides no globals).ultracite initnow adds both presets to generated oxlint configs and installs the two plugins; existing configs are untouched until the nextinit, and either preset can be dropped fromextendsto opt out (the plugins add roughly 1–3s to a lint run for the JS runtime bridge). Rule decisions mirror the oxlint benchmark in both directions: the ESLint preset now disablessonarjs/file-header(it errored on every file),sonarjs/arrow-function-convention(fights the formatter),sonarjs/cyclomatic-complexity,sonarjs/max-lines,sonarjs/max-lines-per-function,sonarjs/nested-control-flow(duplicates of core rules the preset disables),sonarjs/shorthand-property-grouping(conflicts withsort-keys), andgithub/no-dataset(conflicts withunicorn/prefer-dom-node-dataset), and setssonarjs/cognitive-complexityto 20 to match Biome'snoExcessiveCognitiveComplexity. Switching linters withinitno longer removes dependencies that the newly selected linter still needs.f7025b1: Extend cross-linter parity to the framework presets and add an automated parity check. The oxlint react preset now explicitly lists all 102 non-nursery react/react-perf/jsx-a11y rules (previously only ~20 were configured, so most a11y and correctness rules silently never ran) and the next preset lists all 21 nextjs rules, with decisions matching the ESLint presets. The revived exhaustiveness test (theoxlint --rulesmarkdown output it parsed is empty as of oxlint 1.72, so it was passing vacuously) also caught five newly stabilized rules which are now enabled:getter-return,no-unreachable,oxc/branches-sharing-code,unicorn/prefer-export-from, andunicorn/prefer-single-call. ESLint preset fixes that fell out of the audit:no-loss-of-precisionandno-duplicate-importsare re-enabled for TypeScript files (their@typescript-eslinttwins were removed in v8, leaving TS uncovered),no-duplicate-importsgetsallowSeparateTypeImportsto match oxlint, the react/vue configs now only re-apply thereact/-vue/-prefixed entries ofeslint-config-prettierso they can't clobber unrelated rules, the svelte preset keeps the formatting rules disabled thateslint-plugin-svelte's own prettier preset lists, andastro/semiis off (Prettier owns formatting). A newcompare-rule-parityscript runs as part ofvalidate:configs: it resolves the effective ESLint rule sets with ESLint's own config resolution, normalizes names to oxlint's, and fails on any divergence not recorded in an explicit allowlist — currently just two entries (sonarjs/no-reference-error,unicorn/number-literal-case), both with documented reasons.223233f: Add React Doctor rules to the ESLint and Oxlint React, Next.js, and TanStack presets. This enables React Doctor's own rules — the "You Might Not Need an Effect" family (no-fetch-in-effect,no-derived-state,no-mirror-prop-effect, etc.) plus its render-performance, hydration, server-component, security, and framework-specific rules — viaeslint-plugin-react-doctorand theoxlint-plugin-react-doctorJS plugin. Rules that React Doctor ports fromeslint-plugin-react,eslint-plugin-react-hooks, andeslint-plugin-jsx-a11yare intentionally left off to avoid duplicate diagnostics with the plugins Ultracite already ships.Patch Changes
d247ff2: Migrate stale linter and formatter configuration when switching toolchains during init. Runningultracite initnow removes config files and dependencies for unselected Biome, ESLint/Prettier/Stylelint, or Oxlint/Oxfmt setups before writing the selected toolchain config.e24068b: Sortpackage.jsonkeys when using BiomeConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.