Get the FREE Ultimate OpenClaw Setup Guide →

biome-js

npx machina-cli add skill PaulRBerg/agent-skills/biome-js --openclaw
Files (1)
SKILL.md
6.8 KB

BiomeJS Skill

Quick guidance for BiomeJS configuration based on Sablier project patterns.

Core Concepts

Extending Shared Configs

Extend shared configs via npm package exports. The consuming project must always provide its own files.includes:

{
  "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
  "extends": ["@sablier/devkit/biome"],
  "files": {
    "includes": ["**/*.{js,json,jsonc,ts}", "!node_modules/**/*"]
  }
}

For UI projects, extend both base and ui configs:

{
  "extends": ["@sablier/devkit/biome/base", "@sablier/devkit/biome/ui"],
  "files": {
    "includes": ["**/*.{css,js,jsx,json,jsonc,ts,tsx}"]
  }
}

Monorepo Inheritance

In monorepos, workspace configs inherit from root using "//":

// packages/my-package/biome.jsonc
{
  "extends": ["//"],
  "overrides": [
    // package-specific overrides
  ]
}

File Includes Pattern

Always specify files.includes explicitly. Common patterns:

Project TypePattern
Library**/*.{js,json,jsonc,ts}
UI/Frontend**/*.{css,js,jsx,json,jsonc,ts,tsx}
With GraphQL**/*.{css,graphql,js,jsx,json,jsonc,ts,tsx}

Exclusions: !node_modules/**/*, !**/generated, !dist

Common Overrides

Test Files

Relax strict rules in test files:

{
  "overrides": [
    {
      "includes": ["**/tests/**/*.ts", "**/*.test.ts"],
      "linter": {
        "rules": {
          "style": {
            "noNonNullAssertion": "off"
          },
          "suspicious": {
            "noExplicitAny": "off"
          }
        }
      }
    }
  ]
}

Generated/ABI Files

Disable sorting and compact formatting for generated code:

{
  "overrides": [
    {
      "includes": ["**/abi/**/*.ts", "**/generated/**/*.ts"],
      "assist": {
        "actions": {
          "source": {
            "useSortedKeys": "off"
          }
        }
      },
      "javascript": {
        "formatter": {
          "expand": "never"
        }
      }
    }
  ]
}

Import Restrictions

Enforce barrel imports for specific modules:

{
  "overrides": [
    {
      "includes": ["src/**/*.{ts,tsx}"],
      "linter": {
        "rules": {
          "correctness": {
            "noRestrictedImports": {
              "level": "error",
              "options": {
                "paths": {
                  "@/core": "Import from @/core (barrel) instead of subpaths"
                }
              }
            }
          }
        }
      }
    }
  ]
}

Key Rules Reference

RuleDefaultRationale
noFloatingPromiseserrorFloating promises cause bugs
noUnusedImportsoffAllow during dev, enforce in pre-commit
noUnusedVariableserrorKeep code clean
useImportTypewarn (separatedType)Explicit type imports
useSortedKeysonConsistent object ordering
useSortedClasseswarn (UI)Tailwind class sorting
useFilenamingConventionkebab/camel/PascalFlexible naming
noVoidoffUseful for useEffect callbacks
useTemplateoffAllow string concatenation

Git Hooks Integration

Lint-Staged Configuration

Standard pattern for pre-commit hooks:

// .lintstagedrc.js
module.exports = {
  "*.{json,jsonc,ts,tsx}": "bun biome check --write",
  "*.{md,yml,yaml}": "bun prettier --cache --write",
  "*.{ts,tsx}": "bun biome check --write --only=correctness/noUnusedImports",
};

The separate noUnusedImports pass enforces import cleanup only at commit time, not during development.

UI-Specific Configuration

For frontend projects with Tailwind CSS:

{
  "css": {
    "parser": {
      "tailwindDirectives": true
    }
  },
  "assist": {
    "actions": {
      "source": {
        "useSortedAttributes": "on"
      }
    }
  },
  "linter": {
    "rules": {
      "nursery": {
        "useSortedClasses": {
          "fix": "safe",
          "level": "warn",
          "options": {
            "attributes": ["classList"],
            "functions": ["clsx", "cva", "cn", "tv", "tw"]
          }
        }
      }
    }
  }
}

Biome v2.4.0+ auto-enables CSS Modules parsing for *.module.css, so explicit "cssModules": true is usually unnecessary unless your project needs non-standard behavior.

Biome v2.4+ Notes

  • biome check and biome ci now support --only and --skip for targeted rule/action runs.
  • biome check --write now also applies formatting when applying fixes.
  • Config lookup now also supports hidden files: .biome.json and .biome.jsonc.
  • Config lookup now also supports user config directories (for example, $HOME/.config/biome on Linux/macOS equivalents).
  • New formatter option formatter.trailingNewline can disable trailing newline insertion.
  • HTML formatter behavior changed significantly in v2.4.0; expect larger diffs in HTML/Vue/Svelte/Astro if formatter support is enabled.

Troubleshooting

Common Issues

"No files matched": Check files.includes patterns match your file structure.

Conflicting rules: Overrides are applied in order; later overrides take precedence.

Schema errors: Use local schema reference for IDE support:

"$schema": "./node_modules/@biomejs/biome/configuration_schema.json"

Biome vs Prettier

Biome handles JS/TS/JSON/CSS formatting. Use Prettier for:

  • Markdown (.md, .mdx)
  • YAML (.yml, .yaml)

Additional Resources

Examples

Working examples in ./examples/:

  • ./examples/base-config.jsonc - Minimal library configuration
  • ./examples/ui-config.jsonc - Frontend project with Tailwind
  • ./examples/lint-staged.js - Pre-commit hook configuration

Full Documentation

For advanced features, migrations, or complete rule reference, consult the official Biome documentation via Context7 MCP:

Use context7 to fetch Biome documentation for [specific topic]

The official docs at biomejs.dev should be consulted as a last resort for features not covered here.

Source

git clone https://github.com/PaulRBerg/agent-skills/blob/main/skills/biome-js/SKILL.mdView on GitHub

Overview

BiomeJS provides guidance for configuring Biome projects using shared configs and explicit file includes. It covers extending configs via npm exports, monorepo inheritance with //, and common overrides for tests and generated code, aligning with Biome linting and formatting patterns.

How This Skill Works

Configs are extended by npm exports, requiring the consuming project to declare files.includes. Monorepos inherit root settings using //, and overrides tailor linting and formatting for tests, generated/ABI, and imports.

When to Use It

  • Setting up a new BiomeJS project and base config.
  • Extending shared Biome configs for a library or UI.
  • Configuring monorepo inheritance in a multi-package repo.
  • Specifying explicit file includes and exclusions.
  • Customizing linting/formatting rules for tests or generated files.

Quick Start

  1. Step 1: Create biome.jsonc with extends and files.includes.
  2. Step 2: For UI projects, extend both base and ui configurations.
  3. Step 3: Add overrides for tests or generated/ABI files as needed.

Best Practices

  • Always specify files.includes in biome.jsonc.
  • Match includes patterns to your project type (library, UI, etc.).
  • Exclude node_modules, generated, dist.
  • Use overrides for test files and generated/ABI files.
  • Enforce barrel imports for specific modules to guide imports.

Example Use Cases

  • Project extends @sablier/devkit/biome with explicit files.includes.
  • UI project extends both base and ui and uses includes for CSS/JS/JSON.
  • Monorepo with root biome.jsonc and per-package extends //.
  • Override block relaxing tests to disable noNonNullAssertion and noExplicitAny.
  • Generated/ABI files have sorted keys disabled and formatter expand never.

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers