Визуальные AI-агенты вроде Browser-Use или Stagehand удобны для разовых задач, но в регулярных процессах быстро упираются в стоимость и скорость. На один типовой сценарий уходит до 50 тысяч токенов и минута ожидания. Любое изменение верстки ломает цепочку шагов. Вторая проблема — авторизация: передавать логины, пароли и сессионные куки во внешние облачные песочницы рискованно.

Разработчик Jack Wener предложил другую логику: превратить нужные действия на сайтах в обычные консольные команды (CLI), которые выполняются через ваш локальный браузер Chrome с уже сохраненной сессией.

Для повторяющихся задач агент получает не визуальный кликер, а быстрый консольный интерфейс с нулевым расходом токенов и структурированным выводом в JSON, Markdown или таблицу.

Суть подхода: OpenCLI заменяет ресурсоемкое визуальное сканирование страниц детерминированными консольными командами, передавая нативные события мыши и клавиатуры в уже авторизованный профиль браузера.

Почему визуальный браузинг ломается в продакшене

Когда агенту нужно регулярно взаимодействовать с веб-сервисами, разработчики обычно выбирают один из трех путей:

  1. Официальные API. Надежный вариант, но у большинства платформ API закрыт, урезан или требует дорогой подписки.
  2. Облачные скрейперы (Firecrawl, Crawl4AI). Хорошо собирают публичные страницы, но спотыкаются о двухфакторную аутентификацию, SSO и закрытые личные кабинеты.
  3. Визуальные агенты (Browser-Use). Модель изучает скриншоты и пытается попасть курсором по кнопкам. Это медленно, дорого и чувствительно к случайным попапам.

OpenCLI использует другую связку: детерминированные TypeScript-адаптеры поверх активного сеанса Chrome. Вы один раз входите в аккаунт через браузер руками, а OpenCLI выполняет команды через локальное расширение-мост. Повторяющаяся операция отрабатывает за пару секунд локально и не тратит токены языковой модели.

Внутреннее устройство: от расширения Chrome до CDP

Система разделена на четыре уровня:

КомпонентРольПринцип работы
Browser Bridge ExtensionМост к авторизацииРасширение для Chrome из Web Store. Подключается к локальному демону и передает команды активным вкладкам
Local DaemonФоновый диспетчерПроцесс на рабочей машине. Принимает вызовы из терминала и связывает их с нужным профилем браузера
Native Input Backend (CDP)Нативный вводОтправка реальных системных событий мыши и клавиатуры через Chrome DevTools Protocol вместо синтетических JS-кликов
Accessibility Tree (AX)Устойчивое зрениеСнятие компактных снимков дерева доступности вместо сырого DOM, что исключает сбои при перерисовках в React

Почему реальный ввод через CDP надежнее element.click()

Обычные скрипты автоматизации находят элемент в DOM и вызывают метод .click(). В современных веб-приложениях на базе React, Radix UI или shadcn/ui это приводит к скрытым ошибкам: выпадающие списки и модальные окна часто слушают события pointerdown, mousedown или mouseup. Скрипт считает, что клик прошел, но интерфейс не реагирует.

OpenCLI находит точные координаты центра элемента и передает через CDP низкоуровневые события Input.dispatchMouseEvent (mousePressed и mouseReleased). Для страницы это полноценный клик реального пользователя, поэтому кастомные меню открываются стабильно.

Снимки дерева доступности (AX Tree)

Вместо тяжелых скриншотов OpenCLI собирает для агента компактное дерево доступности (Accessibility.getFullAXTree).

Каждый элемент получает идентификатор ссылки (@ref). Если компонент на странице перерисовывается при открытии диалогового окна, OpenCLI находит потерянный элемент по роли (role), имени (name) и порядковому номеру (nth). Агенту не нужно повторно сканировать весь экран и тратить контекст.

Десктопный слой: OpenCLIApp и Electron-приложения

