Utilities

Export Icons

Как выгружать иконки из компонентов Figma в проект через CLI Export Icons: установка, конфиг, источники и цели, имена файлов, иконочный шрифт, SF Symbols, Figma Motion и отслеживание изменений.

Export Icons (@sxl-studio/export-icons): утилита командной строки, которая скачивает иконки из компонентов Figma в папку проекта. Она экспортирует узлы COMPONENT и каждый вариант COMPONENT_SET, запоминает, что уже скачано, и при следующем запуске забирает только изменения. Из того же набора она собирает иконочный шрифт и SF Symbols для iOS.

Что вы получаетеПодробности
Статические файлыsvg, png, jpg, webp, gif, pdf
Анимированные иконки (Figma Motion)svg, gif, mp4, webm
Иконочный шрифтwoff2, woff, ttf, eot, svg вместе с таблицей стилей и страницей предпросмотра
iOSAssets.xcassets с .symbolset на каждую иконку
Отслеживание измененийНовые, изменённые, переименованные и удалённые иконки определяются между запусками

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

  1. Установите пакет в проект. Нужен Node.js 20.9 или новее.
  2. Запишите токен Figma и ключ файла в .env (см. раздел «Доступ к Figma» ниже).
  3. Создайте конфиг мастером: он задаёт несколько вопросов и пишет валидный файл.
  4. Проверьте конфиг и посмотрите изменения через --dry-run.
  5. Запустите синхронизацию. Если в папке уже лежат скачанные ранее иконки, добавьте к первому запуску --adopt-existing: файлы будут приняты как базовое состояние, а не скачаны заново.
BASH
npm install --save-dev @sxl-studio/export-icons
pnpm exec sxl-export-icons init --wizard
pnpm exec sxl-export-icons validate-config --config sxl-export-icons.config.yaml
pnpm exec sxl-export-icons sync --config sxl-export-icons.config.yaml --dry-run
pnpm exec sxl-export-icons sync --config sxl-export-icons.config.yaml --adopt-existing
pnpm exec sxl-export-icons sync --config sxl-export-icons.config.yaml

С pnpm установленный бинарник запускается как pnpm exec sxl-export-icons, с npm как npx sxl-export-icons. Для разового запуска без установки используйте npx @sxl-studio/export-icons или pnpm dlx @sxl-studio/export-icons. Не используйте pnpx sxl-export-icons: в приватных registry он может попытаться найти unscoped-пакет sxl-export-icons и завершиться с 404.

Когда использовать

  • Иконки живут в библиотеке Figma и должны попадать в репозиторий файлами: со стабильными именами и без ручного экспорта.
  • Одни и те же иконки нужны в нескольких форматах или размерах, например SVG для веба и превью в WebP.
  • Из того же набора нужно собрать иконочный шрифт или SF Symbols.
  • Иконки меняются часто, и вы хотите скачивать только изменения: из терминала или в CI.

Доступ к Figma

  1. Откройте настройки аккаунта Figma и создайте personal access token со scopes file_content:read и file_metadata:read. Права на запись не нужны. Токены Figma ограничены по сроку, выберите срок по вашей политике.
  2. Возьмите ключ файла из URL: https://www.figma.com/design/<fileKey>/....
  3. Сохраните оба значения в .env в корне репозитория и добавьте .env и .env.local в .gitignore.
BASH
FIGMA_TOKEN=figd_xxxxxxxxxxxxxxxxx
SXL_ICONS_FILE_KEY=xxxxxxxxxxxx
# только для Bridge: mode: mcp, Figma Motion, экспорт через плагин
BRIDGE_AUTH_TOKEN=xxxxxxxxxxxx

CLI читает .env.local и .env из текущей папки и из всех родительских. Имена переменных можно поменять в конфиге: env.figmaTokenVar, sources[].fileKeyVar, bridge.authTokenVar.

Команды

КомандаЧто делает
sync (по умолчанию)Читает источники, скачивает новые и изменённые иконки, удаляет исчезнувшие, затем собирает шрифт и SF Symbols
initПишет стартовый sxl-export-icons.config.yaml; с --wizard задаёт вопросы вместо копирования шаблона
validate-configПроверяет YAML, пути и переменные окружения
reportПечатает по каждой паре источник и цель, сколько иконок отслеживается и на месте ли их файлы
cleanУдаляет файлы, записанные в state, и очищает state
probe-motionПоказывает, что Figma сообщает об узле с Motion, ничего не записывая
help, versionСправка и версия пакета

