Files
slm-design/DRAFT/level-2

SLM Level 2

Статус: рабочий черновик. Документы в этой папке не являются спецификацией.

Level 2 предназначен для приложений с устойчивыми доменными API, несколькими способами сборки или самостоятельными framework-модулями домена. Он сохраняет слои Level 1, но заменяет простой доменный модуль доменным пакетом с явными владельцами ролей.

Наследование Level 1

Level 2 соблюдает определения и правила Level 1, кроме явно заменённых положений:

Положение Level 1 Статус в Level 2
Порядок app → compositions → domains → infra → ui → shared Сохраняется
Модуль, Group, сегмент, компонент, публичный API и граф зависимостей Сохраняют смысл
Доменный модуль и SLM-L1-DOMAIN-R015 Заменяются доменным пакетом
Навигационная Group слоя domains Может содержать доменные пакеты
Group внутри доменного пакета Содержит обычные SLM-модули и Groups

Канонический набор требований образуют правила Level 1 и правила Level 2.

Когда выбирать Level 2

Level 2 оправдан, когда предметной области нужны один устойчивый DomainApi, разные сборки для браузера и сервера, несколько технических интеграций или самостоятельные domain-specific модули React, Vue либо другого фреймворка.

Уровень выбирается для всего SLM root. Проект, в котором всем предметным областям достаточно простых доменных модулей, остаётся на Level 1. После завершённого перехода на Level 2 каждая предметная область представлена доменным пакетом, даже если отдельный пакет имеет только business.

Размер каталога сам по себе не требует перехода.

Базовая форма

src/domains/
└── auth/                         # Доменный пакет
    ├── README.md                 # Необязательная metadata
    ├── business/                 # Обязательный SLM-модуль
    │   └── index.ts
    ├── presets/                  # Необязательная Group
    │   ├── browser/              # SLM-модуль
    │   └── request/              # SLM-модуль
    ├── adapters/                 # Необязательная Group
    │   └── identity-provider/    # SLM-модуль
    └── react/                    # Необязательная framework Group
        ├── session/              # SLM-модуль
        └── login-form/           # SLM-модуль

Корень пакета не является модулем и не имеет index.ts. Каждый исполняемый владелец внутри пакета остаётся обычным SLM-модулем со своим публичным API.

Публичные границы

Приложение получает данные, состояние и результаты домена через готовый экземпляр DomainApi. Технический код импортирует только API конкретного модуля:

import { authFactory, isAuthError } from '@/domains/auth/business'
import { createBrowserAuth } from '@/domains/auth/presets/browser'
import { AuthSessionProvider } from '@/domains/auth/react/session'
import { LoginForm } from '@/domains/auth/react/login-form'

Общие импорты @/domains/auth и @/domains/auth/react запрещены: пакет и Groups не имеют агрегирующих API.

Миграция

Доменные модули Level 1 могут временно сосуществовать с пакетами Level 2 только во время перехода. Такое состояние не является завершённым соответствием Level 2. По SLM-L2-MIGRATION-A017 старые модули и новые пакеты не создают прямых runtime- или type-only зависимостей; связанные части графа мигрируют вместе.

Карта черновика