Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

feat: promote rules for v2.4#9011

Open
ematipico wants to merge 7 commits intonextfrom
feat/promote-rules-v2.4
Open

feat: promote rules for v2.4#9011
ematipico wants to merge 7 commits intonextfrom
feat/promote-rules-v2.4

Conversation

@ematipico
Copy link
Member

@ematipico ematipico commented Feb 9, 2026

Summary

This PR promotes various rules to stable. I used the help of AI to create a plan and run the scripts for moving a rule.

Test Plan

Green CI

Docs

Not needed

@changeset-bot
Copy link

changeset-bot bot commented Feb 9, 2026

🦋 Changeset detected

Latest commit: 7f08221

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 14 packages
Name Type
@biomejs/biome Minor
@biomejs/cli-win32-x64 Minor
@biomejs/cli-win32-arm64 Minor
@biomejs/cli-darwin-x64 Minor
@biomejs/cli-darwin-arm64 Minor
@biomejs/cli-linux-x64 Minor
@biomejs/cli-linux-arm64 Minor
@biomejs/cli-linux-x64-musl Minor
@biomejs/cli-linux-arm64-musl Minor
@biomejs/wasm-web Minor
@biomejs/wasm-bundler Minor
@biomejs/wasm-nodejs Minor
@biomejs/backend-jsonrpc Patch
@biomejs/js-api Major

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions bot added A-CLI Area: CLI A-Project Area: project A-Linter Area: linter L-JavaScript Language: JavaScript and super languages L-CSS Language: CSS L-JSON Language: JSON and super languages A-Diagnostic Area: diagnostocis labels Feb 9, 2026
@ematipico ematipico changed the title feat: promote rules feat: promote rules for v4 Feb 9, 2026
@ematipico ematipico changed the title feat: promote rules for v4 feat: promote rules for v2.4 Feb 9, 2026
@dyc3 dyc3 added this to the Biome v2.4 milestone Feb 9, 2026
@ematipico ematipico marked this pull request as ready for review February 9, 2026 17:34
@ematipico ematipico requested review from a team February 9, 2026 17:34
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Walkthrough

This PR promotes 22 linter rules from the nursery group into stable groups: 9 to Correctness, 8 to Suspicious, 3 to Complexity, and 2 to Style. Test/spec configuration files and directories are updated to reflect the new rule namespaces (nursery → style/correctness/suspicious/complexity). Several lint rule declarations gain explicit severity metadata. The ROME_CHANGELOG.md file is removed and a small metadata field was added to the UseExplicitType rule.

Possibly related PRs

Suggested reviewers

  • dyc3
  • Netail
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Merge Conflict Detection ⚠️ Warning ❌ Merge conflicts detected (252 files):

