framework/skills/tool-usage/browser-ui/gui-control/SKILL.md
MUST use WHEN GUI-диалог блокирует завершение базы или тест завис без событий в ЖР. Provides X11-детектирование окон 1С, скриншот и симуляцию клавиш для разблокировки без участия человека.
npx skillsauth add steelmorgan/1c-agent-based-dev-framework gui-controlInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
X11-управление — action, не диагностика. Использовать только когда детектирован GUI-диалог, блокирующий нормальное завершение базы. Диагностику причин — через ЖР (event-log-analysis).
Для Предупреждение безопасности метаданные X11-окон могут быть неполными. Ориентируйся на связку: ЖР → скриншот → действия с клавиатурой.
| Триггер | Действие |
|---------|----------|
| В ЖР нет событий после test_start_time | Проверить — не завис ли GUI-диалог |
| Заголовок окна: «Ошибка» / «Предупреждение» | Скриншот → закрыть диалог → анализ ЖР |
| База не завершается после тестов | Закрыть через Escape + Enter |
| В ЖР Предупреждение безопасности на EPF | Визуальная проверка, не действовать вслепую по заголовкам |
import os
os.environ['DISPLAY'] = ':99' # до импорта Xlib и PIL
import os
os.environ['DISPLAY'] = ':99'
from Xlib import display
d = display.Display()
root = d.screen().root
error_windows = []
for win in root.query_tree().children:
name = win.get_wm_name()
wm_class = win.get_wm_class()
if wm_class and '1cv8' in wm_class:
if name and any(kw in name for kw in ['Ошибка', 'Предупреждение', 'Error']):
error_windows.append({'id': win.id, 'name': name})
print(error_windows)
Последовательность: Enter (закрыть диалог) → Escape (закрытие) → Enter (подтвердить). После — ждать 2–3 сек и проверить через шаг 1.
import os, time
os.environ['DISPLAY'] = ':99'
from Xlib import display, X
from Xlib.ext.xtest import fake_input
def send_key(d, keycode, delay=0.3):
fake_input(d, X.KeyPress, keycode)
d.flush()
time.sleep(delay)
fake_input(d, X.KeyRelease, keycode)
d.flush()
time.sleep(delay)
d = display.Display()
ENTER = d.keysym_to_keycode(0xFF0D)
ESCAPE = d.keysym_to_keycode(0xFF1B)
send_key(d, ENTER)
time.sleep(1)
send_key(d, ESCAPE)
time.sleep(1)
send_key(d, ENTER)
import os
os.environ['DISPLAY'] = ':99'
from PIL import ImageGrab
from Xlib import display
d = display.Display()
root = d.screen().root
for win in root.query_tree().children:
name = win.get_wm_name()
wm_class = win.get_wm_class()
if wm_class and '1cv8' in wm_class:
geom = win.get_geometry()
img = ImageGrab.grab(bbox=(geom.x, geom.y, geom.x + geom.width, geom.y + geom.height))
path = f'/tmp/onec_{win.id}.png'
img.save(path)
print(f'Скриншот сохранён: {path}')
search_event_log(from=test_start_time, limit=20)
├── есть события, нет Error → ждать
├── есть Error → скриншот → закрыть → анализ ЖР
└── нет событий → детектировать окна
├── окно с ошибкой → скриншот → закрыть
└── нет окон → база не запустилась
| Ошибка | Обходной путь |
|--------|---------------|
| DISPLAY не установлен | os.environ['DISPLAY'] = ':99' до импортов |
| python-xlib не установлен | pip install python-xlib |
| PIL.ImageGrab не работает | pip install Pillow |
| Окна не найдены, но процесс есть | GUI ещё не отрисован — ждать 2–3 сек |
| XTEST недоступна | Xvfb с флагом -extensions XTEST |
| Capability | Назначение |
|------------|------------|
| python-xlib | Чтение метаданных окон, симуляция ввода |
| PIL ImageGrab | Скриншот фреймбуфера или окна |
testing
MUST use BEFORE making a judgment about the cause of a conflict, a test failure, or an artifact dispute. Defines the end-to-end verification method L1→L6 and the classification of the first broken link.
development
MUST use AFTER a work cycle with ≥2 iterations (wrote → error → fixed → success). Provides the retrospective procedure and the format for recording practice/anti-patterns in references/learned-patterns.md or {project}/.context/learned-patterns.md.
tools
MUST use WHEN you are writing reusable knowledge into RLM (pattern / architectural decision / stable domain fact) OR reading it before a non-trivial task/solution in the domain. Provides the breakdown of native-push vs RLM-pull, tools for writing and reading RLM, H-MEM levels, and hygiene.
testing
MUST use WHEN the task is classified as simple (< 20 lines, 1 file, no new metadata objects, no architectural decisions). Provides a short cycle of 3 steps with a guard on the self path and mandatory verify.