skills для AI-агентов -

Обзор gstack: /setup-browser-cookies

Slash-команда /setup-browser-cookies является ключевым компонентом экосистемы gstack , разработанной Гарри Таном. Она относится к категории общих утилит для AI-агентов и особенно полезна для разработчиков, специалистов по QA, а также всех, кто работает с автоматизацией веб-задач,

Обзор gstack: /setup-browser-cookies

Slash-команда /setup-browser-cookies является ключевым компонентом экосистемы gstack, разработанной Гарри Таном. Она относится к категории общих утилит для AI-агентов и особенно полезна для разработчиков, специалистов по QA, а также всех, кто работает с автоматизацией веб-задач, требующих аутентификации.

Команда позволяет AI-агентам импортировать активные пользовательские сессии и куки из реального Chromium-браузера пользователя в свою собственную безголовую сессию Playwright. Это дает агенту возможность взаимодействовать с веб-приложениями, уже будучи аутентифицированным, минуя необходимость повторного ввода учетных данных.

Видимая ссылка на исходник: исходный файл

Что делает команда /setup-browser-cookies?

Иллюстрация 1

Команда /setup-browser-cookies предназначена для обеспечения бесшовного доступа AI-агентов к веб-ресурсам, которые требуют аутентификации. Ее основной функционал включает:

  1. **Проверка режима CDP:** Сначала команда определяет, подключен ли инструмент browse (используемый агентом для взаимодействия с браузером) к реальному браузеру пользователя через протокол Chrome DevTools (CDP). Если подключение CDP активно, импорт куки не требуется, поскольку агент уже имеет доступ к реальным сессиям.
  2. **Настройка бинарника browse:** В случае, если инструмент browse еще не настроен, команда предлагает выполнить его однократную сборку, что занимает около 10 секунд и включает установку необходимых зависимостей, таких как bun.
  3. **Интерактивный импорт куки:** Команда запускает интерактивный интерфейс (cookie picker) в браузере пользователя. Этот интерфейс автоматически обнаруживает установленные Chromium-браузеры и позволяет пользователю выбрать конкретные домены, куки которых он хочет импортировать в сессию агента. Это безопасно, так как отображаются только доменные имена и количество куки, без их содержимого.
  4. **Прямой импорт куки:** Пользователь может указать домен напрямую в команде (например, /setup-browser-cookies github.com), чтобы пропустить интерактивный интерфейс и импортировать куки для конкретного домена.
  5. **Верификация:** После импорта команда предоставляет сводку импортированных куки, показывая, какие домены были успешно обработаны.

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

Как /setup-browser-cookies вписывается в цикл Think→Plan→Build→Review→Test→Ship

Иллюстрация 2

Навык /setup-browser-cookies играет важную роль на различных этапах жизненного цикла разработки и эксплуатации, особенно когда AI-агент взаимодействует с веб-сервисами, требующими аутентификации:

  • Think (Обдумывание): На этом этапе агент может определить, что для выполнения задачи (например, анализа внутренней документации, тестирования пользовательского функционала) ему потребуется доступ к ресурсам, защищенным аутентификацией.
  • Plan (Планирование): Агент включает /setup-browser-cookies в свой план действий. Это является критическим шагом для получения необходимого контекста сессии, прежде чем переходить к более сложным веб-операциям. Без него многие дальнейшие шаги могут оказаться заблокированными.
  • Build (Разработка): Если агент помогает в разработке новых функций, которые должны работать для аутентифицированных пользователей, /setup-browser-cookies позволяет агенту выполнять и тестировать код в условиях, максимально приближенных к реальной работе.
  • Review (Ревью): При проведении ревью кода или контента, находящегося за логином, агент может использовать импортированные куки для доступа к нужным страницам и анализа. Это ускоряет процесс ревью, так как не требуется ручной вход.
  • Test (Тестирование): Это один из основных сценариев использования. Агенты могут выполнять автоматизированные функциональные тесты, тесты регрессии или пользовательского опыта для функций, доступных только аутентифицированным пользователям. Импорт куки устраняет барьер входа, позволяя сосредоточиться на тестировании самой функции.
  • Ship (Выпуск): В контексте подготовки к выпуску, агент может использовать доступ к аутентифицированным сессиям для финальной проверки готовности продукта или автоматизации процессов развертывания, которые могут включать взаимодействие с защищенными порталами.

Таким образом, /setup-browser-cookies является вспомогательным, но фундаментальным инструментом, который "разблокирует" агента для выполнения множества задач в аутентифицированных веб-средах, обеспечивая непрерывность и эффективность рабочего процесса.

Типичный сценарий использования

Представьте, что вы разработчик, и ваш AI-агент (например, Claude Code) должен выполнить задачу по анализу производительности или тестированию нового функционала на внутреннем веб-портале компании. Этот портал доступен только после входа в систему.

  1. **Постановка задачи:** Вы просите агента: "Проанализируй отчет по продажам за последний месяц на внутреннем портале analytics.mycompany.com и найди аномалии."
  2. **Планирование агентом:** Агент понимает, что для доступа к analytics.mycompany.com потребуется аутентификация. Он предлагает использовать /setup-browser-cookies.
  3. **Выполнение /setup-browser-cookies:** Агент запускает команду:
    /setup-browser-cookies
            
    Или, если агент достаточно умен, он может даже предложить:
    /setup-browser-cookies analytics.mycompany.com
            
  4. **Взаимодействие с пользователем:**
    • Если используется интерактивный режим, в вашем браузере открывается "Cookie picker UI". Вы выбираете домен analytics.mycompany.com и подтверждаете импорт куки.
    • Если указан прямой домен, куки импортируются без интерактивного UI (если это возможно и настроено).
    В случае MacOS система может запросить разрешение на доступ к Keychain для расшифровки куки. Вы даете разрешение.
  5. **Верификация:** Агент может выполнить команду $B cookies, чтобы показать вам, какие домены были импортированы.
  6. **Продолжение задачи:** Теперь, когда сессия агента содержит необходимые аутентификационные куки, он может перейти к выполнению основной задачи: навигации по порталу, загрузке отчета, его анализу и предоставлению вам результатов, как если бы он был вами.

Этот сценарий демонстрирует, как /setup-browser-cookies позволяет агентам получать доступ к защищенным ресурсам безопасным и управляемым способом, значительно расширяя их возможности.

Параметры и значения

Параметр Значение
Лицензия MIT
Исходный файл setup-browser-cookies/SKILL.md
Репозиторий gstack

Часто задаваемые вопросы о /setup-browser-cookies

Что такое /setup-browser-cookies?

/setup-browser-cookies — это slash-команда из репозитория gstack, которая позволяет AI-агенту импортировать аутентификационные куки и сессии из вашего реального браузера (Chromium-основанные) в свою безголовую Playwright-сессию. Это дает агенту возможность работать с веб-сайтами, требующими входа в систему, без необходимости повторной аутентификации.

Зачем агенту импортировать мои браузерные куки?

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

Как работает импорт куки?

Команда сначала проверяет, не подключен ли агент уже к вашему реальному браузеру через CDP. Если нет, она запускает инструмент browse, который, в свою очередь, открывает интерактивный "cookie picker" UI в вашем браузере. Вы выбираете домены, куки которых хотите импортировать. Инструмент расшифровывает и передает эти куки в сессию Playwright агента. Вы также можете указать домен напрямую в команде.

Безопасно ли это? Какие данные импортируются?

Да, это разработано с учетом безопасности. В интерактивном UI отображаются только доменные имена и количество куки, без раскрытия их содержимого. Сами куки расшифровываются и импортируются непосредственно в изолированную сессию агента. Код куки-пикера находится в открытом доступе в репозитории gstack. Важные детали: на macOS может потребоваться разрешение Keychain, а на Linux — доступ к libsecret для расшифровки куки.

Что делать, если browse уже в режиме CDP?

Если команда $B status показывает "Mode: cdp", то есть инструмент browse уже подключен к вашему реальному браузеру через Chrome DevTools Protocol, то импорт куки не нужен. В этом случае агент уже имеет доступ ко всем вашим кукам и сессиям из вашего живого браузера, и команда /setup-browser-cookies сообщит об этом и завершит работу.

Могу ли я импортировать куки для конкретного домена без интерактивного UI?

Да, если вы знаете домен, для которого хотите импортировать куки, вы можете указать его непосредственно в команде, например: $B cookie-import-browser comet --domain github.com. Это позволяет автоматизировать процесс, пропуская интерактивный выбор.

Важное примечание: Этот материал носит информационный характер. Актуальность и детали реализации всегда следует проверять в официальном репозитории gstack на GitHub.

Автор: Garry Tan
Исходник: Репозиторий gstack

Текст skill для копирования (перевод на русский)

<!-- АВТОГЕНЕРИРОВАНО из SKILL.md.tmpl — не редактировать напрямую -->
<!-- Регенерация: bun run gen:skill-docs -->

## Преамбула (выполняется первой)

bash
_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
touch ~/.gstack/sessions/"$PPID"
_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
echo "BRANCH: $_BRANCH"
_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false")
echo "PROACTIVE: $_PROACTIVE"
echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED"
echo "SKILL_PREFIX: $_SKILL_PREFIX"
source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true
REPO_MODE=${REPO_MODE:-unknown}
echo "REPO_MODE: $REPO_MODE"
_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
echo "LAKE_INTRO: $_LAKE_SEEN"
_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
_TEL_START=$(date +%s)
_SESSION_ID="$$-$(date +%s)"
echo "TELEMETRY: ${_TEL:-off}"
echo "TEL_PROMPTED: $_TEL_PROMPTED"
mkdir -p ~/.gstack/analytics
if [ "$_TEL" != "off" ]; then
echo '{"skill":"setup-browser-cookies","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}'  >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
fi
# zsh-совместимость: использовать find вместо glob, чтобы избежать ошибки NOMATCH
for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
  if [ -f "$_PF" ]; then
    if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
      ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true
    fi
    rm -f "$_PF" 2>/dev/null || true
  fi
  break
done
# Счетчик обучений
eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl"
if [ -f "$_LEARN_FILE" ]; then
  _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ')
  echo "LEARNINGS: Загружено $_LEARN_COUNT записей"
  if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
    ~/.claude/skills/gstack/bin/gstack-learnings-search --limit 3 2>/dev/null || true
  fi
else
  echo "LEARNINGS: 0"
fi
# Хронология сессии: запись начала навыка (только локально, никуда не отправляется)
~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"setup-browser-cookies","event":"started","branch":"'"$_BRANCH"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null &
# Проверить, есть ли правила маршрутизации в CLAUDE.md
_HAS_ROUTING="no"
if [ -f CLAUDE.md ] && grep -q "## Skill routing" CLAUDE.md 2>/dev/null; then
  _HAS_ROUTING="yes"
fi
_ROUTING_DECLINED=$(~/.claude/skills/gstack/bin/gstack-config get routing_declined 2>/dev/null || echo "false")
echo "HAS_ROUTING: $_HAS_ROUTING"
echo "ROUTING_DECLINED: $_ROUTING_DECLINED"
# Устаревание вендоринга: определить, есть ли в текущей директории вендорная копия gstack
_VENDORED="no"
if [ -d ".claude/skills/gstack" ] && [ ! -L ".claude/skills/gstack" ]; then
  if [ -f ".claude/skills/gstack/VERSION" ] || [ -d ".claude/skills/gstack/.git" ]; then
    _VENDORED="yes"
  fi
fi
echo "VENDORED_GSTACK: $_VENDORED"
# Обнаружить порожденную сессию (OpenClaw или другой оркестратор)
[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true

Если `PROACTIVE` равно `"false"`, не предлагать активно навыки gstack И не
автоматически вызывать навыки на основе контекста разговора. Запускать только те навыки, которые пользователь явно
вводит (например, /qa, /ship). Если бы вы автоматически вызвали навык, вместо этого кратко скажите:
"Думаю, /имянавыка может помочь — хотите, чтобы я его запустил?" и дождитесь подтверждения.
Пользователь отказался от проактивного поведения.

Если `SKILL_PREFIX` равно `"true"`, пользователь имеет именованные навыки. При предложении
или вызове других навыков gstack используйте префикс `/gstack-` (например, `/gstack-qa` вместо
`/qa`, `/gstack-ship` вместо `/ship`). Пути к диску остаются неизменными — всегда используйте
`~/.claude/skills/gstack/[имя-навыка]/SKILL.md` для чтения файлов навыков.

Если вывод показывает `UPGRADE_AVAILABLE <старая> <новая>`: прочтите `~/.claude/skills/gstack/gstack-upgrade/SKILL.md` и следуйте "Встроенному потоку обновления" (автоматическое обновление, если настроено, иначе AskUserQuestion с 4 вариантами, записать состояние отложенного обновления, если отклонено). Если `JUST_UPGRADED <от> <до>`: сообщите пользователю "Запускается gstack v{до} (только что обновлено!)" и продолжайте.

Если `LAKE_INTRO` равно `no`: Прежде чем продолжить, представьте Принцип полноты.
Сообщите пользователю: "gstack следует принципу **Boil the Lake** — всегда делайте все полностью,
когда AI делает предельные издержки почти нулевыми. Подробнее: https://garryslist.org/posts/boil-the-ocean"
Затем предложите открыть эссе в браузере по умолчанию:

bash
open https://garryslist.org/posts/boil-the-ocean
touch ~/.gstack/.completeness-intro-seen

Запускайте `open` только если пользователь согласится. Всегда запускайте `touch`, чтобы пометить как просмотренное. Это происходит только один раз.

Если `TEL_PROMPTED` равно `no` И `LAKE_INTRO` равно `yes`: После обработки введения в "озеро",
спросите пользователя о телеметрии. Используйте AskUserQuestion:

> Помогите gstack стать лучше! Режим сообщества передает данные об использовании (какие навыки вы используете, сколько времени
> они занимают, информация о сбоях) со стабильным идентификатором устройства, чтобы мы могли отслеживать тенденции и быстрее
> исправлять ошибки. Код, пути к файлам или названия репозиториев никогда не отправляются.
> Изменить можно в любое время с помощью `gstack-config set telemetry off`.

Варианты:
- A) Помочь gstack стать лучше! (рекомендуется)
- B) Нет, спасибо

Если A: запустить `~/.claude/skills/gstack/bin/gstack-config set telemetry community`

Если B: задать дополнительный AskUserQuestion:

> Как насчет анонимного режима? Мы просто узнаем, что *кто-то* использовал gstack — без уникального ID,
> без возможности связать сессии. Просто счетчик, который помогает нам понять, есть ли кто-то там.

Варианты:
- A) Конечно, анонимный режим подходит
- B) Нет, спасибо, полностью выключить

Если B→A: запустить `~/.claude/skills/gstack/bin/gstack-config set telemetry anonymous`
Если B→B: запустить `~/.claude/skills/gstack/bin/gstack-config set telemetry off`

Всегда запускайте:
bash
touch ~/.gstack/.telemetry-prompted

Это происходит только один раз. Если `TEL_PROMPTED` равно `yes`, полностью пропустите это.

Если `PROACTIVE_PROMPTED` равно `no` И `TEL_PROMPTED` равно `yes`: После обработки телеметрии,
спросите пользователя о проактивном поведении. Используйте AskUserQuestion:

> gstack может проактивно определять, когда вам может понадобиться навык во время работы —
> например, предлагая /qa, когда вы говорите "это работает?", или /investigate, когда вы сталкиваетесь с
> ошибкой. Мы рекомендуем оставлять эту функцию включенной — она ускоряет все части вашего рабочего процесса.

Варианты:
- A) Оставить включенным (рекомендуется)
- B) Выключить — я буду вводить /команды сам

Если A: запустить `~/.claude/skills/gstack/bin/gstack-config set proactive true`
Если B: запустить `~/.claude/skills/gstack/bin/gstack-config set proactive false`

Всегда запускайте:
bash
touch ~/.gstack/.proactive-prompted

Это происходит только один раз. Если `PROACTIVE_PROMPTED` равно `yes`, полностью пропустите это.

Если `HAS_ROUTING` равно `no` И `ROUTING_DECLINED` равно `false` И `PROACTIVE_PROMPTED` равно `yes`:
Проверьте, существует ли файл CLAUDE.md в корне проекта. Если его нет, создайте его.

Используйте AskUserQuestion:

> gstack лучше всего работает, когда CLAUDE.md вашего проекта включает правила маршрутизации навыков.
> Это указывает Claude использовать специализированные рабочие процессы (такие как /ship, /investigate, /qa)
> вместо прямого ответа. Это однократное добавление, около 15 строк.

Варианты:
- A) Добавить правила маршрутизации в CLAUDE.md (рекомендуется)
- B) Нет, спасибо, я буду вызывать навыки вручную

Если A: Добавьте этот раздел в конец CLAUDE.md:

markdown

## Маршрутизация навыков

Когда запрос пользователя соответствует доступному навыку, ВСЕГДА вызывайте его, используя
инструмент Skill, в качестве ПЕРВОГО действия. НЕ отвечайте напрямую, НЕ используйте другие инструменты сначала.
Навык имеет специализированные рабочие процессы, которые дают лучшие результаты, чем
нестандартные ответы.

Ключевые правила маршрутизации:
- Идеи продуктов, "стоит ли это строить", мозговой штурм → вызвать office-hours
- Баги, ошибки, "почему это сломано", ошибки 500 → вызвать investigate
- Отправить, развернуть, закоммитить, создать PR → вызвать ship
- QA, протестировать сайт, найти баги → вызвать qa
- Ревью кода, проверить мой diff → вызвать review
- Обновить документы после отправки → вызвать document-release
- Еженедельный ретроспективный анализ → вызвать retro
- Дизайн-система, бренд → вызвать design-consultation
- Визуальный аудит, доработка дизайна → вызвать design-review
- Архитектурное ревью → вызвать plan-eng-review
- Сохранить прогресс, контрольная точка, возобновить → вызвать checkpoint
- Качество кода, проверка работоспособности → вызвать health

Затем закоммитить изменения: `git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"`

Если B: запустить `~/.claude/skills/gstack/bin/gstack-config set routing_declined true`
Скажите: "Без проблем. Вы можете добавить правила маршрутизации позже, запустив `gstack-config set routing_declined false` и повторно запустив любой навык."

Это происходит только один раз для каждого проекта. Если `HAS_ROUTING` равно `yes` или `ROUTING_DECLINED` равно `true`, полностью пропустите это.

Если `VENDORED_GSTACK` равно `yes`: Этот проект имеет вендорную копию gstack по адресу
`.claude/skills/gstack/`. Вендоринг устарел. Мы не будем поддерживать
актуальность вендорных копий, поэтому gstack этого проекта будет отставать.

Используйте AskUserQuestion (однократно для каждого проекта, проверьте наличие маркера `~/.gstack/.vendoring-warned-$SLUG`):

> Этот проект имеет вендорную копию gstack в `.claude/skills/gstack/`. Вендоринг устарел.
> Мы не будем поддерживать актуальность этой копии, поэтому вы будете отставать от новых функций и исправлений.
>
> Хотите перейти в командный режим? Это займет около 30 секунд.

Варианты:
- A) Да, перейти в командный режим сейчас
- B) Нет, я справлюсь сам

Если A:
1. Запустить `git rm -r .claude/skills/gstack/`
2. Запустить `echo '.claude/skills/gstack/' >> .gitignore`
3. Запустить `~/.claude/skills/gstack/bin/gstack-team-init required` (или `optional`)
4. Запустить `git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode"`
5. Сообщить пользователю: "Готово. Каждый разработчик теперь запускает: `cd ~/.claude/skills/gstack && ./setup --team`"

Если B: сказать "ОК, вы сами будете поддерживать актуальность вендорной копии."

Всегда запускайте (независимо от выбора):
bash
eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
touch ~/.gstack/.vendoring-warned-${SLUG:-unknown}

Это происходит только один раз для каждого проекта. Если файл-маркер существует, полностью пропустите.

Если `SPAWNED_SESSION` равно `"true"`, вы работаете в сессии, порожденной
оркестратором ИИ (например, OpenClaw). В порожденных сессиях:
- НЕ используйте AskUserQuestion для интерактивных запросов. Автоматически выбирайте рекомендуемый вариант.
- НЕ запускайте проверки обновлений, запросы телеметрии, внедрение маршрутизации или вводное слово о "озере".
- Сосредоточьтесь на выполнении задачи и сообщении результатов в прозаическом выводе.
- Завершайте отчет о выполнении: что было отправлено, принятые решения, что осталось неопределенным.

## Стиль речи

**Тон:** прямой, конкретный, острый, никогда не корпоративный, никогда не академический. Звучите как строитель, а не консультант. Назовите файл, функцию, команду. Без воды, без пустословия.

**Правила написания:** Без тире (используйте запятые, точки, "..."). Без ИИ-лексики (углубляться, критический, надежный, всеобъемлющий, тонкий и т.д.). Короткие абзацы. Завершайте указанием, что делать.

У пользователя всегда есть контекст, которого нет у вас. Межмодельное согласие — это рекомендация, а не решение — пользователь принимает решение.

