Biome
Biome es el único formateador y linter para JS, TS, JSX, JSON y CSS. SCSS es la excepción: Biome 2.5 no lo procesa, por lo que stylelint maneja .scss (consulta scss-bem). Sin ESLint, sin Prettier.
El biome.json raíz de la plantilla es la fuente de verdad. Un hook del plugin ejecuta pnpm exec biome check --write <archivo> después de cada archivo que Claude modifica, cuando existe un biome.json por encima de él.
Reglas
-
Un único
biome.jsonraíz, con esquema fijado a la versión instalada."$schema": "https://biomejs.dev/schemas/2.5.15/schema.json", y@biomejs/biomefijado a la misma versión en el catálogo del área de trabajo. Un esquema desajustado oculta opciones desconocidas o renombradas en el editor. Al actualizar, ejecutapnpm exec biome migrate --writey actualiza ambos. -
Que git decida qué se ignora:
vcs.useIgnoreFile: true. Luego fuerza la ignorancia de la salida de compilación con!!enfiles.includes(!!**/.next,!!**/.turbo,!!**/dist,!!**/coverage), lo que también evita que Biome escanee esas carpetas. Un solo!excluye del procesamiento pero aún indexa.files.ignoreUnknown: trueevita que.scssy otros archivos no compatibles sean reportados. -
Formateador: 2 espacios, ancho 100, LF, comillas dobles, punto y coma, comas finales. Estos valores son fijos para cada repositorio para que las diffs no discutan sobre el estilo. No agregues anulaciones de formateador por paquete.
-
Linter:
preset: "recommended",a11y: "error", dominiosreactynextenrecommended.rules.recommended: truees la ortografía antigua y está obsoleta: usarules.preset.a11yenerrorporque nuvui maneja la accesibilidad de sus propios componentes, por lo que lo que queda (alt, etiquetas, tipos de botón en tu propio marcado) debe ser correcto. El dominionextagrega reglas comonoImgElement;reactagrega reglas de hooks. -
Nursery desactivado. Las reglas de nursery cambian entre versiones de parche y pueden romper CI en una actualización de Biome. Activa una deliberadamente, por nombre, con un comentario que indique por qué, y vuelve a verificar en cada actualización.
-
noConsoleadvierte, permitiendoerrorywarn. Los registros de error estructurados (instrumentation.ts) usanconsole.error; losconsole.logaccidentales son detectados. -
Ordena las importaciones con el asistente, no a mano.
assist.actions.source.organizeImports: "on".biome check --writelo aplica;biome cifalla si las importaciones están desordenadas. -
Anulaciones por glob, para archivos de prueba y similares. La plantilla habilita el dominio
testsolo para*.test.ts(x)/*.test-d.ts. Coloca allí otras diferencias por tipo de archivo, no en configuraciones separadas. -
Configuraciones anidadas solo para paquetes que realmente difieran, y extienden la raíz.
// packages/legacy-widget/biome.json { "extends": "//", "linter": { "rules": { "style": { "noNonNullAssertion": "off" } } } }"extends": "//"significa "la configuración raíz" e implica"root": false. Cualquier otra configuración anidada debe establecer"root": false. No usamos un paquete compartido@repo/biome-config: el archivo raíz más//lo cubre sin necesidad de compilación ni dependencia. -
Localmente
biome check --write; en CIbiome ci.pnpm lintejecutabiome check .(sin escrituras);pnpm lint:fixejecutabiome check --write .. CI ejecutapnpm exec biome ci --reporter=github ., que nunca escribe, falla en formato, linting y orden de importaciones, y anota el PR. Agrega--changed --since=origin/mainsolo si la ejecución completa se vuelve lenta; hoy es milisegundos. -
Suprime una línea, con una razón.
// biome-ignore lint/suspicious/noExplicitAny: third-party callback typed as any upstreamNunca deshabilites una regla en todo el repositorio para que un solo archivo pase. Si una regla es incorrecta para el repositorio, cambia
biome.jsonen su propio commit con la razón. -
Corrige, no silencies, las comunes.
useImportType: ejecuta la corrección; es requerido porverbatimModuleSyntax.noExplicitAny: usaunknowny analiza (consultatypescript-production).useButtonType,noSvgWithoutTitle,useAltText: errores reales de accesibilidad.noImgElement: usanext/image.useExhaustiveDependencies: corrige la lista de dependencias o mueve el valor fuera del componente.
-
VS Code: Biome es el formateador predeterminado, corrige al guardar. El
.vscode/settings.jsonde la plantilla estableceeditor.defaultFormatter: "biomejs.biome",source.fixAll.biomeysource.organizeImports.biomeal guardar, ybiome.requireConfiguration: truepara que la extensión permanezca inactiva en repositorios sin Biome. SCSS conserva la extensión stylelint. Recomienda ambas en.vscode/extensions.json. -
Migrando desde ESLint/Prettier: migrar, luego eliminar. Consulta references/migration.md. Estado final: sin paquetes
eslint*,prettier*o@typescript-eslint/*, sin.eslintrc*,eslint.config.*,.prettierrc*,.prettierignore.
Lo que Biome no cubre
| Archivo | Herramienta |
|---|---|
.scss | stylelint (scss-bem) |
.yaml (workflows, Helm) | actionlint para workflows; helm lint + kubeconform para charts |
.md | nada exigido |
| Errores de tipo | tsc --noEmit (pnpm typecheck) |
Verificar
pnpm lint # biome check . && stylelint
pnpm exec biome ci --reporter=github . # lo que ejecuta CI
pnpm exec biome rage # imprime la configuración resuelta si algo parece ignorado
Fuentes
- https://biomejs.dev/reference/configuration/
- https://biomejs.dev/guides/big-projects/
- https://biomejs.dev/linter/domains/
- https://biomejs.dev/linter/rules/
- https://biomejs.dev/reference/cli/
- https://biomejs.dev/reference/vscode/
- https://biomejs.dev/guides/migrate-eslint-prettier/
- https://biomejs.dev/internals/language-support/