create-config равнозначно init, init-wizard равнозначно init --wizard. Без --config CLI ищет в текущей папке sxl-export-icons.config.yaml, icons.config.yaml, config/sxl-export-icons.config.yaml и config/icons.config.yaml.

Флаги sync

ФлагЧто делает
--config <path>Файл конфига; повторите флаг, чтобы запустить несколько конфигов сразу
--config-glob "<glob>"Конфиги по шаблону, например "packages/*/sxl-export-icons.config.yaml"
--target <id>Только перечисленные цели; можно повторять
--dry-runПоказывает, что изменится, и ничего не записывает
--fullСначала очищает state и экспортирует всё заново. Запускайте со всеми целями: с --target файлы остальных целей остаются на диске, но их следующий sync начинается с пустого state и считает их новыми
--adopt-existingПри первом запуске принимает уже лежащие на диске файлы как неизменённые, а не скачивает заново
--allow-fallback-restЕсли источник mcp недоступен, читает его через REST API, когда у источника есть ключ файла
--report <path>Записывает JSON-отчёт о запуске

Флаги других команд

КомандаФлагЧто делает
init--path <path>Куда записать конфиг; по умолчанию sxl-export-icons.config.yaml
init--forceПерезаписать существующий конфиг
init--wizardИнтерактивные вопросы; нужен настоящий терминал
clean--dry-runТолько перечислить, что будет удалено
clean--skip-auxСохранить папки шрифта и SF Symbols; удалить только отслеживаемые файлы иконок
validate-config, report--config, --config-globКак у sync
probe-motion--node-id <id>Узел для проверки; без него берётся текущее выделение в Figma
probe-motion--format <list>Форматы для проверки, через запятую или повтором флага: MP4, WEBM, GIF, SVG
probe-motion--inspect-only, --include-descendantsПрочитать данные Motion без пробного экспорта; включить вложенные слои (--descendant-max-depth <n> и --descendant-max-nodes <n> ограничивают обход)
probe-motion--ignore-overlapping-layers, --include-id-attribute, --bridge-url <url>Одноимённые опции экспорта Figma для проверки SVG; адрес Bridge, по умолчанию http://127.0.0.1:37830

Мастер настройки

init --wizard работает только в интерактивном терминале. Вопросы по порядку: язык (en или ru), создать ли .env с пустыми переменными, путь к state-файлу, разрешить ли пути вне проекта, идентификатор источника, режим источника (rest или mcp), переменная с ключом файла, имя страницы, скорость скачивания, идентификатор цели, папка вывода, формат (svg, png, jpg, webp, gif или pdf), стиль имён, иконочный шрифт (папка и форматы), SF Symbols (папка) и фильтр по marker в описании. Результат: конфиг version: 3 с шаблоном имени {prefix}{variant.style}{sectionName}{baseName}{suffix}. Для mp4 и webm добавьте motion.enabled: true вручную.

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

Конфиг: YAML-файл с version: 3. sources описывают, откуда читать иконки, targets описывают, куда и как их записывать. Относительные пути считаются от папки конфига.

YAML
version: 3
env:
  figmaTokenVar: FIGMA_TOKEN
bridge:
  baseUrl: http://127.0.0.1:37830
  authTokenVar: BRIDGE_AUTH_TOKEN
state:
  file: .sxl/cache/icons-state.json
safety:
  allowOutsideWorkspace: false
sources:
  - id: icons
    mode: rest
    fileKeyVar: SXL_ICONS_FILE_KEY
    pageName: Icons
targets:
  - id: web-svg
    sourceIds: [icons]
    output:
      path: assets/icons/svg
      format: svg
КлючПо умолчаниюЧто делает
env.figmaTokenVarFIGMA_TOKENИмя переменной с токеном Figma
bridge.baseUrlhttp://127.0.0.1:37830Адрес Bridge. Используется только источниками mode: mcp, целями с Motion и экспортом через плагин
bridge.authTokenVarBRIDGE_AUTH_TOKENПеременная с токеном доступа к Bridge
state.fileassets/.cache/sxl-export-icons-state.jsonГде CLI запоминает, что уже экспортировано. Шаблон и мастер используют .sxl/cache/icons-state.json; подходят оба, выберите один путь и не меняйте его
safety.allowOutsideWorkspacefalseПо умолчанию пути вывода и state должны оставаться внутри папки, из которой запущена команда. true разрешает писать в другое место, например из packages/ds/tokens в packages/ds/assets

