Derived Modular Arch
Deep Dive

Почему 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-inboundService без потребителей — свойство подграф
dma doctorСигналы эволюции по всему проекту

Пример: цикл services/billingservices/cartservices/inventoryservices/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.

Матрица покрытия

ConcernESLintBiomedma check
layer-directionэвристика
feature-to-featureэвристика
public-apiэвристика
no-barrelэвристика
no-cycle
предикаты входящих рёбер
doctor

Практическая рекомендация

  1. Подключите ESLint (или Biome / Oxlint) в редактор
  2. Добавьте npx @derived-modular/cli check . в CI
  3. Раз в спринт — npx @derived-modular/cli doctor . для сигналов роста

Связанные темы

On this page