npm package: @simplegen/simplegen
Description: SimpleGen CLI for SimpleOne DSL configuration
Latest version: 0.2.3

# SimpleGen для SimpleOne

Инструментарий для генерации кода платформы SimpleOne с помощью AI.

---

## Содержание

- [SimpleGen для SimpleOne](#simplegen-для-simpleone)
  - [Содержание](#содержание)
  - [Установка](#установка)
  - [Конфигурация](#конфигурация)
    - [SimpleGen](#simplegen)
    - [Figma MCP-сервер](#figma-mcp-сервер)
  - [Быстрый старт](#быстрый-старт)
  - [Работа над задачей](#работа-над-задачей)
    - [Шаг 1. Создание и проверка спецификации](#шаг-1-создание-и-проверка-спецификации)
      - [1.1. Создайте спецификацию задачи](#11-создайте-спецификацию-задачи)
      - [1.2. Проверьте постановку задачи в спецификации](#12-проверьте-постановку-задачи-в-спецификации)
    - [Шаг 2. Планирование реализации](#шаг-2-планирование-реализации)
      - [2.1. Создайте план реализации](#21-создайте-план-реализации)
      - [2.2. Закоммитьте спецификацию](#22-закоммитьте-спецификацию)
    - [Шаг 3. Генерация кода](#шаг-3-генерация-кода)
      - [3.1. Сгенерируйте код](#31-сгенерируйте-код)
      - [3.2. Проведите code review](#32-проведите-code-review)
      - [3.3. Закоммитьте результат](#33-закоммитьте-результат)
    - [Шаг 4. Деплой на стенд](#шаг-4-деплой-на-стенд)
  - [Работа с Figma-макетами](#работа-с-figma-макетами)
    - [Как включить макет в задачу](#как-включить-макет-в-задачу)
    - [Что происходит при обработке макета](#что-происходит-при-обработке-макета)
  - [FAQ: Решение типичных вопросов](#faq-решение-типичных-вопросов)
  - [Справочные материалы](#справочные-материалы)
    - [Все команды](#все-команды)
      - [Инициализация и настройка](#инициализация-и-настройка)
      - [Работа со спецификацией](#работа-со-спецификацией)
      - [Генерация и review](#генерация-и-review)
      - [Сборка и деплой](#сборка-и-деплой)
    - [Форматы описания задач](#форматы-описания-задач)
      - [User Story](#user-story)
      - [User Story с макетом](#user-story-с-макетом)
      - [Defect](#defect)
      - [Свободная форма](#свободная-форма)
    - [Структура проекта](#структура-проекта)
    - [Поддерживаемые сущности](#поддерживаемые-сущности)

## Установка

```bash
npm install -g @simplegen/simplegen
```

---

## Конфигурация

### SimpleGen

SimpleGen использует переменные окружения.

Пример создания файла `.env` в корне репозитория:

```dotenv
SIMPLEONE_URL=http://simple.test
SIMPLEONE_LOGIN=admin
SIMPLEONE_PASSWORD=123456
```

| Переменная | Обязательность | Описание | Пример |
| ---------- | -------------- | -------- | ------ |
| `SIMPLEONE_URL` | Обязательная | Базовый URL инстанса SimpleOne | `SIMPLEONE_URL=http://simple.test` |
| `SIMPLEONE_API_KEY` | Обязательная* | API-ключ для аутентификации | `SIMPLEONE_API_KEY=asd123` |
| `SIMPLEONE_LOGIN` | Обязательная* | Логин (альтернатива API-ключу) | `SIMPLEONE_LOGIN=admin` |
| `SIMPLEONE_PASSWORD` | Обязательная* | Пароль (используется вместе с `SIMPLEONE_LOGIN`) | `SIMPLEONE_PASSWORD=123456` |
| `SIMPLEONE_ELEVATED_ROLES` | Необязательная | Список elevated-ролей через запятую | `SIMPLEONE_ELEVATED_ROLES=security_admin` |

\* Должен быть задан либо `SIMPLEONE_API_KEY`, либо пара `SIMPLEONE_LOGIN` + `SIMPLEONE_PASSWORD`.

При деплое (`/simplegen.product_build`) SimpleGen отправляет записи на стенд через Table API. Если пользователь, от имени которого выполняется деплой, не обладает необходимыми правами для создания/изменения определённых записей (например, ACL, ролей), запросы будут отклонены сервером.

Источники конфигурации (по приоритету):

1. Переменные окружения процесса (`SIMPLEONE_*`)
2. `.env` в корне репозитория
3. `~/.simplegen/.env`

### Figma MCP-сервер

Для работы с Figma-макетами при создании и модификации виджетов необходимо подключить Figma MCP-сервер. Это позволяет ИИ автоматически извлекать из макетов дизайн-токены, компоненты и структуру UI.

Создайте файл `.cursor/mcp.json` в корне проекта:

```json
{
  "mcpServers": {
    "figma": {
      "url": "https://mcp.figma.com/mcp"
    }
  }
}
```

**Авторизация Figma:**

1. После добавления конфигурации перезапустите Cursor.
2. Откройте **Cursor Settings → MCP** — сервер `figma` должен отобразиться в списке.
3. При первом обращении к Figma MCP потребуется авторизация через браузер (OAuth). Следуйте инструкциям в интерфейсе Cursor.

> ⚠️ **Важно:** Figma MCP-сервер необязателен для работы с SimpleGen. Он нужен **только** для задач, связанных с Figma-макетами (виджеты, портальные страницы). Остальные задачи (бизнес-правила, ACL, таблицы и т.д.) работают без него.

---

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

1. Если папка проекта **ещё не является git-репозиторием**, выполните команду:

```bash
git init
```

2. Запустите инициализацию:

> ⚠️ **Важно:** Эту команду стоит применять, когда вы инициализируете **пустой репозиторий**. При клонировании готового репозитория команду инициализации выполнять **не нужно**.

```bash
simplegen init "Название продукта"
```

Команда выгрузит все записи с вашего стенда, относящиеся к нужному продукту, а также записи обязательных продуктов (Simple Application и Platform).

> 💡 **Подсказка:** Название приложения должно точно совпадать со значением поля `name` в таблице Applications на вашем стенде.

> ⚠️ **Важно:** Выгрузка "тяжёлых" продуктов может занять некоторое время (до 10 минут).

> **Примечание:** Инструмент `simplegen init` (вызывается через терминал) используется **один раз** при первичной настройке. Для последующего обновления версий используйте команду `/simplegen.init`.

3. Зафиксируйте начальное состояние:

```bash
git add .
git commit -m "Initial SimpleGen setup"
```

---

## Работа над задачей

> ⚠️ **Работа с командами:** Команды SimpleGen вызываются через меню `/` в чате Cursor — начните вводить `/simplegen` и выберите нужную команду из списка. **Не копируйте команды как текст** — они не сработают без вызова через `/`. 

### Зависимость от другой задачи

Если текущая задача зависит от другой задачи, которая ещё не влита в основную ветку:

1. Откалывайтесь от ветки зависимой задачи (а не от `main`/`master`)
2. Перед деплоем накатите SOP зависимой задачи на стенд через `/simplegen.product_build`
3. После этого работайте в обычном режиме

---

### Шаг 1. Создание и проверка спецификации

#### 1.1. Создайте спецификацию задачи

Опишите задачу в свободной форме:

```md
/simplegen.spec_create

Название: Валидация поля urgency
Описание: При сохранении task поле urgency должно быть обязательным
Критерии приёмки:
- При пустом urgency показывается ошибка
- Запись не сохраняется без urgency
```

Если задача связана с UI (виджеты, портальные страницы), **включите Figma-ссылку** прямо в описание:

```md
/simplegen.spec_create

Название: Массовое завершение инцидентов
Описание: Добавить виджет массового завершения инцидентов из списка
[(см. макет)](https://www.figma.com/design/XXXXX/Project?node-id=123-456&m=dev)
Критерии приёмки:
- Пользователь выбирает записи в списке и нажимает «Завершить»
- Открывается модальное окно с полями из макета
- При подтверждении записи переходят в статус «Завершено»
```

> 💡 **Подсказка:** При наличии Figma-ссылки в описании ИИ автоматически обратится к макету через Figma MCP, извлечёт компоненты, дизайн-токены и структуру UI, и включит их в спецификацию. Подробнее — в разделе [Работа с Figma-макетами](#работа-с-figma-макетами).

**Что произойдёт:**

- Создастся каталог `tasks/<task_id>/` (если указан идентификатор задачи — используется он, иначе slug генерируется автоматически из названия задачи)
- Появится файл `_spec.md` с постановкой задачи
- Появится `simplegen.json` с метаданными
- Появится каталог `build_logs/` для артефактов сборки
- Если в описании была Figma-ссылка — в `_spec.md` будут включены элементы, извлечённые из макета

#### 1.2. Проверьте постановку задачи в спецификации

```md
/simplegen.spec_check
```

AI задаст уточняющие вопросы и поможет выявить неоднозначности в требованиях.

---

### Шаг 2. Планирование реализации

#### 2.1. Создайте план реализации

```md
/simplegen.spec_plan
```

Команда разобьёт задачу на фазы и создаст план выполнения в файле `_task_plan.md`.

#### 2.2. Закоммитьте спецификацию

```bash
git add .
git commit -m "Add spec for <feature>"
```

---

### Шаг 3. Генерация кода

#### 3.1. Сгенерируйте код

```md
/simplegen.code_generate
```

ИИ выполняет кодогенерацию по плану `_task_plan.md` и спецификации `_spec.md` активной задачи.

**На выходе:**

- Файлы DSL в `<product>/domain/` — таблицы, колонки, бизнес-правила, клиентские скрипты, UI Actions и другие сущности
- Скрипты `.js` с бизнес-логикой
- TypeScript-файлы `records.ts` с метаданными записей

Команду можно вызывать несколько раз (например, по фазам `_task_plan.md`) — изменения накапливаются поверх текущего состояния кода.

> 💡 **Работа с изменениями в Cursor:**  
> После генерации кода Cursor покажет предложенные изменения в панели Changes.  
> - **Keep All** — принять все изменения (или кликните на файл и нажмите `Ctrl+Shift+Enter`)  
> - **Reject All** — отклонить все изменения  
> - Кликните на конкретный файл, чтобы просмотреть diff и принять/отклонить изменения точечно

#### 3.2. Проведите code review

```md
/simplegen.code_review
```

Автоматическая проверка сгенерированного кода на соответствие правилам и рекомендациям.

> 💡 **Рекомендация:** Code review не является обязательным, но **настоятельно рекомендуется** перед деплоем для выявления потенциальных проблем.

**Если review обнаружил ошибки:**

- Исправьте код через чат (опишите ошибку и попросите ИИ внести правки), затем повторите `/simplegen.code_review`
- Если точечные правки не помогают — перегенерируйте код через `/simplegen.code_generate` (будет создан новый DSL)

#### 3.3. Закоммитьте результат

```bash
git add .
git commit -m "Implement <feature>"
```

---

### Шаг 4. Деплой на стенд

```md
/simplegen.product_build
```

Команда соберёт SOP-файл и развернёт изменения на вашем стенде SimpleOne. Статус деплоя будет выведен в консоль.

---

## Работа с Figma-макетами

SimpleGen поддерживает работу с Figma-макетами через MCP-сервер Figma. Это позволяет ИИ обращаться к макетам напрямую — извлекать компоненты, дизайн-токены, типографику, цвета и структуру UI, и использовать их при генерации виджетов.

> ⚠️ **Предварительное условие:** Figma MCP-сервер должен быть настроен (см. [Figma MCP-сервер](#figma-mcp-сервер)).

### Как включить макет в задачу

Включите Figma-ссылку в описание задачи при вызове `/simplegen.spec_create`. Поддерживаемые форматы ссылок:

```text
https://www.figma.com/design/<FILE_KEY>/<FileName>?node-id=<NODE_ID>&m=dev
https://www.figma.com/file/<FILE_KEY>/<FileName>?node-id=<NODE_ID>
```

Ссылку можно включить двумя способами:

**Inline — прямо в тексте описания:**

```md
Описание: Добавить модальное окно массового завершения
[(см. макет)](https://www.figma.com/design/XXXXX/Project?node-id=123-456&m=dev)
```

**В отдельном разделе — если макетов несколько:**

```md
Описание: Новая страница каталога услуг

Макеты:
- Основной вид: https://www.figma.com/design/XXXXX/Project?node-id=100-200&m=dev
- Состояние пустого списка: https://www.figma.com/design/XXXXX/Project?node-id=100-300&m=dev
- Мобильная версия: https://www.figma.com/design/XXXXX/Project?node-id=100-400&m=dev
```

> 💡 **Подсказка:** Ссылку на макет можно получить в Figma: правый клик на фрейм → **Copy/Paste as** → **Copy link**. Для режима разработки откройте фрейм и скопируйте URL из адресной строки.

### Что происходит при обработке макета

При обнаружении Figma-ссылки ИИ автоматически:

1. **На этапе спецификации** (`spec_create`, `spec_check`):
   - Извлекает из макета элементы UI: поля ввода, кнопки, списки, секции
   - Определяет логику взаимодействия: переходы между состояниями, условную видимость
   - Документирует всё это в `_spec.md`

2. **На этапе генерации кода** (`code_generate`):
   - Маппит Figma-компоненты на SimpleTags платформы (`<string>`, `<select>`, `<reference>` и др.)
   - Извлекает дизайн-токены и транслирует их в CSS-переменные SimpleOne (`var(--token)`)
   - Генерирует код виджета (HTML-шаблон, CSS, клиентский и серверный скрипты)

> 💡 **Подсказка:** Если ваш Figma MCP-сервер недоступен, вы можете вложить **скриншот макета** прямо в чат Cursor как изображение. ИИ проанализирует его визуально, но точность извлечения дизайн-токенов будет ниже.

### Когда Figma MCP недоступен

Если Figma MCP-сервер не настроен или недоступен, элементы макета необходимо описать **текстом** непосредственно в описании задачи или в спецификации:

- Перечислить все элементы UI: поля ввода, кнопки, секции, состояния
- Описать логику взаимодействия: переходы, условную видимость, обратную связь
- Указать Figma-ссылку для справки (ИИ не сможет обратиться к ней автоматически, но она будет полезна при ручной сверке)

Пример спецификации с текстовым описанием макета: [Распознавание документов / Document identification – Figma](https://www.figma.com/design/SBWtQl8zRH4iLCRVLzVlfV/%D0%A0%D0%B0%D1%81%D0%BF%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2---Document-identification?node-id=106-2504&m=dev)

---

## FAQ: Решение типичных вопросов

**Как посмотреть текущую задачу?**  
→ Откройте `simplegen.json` в корне продукта и найдите поле `current_feature_path`

**Как переключиться между задачами?**  
→ Выполните `/simplegen.context_set tasks/<task_id>`  
> ⚠️ Одновременно работать над несколькими задачами нельзя. Если не переключиться, модель будет видеть старую задачу, но контекст будет нарушен новой — это приведёт к ошибкам в коде и спецификации.

**Можно ли править `_spec.md`, код и план вручную?**  
→ **`_spec.md`**: ручные правки разрешены **до создания `_task_plan.md`**. Пока план не сгенерирован — правьте спецификацию свободно. После создания плана изменения в `_spec.md` вносите через `/simplegen.spec_check` → `/simplegen.spec_plan`, чтобы план оставался согласованным.  
→ **Код** в `domain/`: ручные правки разрешены всегда.  
→ **`_task_plan.md`**: структуру (фазы, трассировку FR) пересобирайте через `/simplegen.spec_plan`. Отмечать выполненные пункты (чеклисты) вручную — можно.

**Как принять или отклонить изменения после генерации?**  
→ После выполнения `/simplegen.code_generate` Cursor покажет изменения в панели Changes  
→ **Keep All** — принять все предложенные изменения  
→ **Reject All** — отклонить все изменения  
→ Кликните на файл для просмотра diff и точечного принятия/отклонения

**Как откатить изменения?**  
→ `/simplegen.product_rollback` — откат SOP на стенде (возврат к последнему успешному деплою)  
→ `git reset --hard HEAD~1` — откат на предыдущий коммит локально  
→ `git checkout .` — отмена незакоммиченных изменений

**Нужно синхронизировать с сервером?**  
→ Выполните `/simplegen.product_sync` — обновление `platform/`, `sa/`, `domain/`

**Нужно обновить только правила и команды?**  
→ Выполните `/simplegen.update_rules` — обновит `.cursor/rules/`, `.cursor/commands/`, `simpleone-api.d.ts` и хэши в `simplegen.json` без затрагивания DSL-данных.

**Нужно обновить версию SimpleGen?**  
→ Выполните `/simplegen.init` — переинициализация на уже настроенном проекте  
> ⚠️ **Внимание:** Команда перезапишет локальные изменения в `domain/`. Убедитесь, что все изменения закоммичены или сохранены.

**Figma MCP-сервер не подключается?**  
→ Проверьте наличие файла `.cursor/mcp.json` с записью `"figma"` (см. [Figma MCP-сервер](#figma-mcp-сервер))  
→ Перезапустите Cursor после добавления конфигурации  
→ Проверьте статус в **Cursor Settings → MCP** — сервер `figma` должен быть в списке  
→ Если статус красный — нажмите на сервер и пройдите повторную авторизацию

**ИИ не обращается к макету при создании спецификации?**  
→ Убедитесь, что Figma-ссылка включена непосредственно в описание задачи при `/simplegen.spec_create`  
→ Ссылка должна быть в формате `https://www.figma.com/design/<FILE_KEY>/...?node-id=<NODE_ID>`  
→ Проверьте, что Figma MCP-сервер доступен (см. выше)

---

## Справочные материалы

### Все команды

#### Инициализация и настройка

| Команда | Назначение |
| ------- | ---------- |
| `/simplegen.init` | (Пере)инициализация — обновляет `platform/`, `sa/`, `domain/`, правила |
| `/simplegen.product_sync` | Синхронизировать со стендом (при расхождении версий) |
| `/simplegen.update_rules` | Обновить правила и команды без пересинхронизации DSL |
| `/simplegen.context_set` | Установить активную фичу |

#### Работа со спецификацией

| Команда | Назначение |
| ------- | ---------- |
| `/simplegen.spec_create` | Создать задачу из бизнес-описания |
| `/simplegen.spec_check` | Проверить постановку, задать уточняющие вопросы |
| `/simplegen.spec_plan` | Разбить задачу на фазы → `_task_plan.md` |

#### Генерация и review

| Команда | Назначение |
| ------- | ---------- |
| `/simplegen.code_generate` | Генерация кода по плану |
| `/simplegen.code_review` | Review изменений (diff initial_commit..HEAD) |

#### Сборка и деплой

| Команда | Назначение |
| ------- | ---------- |
| `/simplegen.product_build` | Собрать SOP-файл, задеплоить на стенд |
| `/simplegen.product_rollback` | Откатить на предыдущий SOP-файл |

---

### Форматы описания задач

#### User Story

```md
Название: [название]
Описание: [описание]
Критерии приёмки:
- [критерий 1]
- [критерий 2]
```

#### User Story с макетом

```md
Название: [название]
Описание: [описание]
[(см. макет)](https://www.figma.com/design/XXXXX/Project?node-id=123-456&m=dev)
Критерии приёмки:
- [критерий 1]
- [критерий 2]
```

> 💡 Figma-ссылку можно включить в любое место описания. ИИ автоматически обнаружит её и извлечёт данные из макета. Подробнее — [Работа с Figma-макетами](#работа-с-figma-макетами).

#### Defect

```md
Название: [название]
Описание: [описание]
Шаги воспроизведения:
1. [шаг]
Ожидаемый: [...]
Фактический: [...]
```

#### Свободная форма

```md
Надо добавить на форму записи профиля зеркало, что пользователь заходил и сразу видел свое отражение.
```

---

### Структура проекта

```text
workspace-root/
├── AGENTS.md                  # 📄 Глобальный контекст проекта (краткое описание приложений)
├── platform/                  # 🔒 Read-only — платформа SimpleOne
├── sa/                        # 🔓/🔒 Simple Application
├── .cursor/
│   ├── mcp.json               # ⚙️ MCP-серверы (Figma, SimpleOne)
│   ├── rules/                 # Правила кодогенерации (управляются simplegen.init)
│   └── commands/              # Команды /simplegen.* (управляются simplegen.init)
│
└── <product>/                 # 📦 Ваш продукт (itsm/, hrm/, etc.)
    ├── AGENTS.md              # 📄 Контекст продукта (краткое описание приложения)
    ├── simplegen.json         # ⚙️ Конфигурация продукта
    ├── tests/                 # 🧪 Автотесты
    ├── domain/                # Бизнес-конфигурация решения
    │   ├── data-structure/    # Структура данных
    │   │   ├── tables/<table_name>.ts         # SysDbTable
    │   │   ├── columns/<table_name>.ts        # SysDbColumn (все колонки таблицы в одном файле)
    │   │   ├── choice-options/<table_name>.ts  # SysChoice (все опции таблицы в одном файле)
    │   │   ├── state-models/<table_name>.ts   # SysStateModel
    │   │   ├── state-transitions/<table_name>.ts # SysStateTransition
    │   │   ├── filter-option-dynamics/<table_name>.ts # SysFilterOptionDynamic
    │   │   ├── column-overrides.ts            # SysDbColumnOverride
    │   │   └── record-numbers.ts              # SysNumber
    │   ├── business-logic/    # Бизнес-логика
    │   │   ├── business-rules/<table_name>/   # records.ts + <script_name>.js
    │   │   ├── client-scripts/<table_name>/   # records.ts + <script_name>.js
    │   │   ├── ui-actions/<table_name>/       # records.ts + <script_name>.js
    │   │   ├── script-includes/               # records.ts + <script_name>.js
    │   │   ├── widgets/<widget_name>/         # record.ts + client_script.js + server_script.js + template.html + style.css + instances.ts
    │   │   ├── notifications/<table_name>/    # rules.ts + templates.ts + *.html
    │   │   │   └── scripts/records.ts         # SysNotificationScript
    │   │   ├── system-properties.ts           # SysProperty
    │   │   └── system-property-categories.ts  # SysPropertyCategory
    │   ├── access-control/    # Контроль доступа
    │   │   ├── roles.ts                       # SysRole
    │   │   ├── user-criterias.ts              # SysUserCriteria
    │   │   └── security-acls/<table_name>/    # records.ts + <script_name>.js
    │   ├── forms/             # Представления форм
    │   │   └── <table_name>/                  # views.ts, sections.ts, elements.ts, related-lists.ts, related-list-elements.ts
    │   ├── lists/             # Представления списков
    │   │   └── <table_name>/                  # views.ts, columns.ts
    │   ├── rem/               # REM — расширенная модель записи
    │   │   ├── models/<table_name>/           # SysReModel (records.ts + <script_name>.js)
    │   │   ├── containers.ts                  # SysReContainer
    │   │   ├── collections.ts                 # SysReCollection
    │   │   ├── attributes/<container_name>.ts # SysReAttribute
    │   │   ├── choices/<attribute_name>.ts    # SysReChoice
    │   │   ├── client-scripts/<container_name>/ # SysReModelClientScript (records.ts + <script_name>.js)
    │   │   └── form-elements/<container_name>.ts # SysReFormElement
    │   ├── schedule/          # Планировщик
    │   │   ├── schedules.ts                   # SysSchedule
    │   │   ├── schedule-elements.ts           # SysScheduleElement
    │   │   ├── scheduled-jobs.ts              # SysScheduleJob
    │   │   ├── scheduled-imports.ts           # SysScheduleImport
    │   │   └── scheduled-scripts/             # records.ts + <script_name>.js
    │   ├── navigation/        # Навигация
    │   │   ├── menu-categories.ts             # SysMenuCategory
    │   │   └── menu-items.ts                  # SysMenuItem
    │   ├── service-catalog/   # Каталог услуг
    │   │   ├── catalogs.ts                    # SysRmcCatalog
    │   │   ├── categories.ts                  # SysRmcCategory
    │   │   ├── models.ts                      # SysRmcModel
    │   │   ├── category-user-criterias.ts     # SysRmcCategoryUserCriteria
    │   │   └── model-user-criterias.ts        # SysRmcModelUserCriteria
    │   ├── portal/            # Портал
    │   │   ├── pages.ts                       # Page
    │   │   ├── page-containers.ts             # PageContainer
    │   │   ├── page-rows.ts                   # PageRow
    │   │   ├── page-columns.ts                # PageColumn
    │   │   ├── portals.ts                     # Portal
    │   │   ├── portal-contexts.ts             # SysPortalContext
    │   │   └── portal-nodes.ts                # PortalNode
    │   ├── other/             # Все остальные версионируемые сущности
    │   └── localization/      # Локализации
    │       ├── languages.ts                   # SysLanguage
    │       ├── source-messages/<slug>/        # source.ts + messages.ts
    │       └── translations/<table_name>/     # <column_name>.ts
    │
    └── tasks/                          # Задачи
        └── <task_id>/                  # идентификатор из трекера или slug
            ├── _spec.md                # Постановка задачи
            ├── _task_plan.md                # План выполнения задачи
            ├── simplegen.json          # Метаданные задачи
            ├── [<PRODUCT>]_<task_id>.sop  # Текущий SOP (обновляется при билде)
            └── build_logs/             # Архив SOP, логи API (gitignore)
```

---

### Поддерживаемые сущности

- sys_db_table
- sys_db_column
- sys_db_column_override
- sys_choice
- sys_state_model
- sys_state_transition
- sys_number
- sys_filter_option_dynamic
- sys_business_rule
- sys_script_client
- sys_ui_action
- sys_script_include
- sys_property
- sys_property_category
- sys_notification_rule
- sys_notification_script
- sys_notification_template
- sys_widget
- sys_widget_instance
- sys_role
- sys_security_acl
- sys_user_criteria
- sys_ui_form
	- sys_ui_form_section
	- sys_ui_form_element
	- sys_ui_related_list
	- sys_ui_related_list_element
- sys_ui_list
	- sys_ui_list_column
- source_message
	- message
- sys_language
- sys_translation
- sys_menu_category
- sys_menu_item
- sys_re_model
- sys_re_container
- sys_re_collection
- sys_re_attribute
- sys_re_choice
- sys_re_model_client_script
- sys_re_form_element
- sys_rmc_catalog
- sys_rmc_category
- sys_rmc_model
- sys_rmc_category_user_criteria
- sys_rmc_model_user_criteria
- page
- page_container
- page_row
- page_column
- portal
- sys_portal_context
- portal_node
- sys_schedule
- sys_schedule_element
- sys_schedule_job
- sys_schedule_import
- sys_schedule_script

Остальные сущности экспортируются в папку `other`, но не поддерживаются правилами.