Конфиг version: 2 (icons.config.yaml) по-прежнему читается и мигрирует на лету; его относительные пути считаются от папки, из которой запущена команда.

Источники (sources)

YAML
sources:
  - id: mono
    mode: rest
    fileKeyVar: SXL_ICONS_FILE_KEY
    pageName: Monochrome
    sectionName: Actions
    downloadSpeed: 20
    descriptionExportMarker:
      key: sxl-studio-export-icon
      includeWhenMissing: true
КлючПо умолчаниюЧто делает
idобязателенИмя, которое указывают в targets[].sourceIds
moderestrest читает файл через Figma REST API. mcp читает список иконок из файла, открытого в Figma, через Bridge и Remote Connect; сами файлы всё равно скачиваются через REST, поэтому токен и ключ файла по-прежнему нужны
fileKey, fileKeyVarобязателен для restСам ключ файла или имя переменной, в которой он лежит
pageName, pageIdвсе страницыЧитать только эту страницу
sectionName, sectionIdвсе секцииЧитать только иконки внутри этой секции
downloadSpeed10Запросов в секунду к Figma. Уменьшите, если Figma отвечает 429
descriptionExportMarkerвыключенФильтр по marker в описании компонента, см. ниже
selectorsнетПравила включения и исключения, см. ниже
СелекторЧто делает
includeNodeIds, excludeNodeIdsПо id узла
includeComponentNames, excludeComponentNamesПо имени компонента
includeComponentSetNames, excludeComponentSetNamesПо имени набора компонентов
variantMatchТочное совпадение свойств варианта. Подходит любое свойство, не только style; значение задаётся строкой или списком строк
YAML
selectors:
  variantMatch:
    state: [default, hover]
    style: outlined

Селекторы работают и на уровне цели (targets[].selectors), и внутри переопределения (overrides[].patch.selectors); там они фильтруют только иконки этой цели или правила.

Marker в описании. Напишите sxl-studio-export-icon: true или sxl-studio-export-icon: false в описании компонента или набора компонентов. true экспортирует иконку, false пропускает, а без marker действует includeWhenMissing. Имя ключа настраивается.

Цели (targets)

YAML
targets:
  - id: web-icons
    mode: sync
    sourceIds: [mono]
    download:
      enabled: true
      pruneUntracked: false
    output:
      path: assets/icons
      format: svg
      scale: 1
      quality: 100
      lossless: false
      unsafeSvgPolicy: fail
    naming:
      case: kebab
      pattern: "{prefix}{variant.style}{sectionName}{baseName}{suffix}"
      collisionStrategy: add-nodeid
КлючПо умолчаниюЧто делает
idобязателенИмя цели, используется с --target
modesyncsync читает Figma и пишет файлы. convert-local берёт SVG, уже лежащие в output.path, и только собирает шрифт или SF Symbols
sourceIdsобязателен для syncКакие источники экспортировать
selectorsнетДополнительный фильтр для этой цели
download.enabledtruefalse отключает скачивание, переименование и удаление; локальные файлы используются как есть
download.pruneUntrackedfalseДополнительно удалять файлы формата цели в output.path, которых нет в текущем наборе Figma. Используйте только для папок, принадлежащих одной этой цели
outputФормат и обработка, см. следующую таблицу
namingИмена файлов, см. раздел «Имена файлов»
overrides, sourceExport, motion, font, sfSymbolsвыключеныОписаны в своих разделах

Настройки output

КлючПо умолчаниюЧто делает
pathобязателенПапка вывода
formatsvgsvg, png, jpg, webp, gif, pdf; с motion.enabled ещё mp4 и webm. Один формат на цель
scale1Масштаб экспорта в Figma, от 0.01 до 4
quality100Качество растровых форматов, от 1 до 100
losslessfalsetrue оставляет WebP без потерь, в том числе при заданном qualitySize: CLI никогда сам не переключается на кодирование с потерями
unsafeSvgPolicyfailЧто делать с SVG-иконкой, у которой внутри вектора есть заливка изображением: fail останавливает sync, embed-png пишет SVG со встроенным PNG. См. раздел «SVG со встроенными изображениями»
qualitySizenullОграничение размера растрового файла, например "50kb" или "1mb"; качество снижается, пока файл не уложится
width, heightnullИзменить размер растрового результата до этих значений в пикселях
modeWHnullКак вписывать в width и height: null простое изменение размера, proportion сохранить пропорции внутри рамки, cover заполнить рамку с обрезкой, fill растянуть

