feat(browser-operator): скил-водитель для браузера оператора (канал по харнессу + аренда)
- skills/browser-operator/SKILL.md: канал по харнессу (Hermes browser_exec / pi тул browser / CC chrome-devtools), аренда «один водитель за раз», границы человек/агент, рецепты тяжёлых страниц (fetch внутри вкладки, паузы в Python, AX-дерево для кликов), таблица антипаттернов - основание — RED-прогон без скила (2026-09-11): агент ушёл в curl + browser_cookie3 + ввод пароля мимо канала и аренды и не знал адрес кабинета ЧипДипа (/order/list, а не /cabinet) - browser-cdp 0.1.1: разведены зоны (личные кабинеты оператора -> browser-operator) - hermes/mapping.yaml: browser-operator (auto/software-development) — сейчас конвертер красный из-за 14 ранее незамапленных скилов, это отдельная находка - README + README.ru: строка провенанса
This commit is contained in:
@@ -122,6 +122,7 @@ an explicit `adapted-from` marker in its frontmatter.
|
||||
| `code-review` | `adapted-from: mattpocock/skills @ 84fdeffd` (MIT) — two-axis + Fowler baseline; output: caveman-review format |
|
||||
| `writing-skills` | `adapted-from: obra/superpowers @ 6.2.0` (MIT) — TDD-for-skills core + ideya 8 self-skill-authoring |
|
||||
| `web-search` | `author: ours` — search_web tool (pi-extension) + policy: when to search, «без поиска» session-off |
|
||||
| `browser-operator` | `author: ours` — браузер ОПЕРАТОРА (его Chrome/логины): канал по харнессу (Hermes `browser_exec` / pi тул `browser` / CC `chrome-devtools`), аренда «один водитель за раз», границы «человек vs агент», рецепты тяжёлых страниц. Закрывает провал базового прогона 2026-09-11 («куки из Chrome + curl + ввод пароля» мимо канала); анонимные прогоны — `browser-cdp` |
|
||||
| `review-subagent` | `author: ours` — review_subagent tool (pi-extension): clean-context review by your own model, optional `model` override |
|
||||
| `report-mappa-issue` | `author: ours` — TEMPORARY stopgap: mappa deviation reporting (mail to `mappa` + `.workshop`) while the service is unstable; retire when stabilized |
|
||||
| all other `skills/*` | `author: ours` |
|
||||
|
||||
@@ -91,6 +91,7 @@ bash scripts/build.sh caveman # один
|
||||
| `code-search` | `author: ours` — rg-first код-поиск (замер: 15 мин → 0 сек; роутинг: rg / git grep / interns repo_read / grep_audit) |
|
||||
| `code-review` | `adapted-from: mattpocock/skills @ 84fdeffd` (MIT) — двухосевость + Fowler-база; формат вывода: caveman-review |
|
||||
| `writing-skills` | `adapted-from: obra/superpowers @ 6.2.0` (MIT) — TDD-for-skills ядро + идея 8 self-skill-authoring |
|
||||
| `browser-operator` | `author: ours` — браузер ОПЕРАТОРА (его Chrome/логины): канал по харнессу (Hermes `browser_exec` / pi тул `browser` / CC `chrome-devtools`), аренда «один водитель за раз», границы «человек vs агент»; анонимные прогоны — `browser-cdp` |
|
||||
| остальные `skills/*` | `author: ours` |
|
||||
|
||||
Политика адаптации: клон переписывается под наши конвенции (доски `.tasks/`,
|
||||
|
||||
BIN
dist/browser-cdp.skill
vendored
BIN
dist/browser-cdp.skill
vendored
Binary file not shown.
BIN
dist/browser-operator.skill
vendored
Normal file
BIN
dist/browser-operator.skill
vendored
Normal file
Binary file not shown.
@@ -55,6 +55,10 @@ skills:
|
||||
mode: auto
|
||||
category: software-development
|
||||
|
||||
browser-operator:
|
||||
mode: auto
|
||||
category: software-development
|
||||
|
||||
using-markitdown:
|
||||
mode: auto
|
||||
category: productivity
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
---
|
||||
name: browser-cdp
|
||||
author: ours
|
||||
version: 0.1.0
|
||||
version: 0.1.1
|
||||
description: >
|
||||
Веб-автоматизация через минимальные CDP CLI-тулы в bash — вместо playwright-mcp
|
||||
/ Chrome-DevTools-MCP (подход «what if you don't need MCP»). Запуск Chrome с remote
|
||||
debugging, навигация, eval JS, скриншоты. Trigger: «браузер», «скрейпинг», «открой
|
||||
страницу», «перейди на», «сделай скриншот», «playwright», «веб-автоматизация»,
|
||||
«web scraping», «browser».
|
||||
«web scraping», «browser». Для ЛИЧНЫХ КАБИНЕТОВ оператора (его логины, антибот) —
|
||||
НЕ этот скил, а `browser-operator`.
|
||||
---
|
||||
|
||||
# browser-cdp
|
||||
@@ -20,6 +21,9 @@ description: >
|
||||
снять скриншот, собрать данные (скрейпинг). Использовать **вместо** playwright-mcp или
|
||||
Chrome-DevTools-MCP.
|
||||
|
||||
- ⚠️ **Для личных кабинетов оператора этот путь НЕ годится:** здесь свой Chrome и свой
|
||||
профиль (без его логинов). Нужен браузер оператора — скил `browser-operator`.
|
||||
|
||||
## Процесс
|
||||
|
||||
1. **Прочитай полную справку** (обязательно, первый шаг):
|
||||
|
||||
119
skills/browser-operator/SKILL.md
Normal file
119
skills/browser-operator/SKILL.md
Normal file
@@ -0,0 +1,119 @@
|
||||
---
|
||||
name: browser-operator
|
||||
author: ours
|
||||
version: 0.1.0
|
||||
description: >
|
||||
Работа в браузере ОПЕРАТОРА — его Chrome, его профиль, его живые логины: личные
|
||||
кабинеты поставщиков (ЧипДип, ДКО, Промэлектроника, ТМ), Avito, порталы под
|
||||
антиботом. Trigger: «зайди в личный кабинет», «открой ЛК», «собери заказы»,
|
||||
«посмотри в браузере», «нужна его сессия», «ЧипДип/Ozon/Avito», «browser».
|
||||
НЕ для публичных страниц (там сначала обычный fetch/curl) и НЕ для анонимных
|
||||
прогонов (там скил browser-cdp).
|
||||
---
|
||||
|
||||
# Browser operator — браузер оператора
|
||||
|
||||
**Браузер оператора — разделяемый ресурс с его живыми сессиями.** Работай через
|
||||
готовый канал своего харнесса и **только под арендой «один водитель за раз»**.
|
||||
Не вытаскивай его куки, не логинься сам, не поднимай свой Chrome.
|
||||
|
||||
## Когда браузер действительно нужен
|
||||
|
||||
Сначала спроси себя, нужен ли браузер вообще:
|
||||
|
||||
- **Нет** — публичная страница, API, доки: обычный fetch/curl/поиск. Браузер тут лишний.
|
||||
- **Да** — страница требует взаимодействия (клик/форма/навигация), JS-рендер,
|
||||
**его логин** (личный кабинет, Avito), либо портал режет не-браузерный трафик.
|
||||
|
||||
## Канал по харнессу (не изобретай свой)
|
||||
|
||||
| Харнесс | Чем работать | Аренда |
|
||||
|---|---|---|
|
||||
| **Hermes** | тул `browser_exec` (демон `browser-use`, тот же профиль оператора) | автоматически: shell-хук `pre_tool_call` берёт аренду и блокирует вызов при чужой |
|
||||
| **pi** | тул `browser`: `open` / `read` / `js` / `click` / `screenshot` / `lease` | автоматически внутри тула; `lease` покажет, кто держит |
|
||||
| **Claude Code** | MCP `chrome-devtools` (`list_pages`, `navigate_page`, `take_snapshot`, `evaluate_script`, `click`, `fill`, `take_screenshot`) | автоматически: обёртка берёт аренду перед стартом сервера |
|
||||
|
||||
**Никогда:** `curl` с куками из его профиля, `browser_cookie3`-выгрузка куки,
|
||||
свой `chrome --remote-debugging-port` с пустым профилем (там нет его логинов),
|
||||
`pip install`-стек ради одного кабинета.
|
||||
|
||||
## Аренда: «один водитель в браузере за раз»
|
||||
|
||||
Браузер один. Если его держит другой харнесс — **не ломиться**, сказать «занято,
|
||||
держит X» и вернуться позже (или попросить оператора освободить).
|
||||
|
||||
Идёшь в браузер **в обход** тула (например, скриптом или `browser-use` из терминала) —
|
||||
бери аренду сам:
|
||||
|
||||
```bash
|
||||
BL="$HOME/.config/browser-harness/bin/browser-lease.sh"
|
||||
bash "$BL" acquire --holder "pi:$$" --ttl 900 --pid $$ --tool browser # 0 = взял, 3 = занято, 2 = ошибка
|
||||
# … работа …
|
||||
bash "$BL" release --holder "pi:$$"
|
||||
```
|
||||
|
||||
Контракт аренды (формат файла, TTL, кого связывать): вики mappa
|
||||
`concepts/browser-lease-contract`.
|
||||
|
||||
## Как работать в страницах (рецепты)
|
||||
|
||||
- **Первым делом — своя вкладка.** `ensure_real_tab()` / `new_tab(url)`; не полагайся
|
||||
на активную вкладку оператора: тяжёлая или аудио-страница подвешивает демон
|
||||
(все вызовы падают в таймаут, хотя `browser-use --doctor` говорит «alive»).
|
||||
- **Тяжёлые страницы — читать изнутри, а не обходом.** Если у сайта есть внутренний
|
||||
JSON-эндпоинт, зови его `fetch(path, {credentials:'include'})` из уже открытой
|
||||
страницы: это быстрее и надёжнее десятков навигаций.
|
||||
- **По одной штуке за раз, с паузами.** Паузы — в Python/процессе, **не** в JS `await`
|
||||
(иначе `Runtime.evaluate timed out`). Ориентир оператора: 1 запрос, пауза 7–13 с,
|
||||
перекур каждые ~40, стоп после 3 ошибок подряд.
|
||||
- **Клики:** сначала дерево доступности (`Accessibility.getFullAXTree`) или
|
||||
`querySelector` → центр элемента (`getBoundingClientRect`) → `click_at_xy` → **проверь
|
||||
результат** отдельным `js(...)`/`page_info()`. Не кликай «на глаз» по скриншоту.
|
||||
- **Прогресс — сразу на диск** (jsonl/atomic), а не в конце прогона: длинные обходы
|
||||
обрываются.
|
||||
- **Долгие обходы** — в фоновый процесс, а не в цикл интерактивных вызовов.
|
||||
|
||||
## Границы: где человек, а где агент
|
||||
|
||||
- **Пароли и второй фактор — никогда.** Не вводим и не просим в аргументах командной
|
||||
строки. Уже залогиненная сессия оператора — вот твой доступ.
|
||||
- **Попап «Разрешить удалённую отладку?»** — это человеческое подтверждение: агент его
|
||||
не жмёт, а просит оператора нажать «Разрешить» и повторяет попытку.
|
||||
- **Деньги/платежи/отправка форм с персональными данными** — только с явным
|
||||
подтверждением оператора.
|
||||
- **Секреты и содержимое залогиненных страниц** не пишем в логи, файлы репозитория и
|
||||
вики: в mappa — только агрегаты и идентификаторы.
|
||||
|
||||
## Проверенные адреса и факты
|
||||
|
||||
- **ЧипДип, кабинет заказов:** `https://www.chipdip.ru/order/list`
|
||||
(⚠️ `/cabinet` и `/orders` отдают 404 — не перебирай наугад, ссылка есть в шапке).
|
||||
- Залогиненность видна в шапке кабинета (имя оператора); если видишь форму логина —
|
||||
**сессия потеряна: стоп и скажи оператору**, не логинься сам.
|
||||
- `about:blank`-вкладка с титулом-лошадкой в `document.title` = страницу ведёт агент.
|
||||
|
||||
## Так делать НЕ надо
|
||||
|
||||
| Соблазн | Почему нет |
|
||||
|---|---|
|
||||
| «Вытащу куки из Chrome и пойду `curl`'ом» | мимо канала и мимо аренды; пароль/2FA оказываются рядом; ломается при смене защиты |
|
||||
| «Подниму свой Chrome с отладкой» | там **нет** его логинов → выкинет на логин/капчу, плюс это второй водитель |
|
||||
| «Введу логин/пароль через `read -s`» | пароли и 2FA не вводим никогда |
|
||||
| «Проверю ещё пяток URL кабинета» | адрес подтверждай по ссылке в интерфейсе, а не перебором |
|
||||
| «Налью 20 запросов параллельно, быстрее» | антибот + оператор останавливает такие прогоны; один водитель, одна очередь |
|
||||
|
||||
Основание: базовый прогон без скила (2026-09-11) ушёл именно в «куки + curl + пароль»
|
||||
мимо канала; скил закрывает этот путь.
|
||||
|
||||
## Красные флаги (стоп и перечитай)
|
||||
|
||||
- Собираешься вытащить куки / поднять свой браузер / ввести пароль или код.
|
||||
- Работаешь с браузером **без** аренды (или ломишься, когда «занято»).
|
||||
- Полливаешь запросами без паузы или ждёшь паузу в JS.
|
||||
- Пишешь содержимое залогиненных страниц/секреты в файл, лог или вики.
|
||||
|
||||
## Вне скоупа
|
||||
|
||||
- Анонимные/антидетект-прогоны, свой профиль, `mode: fresh` — скил `browser-cdp`.
|
||||
- Облачные браузеры (Browser Use Cloud и прочие) — не берём.
|
||||
- Свой stdio-MCP-сервер поверх общего демона — отдельная тема.
|
||||
Reference in New Issue
Block a user