chore(deps): update dependency ultracite to v7.11.1 - #56
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
2 times, most recently
from
August 14, 2026 05:27
d6c82ef to
cd94703
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
August 15, 2026 07:28
cd94703 to
d67f695
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
August 20, 2026 07:14
d67f695 to
5eeb836
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
August 27, 2026 09:59
5eeb836 to
5f86118
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
2 times, most recently
from
September 4, 2026 07:51
2fad031 to
516a868
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
September 6, 2026 06:58
516a868 to
a2e80e9
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
September 9, 2026 23:55
a2e80e9 to
93ff400
Compare
renovate
Bot
force-pushed
the
renovate/ultracite-7.x
branch
from
September 10, 2026 19:27
93ff400 to
a03ecd4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
7.2.4→7.11.1Release Notes
haydenbleasel/ultracite (ultracite)
v7.11.1Compare Source
Patch Changes
24b2797: Update oxfmt to 0.67.0 and re-target the markdown:::fence patch to the new dist chunk. The release changes no options; it fixes CSS/SCSS/Less comment preservation and a few JSDoc-cast edge cases in member chains.24b2797: Update oxlint to 1.82.0. The release adds and removes no rules, so the presets are unchanged apart from one new option:no-unmodified-loop-conditionnow runs withcheckConditionalExpressions: truein the oxlint and ESLint core presets, so each branch of a ternary in a loop condition must be modified inside the loop rather than only the expression as a whole.24b2797: Update the ESLint family:@angular-eslint/eslint-plugin22.5,@typescript-eslint/*8.70,eslint-plugin-solid0.18,eslint-plugin-vue10.11,eslint-plugin-jsdoc64.3.8,eslint-plugin-cypress7.0.2,@darraghor/eslint-plugin-nestjs-typed7.5.2 andprettier-plugin-astro1.0. The dynamic presets pick up the seven new rules automatically:@typescript-eslint/no-generated-empty-object-type,@angular-eslint/reactive-context-must-read-signal,vue/no-shadow-native-events, and Solid'sno-boolean-enumerated-attribute,no-store-mutation-outside-setter,no-unused-signalandno-write-in-pure-computation. Note thatprettier-plugin-astro1.0 is a rewrite on the Astro 7 Rust compiler (Node 22.12+); expect whitespace diffs on first run and mirror any customcompressHTMLvia its newastroCompressHTMLoption.24b2797: Refresh the stylelint lock to 17.15.0 and enable its newselector-no-unmatchablerule, which flags selectors that can never match (for examplelabel:checked,::before:first-childor:is(::before)).a71dda4: Stop sorting object keys across the whole TanStack presets, not just route files. TanStack Query mutation options are order-sensitive too: TypeScript infers theonMutatecontext from context-sensitive callbacks in source order, so movingonError/onSettledaboveonMutateturns the context into{}andultracite fixbroke type-correct code (TS2339: Property '...' does not exist on type '{}'). Mutation and query options live anywhere (hooks, components, colocated files), so the route-file exemption could not cover them.ultracite/oxlint/tanstacknow setssort-keystooffandultracite/biome/tanstacknow setsuseSortedKeystoofffor all files.a9db61c: Disablegithub/filenames-match-regexfor file-based route directories (**/routes/**) in the oxlint js-plugins preset, matching the existingunicorn/filename-caseexemption in the TanStack preset. TanStack Router filenames such as__root.tsx,$.tsx, andposts.$postId.tsxno longer fail the GitHub filename rule. Resolves #799.v7.11.0Compare Source
Minor Changes
d5d241f: Addultracite upgrade, and make version drift between Ultracite and its linter visible instead of a crash. Bumpingultracitewithout bumping the linter fails on the nextcheck/fixwith Biome'sFound an unknown keyerror (and the equivalent for ESLint and Oxlint), because each release enables rules from a specific linter version.ultracite upgradeinstalls the latestultracite, prints a release-notes link for the versions you crossed, then hands off to the freshly installed CLI to reinstall your toolchain at the versions that release was verified with: Biome; ESLint, Prettier, Stylelint and the plugins the preset imports; or Oxlint and Oxfmt. Optional extras already in yourpackage.json(framework plugins, Oxlint JS plugins,oxlint-tsgolint) are bumped as well. Config files are never rewritten, and the run ends with the same diagnostics asdoctor.ultracite doctornow checks the installed Biome, ESLint, Prettier, Stylelint, Oxlint and Oxfmt versions against the range this release supports. Too old fails the check and points atultracite upgrade; newer than the verified range only warns.@biomejs/biome ^2.5.0,eslint ^10.0.0,prettier ^3.0.0,stylelint ^17.0.0,oxlint ^1.79.0,oxfmt >=0.40.0.ultracite initnow installs Prettier and Stylelint from those ranges instead oflatest.Requires Biome >= 2.5.0, ESLint >= 10.0.0, Prettier >= 3.0.0, Stylelint >= 17.0.0, Oxlint >= 1.79.0 and Oxfmt >= 0.40.0.
Patch Changes
27d06f2: Update dependencies (@clack/prompts,semver,zod, ESLint plugins).d322691: Defaultultracite initto Oxlint + Oxfmt when--linteris omitted in quiet or non-interactive modec677cf5: Recommend Oxlint + Oxfmt in theultracite initlinter prompt and list it firstc5be848: Disableno-use-before-definein TanStack Router route files for the oxlint tanstack preset. File routes are mutually recursive (Routereferences the component, and the component callsRoute.useParams()), so no declaration order could satisfy the rule.v7.10.8Compare Source
Patch Changes
2a43fdd: Turn offunicorn/prefer-reflect-applyin theultracite/oxlint/anti-sloppreset. When extended afterultracite/oxlint/core, the core rule recommended rewritingFunction#apply()toReflect.apply(), which anti-slop'sno-reflect-applythen rejected, leaving no way to satisfy both. Direct-call guidance for.apply()still comes fromeslint/prefer-spreadandeslint/no-useless-call.03196df: Update@biomejs/biometo 2.5.12. Releases 2.5.10 through 2.5.12 only add nursery rules, which the Biome presets exclude, so the presets are unchanged. The releases also carry linter and formatter fixes, including fewernoUnusedVariablesfalse positives on merged interfaces, namespaces, and overload type parameters, an unsafe-by-default fix fornoThisInStatic, and a large batch of Astro expression parsing fixes.031b867: Update oxfmt to 0.66.0. The 0.65 and 0.66 releases are formatter fixes only, mainly around comment placement between a statement head and its body, suppressed statements (decorators, typecast parens, semicolons), custom side-effect groups insortImports, CommonMark list interruption in JSDoc, and trailing whitespace in YAML block scalars. The:::container-directive fence patch is re-targeted to the new markdown bundle; the patched code itself is unchanged.54affee: Update oxlint to 1.81.0. The 1.80 and 1.81 releases add no rules and remove none, so the presets are unchanged and the peer range stays at ^1.79.0. Notable fixes carried in:no-use-before-definenow runs on JS and JSX files,object-shorthandpreserves__proto__semantics,unicorn/prefer-math-min-maxno longer applies an unsafe autofix, and JS plugin diagnostics with invalid or reversed locations are clamped instead of crashing.0b058d1: Fixultracite fix --codexfailing on recent Codex CLI releases. The Codex adapter invokedcodex exec --full-auto, a flag Codex has since removed, so every attempt failed at argument parsing. It now runscodex exec --sandbox workspace-write, the equivalent non-interactive, workspace-scoped mode, which is also accepted by older Codex versions. Resolves #794.e2346bb: Update the ESLint family to latest: eslint 10.9.1, typescript-eslint 8.69.0, eslint-plugin-unicorn 74, eslint-plugin-solid 0.17, eslint-plugin-jsdoc 64.3.5, eslint-plugin-react-doctor and oxlint-plugin-react-doctor 0.9.13, globals 17.12, and the angular, nestjs-typed, next, tanstack-query, cypress, html, jest and storybook plugins. The dynamic presets pick up the new rules automatically: the solid preset gains the eleven rules added in eslint-plugin-solid 0.16 and 0.17 (removed-api,no-single-arg-create-effect,no-accessor-as-prop,valid-use-server,require-async-server-function,no-invalid-server-capture,no-browser-globals-in-server-function,no-module-scope-reactive-primitive,no-restated-default-options,prefer-onSettled-for-side-effects,prefer-structured-class), which only report Solid 2.0 issues whensettings.solid.versionis set to 2 and stay silent on Solid 1.x code; the nestjs preset gainsforward-ref-injection-should-use-wrapper-type,swagger-file-upload-should-be-documentedanduploaded-file-should-be-validated. The curated jsdoc and react-doctor lists are unchanged. No enabled rule was removed or deprecated, and the ESLint/oxlint parity check still passes.7b0456e:ultracite fixnow runs lint fixes before the formatter: oxlint before oxfmt, and ESLint then Stylelint before Prettier. A fixer can insert unformatted code, such as the bracescurlyadds, the importsconsistent-type-specifier-stylesplits, or the font names Stylelint requotes, and running the formatter first left that code unformatted until the next run. Fixer-inserted code is now formatted in the same run. The--claudeand--codexagent passes follow the same order.unicorn/no-nested-ternaryis now off in the oxlint and ESLint presets: its fixer adds parentheses that oxfmt and Prettier remove, so the two tools rewrote the file on every run. The coreno-nested-ternaryrule still reports nested ternaries.8ddc078: Enable three rules added in Stylelint 17 in the Stylelint preset:selector-no-deprecatedandselector-no-invalidreport selectors that CSS has dropped or that cannot parse, andrelative-selector-nesting-notationis set toexplicit, so nested relative selectors are written& > brather than> b. Theproperty-layout-mappings,unit-layout-mappingsandvalue-keyword-layout-mappingsrules are deliberately left off, since they reject every physical property, unit and keyword and can only autofix with a per-projectlanguageOptions.directionalitysetting. The repo's own Stylelint lock is refreshed from 16.26.1 to 17.14.1, which the config packages already required;ultracite initalready installsstylelint@latestso users are unaffected by the lock change.4609d79: Update the vendoredanti-slopOxlint plugin to upstream v0.1.2 (commite8c4880). The rule set is unchanged; this picks up a round of correctness fixes:no-known-value-wideningnow also reports known values passed into localunknown-typed type predicates,no-object-parameters,no-unknown-parameters,no-unknown-returnsandno-unknown-type-aliasesresolve scoped and transparent generic aliases (including block-scoped aliases and forward references),no-unknown-returnscoversPromiseLike<unknown>,no-unsafe-dictionary-typeallows generic constraints such asT extends Record<string, unknown>,no-runtime-typeofalways allows existence probes against"undefined",no-shape-in-symbol-namesallows static member reads such as Zod'sschema.shape, andrequire-safety-comment-for-type-assertionrejects empty justifications and gains amarkersoption (default["SAFETY"]). Upstream also added a separate opt-inanti-slop-effectplugin for Effect projects, which is not vendored.v7.10.7Compare Source
Patch Changes
15f7ae0: Add support for the Aube package manager:ultracite init --pm aubeis now accepted and projects with anaube-lock.yamllockfile are detected automatically1afc8fe: Re-declare selected Oxlint JS plugins on the root config so dependency analyzers see them.ultracite init --linter oxlint --js-plugins ...now generatesconst jsPlugins = selectJsPlugins([...])and addsjsPlugins: jsPlugins.jsPluginsto the root config (also when the fullultracite/oxlint/js-pluginspreset is extended). Knip only resolvesjsPluginsfrom the root Oxlint config and never walksextends, soeslint-plugin-github,eslint-plugin-sonarjs, andoxlint-plugin-react-doctorwere reported as unused devDependencies. Oxlint dedupes the plugin between the root and the extended preset, so linting is unchanged.Also fix
ultracite updatedropping thejs-pluginspreset fromextendswhen the config used the documentedimport jsPlugins, { jsPluginSettings } from "ultracite/oxlint/js-plugins"form: the import parser only matched bare default imports. The regenerated full-preset config keepssettings: jsPluginSettingson the root as well.20b06bf: Ignore.alchemyacross all linters and formatters. Alchemy (alchemy.run) writes local state and generated bindings to a.alchemydirectory. It is now part of the shared ignore patterns synced into Biome'sfiles.includesand imported by oxlint, oxfmt, and ESLint, and the Stylelint preset ignores it viaignoreFiles. Prettier needs no change: it already respects.gitignore/.prettierignore.6e9286c: Runlefthook installduringultracite initthrough the same spawn adapter as every other tool invocation instead ofexecSync, so it no longer goes through a shell and gets the same Windows command resolution ashusky, the linters, and editor extension installs.8b24f34: Add support for the Nub package manager:ultracite init --pm nubis now accepted and projects with anub.locklockfile are detected automatically (requires nypm ^0.6.9)240cb6b: Install into the workspace root correctly for Nub and Aube monorepos: nypm emits no root selector for them, sonub addran without-wand was refused. Ultracite now hands nypm pnpm's flag set for these pnpm-compatible CLIs, producingnub add --workspace-root --save-dev ultracite44ecbba: Add Vitest type-test files (**/*.{test-d,spec-d}.{ts,tsx,js,jsx}) to the test-file globs so the shared test relaxations and the Vitest rule overrides apply to them, and enable the Vitest plugin'stypechecksetting in the ESLint preset soexpectTypeOf/assertTypecount as assertions.7ba6bb8: Package the reusable Ultracite agent skill with the npm distribution.v7.10.6Compare Source
Patch Changes
972b946: Update the oxlint presets for oxlint 1.79: replace the removedreact/react-compilerrule with the 22 new React Compiler rules in the react preset, addjsdoc/no-blank-blocksandone-varto the core preset (mirrored in the ESLint presets), and require oxlint ^1.79.02d5bbdb: Declare thejsPluginSettingsnamed export in theultracite/oxlint/js-pluginstype declarations, so the documented (andultracite init-generated)import jsPlugins, { jsPluginSettings } from "ultracite/oxlint/js-plugins"type-checks (#773)56aef65: Refresh the toolchain versions thatultracite initinstalls into projects:@biomejs/biome2.5.9, the ESLint plugin family (including eslint-plugin-cypress 7, eslint-plugin-jsdoc 64, eslint-plugin-solid 0.15, and eslint-plugin-unicorn 73 — the dynamic presets adopt their new rules automatically), andprettier-plugin-svelte4.1.1 /prettier-plugin-tailwindcss0.8.1v7.10.5Compare Source
Patch Changes
8df6ad0: Offer the vendoredanti-slopOxlint preset duringultracite init— it now appears in the JS-plugins prompt when you pick Oxlint, and non-interactive setup accepts it via--js-plugins anti-slop. Selecting it addsultracite/oxlint/anti-slopto the generated config'sextends; since the preset is vendored inside Ultracite, nothing extra is installed.cd229e9: Bump theoxlint-plugin-react-doctorpin from^0.7.1to^0.9.12, soultracite initinstalls the current plugin. All react-doctor rules enabled by the js-plugins presets still exist in 0.9.12, and the ported rules run in curated mode via the settings shipped alongside this release (#771).e1ac886: Pin React Doctor's ported rules to their framework-aware "curated" mode (#771). react-doctor 0.9.x rewrote its ported oxc/react-refresh rules — notablyonly-export-components— with a stripped-down default mode: no framework detection, no route-file skipping, andallowConstantExportoff, so Next.js route-segment exports likeexport const dynamic = "force-static"ormetadatawere flagged as non-component exports in every route file. The ESLint react preset now setssettings["react-doctor"].portedRuleMode: "curated", and generated oxlint configs apply a newjsPluginSettingsexport fromultracite/oxlint/js-pluginson the root config (oxlint does not mergesettingsfrom extended configs, so the setting cannot ride along inside the preset). If you extend the js-plugins preset manually, addsettings: jsPluginSettingsto your root oxlint config.c27fe36: Generate oxlint configs that enable a subset of the JS plugins via a newselectJsPluginsexport fromultracite/oxlint/js-plugins, instead of inlining the filtering logic into the generated file. The inlined block contained atypeofcheck that user-side lint presets flagged (anti-slop/no-runtime-typeof, #770); the generated config is now a one-line extend, is emitted already formatted (including the previously missing blank line after imports), and re-runningultracite initmigrates existing configs with the old inlined block automatically.0616523: Update the vendoredanti-slopOxlint plugin to upstream commit446268e, picking up fixes tono-object-parametersandno-unknown-returns(respect lexical type binders in alias resolution) and a newallowInTypeGuardsoption onno-runtime-typeof. Theultracite/oxlint/anti-sloppreset enablesallowInTypeGuards, sotypeofchecks inside type predicate functions ((x): x is T) no longer need disable comments — predicates are the named-boundary pattern the rule pushes toward (dmmulroy/anti-slop#10).v7.10.4Compare Source
Patch Changes
417a85a: Add an opt-inultracite/oxlint/anti-sloppreset that ships a vendored, self-contained build of the anti-slop Oxlint plugin — fifteen rules that reject low-evidence TypeScript and JavaScript patterns (unjustified type assertions,unknownleaking through signatures,Reflect-based access, module mocking, and more). Extend it alongsideultracite/oxlint/core; nothing extra to install. The preset also turns off two core rules that conflict with anti-slop's widening checks (typescript/consistent-indexed-object-styleandunicorn/no-immediate-mutation) when extended after core.4d3fab8: Movesuspicious/useArraySortComparefrom the Biome core config to the opt-in type-aware config. The rule is in Biome'stypesdomain — it type-infers the receiver of every method call before checking the method name, which madeultracite checkup to ~260x slower on projects with expensive library types (zod, better-auth, Prisma). It now only runs when type-aware linting is explicitly enabled, alongside the other type/project-domain rules. Fixes #768.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,Configuration
📅 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.