SVG оптимизируются через SVGO, растровые файлы через Sharp. webp и статический gif экспортируются из Figma как PNG и конвертируются локально; pdf приходит из Figma как есть.

Имена файлов

Имя файла собирается из naming.pattern. Токены, пустые для конкретной иконки, пропускаются; остальные соединяются через separator и приводятся к case.

ТокенЗначение
{prefix}, {suffix}naming.prefix и naming.suffix
{baseName}Имя набора компонентов, иначе имя компонента
{componentName}, {componentSetName}, {nodeName}, {nodeId}Имена из Figma и id узла
{pageName}, {sourceId}Имя страницы, идентификатор источника
{sectionName}Имя секции, только при includeSectionName: true
{variant}Все свойства варианта парами свойство-значение
{variant.<prop>}Одно свойство варианта, например {variant.style} или {variant.size}. Для нескольких свойств поставьте несколько токенов подряд; свойство, которого нет у иконки, пропускается
КлючПо умолчаниюЧто делает
casekebabkebab, snake, camel, pascal
separatorзависит от case- для kebab, _ для snake, без разделителя для camel и pascal
prefix, suffixnullЗначения токенов {prefix} и {suffix}
includeSectionNamefalseВключает токен {sectionName}
collisionStrategyadd-nodeidДве иконки получили одно имя: error останавливает, add-nodeid добавляет id узла, add-index добавляет номер

Без pattern имя складывается из prefix, свойства style (или variant), секции, если она включена, имени набора или компонента и suffix.

Дубли проверяются перед скачиванием. В интерактивном терминале CLI перечисляет их и спрашивает, что делать: refresh перечитывает Figma после того, как вы поправили имена, skip оставляет первую иконку из каждой пары, all скачивает всё и применяет стратегию коллизий, abort останавливает. Выбор стрелками и Enter. В CI, без терминала, стратегия из конфига применяется без вопросов.

Переопределения (overrides)

Переопределения меняют output, sourceExport, naming, motion, font или sfSymbols для иконок, подходящих под правило, и могут добавить selectors.

YAML
targets:
  - id: web-icons
    sourceIds: [mono]
    output:
      path: assets/icons
      format: svg
    overrides:
      - name: flags-webp
        match:
          sectionName: Flags
        patch:
          output:
            format: webp
            quality: 85

match принимает pageName, pageId, sectionName, sectionId, componentName, componentSetName, nodeId и variantMatch. Изменение переопределения переэкспортирует только те иконки, которые под него подходят.

Несколько форматов, источников и конфигов

  • Несколько форматов одних и тех же иконок: несколько целей с одинаковым sourceIds и разными output.path и format.
  • Несколько страниц или секций одного файла: несколько источников с одинаковым fileKeyVar и разными pageName или sectionName.
  • Несколько файлов Figma: несколько источников с разными fileKeyVar; цель может перечислить их все в sourceIds.
  • Несколько пакетов: запустите sync с несколькими флагами --config или с --config-glob.

SVG со встроенными изображениями

Figma может вернуть неполный SVG для векторного слоя с заливкой изображением. Перед записью файлов CLI проверяет иконки каждой SVG-цели на этот случай.

  • unsafeSvgPolicy: fail (по умолчанию): sync останавливается и перечисляет иконки. Исправьте их в Figma, если результат должен остаться векторным.
  • unsafeSvgPolicy: embed-png: такие иконки скачиваются из Figma как PNG в масштабе output.scale (до 4) и оборачиваются в SVG со встроенным изображением, поэтому файл не зависит от временной ссылки Figma. Содержимое растровое и размывается при увеличении. Такие SVG нельзя использовать для шрифта и SF Symbols, поэтому держите их в отдельной цели без этих конвейеров, например отобранной через includeComponentNames.

--dry-run показывает, какие иконки получат встроенный PNG; в JSON-отчёте они перечислены в svgExport.embeddedPng.

Растровый экспорт через плагин