⚔️ .claude/agents/biome-lint-engineer.md (content)
⚔️ .claude/agents/cst-parser-engineer.md (content)
⚔️ .claude/agents/ir-formatter-engineer.md (content)
⚔️ .devcontainer/devcontainer.json (content)
⚔️ .editorconfig (content)
⚔️ .github/renovate.json5 (content)
⚔️ .github/workflows/autofix.yml (content)
⚔️ .github/workflows/benchmark_configuration.yml (content)
⚔️ .github/workflows/benchmark_css.yml (content)
⚔️ .github/workflows/benchmark_graphql.yml (content)
⚔️ .github/workflows/benchmark_js.yml (content)
⚔️ .github/workflows/benchmark_json.yml (content)
⚔️ .github/workflows/benchmark_manifests.yml (content)
⚔️ .github/workflows/benchmark_module_graph.yml (content)
⚔️ .github/workflows/benchmark_tailwind.yml (content)
⚔️ .github/workflows/beta.yml (content)
⚔️ .github/workflows/beta_js_api.yml (content)
⚔️ .github/workflows/preview.yml (content)
⚔️ .github/workflows/pull_request_js.yml (content)
⚔️ .github/workflows/pull_request_markdown.yml (content)
⚔️ .github/workflows/pull_request_node.yml (content)
⚔️ .github/workflows/release.yml (content)
⚔️ .github/workflows/release_cli.yml (content)
⚔️ .github/workflows/release_js_api.yml (content)
⚔️ .github/workflows/repository_dispatch.yml (content)
⚔️ AGENTS.md (content)
⚔️ AGENTS.md~next (content)
⚔️ Cargo.lock (content)
⚔️ Cargo.toml (content)
⚔️ Dockerfile.benchmark (content)
⚔️ benchmark/package.json (content)
⚔️ crates/biome_analyze/src/analyzer_plugin.rs (content)
⚔️ crates/biome_analyze/src/lib.rs (content)
⚔️ crates/biome_analyze/src/rule.rs (content)
⚔️ crates/biome_analyze/src/signals.rs (content)
⚔️ crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs (content)
⚔️ crates/biome_cli/src/execute/migrate/unsupported_rules.rs (content)
⚔️ crates/biome_cli/tests/commands/check.rs (content)
⚔️ crates/biome_cli/tests/snapshots/main_commands_check/check_help.snap (content)
⚔️ crates/biome_cli/tests/snapshots/main_commands_ci/ci_help.snap (content)
⚔️ crates/biome_cli/tests/snapshots/main_commands_format/format_help.snap (content)
⚔️ crates/biome_cli/tests/snapshots/main_commands_lint/lint_only_group_skip_rule.snap (content)
⚔️ crates/biome_cli/tests/snapshots/main_commands_lint/linter_shows_the_default_severity_of_rule_on.snap (content)
⚔️ crates/biome_cli/tests/snapshots/main_configuration/incorrect_rule_name.snap (content)
⚔️ crates/biome_configuration/Cargo.toml (content)
⚔️ crates/biome_configuration/src/analyzer/linter/rules.rs (content)
⚔️ crates/biome_configuration/src/formatter.rs (content)
⚔️ crates/biome_configuration/src/generated/domain_selector.rs (content)
⚔️ crates/biome_css_analyze/Cargo.toml (content)
⚔️ crates/biome_css_analyze/src/assist.rs (content)
⚔️ crates/biome_css_analyze/src/assist/source.rs (content)
⚔️ crates/biome_css_analyze/src/keywords.rs (content)
⚔️ crates/biome_css_analyze/src/lint.rs (content)
⚔️ crates/biome_css_analyze/src/lint/a11y.rs (content)
⚔️ crates/biome_css_analyze/src/lint/a11y/use_generic_font_names.rs (content)
⚔️ crates/biome_css_analyze/src/lint/complexity.rs (content)
⚔️ crates/biome_css_analyze/src/lint/correctness.rs (content)
⚔️ crates/biome_css_analyze/src/lint/nursery.rs (content)
⚔️ crates/biome_css_analyze/src/lint/nursery/no_deprecated_media_type.rs (content)
⚔️ crates/biome_css_analyze/src/lint/nursery/no_hex_colors.rs (content)
⚔️ crates/biome_css_analyze/src/lint/style.rs (content)
⚔️ crates/biome_css_analyze/src/lint/suspicious.rs (content)
⚔️ crates/biome_css_analyze/src/registry.rs (content)
⚔️ crates/biome_css_analyze/tests/specs/a11y/useGenericFontNames/invalid.css (content)
⚔️ crates/biome_css_analyze/tests/specs/a11y/useGenericFontNames/invalid.css.snap (content)
⚔️ crates/biome_css_analyze/tests/specs/a11y/useGenericFontNames/valid.css (content)
⚔️ crates/biome_css_analyze/tests/specs/a11y/useGenericFontNames/valid.css.snap (content)
⚔️ crates/biome_css_analyze/tests/specs/correctness/noUnknownFunction/valid.css (content)
⚔️ crates/biome_css_analyze/tests/specs/correctness/noUnknownFunction/valid.css.snap (content)
⚔️ crates/biome_css_formatter/Cargo.toml (content)
⚔️ crates/biome_css_parser/Cargo.toml (content)
⚔️ crates/biome_diagnostics_categories/src/categories.rs (content)
⚔️ crates/biome_formatter/CONTRIBUTING.md (content)
⚔️ crates/biome_graphql_analyze/src/lint.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/correctness.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/nursery.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/nursery/use_input_name.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/style.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/suspicious.rs (content)
⚔️ crates/biome_graphql_analyze/src/lint/suspicious/no_duplicate_fields.rs (content)
⚔️ crates/biome_graphql_formatter/Cargo.toml (content)
⚔️ crates/biome_graphql_parser/Cargo.toml (content)
⚔️ crates/biome_html_analyze/src/lint.rs (content)
⚔️ crates/biome_html_analyze/src/lint/a11y.rs (content)
⚔️ crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs (content)
⚔️ crates/biome_html_analyze/src/lint/a11y/use_button_type.rs (content)
⚔️ crates/biome_html_analyze/src/lint/nursery.rs (content)
⚔️ crates/biome_html_analyze/src/options.rs (content)
⚔️ crates/biome_html_analyze/tests/specs/a11y/useButtonType/valid.html (content)
⚔️ crates/biome_html_analyze/tests/specs/a11y/useButtonType/valid.html.snap (content)
⚔️ crates/biome_html_factory/src/generated/node_factory.rs (content)
⚔️ crates/biome_html_factory/src/generated/syntax_factory.rs (content)
⚔️ crates/biome_html_formatter/Cargo.toml (content)
⚔️ crates/biome_html_formatter/src/generated.rs (content)
⚔️ crates/biome_html_formatter/src/html/any/attribute.rs (content)
⚔️ crates/biome_html_formatter/src/html/any/attribute_initializer.rs (content)
⚔️ crates/biome_html_formatter/src/html/auxiliary/attribute.rs (content)
⚔️ crates/biome_html_formatter/src/html/auxiliary/attribute_initializer_clause.rs (content)
⚔️ crates/biome_html_formatter/src/html/auxiliary/mod.rs (content)
⚔️ crates/biome_html_formatter/src/html/lists/attribute_list.rs (content)
⚔️ crates/biome_html_formatter/src/utils/children.rs (content)
⚔️ crates/biome_html_formatter/tests/specs/html/interpolation/interpolation.html.snap (content)
⚔️ crates/biome_html_formatter/tests/specs/prettier/html/interpolation/example.html.snap (content)
⚔️ crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/hello-world.html.snap (content)
⚔️ crates/biome_html_parser/Cargo.toml (content)
⚔️ crates/biome_html_parser/src/lexer/mod.rs (content)
⚔️ crates/biome_html_parser/src/syntax/mod.rs (content)
⚔️ crates/biome_html_parser/src/syntax/svelte.rs (content)
⚔️ crates/biome_html_parser/src/syntax/vue.rs (content)
⚔️ crates/biome_html_parser/src/token_source.rs (content)
⚔️ crates/biome_html_parser/tests/html_specs/error/interpolation.html.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/astro/attribute_expression.astro.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/attach.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/await_multiline.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/complex_expressions.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/directives/bind_shorthand.svelte (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/directives/bind_shorthand.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/dynamic-prop.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/each_as_in_identifier.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/shorthand-prop.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/html_specs/ok/svelte/shorthand-spread-props.svelte.snap (content)
⚔️ crates/biome_html_parser/tests/quick_test.rs (content)
⚔️ crates/biome_html_parser/tests/spec_test.rs (content)
⚔️ crates/biome_html_syntax/src/attr_ext.rs (content)
⚔️ crates/biome_html_syntax/src/attribute_ext.rs (content)
⚔️ crates/biome_html_syntax/src/element_ext.rs (content)
⚔️ crates/biome_html_syntax/src/generated/kind.rs (content)
⚔️ crates/biome_html_syntax/src/generated/macros.rs (content)
⚔️ crates/biome_html_syntax/src/generated/nodes.rs (content)
⚔️ crates/biome_html_syntax/src/generated/nodes_mut.rs (content)
⚔️ crates/biome_js_analyze/Cargo.toml (content)
⚔️ crates/biome_js_analyze/src/assist.rs (content)
⚔️ crates/biome_js_analyze/src/assist/source.rs (content)
⚔️ crates/biome_js_analyze/src/assists.rs (content)
⚔️ crates/biome_js_analyze/src/lint.rs (content)
⚔️ crates/biome_js_analyze/src/lint/a11y.rs (content)
⚔️ crates/biome_js_analyze/src/lint/a11y/no_interactive_element_to_noninteractive_role.rs (content)
⚔️ crates/biome_js_analyze/src/lint/a11y/no_positive_tabindex.rs (content)
⚔️ crates/biome_js_analyze/src/lint/complexity.rs (content)
⚔️ crates/biome_js_analyze/src/lint/complexity/use_arrow_function.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness/no_global_dirname_filename.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness/no_unreachable.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness/no_unused_imports.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness/use_exhaustive_dependencies.rs (content)
⚔️ crates/biome_js_analyze/src/lint/correctness/use_jsx_key_in_iterable.rs (content)
⚔️ crates/biome_js_analyze/src/lint/nursery.rs (content)
⚔️ crates/biome_js_analyze/src/lint/nursery/no_vue_arrow_func_in_watch.rs (content)
⚔️ crates/biome_js_analyze/src/lint/nursery/use_explicit_type.rs (content)
⚔️ crates/biome_js_analyze/src/lint/performance.rs (content)
⚔️ crates/biome_js_analyze/src/lint/security.rs (content)
⚔️ crates/biome_js_analyze/src/lint/style.rs (content)
⚔️ crates/biome_js_analyze/src/lint/style/no_common_js.rs (content)
⚔️ crates/biome_js_analyze/src/lint/style/use_consistent_type_definitions.rs (content)
⚔️ crates/biome_js_analyze/src/lint/style/use_naming_convention.rs (content)
⚔️ crates/biome_js_analyze/src/lint/suspicious.rs (content)
⚔️ crates/biome_js_analyze/src/lint/suspicious/no_assign_in_expressions.rs (content)
⚔️ crates/biome_js_analyze/src/lint/suspicious/use_await.rs (content)
⚔️ crates/biome_js_analyze/src/options.rs (content)
⚔️ crates/biome_js_analyze/src/react.rs (content)
⚔️ crates/biome_js_analyze/src/syntax.rs (content)
⚔️ crates/biome_js_analyze/src/syntax/correctness.rs (content)
⚔️ crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx (content)
⚔️ crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/a11y/noPositiveTabindex/invalid.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/a11y/noPositiveTabindex/reactCreateElementInvalid.js.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/noUnusedImports/invalid-unused-react.jsx (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/noUnusedImports/invalid-unused-react.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/noUnusedImports/valid-unused-react.jsx (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/noUnusedImports/valid-unused-react.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useExhaustiveDependencies/issue8802.ts (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useExhaustiveDependencies/issue8802.ts.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useJsxKeyInIterable/invalid.jsx (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useJsxKeyInIterable/invalid.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useJsxKeyInIterable/valid.jsx (content)
⚔️ crates/biome_js_analyze/tests/specs/correctness/useJsxKeyInIterable/valid.jsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/nursery/useAwaitThenable/valid.js (content)
⚔️ crates/biome_js_analyze/tests/specs/nursery/useAwaitThenable/valid.js.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/nursery/useExplicitType/invalid.ts.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/nursery/useExplicitType/invalidArguments.ts.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/style/useConsistentTypeDefinitions/valid.ts (content)
⚔️ crates/biome_js_analyze/tests/specs/style/useConsistentTypeDefinitions/valid.ts.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/style/useImportType/valid-unused-react.tsx (content)
⚔️ crates/biome_js_analyze/tests/specs/style/useImportType/valid-unused-react.tsx.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/noAssignInExpressions/invalid.js.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/noAssignInExpressions/valid.js (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/noAssignInExpressions/valid.js.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js.snap (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js (content)
⚔️ crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js.snap (content)
⚔️ crates/biome_js_formatter/Cargo.toml (content)
⚔️ crates/biome_js_formatter/src/utils/string_utils.rs (content)
⚔️ crates/biome_js_parser/Cargo.toml (content)
⚔️ crates/biome_js_type_info/src/type_data.rs (content)
⚔️ crates/biome_json_analyze/Cargo.toml (content)
⚔️ crates/biome_json_analyze/src/assist.rs (content)
⚔️ crates/biome_json_analyze/src/assist/source.rs (content)
⚔️ crates/biome_json_analyze/src/assists.rs (content)
⚔️ crates/biome_json_analyze/src/lint.rs (content)
⚔️ crates/biome_json_analyze/src/lint/nursery.rs (content)
⚔️ crates/biome_json_analyze/src/lint/suspicious.rs (content)
⚔️ crates/biome_json_analyze/src/registry.rs (content)
⚔️ crates/biome_json_formatter/Cargo.toml (content)
⚔️ crates/biome_json_parser/Cargo.toml (content)
⚔️ crates/biome_lsp/src/server.tests.rs (content)
⚔️ crates/biome_lsp/src/session.rs (content)
⚔️ crates/biome_rule_options/src/lib.rs (content)
⚔️ crates/biome_service/src/settings.tests.rs (content)
⚔️ crates/biome_service/src/workspace/server.rs (content)
⚔️ crates/biome_service/src/workspace/server.tests.rs (content)
⚔️ crates/biome_tailwind_parser/Cargo.toml (content)
⚔️ crates/biome_test_utils/Cargo.toml (content)
⚔️ crates/biome_test_utils/src/bench_case.rs (content)
⚔️ crates/biome_wasm/Cargo.toml (content)
⚔️ justfile (content)
⚔️ package.json (content)
⚔️ packages/@biomejs/backend-jsonrpc/CHANGELOG.md (content)
⚔️ packages/@biomejs/backend-jsonrpc/package.json (content)
⚔️ packages/@biomejs/backend-jsonrpc/src/workspace.ts (content)
⚔️ packages/@biomejs/biome/CHANGELOG.md (content)
⚔️ packages/@biomejs/biome/configuration_schema.json (content)
⚔️ packages/@biomejs/biome/package.json (content)
⚔️ packages/@biomejs/cli-darwin-arm64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-darwin-arm64/package.json (content)
⚔️ packages/@biomejs/cli-darwin-x64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-darwin-x64/package.json (content)
⚔️ packages/@biomejs/cli-linux-arm64-musl/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-linux-arm64-musl/package.json (content)
⚔️ packages/@biomejs/cli-linux-arm64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-linux-arm64/package.json (content)
⚔️ packages/@biomejs/cli-linux-x64-musl/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-linux-x64-musl/package.json (content)
⚔️ packages/@biomejs/cli-linux-x64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-linux-x64/package.json (content)
⚔️ packages/@biomejs/cli-win32-arm64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-win32-arm64/package.json (content)
⚔️ packages/@biomejs/cli-win32-x64/CHANGELOG.md (content)
⚔️ packages/@biomejs/cli-win32-x64/package.json (content)
⚔️ packages/@biomejs/js-api/package.json (content)
⚔️ packages/@biomejs/wasm-bundler/CHANGELOG.md (content)
⚔️ packages/@biomejs/wasm-bundler/package.json (content)
⚔️ packages/@biomejs/wasm-nodejs/CHANGELOG.md (content)
⚔️ packages/@biomejs/wasm-nodejs/package.json (content)
⚔️ packages/@biomejs/wasm-web/CHANGELOG.md (content)
⚔️ packages/@biomejs/wasm-web/package.json (content)
⚔️ packages/aria-data/package.json (content)
⚔️ packages/prettier-compare/package.json (content)
⚔️ pnpm-lock.yaml (content)
⚔️ xtask/codegen/html.ungram (content)
⚔️ xtask/codegen/src/html_kinds_src.rs (content)
⚔️ xtask/glue/src/lib.rs (content)

These conflicts must be resolved before merging into next.
Resolve conflicts locally and push changes to this branch.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: promote rules for v2.4' clearly summarizes the main change—promoting linting rules to stable status for version 2.4.
Description check ✅ Passed The description relates to the changeset by explaining the PR promotes rules to stable and mentions AI assistance was used for planning and scripting.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/promote-rules-v2.4
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch feat/promote-rules-v2.4
  • Create stacked PR with resolved conflicts
  • Post resolved changes as copyable diffs in a comment

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/biome_js_analyze/src/lint/nursery/use_explicit_type.rs (1)

324-335: ⚠️ Potential issue | 🟡 Minor

Avoid marking this nursery rule as WIP unless it’s intentional.

Adding issue_number makes the rule appear work‑in‑progress in diagnostics/website. If this isn’t explicitly WIP or tracked for external observers, please drop it (or add a short rationale in the PR).
Based on learnings, “In Rust lint rules under the nursery category, the issue_number field in declare_lint_rule! is optional and should not be added unless there is a compelling reason.”

🔧 Suggested change
-        issue_number: Some("2017"),
🤖 Fix all issues with AI agents
In @.changeset/promote-nursery-rules-to-stable.md:
- Line 5: The headline "Promoted 24 nursery rules to stable groups." is
inconsistent with the enumerated lists that sum to 22 (9+8+3+2); either update
the headline to "Promoted 22 nursery rules to stable groups." or add the two
missing rule entries into the lists so the totals match. Locate the sentence
"Promoted 24 nursery rules to stable groups." in
.changeset/promote-nursery-rules-to-stable.md and either change the numeric
count or append the two missing rule names to the appropriate group lists so the
arithmetic (9+8+3+2 or revised group totals) equals the headline, and ensure any
summary or changelog metadata reflects the corrected total.

"@biomejs/biome": minor
---

Promoted 24 nursery rules to stable groups.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Rule count doesn’t add up.

The lists sum to 22 (9+8+3+2), but the headline says 24. Please reconcile the count or add the two missing rules.

📝 Suggested tweak (if the list is complete)
-Promoted 24 nursery rules to stable groups.
+Promoted 22 nursery rules to stable groups.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Promoted 24 nursery rules to stable groups.
Promoted 22 nursery rules to stable groups.
🤖 Prompt for AI Agents
In @.changeset/promote-nursery-rules-to-stable.md at line 5, The headline
"Promoted 24 nursery rules to stable groups." is inconsistent with the
enumerated lists that sum to 22 (9+8+3+2); either update the headline to
"Promoted 22 nursery rules to stable groups." or add the two missing rule
entries into the lists so the totals match. Locate the sentence "Promoted 24
nursery rules to stable groups." in
.changeset/promote-nursery-rules-to-stable.md and either change the numeric
count or append the two missing rule names to the appropriate group lists so the
arithmetic (9+8+3+2 or revised group totals) equals the headline, and ensure any
summary or changelog metadata reflects the corrected total.

Copy link
Member

@Conaclos Conaclos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you taken care of reviewing the severity of each rule ?

Also, should we rename noDuplicateDependencies into noDuplicatePackageJsonDependencies?

@dyc3 dyc3 self-requested a review February 10, 2026 02:28
@dyc3
Copy link
Contributor

dyc3 commented Feb 10, 2026

@Conaclos noDuplicateDependencies seems perfectly clear to me. Why the extra specificity to name it noDuplicatePackageJsonDependencies?

@ematipico
Copy link
Member Author

Have you taken care of reviewing the severity of each rule ?

Not really. You're more than welcome to provide some suggestions

@Conaclos
Copy link
Member

@dyc3

noDuplicateDependencies seems perfectly clear to me. Why the extra specificity to name it noDuplicatePackageJsonDependencies?

I was thinking about future rules for package.json linting such as useValidPackageJsonEngines. I thought that renaming noDuplicateDependencies to noDuplicatePackageJsonDependencies could make it more consistent. Although I am not fond of the lengthy names. What do you think?

@dyc3
Copy link
Contributor

dyc3 commented Feb 10, 2026

I'm also not a fan of lengthy names. IMO, the word "dependencies" implies that the rule is talking about package.json, so noDuplicateDependencies is enough to get the idea across.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit wary of promoting this rule just yet. It still has some open bug reports

@Conaclos
Copy link
Member

I pushed a commit that sets explicitly the severity level of the promoted rules.

Here some thinkings / question:

  1. Should the severity of lint/correctness/noNextAsyncClientComponent be set to Error?
  2. Should we move lint/correctness/noVueDataObjectDeclaration to suspicious? I set its severity to Warning. If we keep the rule under correctness, does this make sense of setting its severity to Error?
  3. lint/correctness/noVueDuplicateKeys should be moved to the suspicious group because usually we place noDuplicate* rules in the suspicious group. However, I noted that its severity is set to Error instead of Warning. Is duplicate key a hard error in Vue? If it is an hard error, then it seems ok to keep the rule under correctness.
  4. I think that lint/suspicious/noShaadow should be moved to complexity or style. If we move the rule we could even consider setting its severity to Information.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In
`@crates/biome_js_analyze/src/lint/correctness/no_vue_data_object_declaration.rs`:
- Line 106: The rule "no_vue_data_object_declaration" in
crates/biome_js_analyze/src/lint/correctness/no_vue_data_object_declaration.rs
currently sets severity to Severity::Warning; update that severity to
Severity::Error so the correctness rule aligns with the contributing guidelines
and other Vue correctness rules (e.g., noVueSetupPropsReactivityLoss,
noVueReservedKeys). Locate the severity: Severity::Warning entry in the rule
definition and change it to Severity::Error.

RuleSource::EslintVueJs("no-deprecated-data-object-declaration").inspired(),
RuleSource::EslintVueJs("no-shared-component-data").inspired(),
],
severity: Severity::Warning,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check severity levels used by correctness rules
rg -n 'severity:\s*Severity::' crates/biome_js_analyze/src/lint/correctness/ | head -30

Repository: biomejs/biome

Length of output: 3337


Change severity to Severity::Error.

This rule is in the correctness group but uses Severity::Warning. Per the contributing guidelines, correctness rules must use Severity::Error. Additionally, all other Vue correctness rules (noVueSetupPropsReactivityLoss, noVueReservedKeys, etc.) use Error. Since this rule detects deprecated Vue 3 patterns that won't work correctly, it should be Error, not Warning.

🤖 Prompt for AI Agents
In
`@crates/biome_js_analyze/src/lint/correctness/no_vue_data_object_declaration.rs`
at line 106, The rule "no_vue_data_object_declaration" in
crates/biome_js_analyze/src/lint/correctness/no_vue_data_object_declaration.rs
currently sets severity to Severity::Warning; update that severity to
Severity::Error so the correctness rule aligns with the contributing guidelines
and other Vue correctness rules (e.g., noVueSetupPropsReactivityLoss,
noVueReservedKeys). Locate the severity: Severity::Warning entry in the rule
definition and change it to Severity::Error.

@ematipico
Copy link
Member Author

ematipico commented Feb 13, 2026

@Conaclos please update the changset to reflect your changes. Plus you must update the snapshots too.

You also changed the severity of other rules weren't promoted. Why that?

@@ -105,11 +105,11 @@ fn merge_override_linter_group_rule() {
]))),
linter: Some(OverrideLinterConfiguration {
rules: Some(Rules {
nursery: Some(SeverityOrGroup::Group(Nursery {
use_explicit_type: Some(RuleConfiguration::Plain(
style: Some(SeverityOrGroup::Group(Style {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test was failing because use_explicit_type was moved to style before the reverting of this change. To make the test more stable, I chose an already promoted rule (noDefaultExport).

@Conaclos
Copy link
Member

You also changed the severity of other rules weren't promoted. Why that?

Only one. However, this doesn't change its severity level because it matched the default one. Anyway I reverted this change.

I had to fix a test that made the compilation fails. Strangely the CI didn't fail. This it must skip some tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CLI Area: CLI A-Diagnostic Area: diagnostocis A-Linter Area: linter A-Project Area: project L-CSS Language: CSS L-JavaScript Language: JavaScript and super languages L-JSON Language: JSON and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants