Creates and manages Biome GritQL custom lint rules to enforce coding patterns. Use when creating linter rules, enforcing code conventions, preventing anti-patterns, or when the user mentions Biome, GritQL, custom lint rules, or AST-based linting.
View on GitHubSomtoUgeh/somto-dev-toolkit
somto-dev-toolkit
skills/biome-gritql/SKILL.md
January 24, 2026
Select agents to install to:
npx add-skill https://github.com/SomtoUgeh/somto-dev-toolkit/blob/main/skills/biome-gritql/SKILL.md -a claude-code --skill biome-gritqlInstallation paths:
.claude/skills/biome-gritql/# Biome GritQL Custom Lint Rules
Create AST-based custom lint rules using Biome's GritQL plugin system.
## Quick Start
Create a rule file (`rules/no-use-effect-fetch.grit`):
```gritql
`useEffect($callback, $deps)` where {
$callback <: contains `fetch`,
register_diagnostic(
span = $callback,
message = "Don't fetch inside useEffect. Use TanStack Query instead.",
severity = "error"
)
}
```
Add to `biome.json`:
```json
{
"plugins": ["./rules/no-use-effect-fetch.grit"]
}
```
Run: `bunx biome check` or any equivalent command to run linter in the codebase
## GritQL Syntax
### Basic Pattern Matching
```gritql
`pattern_to_match` where {
register_diagnostic(
span = $matched_var,
message = "Your message here",
severity = "error" // hint | info | warn | error
)
}
```
make sure to read documentation
- [BiomeJS Documentation](https://biomejs.dev/)
- [Blog examples](https://laulau.land/context-window-ate-your-instructions/)
- [BiomeJS GitHub Repository](https://github.com/biomejs/biome)
- [GritQL GitHub Repository](https://github.com/biomejs/gritql)
### Variables
- `$name` - captures any single node
- `$args` - captures arguments
- `$_` - wildcard (match but don't capture)
### Operators
| Operator | Meaning |
|----------|---------|
| `<:` | matches / contains |
| `<: contains` | deep contains |
| `<: r"regex"` | regex match |
| `not` | negation |
| `and` | both conditions |
| `or` | either condition |
## Common Rule Patterns
### Ban a Function Call
```gritql
`console.log($args)` where {
register_diagnostic(
span = $args,
message = "Remove console.log before committing",
severity = "warn"
)
}
```
### Ban a Hook (React)
```gritql
`useMemo($args)` where {
register_diagnostic(
span = $args,
message = "useMemo unnecessary with React Compiler. Remove it.",
severity = "warn"
)
}
```
### Ban Dynamic Imports
```gritql
`await import($p