Монорепо
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 по приложению:
- Одно app (
apps/web) — зелёныйcheck - Остальные — позже или с отдельным планом
См. Миграция.