Biome
GritQL heuristics from @derived-modular/biome-plugin for Biome projects.
@derived-modular/biome-plugin adds four DMA architectural rules to Biome via GritQL patterns. Convenient if Biome is already your sole linter and formatter.
This is best-effort: the plugin looks at import strings, it does not build a full graph. The ESLint plugin is more accurate — it uses @derived-modular/boundaries and proper path resolution.
You still need dma check in CI.
Installation
npm install -D @derived-modular/biome-pluginConfiguration
// biome.jsonc
{
"extends": ["@derived-modular/biome-plugin"],
"files": {
"includes": ["**", "!dist"]
}
}The plugin enables four GritQL rules: layer-direction, feature-to-feature, public-api, no-barrel.
Coverage
| Rule | Biome | ESLint | dma check |
|---|---|---|---|
layer-direction | heuristic | ✓ | ✓ |
feature-to-feature | heuristic | ✓ | ✓ |
public-api | heuristic | ✓ | ✓ |
no-barrel | heuristic | ✓ | ✓ |
no-cycle | — | — | ✓ |
| inbound predicates | — | — | ✓ |
Limitations
No import resolution. The plugin matches @/ and relative path patterns but does not fully read tsconfig aliases. Complex aliases may slip through or cause false positives.
Grit plugin paths resolve from the project root (./node_modules/@derived-modular/biome-plugin/...). Works reliably in flat node_modules (npm, bun); in some monorepo / PnP layouts Biome is still improving shared-config support.
No graph rules. Cycles and "feature with inbound → service" — CLI only.
If you can choose — use the ESLint plugin. Keep Biome for teams already fully on Biome and willing to accept heuristics.
When it fits
| Situation | Recommendation |
|---|---|
| Biome is the unified toolchain | biome-plugin + dma check in CI |
| Already have ESLint | ESLint for DMA instead of Biome |
| Need maximum editor accuracy | ESLint, not Biome |
Example config — examples/vue-vite/biome.jsonc.