Владельцам дизайн-систем и инженерам автоматизации нужна регулярная выдача PNG без ручных повторных экспортов. Здесь цепочка launchd, клиент Node 22 LTS на эндпоинте изображений Figma REST и OpenClaw Gateway со Skills: сверка WxH с манифестом и правила sRGB до каталога promoted. Контракт API-first: inbox принимает байты; на удалённом Mac JSONL доказывает соответствие — без опоры только на «что дизайнер последним положил в папку».
Содержание
Почему инспекция от API, а не от папки
- Человеческий разброс: при переименовании фреймов ручной экспорт плывёт; REST жёстко привязывается к стабильным
node_idиз манифеста. - Цветовые сюрпризы: слайсы Display P3 выглядят нормально в Preview macOS, но ломают допущения CSS; сверяйтесь с матрицей PNG из Figma Dev Mode.
- Лимиты API: ретраи без backoff и джиттера сжигают квоты Figma API и стопорят очередь целиком.
Наблюдение каталога полезно уже после появления файлов, но оно не создаст недостающие масштабы и не докажет, какую версию узла отдал API. Сначала REST, затем OpenClaw Skills обрабатывают inbox как мини-CI.
Матрица выбора источника байт
| Источник PNG | Сильная сторона | Слабое место | Когда выбирать |
|---|---|---|---|
| Watch папки ручного экспорта | Привычка студии, быстрый визуальный цикл | Сложно доказать версию фрейма и состав батча | Исследование, не регулируемые библиотеки |
По расписанию REST /v1/images |
Список узлов в git, повторяемые scale | Гигиена токенов и дисциплина HTTP | Дизайн-токены, маркетинговые компоненты, хром приложения |
| Пуш через плагин | Богатые метаданные изнутри Figma | Ещё одна среда исполнения, апгрейды и ACL | Если команда уже стандартизировала вендорский плагин |
Токены и минимальные права
Разместите PAT в ~/.config/figma-design-system.token с правами 0600 для пользователя launchd; выдавайте только чтение метаданных и выгрузку изображений — никогда админский токен. Ротируйте ежеквартально и привязывайте один токен к одному дереву файлов. Выровняйте владельца UNIX с руководством по установке OpenClaw, чтобы allowlist Gateway и учётные записи SSH описывали один и тот же аккаунт.
0600, бюджет одного батча HTTP до 120 с, не более четырёх масштабов на задачу без согласования с платформой.
Шаблон задачи экспорта
Зафиксируйте Node 22 LTS через engines.node в package.json и одинаковый major в CI. В YAML перечислите file_key, список node_id, format: png, целочисленный scale и шаблон имён вроде ${nodeId}@${scale}x.png. Экспортёр делает POST /v1/images/{file_key}, опрашивает готовность URL, стримит каждый ответ в inbox/*.part, вызывает fsync и rename — без полупустых PNG для Skills.
Наблюдение за каталогом и повторы
Входящий каталог здесь — зона посадки API, а не замена HTTP: дебаунс, игнор *.part, два стабильных подряд опроса размера, mutex на file_key. На 429 уважайте Retry-After, иначе экспоненциальный backoff с потолком. Поля логов согласуйте с батчем watch, retry и архивом; пост-обработку и цепочки CLI — с шаблонами CLI и повторов, оптимизаторы allowlist только при необходимости.
Цветовое пространство и правила проверки sRGB
Выполняйте magick identify -verbose: требуйте Colorspace: sRGB и отклоняйте Display P3 или неизвестный ICC. Сверяйте ширину и высоту с манифестом на каждый узел и масштаб; именование согласуйте с матрицей Dev Mode PNG. Полиграфические TIFF сначала прогоняйте по политике CMYK → sRGB, затем уже этот гейт.
Примеры алертов при сбое
Одна JSON-строка на инцидент — без секретов, только псевдонимы токенов и trace_id. Ошибка ICC: {"ok":false,"reason":"icc_display_p3","file":"btn_primary@2x.png","trace_id":"7c2f9a"}. Лимит: {"ok":false,"reason":"http_429","retry_in_sec":45,"attempt":2}.
Воспроизводимый runbook Gateway
- Layout на локальном NVMe APFS:
inbox,quarantine,promoted,logsпод одним корнем в git. - Зависимости через
npm ci; зафиксируйтеnode -vв README репозитория задачи. - OpenClaw: allowlist только
inspect_png.shиmvвнутри этого корня; лишние MCP-инструменты отключите. - launchd:
ThrottleInterval, чтобы не долбить/v1/imagesпри частых сохранениях в файле. - Алерты: стрим
logs/compliance.jsonlчерезjqв webhook приok:false. - Реплей: заморозьте десятки строк
node_idна ветку; операторам достаточно публичной помощи по SSH и VNC без входа в кабинет.
FAQ по сбоям
Эндпоинт отвечает 200, но URL равны null — что случилось?
Устаревший node_id после отвязки компонента. Обновите манифест из Dev Mode; CI должен падать, если идентификаторы выпали из графа файла.
fetch в Terminal работает, а под launchd — нет
Задайте в plist HOME, PATH, FIGMA_TOKEN_FILE; перезагрузите job через launchctl bootstrap после правок.
Нужно ли открывать Figma напрямую из OpenClaw?
Нет: HTTP оставьте в Node, чтобы токены не попадали в логи чата; OpenClaw планирует расписание, перемещения и инспекцию.
Как доказать паритет со слайсами дизайнера?
В YAML ожидаемые WxH на узел и масштаб; гейт на magick identify -format '%wx%h' до записи в promoted/.
Другие сценарии — в разделе Технические идеи; на главную — MacPng; доступ и узлы без обязательного логина — аренда и покупка, тарифы и помощь.
Стабильно гоняйте дизайн-автоматизацию на удалённом Mac
Выделенный Apple Silicon держит вытягивание Figma API, гейты OpenClaw и журналы PNG compliance на быстром NVMe: ротация токенов, расписания launchd и обновления ImageMagick настраиваются один раз на парк машин, а не на каждом ноутбуке дизайнера.