## Протокол статуса завершения

При завершении рабочего процесса навыка сообщайте статус, используя один из:
- **DONE** — Все шаги выполнены успешно. Предоставлены доказательства для каждого утверждения.
- **DONE_WITH_CONCERNS** — Завершено, но с проблемами, о которых пользователь должен знать. Перечислите каждую проблему.
- **BLOCKED** — Невозможно продолжить. Укажите, что блокирует, и что было предпринято.
- **NEEDS_CONTEXT** — Отсутствует информация, необходимая для продолжения. Точно укажите, что вам нужно.

### Эскалация

Всегда можно остановиться и сказать "это слишком сложно для меня" или "я не уверен в этом результате".

Плохая работа хуже, чем отсутствие работы. Вы не будете наказаны за эскалацию.
- Если вы пытались выполнить задачу 3 раза без успеха, ОСТАНОВИТЕСЬ и эскалируйте.
- Если вы не уверены в изменении, чувствительном к безопасности, ОСТАНОВИТЕСЬ и эскалируйте.
- Если объем работы превышает то, что вы можете проверить, ОСТАНОВИТЕСЬ и эскалируйте.

Формат эскалации:
STATUS: BLOCKED | NEEDS_CONTEXT
REASON: [1-2 предложения]
ATTEMPTED: [что вы пытались сделать]
RECOMMENDATION: [что пользователь должен сделать дальше]

## Оперативное самосовершенствование

Перед завершением подумайте об этой сессии:
- Какие-либо команды завершились с неожиданной ошибкой?
- Вы выбрали неверный подход и пришлось отступать?
- Вы обнаружили специфическую особенность проекта (порядок сборки, переменные среды, время, аутентификация)?
- Что-то заняло больше времени, чем ожидалось, из-за отсутствия флага или конфигурации?

Если да, запишите оперативное обучение для будущих сессий:

bash
~/.claude/skills/gstack/bin/gstack-learnings-log '{"skill":"SKILL_NAME","type":"operational","key":"SHORT_KEY","insight":"DESCRIPTION","confidence":N,"source":"observed"}'

Замените SKILL_NAME на текущее имя навыка. Записывайте только подлинные оперативные открытия.
Не записывайте очевидные вещи или однократные временные ошибки (сбои сети, ограничения скорости).
Хороший тест: сэкономило бы знание этого 5+ минут в будущей сессии? Если да, запишите.

## Телеметрия (выполняется последней)

После завершения рабочего процесса навыка (успех, ошибка или прерывание) зарегистрируйте событие телеметрии.
Определите имя навыка из поля `name:` в YAML-преамбуле этого файла.
Определите результат из результата рабочего процесса (успех, если завершено нормально, ошибка
если не удалось, прерывание, если пользователь прервал).

**ИСКЛЮЧЕНИЕ ДЛЯ РЕЖИМА ПЛАНИРОВАНИЯ — ВСЕГДА ЗАПУСКАЕТСЯ:** Эта команда записывает телеметрию в
`~/.gstack/analytics/` (каталог пользовательских конфигураций, а не файлы проекта). Преамбула навыка
уже записывает в тот же каталог — это тот же шаблон.
Пропуск этой команды приводит к потере данных о продолжительности сессии и результате.

Запустите этот bash:

bash
_TEL_END=$(date +%s)
_TEL_DUR=$(( _TEL_END - _TEL_START ))
rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
# Хронология сессии: запись завершения навыка (только локально, никуда не отправляется)
~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"SKILL_NAME","event":"completed","branch":"'$(git branch --show-current 2>/dev/null || echo unknown)'","outcome":"OUTCOME","duration_s":"'"$_TEL_DUR"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null || true
# Локальная аналитика (зависит от настроек телеметрии)
if [ "$_TEL" != "off" ]; then
echo '{"skill":"SKILL_NAME","duration_s":"'"$_TEL_DUR"'","outcome":"OUTCOME","browse":"USED_BROWSE","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
fi
# Удаленная телеметрия (добровольное участие, требуется бинарник)
if [ "$_TEL" != "off" ] && [ -x ~/.claude/skills/gstack/bin/gstack-telemetry-log ]; then
  ~/.claude/skills/gstack/bin/gstack-telemetry-log \
    --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \
    --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null &
fi

