dsbuilder-ios — единый macOS CLI дизайн-системы SDDS под iOS. Две задачи в одном бинаре:
themes(подкоманда по умолчанию) — берёт схему темы и палитру, декодирует JSON и по Stencil-шаблонам генерирует токены (цвета, типографику, тени, формы, отступы, градиенты) и вариации компонентов вThemes/<Name>Theme.theme generate --sdds <dir>— токены, шрифты и мета токенов для одной темы, описанной локальной.sdds(её наполняетdsbuilder theme fetch). JSON-конфиг не нужен: имя темы, выход и схема компонентов выводятся из директории. Так команду вызывает делегат платформы.components generate --sdds <dir>— вариации компонентов, код binding-API иconfig-info-ios.json. Отдельная команда: тема и компоненты независимы, какgenerateComposeThemeиgenerateComposeComponentsна Android. Прежний совмещённый проход одной командой —theme generate --with-components;themesработает как раньше.docs aggregate --sdds <dir>— собирает дерево документационного бандла целиком: сканирует// @DocSample, рендерит маркеры и раскладывает контент в<sdds>/temp/docs(см. ../docs/DOCS_BUNDLE.md). Прежняя параdocs extract+docs aggregate --themeосталась для ручных прогонов с нестандартными путями.
Не путать с внешним
dsbuilderизsalute-developers/design-system-builder(Kotlin/Native): тот выгружает.sdds/, вызывает наш бинарь как платформенный инструмент (theme generate,docs aggregate) и печёт готовый бандл из подготовленного нами дерева.
DesignSystemBuilderCLI/— точка входа (main.swift) и подкоманды (GenerateThemes.swift,ThemeCommands.swift,ComponentsCommands.swift,DocsCommands.swift); общие опции генерации —SddsGeneration.swift.DesignSystemBuilderCore/— логика генерации тем (App.swift), Stencil-шаблоны.DocsAggregatorCore/— сканер сэмплов, рендер маркеров и раскладка докбандла.SDDSThemeCore/— рантайм-типы токенов (портируемое ядро) — см. SDDSThemeCore/CLAUDE.md.SDDSThemeUtilities/— вспомогательные утилиты.DesignSystemBuilderCoreTests/,DocsAggregatorCoreTests/,SDDSThemeCoreTests/,SDDSThemeTests/— тесты.LocalSchemes/,Playground/— локальные схемы и песочница для отладки.DesignSystemBuilder.xcodeproj,build_cli.sh— сборка.
Тип: SwiftPM-пакет DesignSystemBuilder (Package.swift), продукт — executable dsbuilder.
Зависимости: swift-argument-parser, Stencil, PathKit, swift-syntax.
DesignSystemBuilder.xcodeproj остался только под то, чего SwiftPM не умеет:
SDDSThemeCore.xcframework, SDDSTheme и SDDSDemo.
Из каталога DesignSystemBuilder/:
./build_cli.sh # Release (по умолчанию)
./build_cli.sh --debug # Debug
./build_cli.sh --run # собрать и запустить с default-конфигом
./build_cli.sh --run cfg.json # запустить с внешним JSON-конфигом
./build_cli.sh --run docs extract --repo-root ..
./build_cli.sh --helpРезультат: DesignSystemBuilder/build/dsbuilder-ios/dsbuilder-ios — самодостаточный бинарник,
фреймворка рядом больше нет. build/ в .gitignore.
Напрямую через SwiftPM: swift build --package-path DesignSystemBuilder -c release --product dsbuilder-ios.
Кастомный выходной каталог — опция -o/--output.
--standalone [--components] собирает плоскую папку .swift (StandaloneBundle.swift).
Вендоримые исходники и пакет темы берутся от sourcesRootURL (App.swift), приоритет:
--sources-version <tag>— архивSDDSSources-<tag>.zipс GitHub Release; скачивает и распаковываетSourcesRelease/SourcesReleaseFetcher.swiftвgenerationRootURL, то есть рядом со сгенерированными токенами (<output>/SDDSSources-<tag>). Требует--standalone, несовместим с--sources-root.--sources-url/--sources-repository— переопределения.--sources-root <dir>— распакованная копия исходников.- корень репозитория.
Архив собирает ../scripts/package_sources.sh, публикует
.github/workflows/publish-release.yml. Список путей в скрипте обязан совпадать с тем,
что читает App.sourcesRootURL — иначе бандл соберётся молча неполным (на этот случай
есть guard'ы StandaloneBundle.runGuards и проверка layout-маркера в фетчере).
- Состав компонентов темы и имена файлов конфигов — из индекса DS
meta.json. Источник: сначала локальный пакет.sdds/components, который выгружает DS Builder CLI, затем theme-convertercomponents/<theme>/meta.json. Генерятся только вариации, которые в теме есть; чего iOS не умеет — печатается в лог. Директория.sdds/componentsбезmeta.json— ошибка: это оборванная выгрузка, а не повод уйти в сеть. - Значения enum-свойств — из меты (
valueEnum): case'ы, их id в конфиге и дефолт задаются аннотациями на самом enum'е, отдельного реестра в генераторе нет. ios-api-meta.jsonописывает компоненты: одна запись — один компонент, как вuikit-compose-api-meta.jsonна Android. Какая вариация генерации какому компоненту принадлежит, объявлено вCodeGenerationComponent+MetaComponent.swift— из имён это не выводится (ListNumberedItemпринадлежитListItem, а неList).- Имена
*Appearance/*SizeConfiguration— из.sdds/ios-api-meta.json(см. ../Tools/SDDSApiInfoGenerator/CLAUDE.md), руками в генераторе не дублируются. - Связка «компонент → тип стиля» объявлена в самой библиотеке —
@ApiInfo(components: [...])на*Appearance, как на Android — и приезжает в мету. Вывести её из данных нельзя: группировка по типам iOS не совпадает с группировкой DS (у DSbasic-button/icon-button— разные компоненты, на iOS это одинButtonAppearance;bottom-sheetна iOS зовётсяBottomSheetAppearance, а в мете обязан называтьсяModalBottomSheet, как на Android).
.sdds/ios-api-meta.json — продукт сборки, не коммитится: генерится
scripts/generate_api_meta.sh, который вызывают build_cli.sh и run_tests.rb.
Приоритет: локальная .sdds/-директория DS Builder → удалённый/локальный zip-снапшот.
.sdds/ наполняется scripts/fetch_sdds.sh (DS Builder CLI). Токены/палитра в .sdds/
под .gitignore; config.json — трекается. Если .sdds/ пуст — откат на zip
(localSchemePath).
swift test --package-path . # DesignSystemBuilderCoreTests + DocsAggregatorCoreTests
ruby ../scripts/run_tests.rb # то же самое из корня репозитория- Генерация тем перезаписывает
Themes/<Name>Theme/— правь шаблоны/токены, не результат. ios-api-meta.jsonнужна только генерации компонентов;theme generateработает без неё.--format(swiftlint --fix) по умолчанию выключен: пакеты тем коммитятся как есть, и включение переформатировало бы их целиком — это отдельная регенерация всех тем.- Полный конвейер «токены → пакеты тем → Xcode-проекты» —
scripts/generate_themes/+scripts/create_project/(см. ../scripts/CLAUDE.md). - Меняешь публичное appearance-API в
SDDSComponents? Регенерируй темы и убедись, что шаблоны/типы совпадают. - Коммит-скоуп:
sdds-icore/theme-builder.