По умолчанию растровые форматы рендерит Figma REST API в масштабе output.scale, не больше 4. Когда из маленького вектора нужен большой растр, например WebP 128 px из иконки 24 px, попросите плагин SXL Studio отрендерить промежуточное изображение: sourceExport.transport: plugin. sourceExport задаётся на уровне цели и внутри overrides[].patch.

КлючПо умолчаниюЧто делает
transportrestplugin рендерит промежуточное изображение в открытом файле Figma через Bridge и Remote Connect
formatpngПромежуточный формат, png или jpg; output.format применяется после
constraint.type, constraint.valueнетРазмер промежуточного изображения: SCALE до 16, WIDTH или HEIGHT до 4096 px

Требования экспорта через плагин:

  • output.format: png, jpg, webp или gif; нельзя совмещать с motion.enabled.
  • Bridge запущен, плагин SXL Studio открыт в исходном файле с включённым Remote Connect. За один sync экспорт через плагин работает только с одним файлом Figma; остальные файлы разделите по конфигам или через --target.
  • У источника есть fileKey или fileKeyVar, в том числе в mode: mcp. CLI сверяет его с открытым документом до записи файлов.
  • В промежуточном изображении уже должно быть достаточно пикселей: CLI не увеличивает локально. Поднимите constraint.value, если видите ошибку о том, что источник меньше запрошенного размера.
  • Ограничения на иконку: стороны до 4096 px, 16 миллионов пикселей, 16 МиБ PNG или JPG.

Community-версия плагина. Community-сборка плагина может не знать ключ открытого файла. Откройте Repository connection в SXL Studio (то же поле есть в настройках Git Sync), заполните Figma file URL or key и сохраните. Ключ хранится в документе для всех; после дублирования файла введите его заново. Если ключ отсутствует или не совпадает с источником, sync останавливается.

Пример: вектор 24x24 из секции Illustrations рендерится Figma в 128 px и сохраняется как WebP 128x128 без потерь.

YAML
overrides:
  - name: illustrations-webp-128
    match:
      sectionName: Illustrations
    patch:
      output:
        format: webp
        width: 128
        height: 128
        quality: 100
        lossless: true
      sourceExport:
        transport: plugin
        format: png
        constraint:
          type: WIDTH
          value: 128

--dry-run печатает, сколько иконок пойдёт через плагин; JSON-отчёт записывает каждую из них с форматом и ограничением.

Анимированные иконки (Figma Motion)

Иконки, анимированные в Figma Motion, экспортирует обычный sync, если у цели задано motion.enabled: true.

ФорматКак получается
svgАнимированный SVG: SVG иконки плюс её ключевые кадры Motion в виде CSS-анимации
gif, mp4, webmРендерит сама Figma через плагин

Требования: Bridge запущен, плагин SXL Studio открыт в том же файле с включённым Remote Connect, а источник либо rest с ключом файла, либо mcp. Цели с Motion переэкспортируются при каждом sync: данные анимации приходят из плагина, а не из снимка файла, который сравнивает отслеживание изменений.

YAML
targets:
  - id: motion-webm
    sourceIds: [icons]
    output:
      path: assets/motion
      format: webm
    motion:
      enabled: true
      fps: 30
      loop: true
КлючПо умолчаниюЧто делает
enabledfalseВключает экспорт Motion для цели
fps30Кадров в секунду, от 1 до 120
looptrueЗациклить анимацию
includeDescendantstrueВключить анимацию вложенных слоёв; descendantMaxDepth (8) и descendantMaxNodes (300) ограничивают обход
ignoreOverlappingLayerstrueОдноимённая опция экспорта Figma; действует для svg
includeIdAttributetrueСохранять id слоёв атрибутами id; действует для svg

Чтобы увидеть, что Figma сообщает об анимированной иконке до настройки цели, запустите probe-motion. Без --node-id проверяется текущее выделение в Figma.

BASH
pnpm exec sxl-export-icons probe-motion --format MP4,WEBM,GIF,SVG --inspect-only
pnpm exec sxl-export-icons probe-motion --node-id 1:2 --format SVG --include-id-attribute

Иконочный шрифт и SF Symbols

Оба конвейера работают внутри цели после скачивания и берут SVG-файлы этой цели.

YAML
font:
  enabled: true
  path: assets/icons/font
  formats: [woff2, woff, ttf, eot, svg]
  fontName: icons
  engine: webfonts-generator
