architect/_archive/2025-11-26-cleanup/cifra/archive/2025-11-10-restructure-v2/HIERARCHICAL_COMPOSITION_ARCHITECTURE.md

Иерархическая композиционная архитектура ПЛАТФОРМА ЦИФРА

Дата: 2025-11-10
Версия: 1.0.0
Принцип: Lego + Матрешка - от простого к сложному


КРАТКИЙ ОТВЕТ

Концепция: Всё собирается из простейших кирпичиков

┌─────────────────────────────────────────────────────────────┐
│               ИЕРАРХИЯ КОМПОЗИЦИИ (снизу вверх)              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Уровень 0: ЭЛЕМЕНТЫ (атомы)                               │
│  ├── Entity Types (User, Product, Order)                    │
│  ├── Field Types (String, Integer, Email, DateTime)         │
│  ├── Validators (unique, required, format)                  │
│  └── Actions (create, read, update, delete)                 │
│                                                             │
│  Уровень 1: МОДУЛИ (молекулы)                              │
│  ├── AuthModule                                             │
│  ├── ProductCatalogModule                                   │
│  ├── OrderManagementModule                                  │
│  └── PaymentModule                                          │
│                                                             │
│  Уровень 2: КОМПОНЕНТЫ (органеллы)                         │
│  ├── EcommerceComponent (модули + настройки)               │
│  │   ├── ProductCatalogModule (клон #1)                    │
│  │   ├── OrderManagementModule (клон #1)                   │
│  │   └── PaymentModule                                     │
│  └── MarketplaceComponent                                   │
│      ├── ProductCatalogModule (клон #2) ← изолирован!      │
│      └── MultiVendorModule                                  │
│                                                             │
│  Уровень 3: ВЫСОКОУРОВНЕВЫЕ КОМПОНЕНТЫ (органы)            │
│  └── SalesSystemComponent                                   │
│      ├── EcommerceComponent (внутри)                        │
│      ├── MarketplaceComponent (внутри)                      │
│      └── AnalyticsComponent                                 │
│                                                             │
│  Уровень 4: КОНФИГУРАЦИЯ (организм)                        │
│  └── platform.config.yaml                                   │
│      ├── SalesSystemComponent                               │
│      ├── CRMSystemComponent                                 │
│      └── WarehouseSystemComponent                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Ключевые принципы:

  1. Композиция - всё строится снизу вверх
  2. Изоляция - один модуль → разные компоненты → разные клоны
  3. Переиспользование - модуль описан 1 раз, используется много раз
  4. Конфигурируемость - поведение через настройки, не код
  5. Вложенность - компоненты внутри компонентов (как матрешка)

Уровень 0: ЭЛЕМЕНТЫ (атомарный уровень)

Философия: Неделимые кирпичики

Элементы - это самые базовые концепции, из которых строится ВСЁ остальное.

Типы элементов:

1. Entity Types (типы сущностей)

# elements/entities/user.entity.yaml
element_type: entity
name: User
description: "Пользователь системы"

base_fields:
  - id: {type: uuid, primary_key: true}
  - created_at: {type: datetime, auto_now_add: true}
  - updated_at: {type: datetime, auto_now: true}

behaviors:
  - timestampable
  - soft_deletable
  - versionable

2. Field Types (типы полей)

# elements/fields/email.field.yaml
element_type: field
name: EmailField
base_type: string

constraints:
  - type: format
    value: email
  - type: max_length
    value: 255
  - type: required
    value: true

validators:
  - EmailValidator
  - UniqueValidator

ui_widget: email_input
db_index: true

3. Validators (валидаторы)

# elements/validators/email_validator.yaml
element_type: validator
name: EmailValidator
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
error_message: "Invalid email format"

4. Actions (действия)

# elements/actions/crud.yaml
element_type: action_set
name: CRUDActions

actions:
  - name: create
    http_method: POST
    permissions: [create]

  - name: read
    http_method: GET
    permissions: [read]

  - name: update
    http_method: PUT
    permissions: [update]

  - name: delete
    http_method: DELETE
    permissions: [delete]

Важно про элементы:


Уровень 1: МОДУЛИ (функциональные блоки)

Философия: Модуль = Элементы + Логика + Настройки по умолчанию

Модуль - это законченный функциональный блок, который решает конкретную задачу.

Структура модуля:

# modules/auth/auth_module.yaml
module:
  name: AuthModule
  version: 1.0.0
  description: "Аутентификация и авторизация"

# Элементы, которые использует модуль
uses_elements:
  entities:
    - User
    - Role
    - Permission
  fields:
    - EmailField
    - PasswordField
    - TokenField
  validators:
    - EmailValidator
    - PasswordStrengthValidator

# Определения сущностей модуля
entities:
  User:
    extends: elements.entities.User
    fields:
      email: EmailField
      password: PasswordField
      roles: {type: relation, target: Role, many: true}

  Role:
    fields:
      name: {type: string, unique: true}
      permissions: {type: relation, target: Permission, many: true}

  Permission:
    fields:
      name: {type: string, unique: true}
      resource: {type: string}
      action: {type: enum, values: [create, read, update, delete]}

# API endpoints модуля
api:
  endpoints:
    - path: /auth/register
      method: POST
      handler: AuthModule.register_user

    - path: /auth/login
      method: POST
      handler: AuthModule.login_user

    - path: /auth/logout
      method: POST
      handler: AuthModule.logout_user
      auth_required: true

# Конфигурация по умолчанию (можно переопределить)
config:
  jwt_secret: "${ENV:JWT_SECRET}"
  jwt_expiration: 3600
  password_min_length: 8
  allow_registration: true
  email_verification_required: false

# Зависимости от других модулей
dependencies:
  - EmailModule  # для отправки писем подтверждения (опционально)

# Hooks (точки расширения)
hooks:
  before_register: []
  after_login: []
  on_password_reset: []

Важно про модули:

Пример: Один модуль → Два клона

# component_ecommerce.yaml
components:
  ecommerce:
    uses_modules:
      # Клон #1 ProductCatalog
      main_catalog:
        module: ProductCatalogModule
        config:
          allow_reviews: true
          default_currency: RUB
          max_images_per_product: 10

# component_marketplace.yaml
components:
  marketplace:
    uses_modules:
      # Клон #2 ProductCatalog (ИЗОЛИРОВАН от клона #1!)
      vendor_catalog:
        module: ProductCatalogModule
        config:
          allow_reviews: false
          default_currency: USD
          max_images_per_product: 5
          require_vendor_approval: true

Результат:
- Два экземпляра ProductCatalogModule
- Разные настройки
- Разные БД таблицы (ecommerce_products, marketplace_products)
- Полная изоляция данных


Уровень 2: КОМПОНЕНТЫ (наборы модулей)

Философия: Компонент = Модули + Настройки + Связи

Компонент - это набор модулей с настройками, которые работают вместе для решения бизнес-задачи.

Структура компонента:

# components/ecommerce/ecommerce_component.yaml
component:
  name: EcommerceComponent
  version: 1.0.0
  description: "Интернет-магазин (B2C)"

# Модули внутри компонента (с клонированием)
modules:
  # Модуль аутентификации
  auth:
    source: AuthModule
    config:
      allow_registration: true
      email_verification_required: true

  # Модуль каталога продуктов
  catalog:
    source: ProductCatalogModule
    config:
      allow_reviews: true
      enable_wishlist: true
      default_currency: RUB

  # Модуль корзины
  cart:
    source: ShoppingCartModule
    config:
      cart_expiration_days: 30
      max_items_per_cart: 100

  # Модуль заказов
  orders:
    source: OrderManagementModule
    config:
      order_statuses: [pending, processing, shipped, delivered, cancelled]
      auto_cancel_after_days: 7

  # Модуль платежей
  payments:
    source: PaymentModule
    config:
      providers: [stripe, paypal]
      default_currency: RUB

# Связи между модулями (интеграция)
integrations:
  # Корзина → Заказы
  - from: cart
    to: orders
    type: data_flow
    events:
      - cart.checkout → orders.create_order

  # Заказы → Платежи
  - from: orders
    to: payments
    type: data_flow
    events:
      - orders.created → payments.create_payment
      - payments.completed → orders.mark_as_paid

# Общая конфигурация компонента
config:
  name: "My Online Store"
  timezone: Europe/Moscow
  locale: ru_RU

# UI страницы компонента
pages:
  - path: /
    component: HomePage
    uses_modules: [catalog]

  - path: /products/{id}
    component: ProductDetailPage
    uses_modules: [catalog, cart]

  - path: /cart
    component: CartPage
    uses_modules: [cart, auth]

  - path: /checkout
    component: CheckoutPage
    uses_modules: [cart, orders, payments]
    auth_required: true

Важно про компоненты:


Уровень 3: ВЫСОКОУРОВНЕВЫЕ КОМПОНЕНТЫ (композиты)

Философия: Компонент может содержать другие компоненты

Высокоуровневый компонент - это компонент, который включает в себя другие компоненты + добавляет свою логику.

Пример: SalesSystemComponent

# components/sales_system/sales_system_component.yaml
component:
  name: SalesSystemComponent
  version: 1.0.0
  description: "Полная система продаж (B2C + B2B + Marketplace)"

# Включает другие компоненты
includes_components:
  # B2C интернет-магазин
  b2c_store:
    source: EcommerceComponent
    config:
      name: "Retail Store"
      allow_guest_checkout: true

  # B2B оптовая торговля
  b2b_wholesale:
    source: EcommerceComponent  # Тот же компонент, но другая конфигурация!
    config:
      name: "Wholesale Portal"
      allow_guest_checkout: false
      require_company_verification: true
      enable_bulk_pricing: true

  # Marketplace (многопользовательский)
  marketplace:
    source: MarketplaceComponent
    config:
      name: "Vendor Marketplace"
      vendor_commission_percent: 15
      require_vendor_approval: true

# Дополнительные модули (общие для всех подкомпонентов)
shared_modules:
  # Единая аналитика для всех каналов продаж
  analytics:
    source: AnalyticsModule
    config:
      track_sources: [b2c_store, b2b_wholesale, marketplace]

  # Единый склад для всех каналов
  warehouse:
    source: WarehouseModule
    config:
      sync_inventory: true
      reserve_stock_on_order: true

# Интеграции между подкомпонентами
cross_component_integrations:
  # Синхронизация товаров между каналами
  - from: b2c_store.catalog
    to: marketplace.catalog
    type: sync
    mode: one_way

  # Общий учет остатков
  - components: [b2c_store, b2b_wholesale, marketplace]
    shared_resource: warehouse
    sync_field: product.stock

# Dashboard для управления всей системой
admin_dashboard:
  sections:
    - name: "B2C Sales"
      component: b2c_store

    - name: "B2B Sales"
      component: b2b_wholesale

    - name: "Marketplace"
      component: marketplace

    - name: "Analytics"
      module: analytics

    - name: "Warehouse"
      module: warehouse

Визуализация вложенности (матрешка):

┌─────────────────────────────────────────────────────────┐
│  SalesSystemComponent                                   │
│  ┌───────────────────────────────────────────────────┐  │
│  │  EcommerceComponent (B2C)                         │  │
│  │  ┌─────────────┐ ┌────────────┐ ┌─────────────┐  │  │
│  │  │AuthModule   │ │CatalogModule│ │OrderModule │  │  │
│  │  └─────────────┘ └────────────┘ └─────────────┘  │  │
│  └───────────────────────────────────────────────────┘  │
│                                                         │
│  ┌───────────────────────────────────────────────────┐  │
│  │  EcommerceComponent (B2B) - клон с другими settings│ │
│  │  ┌─────────────┐ ┌────────────┐ ┌─────────────┐  │  │
│  │  │AuthModule   │ │CatalogModule│ │OrderModule │  │  │
│  │  └─────────────┘ └────────────┘ └─────────────┘  │  │
│  └───────────────────────────────────────────────────┘  │
│                                                         │
│  ┌───────────────────────────────────────────────────┐  │
│  │  MarketplaceComponent                             │  │
│  │  ┌─────────────┐ ┌────────────┐ ┌─────────────┐  │  │
│  │  │VendorModule │ │CatalogModule│ │OrderModule │  │  │
│  │  └─────────────┘ └────────────┘ └─────────────┘  │  │
│  └───────────────────────────────────────────────────┘  │
│                                                         │
│  Shared:  ┌──────────────┐  ┌──────────────┐          │
│           │AnalyticsModule│  │WarehouseModule│         │
│           └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────┘

Важно про высокоуровневые компоненты:


Уровень 4: КОНФИГУРАЦИЯ (сборка платформы)

Философия: Конфигурация = Assembly всех компонентов в единую систему

Конфигурация - это самый верхний уровень, где собирается ВСЯ платформа целиком.

Структура конфигурации:

# platform.config.yaml
platform:
  name: "CIFRA PLATFORM"
  version: 1.0.0

# Глобальные настройки
global_config:
  database:
    host: localhost
    port: 5432
    name: cifra_platform

  cache:
    backend: redis
    host: localhost
    port: 6379

  auth:
    jwt_secret: "${ENV:JWT_SECRET}"
    session_timeout: 3600

# Активированные компоненты на платформе
components:
  # Система продаж
  sales_system:
    source: SalesSystemComponent
    enabled: true
    subdomain: sales
    database_prefix: sales_

  # CRM система
  crm_system:
    source: CRMSystemComponent
    enabled: true
    subdomain: crm
    database_prefix: crm_

  # Складская система
  warehouse_system:
    source: WarehouseSystemComponent
    enabled: true
    subdomain: warehouse
    database_prefix: warehouse_

  # HR система
  hr_system:
    source: HRSystemComponent
    enabled: false  # Отключена, но может быть включена
    subdomain: hr
    database_prefix: hr_

# Кросс-компонентные интеграции
platform_integrations:
  # Общая аутентификация для всех компонентов
  - type: shared_auth
    provider: sales_system.auth
    consumers: [crm_system, warehouse_system]

  # Синхронизация данных клиентов
  - type: data_sync
    source: crm_system.customers
    targets:
      - sales_system.b2c_store.users
      - sales_system.b2b_wholesale.users
    mode: bidirectional

  # Синхронизация складских остатков
  - type: data_sync
    source: warehouse_system.inventory
    targets:
      - sales_system.warehouse
    mode: real_time

# Центральная админ-панель
admin_portal:
  path: /admin
  auth_required: true
  permissions: [platform_admin]

  sections:
    - name: "Sales"
      component: sales_system
      icon: shopping-cart

    - name: "CRM"
      component: crm_system
      icon: users

    - name: "Warehouse"
      component: warehouse_system
      icon: warehouse

    - name: "Platform Settings"
      type: platform_config
      icon: settings

# Мониторинг и логирование
monitoring:
  enabled: true
  services:
    - prometheus
    - grafana
    - loki

  alerts:
    - type: service_down
      notify: [email, slack]

    - type: high_error_rate
      threshold: 5%
      notify: [slack]

# Backup стратегия
backup:
  enabled: true
  schedule: "0 2 * * *"  # Каждый день в 2:00
  retention_days: 30
  storage: s3

# Deployment настройки
deployment:
  environment: production
  replicas: 3
  auto_scaling:
    enabled: true
    min_replicas: 3
    max_replicas: 10
    cpu_threshold: 70

Визуализация полной платформы:

                    PLATFORM.CONFIG.YAML
┌────────────────────────────────────────────────────────┐
                                                        
  ┌──────────────────────────────────────────────────┐ 
   SalesSystemComponent                              
     ├─ EcommerceComponent (B2C)                     
        ├─ AuthModule                               
        ├─ ProductCatalogModule                     
        ├─ ShoppingCartModule                       
        ├─ OrderManagementModule                    
        └─ PaymentModule                            
                                                     
     ├─ EcommerceComponent (B2B) [clone]             
        └─ [same modules, different config]         
                                                     
     └─ MarketplaceComponent                         
         ├─ VendorModule                             
         └─ [other modules]                          
  └──────────────────────────────────────────────────┘ 
                                                        
  ┌──────────────────────────────────────────────────┐ 
   CRMSystemComponent                                
     ├─ ContactManagementModule                      
     ├─ LeadManagementModule                         
     ├─ DealPipelineModule                           
     └─ EmailCampaignModule                          
  └──────────────────────────────────────────────────┘ 
                                                        
  ┌──────────────────────────────────────────────────┐ 
   WarehouseSystemComponent                          
     ├─ InventoryModule                              
     ├─ ShipmentModule                               
     └─ LocationModule                               
  └──────────────────────────────────────────────────┘ 
                                                        
  Platform Services:                                   
  ├─ Shared Auth                                       
  ├─ Data Sync Engine                                  
  ├─ Monitoring (Prometheus/Grafana)                   
  ├─ Backup Service                                    
  └─ Admin Portal                                      
└────────────────────────────────────────────────────────┘

Принцип изоляции модулей (ключевая концепция!)

Проблема: Один модуль → Несколько компонентов

Вопрос: Что происходит, когда ProductCatalogModule используется в двух разных компонентах?

Ответ: Создаются изолированные клоны модуля.

Механизм изоляции:

# Компонент 1: Ecommerce
component:
  name: Ecommerce
  modules:
    catalog:
      source: ProductCatalogModule
      instance_id: ecommerce_catalog  # Уникальный ID
      config:
        allow_reviews: true

# Результат:
# - DB tables: ecommerce_catalog_products, ecommerce_catalog_categories
# - API: /ecommerce/catalog/products
# - Полностью изолированные данные

---

# Компонент 2: Marketplace
component:
  name: Marketplace
  modules:
    vendor_catalog:
      source: ProductCatalogModule
      instance_id: marketplace_catalog  # Другой уникальный ID
      config:
        allow_reviews: false
        require_vendor_approval: true

# Результат:
# - DB tables: marketplace_catalog_products, marketplace_catalog_categories
# - API: /marketplace/catalog/products
# - Полностью изолированные данные (НЕ пересекаются с Ecommerce!)

Технически как это работает:

# Platform Core - создание изолированного экземпляра модуля
class ModuleInstance:
    def __init__(self, module_class, component_name, instance_id, config):
        self.module_class = module_class
        self.component_name = component_name
        self.instance_id = instance_id
        self.config = config

        # Генерируем уникальные имена для изоляции
        self.db_prefix = f"{component_name}_{instance_id}_"
        self.api_prefix = f"/{component_name}/{instance_id}"
        self.cache_prefix = f"{component_name}:{instance_id}:"

    def instantiate(self):
        """Создает изолированный экземпляр модуля"""
        return self.module_class(
            db_prefix=self.db_prefix,
            api_prefix=self.api_prefix,
            cache_prefix=self.cache_prefix,
            config=self.config
        )

# Пример: создание двух изолированных каталогов
ecommerce_catalog = ModuleInstance(
    module_class=ProductCatalogModule,
    component_name="ecommerce",
    instance_id="catalog",
    config={"allow_reviews": True}
).instantiate()

marketplace_catalog = ModuleInstance(
    module_class=ProductCatalogModule,
    component_name="marketplace",
    instance_id="vendor_catalog",
    config={"allow_reviews": False}
).instantiate()

# Результат:
# ecommerce_catalog → DB: ecommerce_catalog_products
# marketplace_catalog → DB: marketplace_vendor_catalog_products
# Полная изоляция!

Преимущества изоляции:

  1. Безопасность - данные не смешиваются
  2. Гибкость - разные настройки для каждого клона
  3. Масштабируемость - можно развернуть клоны на разных серверах
  4. Независимость - изменения в одном клоне не влияют на другие

Как это связано с Drupal Entity API?

Drupal концепции в нашей архитектуре:

Drupal CIFRA Platform Описание
Entity Type Element: Entity Базовые типы сущностей (User, Node, Product)
Field API Element: Field Динамические поля, attachable к любой сущности
Bundle Module Entity Config Конфигурация сущности в контексте модуля
Module Module Модуль как набор функционала
Configuration Component Config Настройки компонентов
Site Platform Config Конфигурация всей платформы

Пример: Drupal Field API → CIFRA Field API

Drupal:

// Attach field to content type
$field_storage = FieldStorageConfig::create([
  'field_name' => 'field_bio',
  'entity_type' => 'user',
  'type' => 'text_long',
]);

$field_storage->save();

CIFRA Platform:

# modules/blog/blog_module.yaml
module:
  name: BlogModule

entities:
  BlogPost:
    extends: elements.entities.ContentEntity

    # Attach fields (как в Drupal!)
    attach_fields:
      - source: elements.fields.RichTextField
        name: body

      - source: elements.fields.ImageField
        name: featured_image
        max_files: 1

      - source: elements.fields.TagField
        name: tags
        max_tags: 10

Результат: Поля body, featured_image, tags автоматически добавляются к BlogPost без изменения кода!


Генерация кода из иерархии

Как из YAML генерируется код на всех уровнях:

Шаг 1: Элементы → База

# elements/fields/email.field.yaml
element_type: field
name: EmailField
base_type: string

Генерируется:

# generated/elements/fields/email_field.py
from platform.core.fields import StringField
from platform.core.validators import EmailValidator

class EmailField(StringField):
    def __init__(self, **kwargs):
        super().__init__(
            max_length=255,
            validators=[EmailValidator()],
            **kwargs
        )

Шаг 2: Модуль → SQLAlchemy + FastAPI

# modules/auth/auth_module.yaml
module:
  name: AuthModule
entities:
  User:
    fields:
      email: EmailField
      password: PasswordField

Генерируется:

# generated/modules/auth/models.py
from sqlalchemy import Column, String
from generated.elements.fields.email_field import EmailField as EmailFieldType

class User(Base):
    __tablename__ = "auth_users"

    id = Column(UUID, primary_key=True)
    email = Column(String(255), unique=True, nullable=False, index=True)
    password = Column(String(255), nullable=False)

# generated/modules/auth/schemas.py
from pydantic import BaseModel, EmailStr

class UserCreateSchema(BaseModel):
    email: EmailStr
    password: str

# generated/modules/auth/api.py
from fastapi import APIRouter

router = APIRouter(prefix="/auth")

@router.post("/register")
async def register(data: UserCreateSchema):
    # Auto-generated handler
    pass

Шаг 3: Компонент → Клонирование модулей

# components/ecommerce/ecommerce_component.yaml
component:
  name: Ecommerce
  modules:
    auth:
      source: AuthModule
      instance_id: ecommerce_auth

Генерируется:

# generated/components/ecommerce/models.py
from generated.modules.auth.models import User as BaseUser

# Клон с префиксом
class User(BaseUser):
    __tablename__ = "ecommerce_auth_users"  # Префикс добавлен!

# generated/components/ecommerce/api.py
from fastapi import APIRouter

router = APIRouter(prefix="/ecommerce/auth")  # Префикс добавлен!

@router.post("/register")
async def register(data: UserCreateSchema):
    # Handler для ecommerce компонента
    pass

Шаг 4: Конфигурация → Docker Compose + Nginx

# platform.config.yaml
components:
  sales_system:
    source: SalesSystemComponent
    subdomain: sales

Генерируется:

# generated/docker-compose.yml
services:
  sales-system:
    build: ./generated/components/sales_system
    environment:
      - DATABASE_URL=postgresql://...
    ports:
      - "8001:8000"
# generated/nginx.conf
server {
    server_name sales.example.com;
    location / {
        proxy_pass http://sales-system:8000;
    }
}

Полный workflow: От идеи до кода

Сценарий: Создать блог для ecommerce сайта

Шаг 1: Описываем элементы (если нужны новые)

# elements/fields/slug.field.yaml
element_type: field
name: SlugField
base_type: string
constraints:
  - type: pattern
    value: "^[a-z0-9-]+$"
  - type: unique
    value: true

Шаг 2: Создаем модуль блога

# modules/blog/blog_module.yaml
module:
  name: BlogModule
  version: 1.0.0

uses_elements:
  entities: [ContentEntity]
  fields: [RichTextField, SlugField, ImageField]

entities:
  BlogPost:
    extends: elements.entities.ContentEntity
    fields:
      title: {type: string, max_length: 200}
      slug: SlugField
      body: RichTextField
      featured_image: ImageField
      published_at: {type: datetime, nullable: true}

  BlogCategory:
    fields:
      name: {type: string, max_length: 100}
      slug: SlugField

api:
  endpoints:
    - path: /posts
      method: GET
      handler: list_posts

    - path: /posts/{slug}
      method: GET
      handler: get_post_by_slug

config:
  posts_per_page: 10
  allow_comments: true

Шаг 3: Добавляем модуль в компонент

# components/ecommerce/ecommerce_component.yaml (обновляем)
component:
  name: EcommerceComponent

modules:
  # Существующие модули
  auth: {...}
  catalog: {...}

  # НОВЫЙ модуль блога
  blog:
    source: BlogModule
    instance_id: store_blog
    config:
      posts_per_page: 15  # Переопределяем default
      allow_comments: false

# Добавляем страницы блога
pages:
  - path: /blog
    component: BlogListPage
    uses_modules: [blog]

  - path: /blog/{slug}
    component: BlogPostPage
    uses_modules: [blog]

Шаг 4: Генерируем код

$ python platform-cli.py generate ecommerce

🔄 Generating code for EcommerceComponent...

✅ Generated modules:
   - auth (AuthModule)  generated/components/ecommerce/auth/
   - catalog (ProductCatalogModule)  generated/components/ecommerce/catalog/
   - blog (BlogModule)  generated/components/ecommerce/blog/   НОВЫЙ!

✅ Generated API endpoints:
   - POST /ecommerce/auth/register
   - GET /ecommerce/catalog/products
   - GET /ecommerce/blog/posts   НОВЫЙ!
   - GET /ecommerce/blog/posts/{slug}   НОВЫЙ!

✅ Generated database migrations:
   - ecommerce_blog_blog_post (table)
   - ecommerce_blog_blog_category (table) Generated UI components:
   - BlogListPage.tsx
   - BlogPostPage.tsx

✅ Generated tests:
   - test_blog_api.py
   - test_blog_models.py

Done! Run: docker-compose up

Шаг 5: Запускаем

$ docker-compose up

# Блог работает!
# GET http://localhost:8000/ecommerce/blog/posts
# GET http://localhost:8000/ecommerce/blog/posts/my-first-post

Результат:
- Описали модуль в YAML (50 строк)
- Сгенерировали код (2000+ строк)
- Блог работает с API, БД, UI
- Без написания кода вручную!


Преимущества иерархической архитектуры

1. Переиспользование на всех уровнях

Element (EmailField)
  → используется в 10 модулях
    → модули используются в 20 компонентах
      → компоненты используются в 5 платформах

Результат: 1 описание → 1000 реальных применений

2. Изоляция и безопасность

3. Гибкость конфигурации

# Один модуль - три разных применения
ProductCatalogModule:

  # B2C интернет-магазин
  - config: {allow_reviews: true, show_prices: true}

  # B2B оптовый портал
  - config: {allow_reviews: false, show_prices: false, require_auth: true}

  # Marketplace
  - config: {allow_reviews: true, multi_vendor: true, commission: 15%}

4. Простота разработки

5. AI-friendly

AI (Claude) может:
- Создавать новые элементы
- Генерировать модули из описания задачи
- Собирать компоненты из модулей
- Предлагать оптимальную конфигурацию

Пример диалога:

User: Нужен блог с комментариями и лайками

AI: Создам BlogModule с:
    - Элементы: BlogPost, Comment, Like
    - API: CRUD posts, add comment, toggle like
    - UI: BlogListPage, BlogPostPage
    Добавить к EcommerceComponent?

User: Да

AI:  Сгенерировал код, накатил миграции, блог работает!

Связь с CIDL (CIFRA Interface Definition Language)

CIDL - это формат описания на всех уровнях!

CIDL = Universal format для описания:
  ├─ Elements (.element.yaml)
  ├─ Modules (.module.yaml)
  ├─ Components (.component.yaml)
  └─ Platform Config (.config.yaml)

Единая структура CIDL:

Все файлы следуют одному формату:

# Метаданные
<type>:
  name: <name>
  version: <version>
  description: <description>

# Зависимости
uses_<dependency_type>: [...]

# Определения
<definitions>: {...}

# API (если applicable)
api: {...}

# Конфигурация
config: {...}

Инструменты работы с CIDL:

# CLI для работы со всей иерархией
$ cidl-cli

# Создать новый элемент
$ cidl create element --type field --name CustomField

# Создать модуль
$ cidl create module --name MyModule --uses AuthModule,EmailModule

# Создать компонент
$ cidl create component --name MyApp --modules auth,catalog,blog

# Сгенерировать код
$ cidl generate component MyApp --target python-fastapi

# Валидация
$ cidl validate platform.config.yaml
✅ All components valid
✅ All modules found
✅ All dependencies satisfied

# Визуализация зависимостей
$ cidl visualize platform.config.yaml --output graph.svg

Roadmap: Что дальше?

Фаза 1: Core Platform (сейчас)

Фаза 2: Module Library

Фаза 3: Component Library

Фаза 4: Visual Builder

Фаза 5: AI Integration


Заключение

Принцип Lego + Матрешка реализован!

🧱 Lego: Простые элементы → сложные конструкции
🪆 Матрешка: Вложенность уровней (элементы → модули → компоненты → платформа)

Результат:
  Платформа собирается из простейших кирпичиков
  Каждый уровень строится на предыдущем
  Максимальное переиспользование
  Полная изоляция экземпляров
  AI-friendly архитектура

Ключевые выводы:

  1. 5 уровней иерархии - от элементов до платформы
  2. Изоляция - один модуль → много независимых клонов
  3. CIDL - единый формат описания всех уровней
  4. Генерация кода - YAML → полноценное приложение
  5. AI-first - архитектура создана для работы с AI

Готово к имплементации! 🚀