---
changelog:
  category: Release
  version: ultracite@7.12.3
date: '2026-10-05T06:47:43Z'
seo:
  description: >-
    Add opt-in TSDoc syntax validation and public TypeScript API documentation
    checks to the Oxlint js-plugins preset. Selecting a plugin with --js-plugins
    on a…
title: ultracite@7.12.3
type: changelog
---
## Patch Changes

- f753c14: Add opt-in TSDoc syntax validation and public TypeScript API documentation checks to the Oxlint `js-plugins` preset. Selecting a plugin with `--js-plugins` on a config that extends the full `js-plugins` preset now keeps the preset's plugins.
- ade34d3: Update `@biomejs/biome` to 2.5.15. The release adds 11 nursery rules and changes no stable rules, so the Biome presets, which exclude nursery rules, are unchanged. It speeds up HTML formatting and big-file analysis, fixes Astro expression indentation and Svelte comment placement, and reports configuration errors that Biome 2.5.14 silently ignored.
- 631e0dd: Update oxfmt to 0.71.0. The release changes no options; it bundles Prettier 3.9.9 for embedded languages and fixes comment placement around assignments, JSDoc alignment and several Markdown edge cases.
- 08e83af: Update oxlint to 1.86.0 and enable its new type-aware rule, [`typescript/no-generated-empty-object-type`](https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-generated-empty-object-type.html), in the core Oxlint preset. It reports type operations such as `Pick<Data, never>` that resolve to the empty object type `{}`, matching the `@typescript-eslint` rule of the same name that the ESLint preset already enables. Like the other type-aware rules, it only runs with `oxlint --type-aware` and `oxlint-tsgolint` installed. Older oxlint releases fail to parse a config that names the rule, so the `oxlint` peer range moves to `^1.86.0`.
  
  Requires oxlint >= 1.86.0
- 2a9348c: Update the ESLint presets' plugins: `eslint` 10.12, `eslint-plugin-unicorn` 77, `eslint-plugin-jsdoc` 65, `@typescript-eslint` 8.71, `eslint-plugin-sonarjs` 4.2.2, `eslint-plugin-react-doctor` and `oxlint-plugin-react-doctor` 0.9.16, plus patch releases of the Next.js, TanStack Query, `n`, Solid and Storybook plugins.
  
  The ESLint core preset enables every non-deprecated JavaScript rule from unicorn, so it now also runs unicorn 77's 21 new JavaScript rules, including [`no-unnecessary-parameters`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v77.0.0/docs/rules/no-unnecessary-parameters.md), [`no-unsafe-json-serialization`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v77.0.0/docs/rules/no-unsafe-json-serialization.md), [`prefer-promise-static-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v77.0.0/docs/rules/prefer-promise-static-methods.md) and a set of `no-invalid-*` checks for DOM, `Intl`, `Response`, Temporal and property descriptor arguments. It also enables the new type-aware [`@typescript-eslint/no-unsafe-enum-assignment`](https://typescript-eslint.io/rules/no-unsafe-enum-assignment). Unicorn 77 moves its CSS-only rules to `eslint-cssicorn`; the preset never enabled them for JavaScript files, so nothing is lost.
- 864cde1: Raise the `eslint` peer dependency to `^10.9.0`. The ESLint core preset configures `no-unmodified-loop-condition` with `checkConditionalExpressions`, an option ESLint 10.0 to 10.8 reject, so every preset except Vue failed with `Key "rules": Key "no-unmodified-loop-condition"` on those releases even though the old `^10.0.0` range allowed them (`eslint-plugin-unicorn` also needs ESLint 10.4 or later). `ultracite init` and `ultracite upgrade` now install a release that loads the presets, and `ultracite doctor` and your package manager flag older ones. `@eslint/js`, which is no longer versioned with ESLint, keeps its own `^10.0.1` range.
  
  Requires eslint >= 10.9.0
- d7563b3: `ultracite init` now skips every prompt when you pass any of `--pm`, `--editors`, `--agents`, `--hooks`, `--integrations`, `--frameworks` or `--workspace-framework`, as documented. Before, the editor, agent, hook, skill and (with `--frameworks`) integration prompts still asked, which stalled scaffolding tools that call init without a TTY. `--js-plugins` with a linter other than Oxlint now stops init with an error instead of being silently ignored, and without `--linter` it skips the linter prompt.
- 6c7e149: `ultracite init` no longer hangs on a `.pre-commit-config.yaml` or lefthook config with CRLF line endings and many consecutive comment lines. The check that keeps the file's sequence indentation could backtrack exponentially on that input.
- 3dc6431: On Windows, a linter or formatter that isn't installed is now reported as missing instead of as "exited with code 1". `ultracite check` and `ultracite fix` warn and skip CSS linting when the optional Stylelint is missing, as they already did on macOS and Linux, and `ultracite fix --agent` now skips a missing Stylelint on every platform instead of failing.
- 7f085b2: Type `jsPlugins` as a non-null array on the Oxlint presets that always ship plugins (`js-plugins`, `shadcn`, `anti-slop`, `next/js-plugins`, `tanstack/js-plugins`) and on `selectJsPlugins()`'s return value, so spreading several of them into a root `jsPlugins` array typechecks.
- 45e7f86: The ESLint core preset enables `unicorn/prefer-combined-guards`'s new [`checkMultiStatementBodies`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v77.0.0/docs/rules/prefer-combined-guards.md#checkmultistatementbodies) option, so consecutive guards whose bodies repeat the same statements before the same exit (for example, two `if` blocks that each log and `continue`) are reported and can be combined with `||`. In TypeScript, the rule only combines bodies when type information shows every reference has the same type in both.
- d5523c5: `ultracite init` takes `--workspace-framework <path>=<framework>` for monorepos whose workspaces use different frameworks. For each workspace, it writes an Oxlint, Biome or ESLint config in that directory that extends the root config and adds the workspace's presets, so framework rules only run where they apply and editors see the same rules as `ultracite check`.