Для повседневной работы на macOS и Windows доступно приложение OpenCLIApp (https://opencli.info/download). Оно работает в системном трее и решает практические задачи:

  • Диагностика окружения: утилита opencli подключается в систему в один клик, а встроенный doctor сразу проверяет статус демона и расширения Chrome.
  • Продление сессий (Keepalive): фоновый опрос открытых вкладок защищает корпоративные токены и сессионные куки от сброса по таймауту.
  • Конвертер Web в Markdown: очищает текущую веб-страницу от визуального шума и отдает чистый текст для контекста локальных LLM.
  • Контроль Electron-приложений: через CDP и AppleScript OpenCLI отправляет команды в Cursor, Codex, ChatGPT Desktop и Antigravity прямо из терминала.

Агентный контур: навыки для Claude Code, Cursor и терминала

OpenCLI задумывался как рабочий инструмент для внешних кодинг-агентов. В репозитории есть готовый набор навыков, который ставится одной командой:

npx skills add jackwener/opencli

Комплект навыков распределяет задачи агента по отдельным модулям:

НавыкНазначение и сценарий использования
opencli-browserИнтерактивное управление живой страницей: переходы, клики по @ref, ввод текста и чтение снимка DOM.
opencli-adapter-authorРазработка нового повторяемого адаптера: отслеживание сетевых запросов и генерация TypeScript-кода.
opencli-autofixАвтоматическая корректировка селекторов и структуры данных адаптера после обновления верстки сайта.
opencli-browser-sitemapНавигация по проверенной структуре сайта без блуждания по посторонним ссылкам.
opencli-sitemap-authorСоставление и валидация стабильных маршрутов по ключевым разделам сервиса.
opencli-usageВстроенный справочник по готовым командам и поддерживаемым площадкам.

Модель не тратит контекстное окно на изучение документации сайта, а сразу вызывает нужную утилиту через консоль.

Сравнение подходов к автоматизации

ИнструментОсновной подходРасход токеновСкорость ответаРабота с авторизацией
OpenCLIДетерминированные TS-адаптеры + CDP0 токенов для адаптеров1–3 секундыСессия вашего профиля Chrome
Browser-UseВизуальный LLM-агент по скриншотамВысокий (на каждый шаг)15–60 секундРучной перенос куки или профиля
StagehandОбертка над Playwright (act, extract)Средний / высокий5–20 секундПрограммная настройка контекста
FirecrawlОблачный API выгрузки в MarkdownПо тарифам сервиса3–10 секундТолько открытые страницы
agent-browserПримитивы на базе Accessibility TreeСредний (нужен план модели)3–10 секундОтдельный инстанс Chromium

Быстрый старт и практическое применение

1. Установка и подключение

Для десктопа проще всего скачать приложение с официального сайта https://opencli.info/download, запустить OpenCLIApp и подтвердить установку команды в систему.

Для серверов и CI доступна установка через npm (нужен Node.js не ниже 20.18.1):

npm install -g @jackwener/opencli

После этого установите расширение OpenCLI из Chrome Web Store и проверьте связь:

opencli doctor

2. Работа с несколькими профилями Chrome

Если вы разделяете личный и рабочий браузеры, OpenCLI умеет переключаться между ними:

# Список подключенных профилей браузера
opencli profile list

# Назначение имени рабочему профилю
opencli profile rename <contextId> work
opencli profile use work

# Проверка состояния браузера в выбранном профиле
opencli --profile work browser main state

3. Управление сессиями и вкладками браузера

Для прямого взаимодействия со страницей OpenCLI использует концепцию именованных сессий. Это исключает коллизии, когда агент одновременно обращается к разным сайтам.

⚖️ Правило сессий: Команды группы opencli browser требуют обязательного указания имени сессии: opencli browser <session> <action>. Сессия сохраняет привязку к вкладке до команды close или автоматического сброса по таймауту неактивности.

# Открытие целевой страницы в сессии "work"
opencli browser work open https://github.com

# Просмотр открытых вкладок и выбор целевой страницы
opencli browser work tab list
opencli browser work tab select <targetId>

# Получение компактного снимка дерева доступности
opencli browser work state

4. Вызов встроенных адаптеров

В репозитории есть больше сотни адаптеров под популярные платформы:

# Топ записей HackerNews в формате JSON
opencli hackernews top --limit 5 -f json

# Поиск постов в Twitter с выводом в таблицу
opencli twitter search "AI agents" --limit 10 -f table

5. Создание собственного адаптера и способы расширения

Если нужного внутреннего сервиса нет в списке, создание адаптера занимает несколько минут:

# Каркас адаптера в ~/.opencli/clis/
opencli browser init myportal/reports

# Проверка работы адаптера на живой странице
opencli browser verify myportal/reports

# Вызов новой команды
opencli myportal reports

Для командной и локальной разработки предусмотрено несколько сценариев расширения:

СценарийКоманда и механизм
Создание изолированного плагинаopencli plugin create с подключением локального или Git-репозитория (opencli plugin install file://...)
Локальный адаптер под закрытый сервисopencli browser init <site>/<cmd> с сохранением в каталоге ~/.opencli/clis/
Модификация официального адаптераopencli adapter eject (откат к исходной версии через opencli adapter reset)
Установка сторонних расширенийopencli plugin install github:user/repo
Регистрация внешних CLI-утилитopencli external register (объединение в общий интерфейс с gh, docker, vercel)

Справочник: форматы вывода, коды завершения и переменные окружения

Форматы вывода данных

Встроенные команды по умолчанию выводят результат в виде терминальной таблицы (table), но для интеграции в цепочки скриптов и агентные контуры поддерживают форматы json, yaml, md и csv:

# Вывод в формате JSON для программного парсинга
opencli bilibili hot -f json

# Вывод в Markdown для передачи в контекст LLM
opencli bilibili hot -f md

Коды завершения (Exit Codes)

Для надежной обработки ошибок агентом команды OpenCLI возвращают стандартизированные коды завершения:

КодСтатусЗначение для скрипта или агента
0УспехКоманда выполнена штатно, данные получены.
66Пустой результатЗапрос отработал, но целевых элементов на странице не найдено.
69Мост недоступенBrowser Bridge не отвечает (расширение выключено или закрыт Chrome).
75Превышен таймаутСервис не успел отдать данные за отведенное время ожидания.
77Нужна авторизацияСессия истекла, требуется повторный вход в браузере.
78Ошибка параметровНекорректные флаги или аргументы командной строки.
130ПрерваноВыполнение остановлено сигналом пользователя (Ctrl+C).

Переменные окружения

Поведение OpenCLI на серверах и в CI настраивается через системные переменные:

ПеременнаяНазначение
OPENCLI\_PROFILEИмя профиля Chrome по умолчанию при наличии нескольких подключений.
OPENCLI\_WINDOWРежим отображения окна браузера: foreground (активное) или background (фоновое).
OPENCLI\_SITE\_SESSIONРежим сессии адаптера: ephemeral (разовая) или persistent (сохраняемая).
OPENCLI\_BROWSER\_CONNECT\_TIMEOUTТаймаут ожидания подключения браузерного моста (по умолчанию 45 секунд).
OPENCLI\_BROWSER\_COMMAND\_TIMEOUTТаймаут выполнения отдельной команды браузера (по умолчанию 60 секунд).
OPENCLI\_CDP\_ENDPOINTАдрес подключения к удаленному порту CDP или запущенному Electron-приложению.
OPENCLI\_CDP\_TARGETФильтрация целевых вкладок CDP по подстроке в URL.
OPENCLI\_VERBOSEВключение подробного журнала отладки (аналог флага -v).
DEBUG\_SNAPSHOTВывод сырого снимка дерева доступности при значении 1.

Безопасность профиля: Автоматизацию следует запускать в изолированном профиле Chrome без сохраненных банковских карт, личной переписки и критичных прав администратора.

Ограничения

Ограничения

Привязка к Chrome: Для работы авторизованных команд нужен запущенный браузер с расширением.

На сервере без графической оболочки придется поднимать headless-режим и вручную настраивать порт CDP.

Зависимость от верстки сервисов:

Если сайт полностью переписывает фронтенд или меняет приватные API, адаптер потребует обновления (навык opencli-autofix берет часть правок на себя).

Специализация вместо универсальности: Инструмент решает задачи с повторяющейся структурой.

Для исследовательского серфинга по незнакомым сайтам лучше оставить Stagehand или Browser-Use.

Контроль прав доступа: Агент с доступом к opencli оперирует реальными сессиями пользователя.

Не стоит давать модели бесконтрольный доступ к профилю с почтой или финансами.

Антипаттерны

Антипаттерны

Сжигать токены на рутинный сбор данных:

Гонять мультимодальные модели по скриншотам каждые полчаса вместо того, чтобы один раз зафиксировать сценарий в адаптере.

Хранить сессионные куки в открытом коде:

Складывать cookies в файлы проекта вместо безопасной передачи через локальный мост расширения.

Использовать синтетические клики в сложных UI:

Вызывать .click() на нестандартных выпадающих списках вместо передачи нативных CDP-событий мыши.

Пускать агента в основной профиль браузера:

Запускать автоматизацию под личным профилем Chrome без изоляции рабочих задач.

Чеклист

Чеклист

Проверьте статус моста:

Команда opencli doctor подтверждает связь демона с расширением Chrome.

Изолируйте рабочий профиль:

Для автоматизации создан отдельный профиль Chrome (opencli profile rename ...), не связанный с личными аккаунтами.

Зафиксируйте формат вывода:

В скриптах агента явно указан флаг -f json или -f md для предсказуемой обработки данных.

Протестируйте адаптер перед запуском:

Новая команда проверена через opencli browser verify <site>/<cmd> на реальной странице.

Подключите навыки к агенту:

Пакет jackwener/opencli добавлен в рабочий кодинг-агент через npx skills add.

Ссылки

Ссылки