Derived Modular Arch
Начало

Быстрый старт

Установите CLI, bootstrap через dma init, запустите dma check и подключите CI.

Минимальный путь от пустого или существующего проекта до работающей проверки DMA. Предполагаем TypeScript-приложение с src/ (или создаёте его через init).

Работаете с AI-агентом? Скопируйте промпт — он подскажет установку skill, dma init и шаги проверки для вашего репозитория.

1. Установите CLI

npm install -D @derived-modular/cli

2. 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-featureFeature A импортирует feature BPromotion в 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.

Что дальше

On this page