Решили: экспорт частей юнита гоняется из Aseprite в batch (Aseprite.exe -b <файл> --script-param … --script export_bone_parts.lua), а не только руками из меню редактора. Скрипт получил параметры group / scale / subdir и уникализацию имён.

Почему: редактор Макса занят рисованием, а части нужны в проекте; открывать его ради экспорта значит ждать человека. Альтернатива — выгружать PNG своим питоновским разборщиком .aseprite — отвергнута: конвенция экспорта (папка, ×10 nearest, trim, правила @/_) уже живёт в lua-скрипте, и второй разборщик стал бы вторым владельцем этой конвенции.

Грабли — четыре штуки, и все четыре молчат, то есть выглядят как «сработало, но пусто»:

  • Установленное расширение роняет весь batch-запуск. pixellab падает на dlg = nil, когда UI недоступен. Лечится подменой APPDATA на пустую папку: чистый профиль не грузит расширений.
  • app.alert без UI не делает ничего, поэтому return app.alert("…") даёт пустой вывод и код возврата 0. Любой отказ в скрипте, который должен работать в batch, обязан печатать.
  • Путь спрайта в CLI приходит таким, как передан. Относительный путь уводил поиск корня проекта в пустоту. Достраиваем от app.fs.currentPath, но app.fs.isAbsolutePath использовать нельзя — поля нет в части версий API, и обращение к нему роняет скрипт целиком (Field isAbsolutePath does not exist).
  • Слои-листья левой и правой конечности названы одинаково (Leg (Down) в обеих группах), а имя PNG берётся из имени слоя: 18 экспортов давали 12 файлов, шесть частей затирались молча. Теперь при коллизии имя получает префикс родительской группы (Leg (Right) - Leg (Down).png), а имена без коллизий не меняются — иначе поехали бы ссылки в уже собранных ригах.

Отдельно: фильтр по группе обязателен для верстака. Без --script-param group в проект уезжают и снятые болванки, и реф-борды, которые лежат на том же холсте рядом с рабочей фигурой.

Владелец правды: Aseprite/scripts/export_bone_parts.lua (конвенция и параметры), Aseprite/scripts/README.md (установка), docs/unit-128-rig-progress.md (живой заход, временный).