Началось всё с курса по Cursor, который я собрал для Степика, там на каждый второй шаг нужна картинка интерфейса в строго определённом состоянии, скажем открытое меню, окно настроек или панель агента с готовым диффом. Снимать такое руками муторно, а самое неприятное начинается, когда выходит новая версия Cursor и надо переснимать окошки заново.
Ну я и попросил агента накидать пару скриптов, чтобы он делал это сам, и результат мне настолько понравился, что я решил упаковать эту историю в формате скила screenshotting-gui.
Чтобы получить картинку поднимается виртуальный экран через Xvfb, это X-сервер, который рисует в память. На этом экране из-под моей же учётки стартует нужное приложение, дальше агент водит по нему синтетическим вводом через XTEST (клики, клавиши, скролл, драг), снимает кадр через ImageMagick и им же его размечает, то есть рисует рамку со скруглением вокруг нужной кнопки, обрезает лишнее, ставит стрелку или склеивает два кадра в один.
Удобство в том, что всё это живёт в headless-режиме на отдельном дисплее
:99. Приложение не всплывает поверх моих окон, не ворует фокус и не дёргает курсор, я спокойно работаю дальше, пока где-то в фоне агент тыкает по кнопкам Cursor, не сравнить с тем как работает Playwright MCP постоянно отбирающий у меня мышку.На клодкод ставится как плагин из моего каталога rpa-skills парой команд:
/plugin marketplace add EvilFreelancer/rpa-skills
/plugin install screenshotting-gui@rpa-skills
Пользоваться можно и руками, весь цикл выглядит примерно вот так:
export XCTL_DISPLAY=:99
Xvfb :99 -screen 0 1920x1080x24 -ac & sleep 1
DISPLAY=:99 cursor & sleep 3
python3 scripts/xctl.py winlist
python3 scripts/xctl.py click 1490 1003
python3 scripts/xctl.py shot raw.png --crop 1270 560 650 520
python3 scripts/annotate.py box raw.png final.png 1300 600 1720 680
Но по-хорошему всё это агент делает сам, ему достаточно сказать "перечитай скил и пересними скриншот окна настроек с подсветкой поля модели".
Реп: https://github.com/EvilFreelancer/screenshotting-gui
Каталог скилов: https://github.com/EvilFreelancer/rpa-skills