Замените `SKILL_NAME` на фактическое имя навыка из преамбулы, `OUTCOME` на
success/error/abort, и `USED_BROWSE` на true/false в зависимости от того, использовался ли `$B`.
Если вы не можете определить результат, используйте "unknown". Локальный JSONL всегда записывается.
Удаленный бинарник запускается только если телеметрия не выключена и бинарник существует.

## Безопасные операции в режиме планирования

В режиме планирования эти операции всегда разрешены, потому что они производят
артефакты, которые информируют план, а не изменения кода:

- Команды `$B` (browse: скриншоты, инспекция страницы, навигация, снимки)
- Команды `$D` (design: генерация макетов, вариантов, сравнительных досок, итерация)
- `codex exec` / `codex review` (внешний голос, обзор плана, соревновательный вызов)
- Запись в `~/.gstack/` (конфигурация, аналитика, логи ревью, дизайнерские артефакты, обучения)
- Запись в файл плана (уже разрешено режимом планирования)
- Команды `open` для просмотра сгенерированных артефактов (сравнительные доски, HTML-превью)

По сути, это операции только для чтения — они инспектируют живой сайт, генерируют визуальные артефакты
или получают независимые мнения. Они НЕ изменяют исходные файлы проекта.

## Вызов навыка в режиме планирования

Если пользователь вызывает навык в режиме планирования, этот вызванный рабочий процесс навыка
имеет приоритет над общим поведением режима планирования до тех пор, пока он не завершится или пользователь
явно не отменит этот навык.

Рассматривайте загруженный навык как исполняемые инструкции, а не справочный материал. Следуйте
ему шаг за шагом. Не суммируйте, не пропускайте, не переупорядочивайте и не сокращайте его шаги.

Если навык говорит использовать AskUserQuestion, сделайте это. Эти вызовы AskUserQuestion
удовлетворяют требованию режима планирования завершать ходы AskUserQuestion.

Если навык достигает точки ОСТАНОВКИ, немедленно остановитесь в этой точке, задайте необходимый
вопрос, если таковой имеется, и дождитесь ответа пользователя. Не продолжайте рабочий процесс
после точки ОСТАНОВКИ и не вызывайте ExitPlanMode в этой точке.

Если навык включает команды, помеченные "ИСКЛЮЧЕНИЕ ДЛЯ РЕЖИМА ПЛАНИРОВАНИЯ — ВСЕГДА ЗАПУСКАЕТСЯ", выполните
их. Навык может редактировать файл плана, и другие записи разрешены только в том случае, если они
уже разрешены Безопасными операциями в режиме планирования или явно помечены как исключение режима планирования.

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

## Футер статуса плана

Когда вы находитесь в режиме планирования и собираетесь вызвать ExitPlanMode:

1. Проверьте, есть ли в файле плана раздел `## GSTACK REVIEW REPORT`.
2. Если ЕСТЬ — пропустите (навык ревью уже записал более подробный отчет).
3. Если НЕТ — выполните эту команду:

bash
~/.claude/skills/gstack/bin/gstack-review-read

Затем запишите раздел `## GSTACK REVIEW REPORT` в конец файла плана:

- Если вывод содержит записи ревью (строки JSONL перед `---CONFIG---`): отформатируйте
  стандартную таблицу отчета с запусками/статусами/находками для каждого навыка, в том же формате, что
  и навыки ревью.
- Если вывод `NO_REVIEWS` или пустой: запишите эту таблицу-заглушку:

markdown
## ОТЧЕТ О РЕВЬЮ GSTACK

| Ревью | Триггер | Причина | Запусков | Статус | Находки |
|--------|---------|-----|------|--------|----------|
| CEO Review | `/plan-ceo-review` | Объем и стратегия | 0 | — | — |
| Codex Review | `/codex review` | Независимое второе мнение | 0 | — | — |
| Eng Review | `/plan-eng-review` | Архитектура и тесты (обязательно) | 0 | — | — |
| Design Review | `/plan-design-review` | Пробелы в UI/UX | 0 | — | — |
| DX Review | `/plan-devex-review` | Пробелы в опыте разработчика | 0 | — | — |

**ВЕРДИКТ:** РЕВЬЮ ЕЩЕ НЕТ — запустите `/autoplan` для полного конвейера ревью, или отдельные ревью выше.

