Быстрый старт
Установите CLI, bootstrap через dma init, запустите dma check и подключите CI.
Минимальный путь от пустого или существующего проекта до работающей проверки DMA. Предполагаем TypeScript-приложение с src/ (или создаёте его через init).
Работаете с AI-агентом? Скопируйте промпт — он подскажет установку skill, dma init и шаги проверки для вашего репозитория.
1. Установите CLI
npm install -D @derived-modular/cli2. Bootstrap layout
Из директории app-пакета (в monorepo: apps/web, а не корень workspace):
npx @derived-modular/cli init .init безопасен для существующих проектов — strict skip, ничего не перезаписывает:
| Создаёт (если нет) | Пропускает |
|---|---|
src/, features/, shared/ | Существующие файлы и папки |
app/ — если ещё нет pages/ или routes/ | dma.config.*, scripts.dma, маркеры в AGENTS.md |
dma.config.ts, scripts.dma в package.json | Конфиги линтеров |
Блок DMA в AGENTS.md (только append) | services/ |
Итоговое дерево (минимальное):
src/
├── app/ # или pages/, routes/ — корень композиции вашего фреймворка
├── features/
└── shared/Папку services/ не создавайте заранее — она появится при первой promotion, когда другой модуль импортирует код.
Подробнее: dma init · Структура проекта.
Layout вручную? Создайте те же папки сами. Опционально dma.config.* — dma.config.
3. Смонтируйте feature из корня композиции
Корень композиции импортирует модули только через public/:
// src/app/page.tsx
import { CatalogPage } from "@/features/catalog/public/catalog-page";
import { CheckoutPage } from "@/features/checkout/public/checkout-page";
export default function Page() {
return (
<div>
<CatalogPage />
<CheckoutPage />
</div>
);
}Feature может тянуть services/*/public/* и shared/, но не другие features. Пример — examples/next-app.
4. Запустите проверку
npx @derived-modular/cli check .Один app с src/ — один граф. Корень monorepo без src/ — CLI находит приложения (или --roots). Каждый root — отдельный граф.
Типичные первые ошибки:
| Правило | Что случилось | Что делать |
|---|---|---|
public-api | Импорт в features/foo/model, а не в public/ | Вынесите символ в public/ или импортируйте оттуда |
feature-to-feature | Feature A импортирует feature B | Promotion в services/ или shared/ (second use) |
layer-direction | Импорт «вверх», например из shared в features | Разверните зависимость |
Разбор правил — dma check. Monorepo — гайд по monorepo.
5. Добавьте в CI
npx @derived-modular/cli check . --format jsonПодробнее — CI.
6. (Опционально) Линтер в редакторе
Быстрая обратная связь при сохранении — не замена dma check:
npm install -D @derived-modular/eslint-plugin eslint// eslint.config.js
import dma from "@derived-modular/eslint-plugin";
export default [
...dma.configs.recommended,
{
settings: {
dma: {
srcRoot: "src",
compositionRoots: ["app", "pages", "routes"],
},
},
},
];ESLint может подхватить srcRoot / compositionRoots из dma.config.*, если settings.dma не задан. Настройка — ESLint.
7. Локальные сигналы роста
npx @derived-modular/cli doctor .doctor не ломает CI (код 0), но подсказывает: вынести в shared, раздуть сегменты, промоутить feature в service. Подробнее — dma doctor.