Skip to content
Ultracite
Esc
↑↓navigate↵open⌘Jpreview
On this page

ultracite@8.0.2

Patch Changes

  • 9f80955: Make ultracite fix --claude and --codex judge each retry by what the previous edit actually did. An issue that’s still reported gets the old note asking for a structurally different approach, but one that only appeared after the edit is now handed back as new, with the agent told to build on the fix rather than undo it. Before, a correct ARIA button pattern that then tripped prefer-tag-over-role, or a correct <button> missing its type, was treated as a failed fix and thrown away. When an issue needs a person’s decision, the agent now lists it at the end of its final message. Ultracite stops retrying it and shows the agent’s explanation in the summary, where it used to be discarded. The handoff also gets three fixes. Biome’s a11y rules now reach the agent with their help text and documentation link, which a pattern that didn’t allow digits in a rule group had dropped. A path Oxlint has no files to lint, such as a Markdown file, no longer crashes the run. And Biome’s internal errors, such as internalError/io for a file it can’t write, are no longer handed to the agent as lint issues.
  • 30e03ef: Give jsx-a11y/label-has-associated-control in ultracite/oxlint/react the options the ESLint react preset already sets: <Label> counts as a label, <Input>, <Select>, <Textarea>, <Checkbox> and <Radio> count as controls, and a control is found up to three levels deep. Oxlint used to miss a <Label> with no control, and flagged an <Input> inside a <label>, or an input nested three deep, as unlabelled. Biome’s noLabelWithoutControl in ultracite/biome/core gets the same label and control components.
  • 947ca03: Turn off promise/prefer-await-to-then in ultracite/oxlint/core and ultracite/eslint/core, and github/no-then in ultracite/oxlint/js-plugins and ultracite/eslint/core. Both rules match .then(), .catch() and .finally() by method name, without type information, so they flagged APIs that aren’t promises, such as Zod’s .catch() fallback. They also flagged a fire-and-forget promise given a .catch() handler. Oxlint closed the false positive as not planned. promise/always-return and promise/catch-or-return are now on in both presets, so an unhandled promise chain is still reported. In ESLint, unicorn/prefer-await moves to ultracite/eslint/type-aware, where it uses type information to skip calls that aren’t on a promise. The test-file overrides that turned promise/prefer-await-to-then off in the jest and vitest presets are gone, since the rule is off everywhere.
  • c198d06: Stop unicorn/no-useless-undefined in ultracite/oxlint/core from checking function call arguments. A required parameter typed string | undefined has to be passed undefined explicitly, but Oxlint flagged consume(undefined) and ultracite fix rewrote it to consume(), which TypeScript rejects with TS2554. The rule can’t see parameter types, so it now runs with checkArguments: false. It still reports let value = undefined, return undefined and the rest of its checks. ultracite/eslint/core sets the same option. eslint-plugin-unicorn already skipped arguments in TypeScript files, and now skips them in JavaScript too. Biome’s noUselessUndefined never checked arguments.

Last updated on

Was this page helpful?