cdp
CDP — навык для управления Chrome через DevTools Protocol из JavaScript. Его основа — CLI browser-harness-js и типизированный SDK, сгенерированный по browser_protocol.json и js_protocol.json. При первом запуске CLI поднимает небольшой HTTP-сервер на Bun, который удерживает CDP Session, а последующие сниппеты выполняются через то же соединение. Поэтому между вызовами сохраняются сессия, выбранная вкладка и значения, явно помещённые в globalThis. Такой режим подходит для последовательной инспекции браузера, автоматизации одной или нескольких вкладок и сценариев, где состояние нельзя терять после каждого короткого JavaScript-вызова. Перед первым вызовом исходный skill нужно установить через npx skills add. Сам пакет не обязан автоматически появиться в PATH: инструкция предлагает проверить browser-harness-js командой command -v и при необходимости создать символическую ссылку на CLI в каталоге PATH. На macOS Apple Silicon это может быть /opt/homebrew/bin, на Intel и большинстве Linux — /usr/local/bin, а на Linux без sudo — ~/.local/bin. Если Bun отсутствует, CLI умеет установить его при первом запуске; этот шаг можно отключить переменной BROWSER_HARNESS_SKIP_BUN_INSTALL=1. Эти действия относятся к одноразовой настройке, а не к каждому запросу к браузеру. Обычный вызов передаёт JavaScript в кавычках: сначала можно выполнить await session.connect(), затем перейти на страницу через session.Page.navigate и получить значение Runtime.evaluate. CLI печатает сырой результат без дополнительной оболочки: строка выводится как текст, объект или массив — как компактный JSON, а пустые значения не дают вывода. Ошибки уходят в stderr и завершают процесс с кодом 1, поэтому вызывающий скрипт должен проверять код возврата. Для многострочного ввода через stdin нужно явно написать return: последний оператор сам по себе не становится результатом. В сниппетах уже доступны session с доменами CDP, listPageTargets, detectBrowsers, resolveWsUrl и пространства имён CDP для имён типов. Методы вызываются одним объектом параметров; можно включить DOM, получить документ, найти nodeId, подписаться на события через onEvent или дождаться одного события через waitFor. session.connect() без параметров сначала ищет запущенные Chromium-браузеры по DevToolsActivePort и выбирает принимающее WebSocket-соединение. Если найден не тот профиль, допустимы явные profileDir или wsUrl. Для выбора вкладки сначала используется listPageTargets(), затем session.use(targetId); порядок CDP-целей может отличаться от порядка вкладок в видимой полосе браузера. Состояние удобно переносить между вызовами через globalThis: например, сохранить targetId, выбрать его следующим вызовом, а затем отсоединиться с помощью setActiveSession(undefined). Для уже запущенного Chrome есть сценарий chrome://inspect/#remote-debugging: нужно включить Discover network targets и подтвердить диалог Allow. При нескольких браузерах сначала полезно вызвать detectBrowsers(), а для окна подтверждения увеличить timeoutMs до 30000. Если протокол изменился, SDK обновляют заменой upstream JSON-файлов и повторным запуском bun gen.ts; после этого browser-harness-js перезапускают, чтобы сервер загрузил новые привязки. Навык поставляет не готовые бизнес-хелперы, а прямой типизированный доступ к CDP, поэтому конкретный сценарий, селекторы и проверки результата остаются частью вызывающего сниппета.
Для чего подходит
- Автоматизация Chrome через CDP
- Инспекция вкладок и браузерного состояния
- Повторное использование долгоживущей browser-сессии
Установка
Сначала прочитайте SKILL.md и scripts в исходном репозитории. Затем выполните команду в каталоге проекта:
npx skills add https://github.com/browser-use/browser-harness-js/tree/main/