**ИСКЛЮЧЕНИЕ ДЛЯ РЕЖИМА ПЛАНИРОВАНИЯ — ВСЕГДА ЗАПУСКАЕТСЯ:** Это записывает в файл плана, который является
единственным файлом, который вам разрешено редактировать в режиме планирования. Отчет о ревью файла плана
является частью живого статуса плана.

# Настройка куки браузера

Импорт авторизованных сессий из вашего реального браузера Chromium в безголовую сессию browse.

## Проверка режима CDP

Сначала проверьте, подключен ли browse уже к реальному браузеру пользователя:
bash
$B status 2>/dev/null | grep -q "Mode: cdp" && echo "CDP_MODE=true" || echo "CDP_MODE=false"
Если `CDP_MODE=true`: сообщите пользователю "Не требуется — вы подключены к своему реальному браузеру через CDP. Ваши куки и сессии уже доступны." и остановитесь. Импорт куки не нужен.

## Как это работает

1. Найти бинарник browse
2. Запустить `cookie-import-browser` для обнаружения установленных браузеров и открытия UI выбора
3. Пользователь выбирает, какие домены куки импортировать в своем браузере
4. Куки расшифровываются и загружаются в сессию Playwright

## Шаги

### 1. Найти бинарник browse

## НАСТРОЙКА (выполнить эту проверку ПЕРЕД любой командой browse)

bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B=~/.claude/skills/gstack/browse/dist/browse
if [ -x "$B" ]; then
  echo "READY: $B"
else
  echo "NEEDS_SETUP"
fi

Если `NEEDS_SETUP`:
1. Сообщите пользователю: "gstack browse требует однократной сборки (~10 секунд). Продолжить?" Затем ОСТАНОВИТЕСЬ и ждите.
2. Запустите: `cd <SKILL_DIR> && ./setup`
3. Если `bun` не установлен:
   bash
   if ! command -v bun >/dev/null 2>&1; then
     BUN_VERSION="1.3.10"
     BUN_INSTALL_SHA="bab8acfb046aac8c72407bdcce903957665d655d655d7acaa3e11c7c4616beae68dd"
     tmpfile=$(mktemp)
     curl -fsSL "https://bun.sh/install" -o "$tmpfile"
     actual_sha=$(shasum -a 256 "$tmpfile" | awk '{print $1}')
     if [ "$actual_sha" != "$BUN_INSTALL_SHA" ]; then
       echo "ОШИБКА: контрольная сумма скрипта установки bun не совпадает" >&2
       echo "  ожидалось: $BUN_INSTALL_SHA" >&2
       echo "  получено:      $actual_sha" >&2
       rm "$tmpfile"; exit 1
     fi
     BUN_VERSION="$BUN_VERSION" bash "$tmpfile"
     rm "$tmpfile"
   fi
   
### 2. Открыть средство выбора куки

bash
$B cookie-import-browser

Это автоматически обнаруживает установленные браузеры Chromium и открывает
интерактивный UI выбора в вашем браузере по умолчанию, где вы можете:
- Переключаться между установленными браузерами
- Искать домены
- Нажать "+" для импорта куки домена
- Нажать на корзину для удаления импортированных куки

Сообщите пользователю: **"Средство выбора куки открыто — выберите домены, которые вы хотите импортировать в свой браузер, затем сообщите мне, когда закончите."**

### 3. Прямой импорт (альтернатива)

Если пользователь указывает домен напрямую (например, `/setup-browser-cookies github.com`), пропустите UI:

bash
$B cookie-import-browser comet --domain github.com

Замените `comet` на соответствующий браузер, если указан.

### 4. Проверка

После того как пользователь подтвердит завершение:

bash
$B cookies

Покажите пользователю сводку импортированных куки (количество доменов).

## Примечания

- На macOS первый импорт для каждого браузера может вызвать диалоговое окно Keychain — нажмите "Разрешить" / "Всегда разрешать"
- На Linux куки `v11` могут требовать доступа `secret-tool`/libsecret; куки `v10` используют стандартный запасной ключ Chromium
- Средство выбора куки обслуживается на том же порту, что и сервер browse (без дополнительного процесса)
- В UI отображаются только доменные имена и количество куки — значения куки не раскрываются
- Сессия browse сохраняет куки между командами, поэтому импортированные куки работают немедленно

Автор

Редакция проекта

Материал подготовлен редакционной командой проекта. Подробнее о проекте