Derived Modular Arch
Гайды

Монорепо

dma check в монорепо: multi-root discovery, workspace-пакеты, CI.

dma check / dma doctor анализируют одно дерево src/ на корень. В монорепо можно указать одно приложение или запустить проверку с корня workspace — CLI сам найдёт apps.

Один check — одно приложение (по-прежнему ок)

npx @derived-modular/cli check apps/web
npx @derived-modular/cli check apps/admin
npx @derived-modular/cli check examples/vite-react

Путь должен указывать на корень приложения с src/{app|pages|routes, features, services?, shared}.

Multi-root с корня монорепо

Если у path нет src/, CLI находит DMA-корни и проверяет каждый отдельно:

npx @derived-modular/cli check .

По умолчанию: пакеты с src/ и composition root (app | pages | routes).

Кандидаты: сначала npm/bun package.json workspaces или pnpm-workspace.yaml; иначе неглубокий обход каталогов (пропуск node_modules, dist, …).

Флаги

# явный список (без discover; positional path игнорируется)
npx @derived-modular/cli check --roots apps/web,apps/admin

# также library-пакеты с src/{features|services|shared} без composition root
npx @derived-modular/cli check . --include-packages

Или то же в dma.config.ts (см. dma.config):

import { defineConfig } from "@derived-modular/cli";

export default defineConfig({
  roots: ["apps/web", "apps/admin"],
});

Каждый корень — отдельный граф. Workspace-импорты между пакетами не склеиваются — осознанно.

Коды выхода агрегируются: 1, если любой корень упал в check; 2, если корней нет или у --roots нет src/.

CI для нескольких приложений

Один job с корня репо

- run: npx @derived-modular/cli check .

Матрица jobs (per app)

strategy:
  matrix:
    app: [apps/web, apps/admin]
steps:
  - run: npx @derived-modular/cli check ${{ matrix.app }}

Явные корни

npx @derived-modular/cli check --roots apps/web,apps/admin

Пакеты workspace (стадия 4)

Когда модуль потребляют несколько приложений, выносите в пакет монорепо:

packages/
└── cart/
    ├── package.json      # exports указывают на public surface
    └── src/
        └── public/
            └── cart.ts

Правила те же: прямые пути, без barrel внутри пакета. Enforcement — через exports в package.json и импорты приложений на published surface.

Чтобы прогнать dma check по такому пакету (без composition root): --include-packages или --roots packages/cart.

Приложение импортирует @my-org/cart/public/cart (или path из exports) — как внешний модуль ниже по слою, не как feature.

Подробнее о стадии 4 — Модули и public API.

Paths и tsconfig

Алиасы @/ резолвятся из tsconfig.json приложения, не корневого tsconfig всего монорепо. Убедитесь, что paths настроены в пакете, где лежит src/.

Examples в этом репозитории

Каждый example — workspace package под examples/*:

bun run build   # собрать CLI и плагины
bun run --cwd examples/vite-react dma-check
# или с корня после сборки:
npx @derived-modular/cli check --roots examples/vite-react

Линтеры в монорепо

ESLint / Biome / Oxlint конфиги обычно per package. @derived-modular/* плагины подключаются в конфиге приложения, где живёт src/.

Biome Grit-плагины резолвят пути от корня проекта; в некоторых monorepo / PnP раскладках возможны ограничения — см. Biome.

Миграция монорепо

Не включайте dma check на весь legacy сразу. Strangler по приложению:

  1. Одно app (apps/web) — зелёный check
  2. Остальные — позже или с отдельным планом

См. Миграция.

Что дальше

On this page