Концепции, ценность и типичные сценарии клонирования — меньше кода.
Концепции, ценность и типичные сценарии клонирования — меньше кода.
Preparing Ring content
Preparing Ring content
Preparing Ring content
White-label Ring разделяют одну platform codebase: ring-platform.org. Вертикали выбираются по имени пресета в ring-config.json. Типизированные каталоги живут в features/*/presets/<preset>.ts (и home в components/pages/home-presets/<preset>.tsx).
| Source | What lives there | When it wins |
|---|---|---|
Platform (ring-platform.org) | Shared niches (platform, agricultural, …) | База каждой сборки |
Clone project dir (напр. ring-greenfood-live) | Branding, ring-config.json, custom <preset>.ts + registry overlays | Overwrite при коллизии после copy platform |
Используйте ringdom-clone-build (ringdom-mcp):
ring-platform.org → build tmp (пропуская node_modules / .next / .git)Не ожидайте, что thin overlay сам по себе будет runnable app — сначала merge.
| Tier | What | Where |
|---|---|---|
| 1 — data | Category lists, badge tokens, labels | карты ring-config.json + locales/ |
| 2 — typed logic | Entity catalogs, zod/forms, niche field UIs | features/*/presets/<preset>.ts (platform и/или clone overlay) |
GreenFood задаёт entities / productFields / productBadges в "agricultural" и home.preset в "mvm-landing".
Все используют настроенную строку *.preset. Если singular-ключ не задан, entities и productBadges падают на productFields.preset, затем "platform" — без hard-coded niche if/else.
getEntitiesPreset() → реестр features/entities/presetsgetHomePreset() → реестр components/pages/home-presetsgetProductFieldsPreset() / getProductFieldsPresets()getProductBadgesPreset() / getProductBadgesPresets()Правило: имена пресетов появляются в ring-config + карте реестра. Consumers вызывают getEntityTypes() / getEntityTypeList() — никогда не импортируйте agricultural.ts напрямую.
Своя ниша на клоне: добавьте features/entities/presets/<name>.ts в clone project, overlay index.ts для регистрации, задайте entities.preset этим именем, затем ringdom-clone-build.
Дисциплина бандла: sync-каталоги — лёгкие UI-списки. Тяжёлые ERP field catalogs живут в модулях *-erp.ts, загружаемых только через async loadErpEntityTypes().
presets/<name>.ts): ids, emoji, English fallback names/descriptionslocales/*/modules/entities.json → types.<id> + types.<id>Desccomponents/entities/entity-type-icons.tsx карта TYPE_VISUALSuseEntityTypeLabel() / useEntityTypeDescription() — сначала i18n, fallback каталогаfeatures/entities/presets/<name>.ts (+ опционально <name>-erp.ts)ENTITIES_PRESET_REGISTRY (+ ERP_CATALOG_REGISTRY при необходимости)components/pages/home-presets/<name>.tsxproductFieldsPresets / productBadgesPresetslocales/*/modules/entities.jsonring-config.template.jsonЦелевой roster: platform, agricultural, затем tourism, sport, business, pet, auto, connect, technopark, manufacturing.
.reggie-propagate-exclude.json защищает пути только overlay от перезаписи Reggie:
ring-config.jsonpublic/logo*.svg, favicon.ico, public/branding/locales/{en,uk,ru}/config.json, vendor.jsonfeatures/*/presets/<clone-only>.ts (+ registry overlay), пока не upstream'нутыlib/overlay/registry.ts (maps). Не исключайте lib/overlay/types.ts или lib/overlay/runtime.ts — это platform SSOT.| Path | Owner | Role |
|---|---|---|
lib/overlay/types.ts | Platform | Contracts |
lib/overlay/runtime.ts | Platform | loadOverlayMessages / resolveOverlayHomeRail |
lib/overlay/registry.ts | Platform empty maps; clone overlays maps | Domain feature loaders |
Consumers импортируют из @/lib/overlay/runtime. Клоны никогда не дублируют loaders в registry.ts.
Чеклист оператора (калькулятор / Order Lab): Ringization playbook.
Источник propagation остаётся ring-platform.org → clones для shared code. Clone-local custom presets остаются в clone dir и побеждают на ringdom-clone-build.
if (productPreset === 'agricultural') в accessorscustom-types.ts / overrides.ts без именованного preset moduleswitch (vertical) в feature code — используйте реестрWhite-label Ring разделяют одну platform codebase: ring-platform.org. Вертикали выбираются по имени пресета в ring-config.json. Типизированные каталоги живут в features/*/presets/<preset>.ts (и home в components/pages/home-presets/<preset>.tsx).
| Source | What lives there | When it wins |
|---|---|---|
Platform (ring-platform.org) | Shared niches (platform, agricultural, …) | База каждой сборки |
Clone project dir (напр. ring-greenfood-live) | Branding, ring-config.json, custom <preset>.ts + registry overlays | Overwrite при коллизии после copy platform |
Используйте ringdom-clone-build (ringdom-mcp):
ring-platform.org → build tmp (пропуская node_modules / .next / .git)Не ожидайте, что thin overlay сам по себе будет runnable app — сначала merge.
| Tier | What | Where |
|---|---|---|
| 1 — data | Category lists, badge tokens, labels | карты ring-config.json + locales/ |
| 2 — typed logic | Entity catalogs, zod/forms, niche field UIs | features/*/presets/<preset>.ts (platform и/или clone overlay) |
GreenFood задаёт entities / productFields / productBadges в "agricultural" и home.preset в "mvm-landing".
Все используют настроенную строку *.preset. Если singular-ключ не задан, entities и productBadges падают на productFields.preset, затем "platform" — без hard-coded niche if/else.
getEntitiesPreset() → реестр features/entities/presetsgetHomePreset() → реестр components/pages/home-presetsgetProductFieldsPreset() / getProductFieldsPresets()getProductBadgesPreset() / getProductBadgesPresets()Правило: имена пресетов появляются в ring-config + карте реестра. Consumers вызывают getEntityTypes() / getEntityTypeList() — никогда не импортируйте agricultural.ts напрямую.
Своя ниша на клоне: добавьте features/entities/presets/<name>.ts в clone project, overlay index.ts для регистрации, задайте entities.preset этим именем, затем ringdom-clone-build.
Дисциплина бандла: sync-каталоги — лёгкие UI-списки. Тяжёлые ERP field catalogs живут в модулях *-erp.ts, загружаемых только через async loadErpEntityTypes().
presets/<name>.ts): ids, emoji, English fallback names/descriptionslocales/*/modules/entities.json → types.<id> + types.<id>Desccomponents/entities/entity-type-icons.tsx карта TYPE_VISUALSuseEntityTypeLabel() / useEntityTypeDescription() — сначала i18n, fallback каталогаfeatures/entities/presets/<name>.ts (+ опционально <name>-erp.ts)ENTITIES_PRESET_REGISTRY (+ ERP_CATALOG_REGISTRY при необходимости)components/pages/home-presets/<name>.tsxproductFieldsPresets / productBadgesPresetslocales/*/modules/entities.jsonring-config.template.jsonЦелевой roster: platform, agricultural, затем tourism, sport, business, pet, auto, connect, technopark, manufacturing.
.reggie-propagate-exclude.json защищает пути только overlay от перезаписи Reggie:
ring-config.jsonpublic/logo*.svg, favicon.ico, public/branding/locales/{en,uk,ru}/config.json, vendor.jsonfeatures/*/presets/<clone-only>.ts (+ registry overlay), пока не upstream'нутыlib/overlay/registry.ts (maps). Не исключайте lib/overlay/types.ts или lib/overlay/runtime.ts — это platform SSOT.| Path | Owner | Role |
|---|---|---|
lib/overlay/types.ts | Platform | Contracts |
lib/overlay/runtime.ts | Platform | loadOverlayMessages / resolveOverlayHomeRail |
lib/overlay/registry.ts | Platform empty maps; clone overlays maps | Domain feature loaders |
Consumers импортируют из @/lib/overlay/runtime. Клоны никогда не дублируют loaders в registry.ts.
Чеклист оператора (калькулятор / Order Lab): Ringization playbook.
Источник propagation остаётся ring-platform.org → clones для shared code. Clone-local custom presets остаются в clone dir и побеждают на ringdom-clone-build.
if (productPreset === 'agricultural') в accessorscustom-types.ts / overrides.ts без именованного preset moduleswitch (vertical) в feature code — используйте реестрWhite-label Ring разделяют одну platform codebase: ring-platform.org. Вертикали выбираются по имени пресета в ring-config.json. Типизированные каталоги живут в features/*/presets/<preset>.ts (и home в components/pages/home-presets/<preset>.tsx).
| Source | What lives there | When it wins |
|---|---|---|
Platform (ring-platform.org) | Shared niches (platform, agricultural, …) | База каждой сборки |
Clone project dir (напр. ring-greenfood-live) | Branding, ring-config.json, custom <preset>.ts + registry overlays | Overwrite при коллизии после copy platform |
Используйте ringdom-clone-build (ringdom-mcp):
ring-platform.org → build tmp (пропуская node_modules / .next / .git)Не ожидайте, что thin overlay сам по себе будет runnable app — сначала merge.
| Tier | What | Where |
|---|---|---|
| 1 — data | Category lists, badge tokens, labels | карты ring-config.json + locales/ |
| 2 — typed logic | Entity catalogs, zod/forms, niche field UIs | features/*/presets/<preset>.ts (platform и/или clone overlay) |
GreenFood задаёт entities / productFields / productBadges в "agricultural" и home.preset в "mvm-landing".
Все используют настроенную строку *.preset. Если singular-ключ не задан, entities и productBadges падают на productFields.preset, затем "platform" — без hard-coded niche if/else.
getEntitiesPreset() → реестр features/entities/presetsgetHomePreset() → реестр components/pages/home-presetsgetProductFieldsPreset() / getProductFieldsPresets()getProductBadgesPreset() / getProductBadgesPresets()Правило: имена пресетов появляются в ring-config + карте реестра. Consumers вызывают getEntityTypes() / getEntityTypeList() — никогда не импортируйте agricultural.ts напрямую.
Своя ниша на клоне: добавьте features/entities/presets/<name>.ts в clone project, overlay index.ts для регистрации, задайте entities.preset этим именем, затем ringdom-clone-build.
Дисциплина бандла: sync-каталоги — лёгкие UI-списки. Тяжёлые ERP field catalogs живут в модулях *-erp.ts, загружаемых только через async loadErpEntityTypes().
presets/<name>.ts): ids, emoji, English fallback names/descriptionslocales/*/modules/entities.json → types.<id> + types.<id>Desccomponents/entities/entity-type-icons.tsx карта TYPE_VISUALSuseEntityTypeLabel() / useEntityTypeDescription() — сначала i18n, fallback каталогаfeatures/entities/presets/<name>.ts (+ опционально <name>-erp.ts)ENTITIES_PRESET_REGISTRY (+ ERP_CATALOG_REGISTRY при необходимости)components/pages/home-presets/<name>.tsxproductFieldsPresets / productBadgesPresetslocales/*/modules/entities.jsonring-config.template.jsonЦелевой roster: platform, agricultural, затем tourism, sport, business, pet, auto, connect, technopark, manufacturing.
.reggie-propagate-exclude.json защищает пути только overlay от перезаписи Reggie:
ring-config.jsonpublic/logo*.svg, favicon.ico, public/branding/locales/{en,uk,ru}/config.json, vendor.jsonfeatures/*/presets/<clone-only>.ts (+ registry overlay), пока не upstream'нутыlib/overlay/registry.ts (maps). Не исключайте lib/overlay/types.ts или lib/overlay/runtime.ts — это platform SSOT.| Path | Owner | Role |
|---|---|---|
lib/overlay/types.ts | Platform | Contracts |
lib/overlay/runtime.ts | Platform | loadOverlayMessages / resolveOverlayHomeRail |
lib/overlay/registry.ts | Platform empty maps; clone overlays maps | Domain feature loaders |
Consumers импортируют из @/lib/overlay/runtime. Клоны никогда не дублируют loaders в registry.ts.
Чеклист оператора (калькулятор / Order Lab): Ringization playbook.
Источник propagation остаётся ring-platform.org → clones для shared code. Clone-local custom presets остаются в clone dir и побеждают на ringdom-clone-build.
if (productPreset === 'agricultural') в accessorscustom-types.ts / overrides.ts без именованного preset moduleswitch (vertical) в feature code — используйте реестр
{
"entities": { "preset": "platform" },
"home": { "preset": "platform" },
"productFields": { "preset": "platform" },
"productBadges": { "preset": "platform" },
"productFieldsPresets": {
"platform": { "storeCategories": ["commerce", "education", "…"] },
"agricultural": { "storeCategories": ["organic-produce", "honey-sweets", "…"] }
},
"productBadgesPresets": {
"platform": { "productBadges": ["new", "featured", "popular"] },
"agricultural": { "productBadges": ["organic", "local", "regenerative"] }
}
}
ringdom-clone-build({ project_name: "ring-greenfood-live", dry_run?: true })
→ .ringdom-build/<project>/<timestamp>
features/entities/presets/
types.ts # EntityTypeCatalog contract
platform.ts # export const entityTypes (26 industries)
agricultural.ts # healthy-living UI catalog (lightweight)
agricultural-erp.ts # heavy ERP field catalogs — async-only via loadErpEntityTypes()
index.ts # ENTITIES_PRESET_REGISTRY + getEntityTypes()
components/pages/
home.tsx # platform default landing
home-presets/mvm-landing.tsx # multi-vendor-marketplace e-commerce landing
home-content-resolver.tsx # HOME_PRESET_REGISTRY + getHomePreset()
ensure ring-config: entities/productFields/productBadges = agricultural, home = mvm-landing
keep branding + locale deltas in ring-greenfood-live
ringdom-clone-build({ project_name: "ring-greenfood-live" })
build/deploy from .ringdom-build/ring-greenfood-live/<stamp>
{
"entities": { "preset": "platform" },
"home": { "preset": "platform" },
"productFields": { "preset": "platform" },
"productBadges": { "preset": "platform" },
"productFieldsPresets": {
"platform": { "storeCategories": ["commerce", "education", "…"] },
"agricultural": { "storeCategories": ["organic-produce", "honey-sweets", "…"] }
},
"productBadgesPresets": {
"platform": { "productBadges": ["new", "featured", "popular"] },
"agricultural": { "productBadges": ["organic", "local", "regenerative"] }
}
}
ringdom-clone-build({ project_name: "ring-greenfood-live", dry_run?: true })
→ .ringdom-build/<project>/<timestamp>
features/entities/presets/
types.ts # EntityTypeCatalog contract
platform.ts # export const entityTypes (26 industries)
agricultural.ts # healthy-living UI catalog (lightweight)
agricultural-erp.ts # heavy ERP field catalogs — async-only via loadErpEntityTypes()
index.ts # ENTITIES_PRESET_REGISTRY + getEntityTypes()
components/pages/
home.tsx # platform default landing
home-presets/mvm-landing.tsx # multi-vendor-marketplace e-commerce landing
home-content-resolver.tsx # HOME_PRESET_REGISTRY + getHomePreset()
ensure ring-config: entities/productFields/productBadges = agricultural, home = mvm-landing
keep branding + locale deltas in ring-greenfood-live
ringdom-clone-build({ project_name: "ring-greenfood-live" })
build/deploy from .ringdom-build/ring-greenfood-live/<stamp>
{
"entities": { "preset": "platform" },
"home": { "preset": "platform" },
"productFields": { "preset": "platform" },
"productBadges": { "preset": "platform" },
"productFieldsPresets": {
"platform": { "storeCategories": ["commerce", "education", "…"] },
"agricultural": { "storeCategories": ["organic-produce", "honey-sweets", "…"] }
},
"productBadgesPresets": {
"platform": { "productBadges": ["new", "featured", "popular"] },
"agricultural": { "productBadges": ["organic", "local", "regenerative"] }
}
}
ringdom-clone-build({ project_name: "ring-greenfood-live", dry_run?: true })
→ .ringdom-build/<project>/<timestamp>
features/entities/presets/
types.ts # EntityTypeCatalog contract
platform.ts # export const entityTypes (26 industries)
agricultural.ts # healthy-living UI catalog (lightweight)
agricultural-erp.ts # heavy ERP field catalogs — async-only via loadErpEntityTypes()
index.ts # ENTITIES_PRESET_REGISTRY + getEntityTypes()
components/pages/
home.tsx # platform default landing
home-presets/mvm-landing.tsx # multi-vendor-marketplace e-commerce landing
home-content-resolver.tsx # HOME_PRESET_REGISTRY + getHomePreset()
ensure ring-config: entities/productFields/productBadges = agricultural, home = mvm-landing
keep branding + locale deltas in ring-greenfood-live
ringdom-clone-build({ project_name: "ring-greenfood-live" })
build/deploy from .ringdom-build/ring-greenfood-live/<stamp>