До этого речь шла о твоём приложении. Здесь показан отдельный репозиторий Admingen: он читает декларативную модель, приводит её к единому внутреннему представлению, строит план и создаёт файлы. Generator UI и дополнительный CLI вызывают общую прикладную логику.
Дерево показывает основные пути на примере Article, а не полный список файлов. Набор файлов зависит от модели и возможностей проекта.
Репозиторий генератора · основные пакеты
admingen/
├── cmd/
│ └── admingen/main.go
├── internal/
│ ├── domain/
│ │ ├── spec/ # контракт модели
│ │ │ ├── project.go
│ │ │ ├── types.go
│ │ │ └── validation.go
│ │ ├── normalized/ # нормализованная модель
│ │ │ ├── normalizer.go
│ │ │ ├── types.go
│ │ │ └── projection.go
│ │ └── generation/ # артефакты и их владение
│ │ ├── planner.go
│ │ ├── plan.go
│ │ └── migration_inventory.go
│ ├── app/ # прикладные сценарии
│ │ ├── project/service.go
│ │ ├── plan/service.go
│ │ ├── generate/service.go
│ │ └── rollback/service.go
│ ├── adapters/ # CLI и HTTP
│ │ ├── cli/runner.go
│ │ └── http/server.go
│ └── infrastructure/
│ ├── manifest/ # хранение модели
│ │ ├── store.go
│ │ └── workflow.go
│ ├── templates/ # рендеринг
│ │ ├── renderer.go
│ │ └── registry.go
│ └── fs/ # файловая система
│ ├── osfs.go
│ └── retirement.go
├── templates/ # исходники шаблонов
│ ├── backend/
│ │ ├── app_service.go.tmpl
│ │ └── custom_hooks.go.tmpl
│ ├── admin/
│ │ ├── feature_form.tsx.tmpl
│ │ └── feature_custom_ui_extension.tsx.tmpl
│ ├── api/entity.yaml.tmpl
│ ├── db/schema_migration.sql.tmpl
│ └── project/
└── ui/admin/ # интерфейс генератора
└── src/
├── app/router.tsx
├── features/
│ ├── entities/
│ ├── generation/
│ └── project/
└── shared/
Domain определяет правила модели, app — операции над проектом. Чтение и запись файлов, HTTP и другие способы ввода-вывода находятся во внешних пакетах. Generator UI и CLI используют одни сценарии и одну модель, поэтому выбор интерфейса не меняет правила генерации.
Контракт модели
internal/domain/spec/ задаёт допустимое содержимое manifest: сущности, поля, связи и возможности проекта. На этот контракт опираются редактор Generator UI, CLI и генерация. Так все способы работы с проектом используют одно описание.
internal/domain/generation/planner.go определяет состав файлов, их пути и правила обновления. В templates/backend/, templates/admin/ и templates/project/ лежит текст шаблонов. Такое разделение позволяет изменять правила модели отдельно от создаваемого кода. Общие исправления генерации вносятся здесь, чтобы не повторять ручные правки в каждом приложении.
Нормализованная модель
internal/domain/normalized/ приводит имена, типы и связи к согласованному внутреннему представлению. Шаблоны получают уже подготовленные данные и не должны заново разбирать исходные настройки для каждого файла.
План файлов и правила обновления
internal/domain/generation/ определяет, какие файлы создать, где их разместить и кто ими управляет. По этим правилам генератор решает, что обновить, что сохранить и когда показать конфликт ручных изменений.
Прикладные сценарии
internal/app/ выполняет операции над проектом: изменение модели, подготовку плана, просмотр и применение генерации. Сценарии обращаются к интерфейсам хранения и рендеринга. Конкретные реализации чтения и записи подключаются снаружи.
HTTP для UI и команды CLI
internal/adapters/ принимает HTTP-запросы Generator UI и команды терминала. Он преобразует их в аргументы прикладных сценариев. Оба интерфейса используют общие правила работы с проектом.
Хранение модели
internal/infrastructure/manifest/ читает и сохраняет manifest проекта. Этот пакет отвечает за документ на диске; создание Go-кода и React-компонентов выполняется отдельно.
Рендеринг шаблонов
internal/infrastructure/templates/ подставляет подготовленные данные в шаблоны и получает содержимое будущих файлов. Здесь находится сам механизм рендеринга. Текст шаблонов лежит отдельно — в корневой папке templates/.
Работа с файловой системой
internal/infrastructure/fs/ реализует чтение и запись файлов. Прикладные сценарии используют эти операции, не смешивая детали работы с диском с правилами модели и текстом шаблонов.
Исходники шаблонов
В templates/ лежат заготовки Go-кода, React-компонентов, конфигурации и других создаваемых файлов. Чтобы изменить стандартную генерацию, правят соответствующий шаблон. После этого изменение можно получать через Generate, не повторяя его вручную в каждом проекте.
Интерфейс генератора
ui/admin/ содержит Generator UI: редактор модели, настройки проекта, Generate и History. Здесь работает разработчик приложения. Система администрирования для работы с его данными создаётся отдельно, из шаблонов.