Files
slm-design/README.md

129 lines
10 KiB
Markdown
Raw Permalink Normal View History

2026-07-24 14:35:35 +03:00
# SLM Design
**Scoped Layered Module Design (SLM)** - архитектурная модель для организации кода внутри фронтенд-приложения. Она описывает владельцев поведения, роли слоёв, границы модулей, публичные API и допустимые зависимости.
2026-07-24 14:35:35 +03:00
Цель SLM - сделать архитектурные решения наблюдаемыми в структуре проекта: понимать, какой модуль отвечает за результат, что доступно его потребителям и как изменение повлияет на остальное приложение.
2026-07-24 14:35:35 +03:00
[Документация](https://gromlab-ru.github.io/slm-design/) | [Пример React-приложения](./examples/react-vite/)
2026-07-24 14:35:35 +03:00
## AI skill
```bash
npx skills add gromlab-ru/slm-design
```
Или [скачать `slm-design.zip`](https://gromlab-ru.github.io/slm-design/downloads/slm-design.zip).
## О чём SLM
SLM отвечает на три основных вопроса:
1. Какой модуль владеет конкретным результатом или поведением?
2. Какие возможности модуль открывает внешним потребителям?
3. От каких других модулей он может зависеть?
Базовый принцип модели: **у каждой самостоятельной ответственности есть ровно один модуль-владелец**.
Модуль определяет публичный API ответственности, её зависимости, модели и правила, состояние, жизненный цикл и внутреннюю реализацию. Компонент, Provider, hook, store или service остаются механизмами реализации и не становятся отдельными архитектурными владельцами только из-за своей технической роли.
SLM применяется внутри `SLM root` - границы структурной архитектуры одного приложения. Конкретный проект сам сопоставляет свои пути с сущностями SLM.
## Структурная модель
```text
SLM root
└── слой
├── модуль
│ ├── публичные фасеты
│ ├── сегменты
│ └── вложенные модули
└── группа
└── модули
```
| Сущность | Назначение |
|---|---|
| `SLM root` | Ограничивает область архитектуры одним приложением |
| Слой | Классифицирует код по архитектурной роли и ограничивает направления зависимостей |
| Модуль | Владеет одной самостоятельной ответственностью и её публичным API |
| Домен | Специализирует модуль для предметной ответственности и доменных сценариев |
| Группа | Навигационно классифицирует модули, но не владеет кодом или API |
| Сегмент | Организует внутренний код одного модуля без собственной ответственности |
| Вложенный модуль | Владеет отдельной подответственностью внутри родительского модуля |
Слой, группа и сегмент не являются владельцами. По умолчанию код внутри `SLM root` принадлежит ближайшему модулю; исключениями остаются точки входа `app` и небольшие детерминированные ресурсы `shared`.
## Слои
SLM определяет шесть архитектурных ролей:
| Слой | Роль |
|---|---|
| `app` | Запуск приложения, маршруты, преобразование внешних входов и подключение готовых публичных API |
| `compositions` | Представление и связывание готовых возможностей в страницы, макеты, экраны и виджеты |
| `domains` | Предметные ответственности и сценарии: модели, правила, состояние, операции с данными и доменный UI |
| `infra` | Технические сервисы без собственной предметной модели |
| `ui` | Универсальные интерфейсные модули без знания о конкретном продукте или странице |
| `shared` | Детерминированный фундамент без продуктового знания, ввода-вывода и изменяемого состояния |
Проект создаёт только те слои, для которых появился соответствующий код. Пустые слои и обязательное прохождение через каждый промежуточный уровень не требуются.
## Ключевые свойства
- **Один владелец ответственности.** Контракт, состояние, зависимости и внутренняя реализация связного результата принадлежат одному модулю.
- **Закрытая модульная граница.** Внешний код использует модуль только через его публичные фасеты. Глубокие импорты во внутренние файлы запрещены.
- **Фасеты сред выполнения.** Обязательный `index` содержит универсальный API; `client`, `browser` и `server` добавляются только при необходимости.
- **Вертикальные домены.** Домен владеет сценарием целиком: предметным контрактом, правилами, состоянием, ошибками, доменным UI и адаптацией источников данных.
- **Независимость от DTO.** Внешние request, response и error types остаются внутри интеграционной границы и не становятся публичной моделью домена.
- **Ацикличный модульный граф.** Межмодульные импорты проходят через публичный API, учитывают направление слоёв и не образуют циклов.
- **Рост по ответственности.** Сегменты организуют внутренний код, а новый или вложенный модуль появляется только для самостоятельной ответственности.
- **Владение состоянием и ресурсами.** Модуль определяет источник истины, область жизни, число экземпляров и очистку долгоживущих ресурсов.
## Проверка архитектуры
SLM разделяет смысловые и структурные решения.
- На архитектурном ревью проверяются ответственность, единственный владелец, роль слоя, состав публичного API, доменный контракт, состояние и жизненный цикл.
- Автоматически можно проверять направления между слоями, доступ через публичные фасеты, отсутствие глубоких импортов и циклов в модульном графе.
Блокирующие правила собраны в едином реестре и имеют стабильные коды. Рекомендации и примеры объясняют модель, но не подменяют нормативные требования.
## Что SLM не определяет
SLM не требует конкретного фреймворка, state manager, способа получения данных или потока управления. Модель не задаёт фиксированные имена сегментов, полный файловый стайлгайд и правила организации монорепозитория.
Эти решения остаются за проектом. SLM определяет только архитектурный смысл владельцев, границ и зависимостей внутри одного приложения.
## Документация и пример
- [Обзор архитектурной модели](https://gromlab-ru.github.io/slm-design/architecture/)
- [Слои](https://gromlab-ru.github.io/slm-design/architecture/layers)
- [Модули и публичный API](https://gromlab-ru.github.io/slm-design/architecture/modules)
- [Домены и граница внешних данных](https://gromlab-ru.github.io/slm-design/architecture/domains)
- [Зависимости и модульный граф](https://gromlab-ru.github.io/slm-design/architecture/dependencies)
- [Терминология](https://gromlab-ru.github.io/slm-design/reference/terminology)
- [Реестр правил](https://gromlab-ru.github.io/slm-design/rules/registry)
- [Проверка архитектуры](https://gromlab-ru.github.io/slm-design/reference/validation)
- [Пример React + Vite приложения](./examples/react-vite/)
<details>
<summary>Разработка репозитория</summary>
2026-07-24 14:35:35 +03:00
Требуется Node.js 20 или новее.
```bash
npm ci
2026-08-01 09:31:08 +03:00
npm run build:skill
2026-07-24 14:35:35 +03:00
npm run check
```
Локальный запуск документации:
2026-07-24 14:35:35 +03:00
```bash
npm run docs:dev
2026-07-24 14:35:35 +03:00
```
Документация находится в `docs/`, исходник skill - в `src-skills/slm-design/`. Собранный каталог `skills/slm-design/` не редактируется вручную.
</details>