sfSymbols:
  enabled: true
  path: assets/icons/ios
КлючПо умолчаниюЧто делает
font.enabledfalseСобрать шрифт
font.pathassets/fontПапка вывода. В неё попадают файлы шрифта, <fontName>.css, preview.html и codepoints.json, который сохраняет коды символов между запусками
font.formats[woff2, woff, ttf]Любые из woff2, woff, ttf, eot, svg
font.fontNameiconsИмя семейства и файлов
font.enginewebfonts-generatorwebfonts-generator или advanced
font.includeNames, font.excludeNamesвсе иконкиПодмножество по имени файла, с .svg или без
sfSymbols.enabledfalseСобрать Assets.xcassets с .symbolset на каждую иконку
sfSymbols.pathassets/iosПапка вывода

SF Symbols пропускают иконки с градиентами, фильтрами, масками и встроенными изображениями.

Чтобы собрать шрифт или SF Symbols из SVG, которые уже лежат на диске, используйте цель convert-local: sourceIds: [], download.enabled: false, output.format: svg и хотя бы один включённый font или sfSymbols. Запускайте её отдельно через --target.

YAML
targets:
  - id: icons-font-only
    mode: convert-local
    sourceIds: []
    download:
      enabled: false
    output:
      path: assets/icons
      format: svg
    font:
      enabled: true
      path: assets/icons/font
      includeNames: [filled-menu, outline-menu]

Состояние и отслеживание изменений

CLI запоминает каждую экспортированную иконку в state.file, по парам sourceId::targetId. При следующем запуске он сравнивает Figma с state и обрабатывает только разницу.

ИзменениеКогда
NEWИконка появилась впервые
UPDATEDИконка изменилась в Figma (включая правки формы), файл отсутствует, сменился формат или настройки цели
RENAMEDИзменилось имя, формат прежний
DELETEDИконка ушла из области источника; файл удаляется
UNCHANGEDДелать нечего
  • Первый запуск без state: каждая иконка NEW и скачивается, даже если файлы есть. --adopt-existing вместо этого принимает существующие файлы как UNCHANGED.
  • --full очищает state и экспортирует всё заново.
  • download.pruneUntracked: true дополнительно удаляет файлы формата цели, о которых state не знает.
  • report показывает по парам, сколько иконок отслеживается, на месте ли файлы и в каких форматах.
  • clean удаляет отслеживаемые файлы и папки шрифта и SF Symbols, затем очищает state; --skip-aux сохраняет эти папки, --dry-run только перечисляет.

Если что-то не работает

Что случилосьЧто делать
Config file not foundПередайте --config <path> или создайте sxl-export-icons.config.yaml в текущей папке
Missing Figma token in env "FIGMA_TOKEN"Добавьте токен в .env или проверьте env.figmaTokenVar
Figma отвечает 429Уменьшите downloadSpeed источника
Path ... is outside workspaceУстановите safety.allowOutsideWorkspace: true или запускайте команду из папки, в которой лежит вывод
Bridge session is not connected, Remote Connect is not connectedЗапустите Bridge, откройте SXL Studio в файле и включите Remote Connect. См. Bridge
Naming collision detectedДобавьте токены в naming.pattern, например {sectionName} или {nodeId}, или поменяйте collisionStrategy
Unsafe Figma SVG export blockedУберите заливку изображением в Figma или задайте unsafeSvgPolicy: embed-png для этих иконок в отдельной цели
Raster-backed SVG fallback cannot be used as an icon-font or SF Symbols sourceПеренесите иконки с embed-png в цель без font и sfSymbols
Plugin export is connected to Figma file "...", could not verify the active Figma fileОткройте исходный файл в Figma; в Community-версии плагина заполните Figma file URL or key в Repository connection
Raster source ... is smaller than the requested outputУвеличьте sourceExport.constraint.value
Lossless WebP is ... above qualitySizeПоднимите qualitySize или задайте lossless: false
Wizard mode requires an interactive terminalЗапускайте init --wizard в терминале; в CI используйте обычный init
При первом запуске все иконки NEW, хотя файлы естьЗапустите первый sync с --adopt-existing
Иконки Motion экспортируются при каждом запускеТак и задумано: данные анимации приходят из плагина, а не из снимка файла
No targets matched --target filterПроверьте значения id целей; сообщение перечисляет доступные

Связанные страницы