Почему CLI, а не только линтеры
Архитектурные правила — свойства графа. Один файл этого не видит.
Короткий ответ
ESLint, Biome и Oxlint смотрят на один файл (или эвристику строки импорта). Циклы, предикаты входящих рёбер и promotion — свойства всего графа. Для этого нужен отдельный анализатор — dma check.
Линтеры в редакторе остаются полезными. Но CI без CLI — дыра в архитектуре.
Что линтер видит
File-scoped правила DMA:
- импорт не в ту сторону по слоям (
layer-direction) - feature → feature (
feature-to-feature) - импорт мимо
public/(public-api) - barrel
indexс реэкспортами (no-barrel)
ESLint делает это точно — через @derived-modular/boundaries и резолв путей. Biome — эвристикой по паттернам строк.
Что линтер не видит
| Правило | Почему нужен граф |
|---|---|
no-cycle | Цикл — путь A→B→C→A через несколько файлов |
feature-has-inbound | Входящие рёбра считаются по всем модулям, не одному импорту в файле |
service-no-inbound | Service без потребителей — свойство подграф |
dma doctor | Сигналы эволюции по всему проекту |
Пример: цикл services/billing → services/cart → services/inventory → services/billing — в каждом файле один импорт выглядит законным, а no-cycle видит только полный граф. Или catalog импортирует checkout напрямую — ESLint поймает feature-to-feature в файле, но предикат входящих рёбер feature-has-inbound и цепочки через несколько модулей — только check.
Гибридная модель DMA
Редактор → линтер (быстро, file-scoped)
CI → dma check (полный граф)
Локально → dma doctor (мягкие сигналы)Один анализатор (@derived-modular/cli) — source of truth. Линтеры — тонкие адаптеры поверх @derived-modular/boundaries, не второй источник правды.
«Настроили ESLint — архитектура под контролем» — иллюзия, пока не гоняете dma check в CI.
Почему не один мега-ESLint rule
Теоретически ESLint мог бы анализировать весь проект. На практике:
- линтеры оптимизированы под файл и кэш per-file;
- полный graph pass на каждый save — дорого;
- циклы и входящие рёбра — отдельный класс алгоритмов, не AST одного модуля.
DMA сознательно вынес graph audit в CLI. Линтеры — для feedback loop в IDE.
Матрица покрытия
| Concern | ESLint | Biome | dma check |
|---|---|---|---|
layer-direction | ✓ | эвристика | ✓ |
feature-to-feature | ✓ | эвристика | ✓ |
public-api | ✓ | эвристика | ✓ |
no-barrel | ✓ | эвристика | ✓ |
no-cycle | — | — | ✓ |
| предикаты входящих рёбер | — | — | ✓ |
| doctor | — | — | ✓ |
Практическая рекомендация
- Подключите ESLint (или Biome / Oxlint) в редактор
- Добавьте
npx @derived-modular/cli check .в CI - Раз в спринт —
npx @derived-modular/cli doctor .для сигналов роста