From 314b15ea25b3badd6d83a055f3f57ff09366c1c8 Mon Sep 17 00:00:00 2001 From: vitya Date: Fri, 11 Sep 2026 22:12:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(browser-operator):=20=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=BB-=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B1=D1=80=D0=B0=D1=83=D0=B7=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=20(=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=20=D0=BF=D0=BE=20=D1=85?= =?UTF-8?q?=D0=B0=D1=80=D0=BD=D0=B5=D1=81=D1=81=D1=83=20+=20=D0=B0=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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: строка провенанса --- README.md | 1 + README.ru.md | 1 + dist/browser-cdp.skill | Bin 1518 -> 1710 bytes dist/browser-operator.skill | Bin 0 -> 4072 bytes hermes/mapping.yaml | 4 ++ skills/browser-cdp/SKILL.md | 8 ++- skills/browser-operator/SKILL.md | 119 +++++++++++++++++++++++++++++++ 7 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 dist/browser-operator.skill create mode 100644 skills/browser-operator/SKILL.md diff --git a/README.md b/README.md index 7fe695c..e8d530f 100644 --- a/README.md +++ b/README.md @@ -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` | diff --git a/README.ru.md b/README.ru.md index 42ae7ea..8b10b84 100644 --- a/README.ru.md +++ b/README.ru.md @@ -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/`, diff --git a/dist/browser-cdp.skill b/dist/browser-cdp.skill index 9695100ef2b4ac61523db02d9a9cd80409d415dc..5cee20a2414496efce55b4724d9967ff6449d7f3 100644 GIT binary patch delta 1658 zcmV-=28H?V3$6_tP)h>@6aWAK2mo%eD_sswGCd>)003AG000z|!37t8l~=)T6IT@7 zTk=0#iAC%*GcIjc7K+pcR23D93hD+Sjbjgqk?pZ&#!0iOYzGJ^fC~Z@(L!mZstY!b z@sLRz+fu&Z%`fl+{e_-;-`I{FOTdCSd4BJ{bI(2Z+=pQp$wVbrwzIVAI-8#D8u>ys znaI`rb;r$;Q**s!V#9WSy`ode(&y$`^K3Fvu)VxntopLHoJEmsE#V zbKW|=uRq1_*d0U-j!xB5ZfnymuC4nH&UXxVs=6DGQE&J%*lUQHbymilT>dxG5Q8 zOOLmcHBz)wwcVWWxR#kr7%cc?;>@(%lL__598DhRGV_gfnywmuAKf9XRp9KL6u7AN zGZwT6WxxT631r0pBi}L*EeCu@IN1a#8XS#7LAC*^*ER+48D@|9zzRu}p+1ASd;t7K z4U>eJG!qP=h4JzoE^*v37=@nERE!bW^rL@l=W}7!~#yF}?B6Ye^xO1P+=Ytj(Pa4PK;*50= zi$#UW#2oh!+6{XD;`M)Fivz`i#(tDqmmkS8tqdc7kY?%36ZBY~VlI*rtCmI1?TVE~ z)XD-JpmznUu+rh4ANdeOGFlSZ54jxCZN`t?DS!}Xo$VZk#QeO39^T>G{)~+0!DYK0 zHPZYh(sKM$Alwze4PHEJGEI7Uhw~EG8L0%RKjOGUkwOPm+(ybNDRoQSg*79srv^(D z!|F(X8$uav6gtbPljYjE0{xPyy3Q>-?|T_D@0803F$ zF`gq}QApzU8j&>6Hmx0r>1M|EwG_2T z^vsM$VN-hx#K2tz(ITraA&}P-e_+06yo~K1s)`=*9=@b2e!wlR?+#%eg4g)?L@T)s zq)F#$ZfTjW8%D+6ykUK65T3alW#QZ{Z+Rguv>=!AK9Ev1;Y~kWW_R-Zf>ZN9^%DGl zZQB)Z-Ql{>bwn_$m9-lT`evqvgOdAxuuT`K6+n1+~?!;c~#5}}qbN$ixx(oK=xxr?- zJ2q934qtOm1(JEnTBeL&u4W23KZm@3oQjn`{R*OyDQMfDNK6{qqSTek-)cua6v2(} zf2TW81?eg8(US?pX`_axhWa#axkFYSy0VPup*j*$T1*v7cY2Jsvo!8t_Ndq;FJ8^W zG_fJqGvcU+qo;u$sSWLX^16-vMGv4u94uOz|Bg5gU_coz-b^o0^{Q;z3!wxs@_aGi`By^kr^BOHftQREH*O z#;>`RZ?=BQm1?$?)_`A0@AP9z+BG0CVZMhGJCI9RH-Q<~1Fs0^Gn~A9PropXv6P4U z)vRAA;(<~^w#Ug+5Lo^PP)h*<6aW+e000O8Zm}y}4o)&XBnAKgSPhe~1vmy)1^@s6 E07DulJOBUy delta 1465 zcmV;q1xEU=4ekpYP)h>@6aWAK2mnQZ3|-U$;eKQV0062B000z|fd&_Ul~zqp8&?$F zTk?OnQWjv!jFYx2D?(}kRjrydYNKwVNHf?27}+z{%oxh10@Hj60!r1YRn*UQHpY0u zU}Gck3*P*N{*s=1-?PDhlw<(|Z{EA_o^#JVcPz`w=X|&Bm1rppHX<*y%9Tbw=QiWj zAS_YP45NH*-3y~?;FsuswtdIGozGRgs2o-sv8>JIb42QAm8e5YwN)o;si8VmZ9G$T zjOSC8W(Sl#Q%SakUB`sCsT$x1yHr2hQ-f?*B{aYAfabsc(#l%d4wiRGb!f?rR_VX3 zU+_0}C)qYfr$)`)+z6{HtFcutH~9V{&98<*-Ln?F^@l-Fi>!Np^ABiRogtTQ_Jn`a z`J0VZH>T<`Z3a!M1pZV^zUNg4ThIFio78W}=PcXFwpGu>qimZ(uO7r6-%|0Gnky?+ ze`S`CKd=JB(FoxzdFyVCzWQ#KH~_E$WcFMQfoIpIhsbxu1EuG0)FEEB0rHqBIq%P6 z%^XS8336t3j`TWzAD1^nb;2ny1ALnK%bsRCX4jb^_e6D7D#?w*cCp;Yfs<=#=`9yz znpmB8loH!G6VT}`5rp72z=%F;G<4p#^Er#9mCxOp6jnZ`{n^1Iri=%NU2qXbdZCet)Md~%) z9PtWClrwz>arpq~$o2%utI0g^H*~&baI|n5XNOlxh9~4-qETT14&jQI^pr}q%{_qC z0Y8#~1i%_J#=W6>SR4qno`!f;9lIzLQW#_ha_nmTMW{o=Hg90WII7!m`nn{!M}EJV z51N^|+@dpoGgq1vL;^sX&)v|cW7_{_{Ofpj2xWo|@bYB)=#Njf4oFwh2|5-XXU&~q#FW3dqiYhF2yigr1u*8{((Z7wPr z2^YUz{A}UgqFt{zVoH+FDOYHl$v3{mHwn$BqODzjksb6jE)3)=&jSGeSP=fpk+8QV z`2#+4C5DK9USzLWwu#2w)#WUd$nk@U_dZ!iu^YzrTI2{=ann?6;gll^Ni3rgNkiTE zy7QQBW=u-0fenod8*^>x9#U^bJxSIAs!t%4e=hof`M%P#Y$yb__IVFq(iPpal=a;y znndz{wca17@2&$T-ED@oIeKJSzPIt%`OqNj;v8k_?picAWeP2sOL_OCR4w%2H}|;< zqqq_@;}5+A|9hSvtp;2ddV~me!(VyKNiR2RwGYp_R*j^@qhZ+-&+p=yLQx=><<2FR z;-y$`7xKAJMSZWu<++;2;!sd#2|~O9G;=e5#jXffMZpJJ1-h^U8J@Zm`^ItDtbgMA ztG?-iL*tKZ8oOij5b5wW&s8GGr=2+}#`Q+A;>Ip;1-?_bK38dE3fkT-Bqj~*(DZ}* zU$9NKG0$a!jqZP|J5VKs3GdMk4B~jvBK4;xib=!-a>~$^V`VSZsgQEORIzj?$5p$3 zMB@%-kJ6VxFGWLBm$wyVmi0y>P>+sn?R@gRWc)=NZI8#uOD^2lWo(mSa%qw9e?-nY!vwYPNO*FI$&W-CM!IHt=S zj?*4F2Y+oji$9b-{b^~$oL;hcux>7Ynye$H)iZ!F#-v$ibvoRpb`*#BM5!)sPTRI! zaJWBsc<`u9p{kaxdNyk&ZifEno8P;&rsouN!hcEc3=Hi$Au(aThk>2QrL3F8Hub=? zgg(=YZ>j5()EZ0qOn-;zNh}^HC1iWN_~bz@{{v7<0Rj{N6aWAK2mnQZ3|-U-0^xpS T1pol53zKjLI0lvl00000Jg>yb diff --git a/dist/browser-operator.skill b/dist/browser-operator.skill new file mode 100644 index 0000000000000000000000000000000000000000..7f03cf55def544e4d982bec95fbe5826e51dea48 GIT binary patch literal 4072 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 RzdPW+(fs!({p)!E;6KY Веб-автоматизация через минимальные 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. **Прочитай полную справку** (обязательно, первый шаг): diff --git a/skills/browser-operator/SKILL.md b/skills/browser-operator/SKILL.md new file mode 100644 index 0000000..ddb2a95 --- /dev/null +++ b/skills/browser-operator/SKILL.md @@ -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-сервер поверх общего демона — отдельная тема.