Поэтому для параллельной разработки браузерной автоматизации нужны два независимых уровня:
- отдельный worktree для кода каждого агента;
- отдельная сессия 2Captcha Browser API для каждого браузерного сценария.
Worktree не дает агентам затереть файлы друг друга. Browser API не дает их сценариям столкнуться внутри одного браузера.
Что такое worktree в Claude Code
Обычно Git-репозиторий открыт в одной рабочей папке. В ней лежат файлы текущей ветки, незакоммиченные изменения, зависимости и локальные настройки.
Git worktree позволяет создать рядом несколько рабочих папок, связанных с одним репозиторием. У каждой будет своя ветка и свое состояние файлов, но история коммитов останется общей.
Для Claude Code это означает, что каждому агенту можно выделить отдельную копию проекта:
claude --worktree browser-auth
Короткая форма:
claude -w browser-auth
Для второй задачи создается еще один worktree:
claude --worktree product-parser
Структура проекта будет выглядеть примерно так:
project/
├── .git/
├── src/
├── package.json
└── .claude/
└── worktrees/
├── browser-auth/
└── product-parser/В каждом дереве агент работает со своими файлами и своей веткой.
Это не то же самое, что открыть два терминала. Если два агента запущены в одной директории, они по-прежнему видят одни и те же файлы. Последний процесс, сохранивший изменения, может просто перезаписать работу другого.
Подробнее механизм описан в официальной документации Claude Code.
Почему worktree не решает все проблемы
Worktree разделяет файлы, но не внешнее состояние.
Два агента могут работать в разных папках и при этом подключаться к одному браузеру. Тогда конфликт возникает уже не в Git, а во время выполнения сценария.
Например:
- первый агент открывает форму входа, а второй сразу переходит в каталог;
- один очищает cookies, пока другой использует авторизованную сессию;
- один закрывает вкладку, с которой еще работает второй;
- оба меняют значения в localStorage;
- один выходит из аккаунта во время сбора данных;
- оба сохраняют скриншоты или загрузки под одинаковыми именами;
- два сценария одновременно меняют настройки одного аккаунта.
Код в этом случае останется целым, но результаты запуска будут случайными.
Worktree разделяет исходники. Браузерную сессию он не разделяет.
Для параллельной работы каждому агенту нужен собственный браузерный логин, отдельная сессия или постоянный профиль 2Captcha Browser API.
Как распределить ресурсы между агентами
| Ресурс | Worktree | Отдельная сессия Browser API |
|---|---|---|
| Исходный код | Разделяет | Не влияет |
| Git-ветка | Разделяет | Не влияет |
| Локальные файлы | Разделяет | Не влияет |
| Зависимости | Разделяет | Не влияет |
| Cookies | Не разделяет | Разделяет |
| localStorage | Не разделяет | Разделяет |
| Открытые вкладки | Не разделяет | Разделяет |
| Авторизация | Не разделяет | Разделяет |
| Настройки прокси | Не разделяет | Разделяет |
| База данных | Не разделяет | Не разделяет |
| Аккаунт на сайте | Не разделяет | Не разделяет серверные данные |
| Баланс Browser API | Не разделяет | Остается общим |
Рабочая схема:
Одна задача
↓
Один Claude Code worktree
↓
Одна Git-ветка
↓
Одна сессия 2Captcha Browser API
↓
Своя папка с логами и результатамиЗачем здесь нужен 2Captcha Browser API
2Captcha Browser API позволяет запускать браузеры удаленно и управлять ими через Playwright, Puppeteer и другие инструменты, совместимые с Chrome DevTools Protocol.
Вместо локального запуска Chrome код подключается к удаленному браузеру по WebSocket.
Адрес подключения имеет такой формат:
ws://BROWSER_USERNAME:[email protected]:9222
При этом сам сценарий почти не меняется.
Локальный запуск Playwright:
import { chromium } from "playwright";
const browser = await chromium.launch({
headless: true,
});Подключение к 2Captcha Browser API:
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP(
process.env.BROWSER_WS_ENDPOINT
);Claude Code по-прежнему пишет обычный код на Playwright. Разница только в том, где этот код выполняется.
Такой вариант удобен при параллельной разработке: не нужно держать несколько локальных процессов Chrome, следить за их версиями, вручную распределять память и разбираться с зависшими профилями.
Пример: авторизация и сбор данных
Предположим, в проекте есть две задачи:
- настроить вход в аккаунт и сохранение сессии;
- написать сборщик данных со страниц товаров.
Они почти не пересекаются по коду, поэтому их можно отдать разным агентам.
Агент авторизации
Создаем отдельное дерево:
claude --worktree browser-auth
Формулировка задачи:
Реализуй авторизацию через Playwright и 2Captcha Browser API. Ограничения: - изменяй только модуль авторизации; - используй браузерную конфигурацию этого worktree; - сохраняй авторизованную сессию; - сохраняй скриншоты и трассировки в artifacts/browser-auth; - не изменяй код сбора данных; - не создавай миграции базы данных.
Настройки:
Worktree: browser-auth Ветка: worktree-browser-auth Браузерный логин: claude-browser-auth Результаты: artifacts/browser-auth Задача: вход в аккаунт и сохранение сессии
Агент сбора данных
Создаем второе дерево:
claude --worktree product-parser
Задача:
Реализуй сбор данных со страницы товара через Playwright и 2Captcha Browser API. Ограничения: - изменяй только модуль сбора данных; - используй браузерную конфигурацию этого worktree; - извлекай название, цену, наличие и canonical URL; - сохраняй скриншоты и трассировки в artifacts/product-parser; - не изменяй модуль авторизации; - не создавай миграции базы данных.
Настройки:
Worktree: product-parser Ветка: worktree-product-parser Браузерный логин: claude-product-parser Результаты: artifacts/product-parser Задача: навигация и извлечение данных
Теперь агенты не делят ни файлы, ни браузерные сессии.
Подключение Playwright к 2Captcha Browser API
Установите зависимости:
npm install playwright dotenv
Создайте файл .env:
BROWSER_USERNAME=YOUR_BROWSER_USERNAME BROWSER_PASSWORD=YOUR_API_KEY BROWSER_HOST=browser-cloud.2captcha.com BROWSER_PORT=9222
Добавьте локальные файлы в .gitignore:
.env .claude/worktrees/ artifacts/
Создайте файл browser-example.mjs:
import "dotenv/config";
import { chromium } from "playwright";
import { mkdir } from "node:fs/promises";
import path from "node:path";
const requiredVariables = [
"BROWSER_USERNAME",
"BROWSER_PASSWORD",
"BROWSER_HOST",
"BROWSER_PORT",
];
for (const variable of requiredVariables) {
if (!process.env[variable]) {
throw new Error(`Missing required environment variable: ${variable}`);
}
}
const username = encodeURIComponent(process.env.BROWSER_USERNAME);
const password = encodeURIComponent(process.env.BROWSER_PASSWORD);
const host = process.env.BROWSER_HOST;
const port = process.env.BROWSER_PORT;
const endpoint = `ws://${username}:${password}@${host}:${port}`;
const outputDirectory = path.resolve("artifacts/browser-example");
await mkdir(outputDirectory, { recursive: true });
const browser = await chromium.connectOverCDP(endpoint);
try {
const contexts = browser.contexts();
const context = contexts[0] ?? await browser.newContext();
const pages = context.pages();
const page = pages[0] ?? await context.newPage();
await page.goto("https://example.com", {
waitUntil: "domcontentloaded",
timeout: 60000,
});
const title = await page.title();
const heading = await page.locator("h1").first().textContent();
await page.screenshot({
path: path.join(outputDirectory, "page.png"),
fullPage: true,
});
console.log({
title,
heading: heading?.trim() ?? null,
url: page.url(),
});
} finally {
await browser.close();
}Запуск:
node browser-example.mjs
Эту заготовку можно использовать во всех worktrees. Для каждого агента меняются логин Browser API, настройки прокси, тестовый аккаунт и папка, куда складываются результаты.
Отдельная конфигурация для каждого worktree
У каждого рабочего дерева должен быть свой локальный набор параметров.
Для авторизации:
BROWSER_USERNAME=claude-auth BROWSER_PASSWORD=YOUR_API_KEY BROWSER_HOST=browser-cloud.2captcha.com BROWSER_PORT=9222 BROWSER_OUTPUT_DIR=artifacts/browser-auth
Для парсера:
BROWSER_USERNAME=claude-products BROWSER_PASSWORD=YOUR_API_KEY BROWSER_HOST=browser-cloud.2captcha.com BROWSER_PORT=9222 BROWSER_OUTPUT_DIR=artifacts/product-parser
Формат может отличаться в зависимости от того, как в проекте устроены браузерные логины, профили и прокси.
Главное требование одно:
Два агента не должны одновременно управлять одной постоянной браузерной сессией.
Плохой вариант:
worktree browser-auth ─────┐
├── общая браузерная сессия
worktree product-parser ───┘Нормальный вариант:
worktree browser-auth
└── отдельная сессия Browser API
worktree product-parser
└── отдельная сессия Browser APIЧто делать с .worktreeinclude
Новый worktree содержит только файлы, которые отслеживает Git. Локальные файлы вроде .env туда не попадают.
Claude Code поддерживает файл .worktreeinclude. В нем можно перечислить gitignored-файлы, которые нужно копировать в новые рабочие деревья.
Например:
.env.example .env.development
Копировать настоящий рабочий .env во все деревья рискованно.
Если в нем указаны общие значения:
BROWSER_USERNAME=shared-browser-login BROWSER_OUTPUT_DIR=/tmp/shared-browser-output
то агенты получат разные директории, но продолжат использовать одну браузерную конфигурацию и одну папку для результатов.
Лучше копировать только шаблон:
BROWSER_USERNAME= BROWSER_PASSWORD= BROWSER_HOST=browser-cloud.2captcha.com BROWSER_PORT=9222 BROWSER_OUTPUT_DIR=
Значения для конкретного дерева можно передавать через:
- переменные окружения;
- локальный скрипт настройки;
- менеджер секретов;
- временные ключи для разработки;
- локальный файл .env.
Production-ключи не должны попадать в отслеживаемые Git-файлы.
Очистка старых worktrees
Claude Code не всегда удаляет созданные деревья автоматически. Это зависит от режима запуска, имени сессии и наличия изменений.
Нужно учитывать следующее:
- безымянное дерево без изменений может удалиться автоматически;
- для именованного дерева Claude Code может запросить подтверждение;
- дерево с изменениями не удаляется без подтверждения;
- после запуска через claude -p директория может остаться на диске.
Посмотреть список:
git worktree list
Удалить ненужное дерево:
git worktree remove .claude/worktrees/browser-auth
Очистить устаревшие записи:
git worktree prune
Каталог worktrees должен быть добавлен в .gitignore:
.claude/worktrees/
Иначе со временем в проекте накопятся старые ветки, зависимости, логи, скриншоты и локальные настройки.
Какие ресурсы все равно остаются общими
Worktree и отдельная браузерная сессия закрывают только часть рисков.
База данных
Два агента из разных деревьев могут подключаться к одной базе.
Особенно опасно запускать параллельное создание миграций. Обе миграции могут быть корректными по отдельности, но конфликтовать при применении.
Схему базы данных должен менять один агент за раз.
Аккаунт на сайте
Две браузерные сессии не разделяют серверное состояние одного аккаунта.
Один сценарий может изменить настройки, удалить данные, сбросить пароль или завершить активные сессии другого.
Для сценариев, меняющих данные, лучше заводить отдельные тестовые аккаунты.
Баланс и лимиты Browser API
Сессии могут быть независимыми, но использовать общий баланс, трафик и лимит параллельных подключений.
Это нужно учитывать до запуска нескольких агентов.
Прокси
Если разные сессии работают через один IP-адрес, сайт может воспринимать их как одну среду.
Для независимых сценариев используйте разные прокси.
Папки с результатами
Общий путь для скриншотов, логов или загрузок снова создает риск перезаписи файлов.
Плохо:
/tmp/latest-screenshot.png
Лучше:
artifacts/browser-auth/latest-screenshot.png artifacts/product-parser/latest-screenshot.png
Локальные порты
Worktree не резервирует порты.
Два Next.js-приложения не смогут одновременно слушать порт 3000. То же самое касается двух экземпляров FastAPI на порту 8000.
Для первого дерева:
FRONTEND_PORT=3001 BACKEND_PORT=8001
Для второго:
FRONTEND_PORT=3002 BACKEND_PORT=8002
Типичные ошибки
Два агента запущены в одной папке
Отдельные терминалы не дают файловой изоляции. Если оба агента сохраняют один файл, изменения одного из них могут исчезнуть.
Для каждого пишущего агента нужен отдельный worktree.
Одна браузерная сессия используется несколькими агентами
Тогда агенты делят cookies, вкладки, localStorage и состояние авторизации.
Для параллельных задач нужны отдельные сессии.
Worktree считают защитой от merge-конфликтов
Он не устраняет конфликты, а переносит их на этап слияния.
Если две ветки меняют один модуль, конфликт придется решать вручную.
Несколько агентов создают миграции
Параллельная работа со схемой базы данных почти всегда создает лишний риск.
Миграции должны выполняться последовательно.
Один .env копируется во все деревья
Так на диске появляется несколько копий секретов, а все агенты получают одинаковые настройки Browser API.
Лучше передавать конфигурацию отдельно для каждого дерева.
Все сценарии используют один тестовый аккаунт
Разные браузеры не разделяют серверные данные.
Для действий, меняющих состояние аккаунта, используйте отдельные тестовые учетные записи.
Логи и скриншоты пишутся в общую папку
В таком случае агенты могут перезаписывать уже не код, а результаты запуска.
Зависимые задачи запускаются одновременно
Если второй агент ждет код или состояние, которое должен подготовить первый, параллельный запуск только усложнит работу.
Такие задачи лучше выполнять по очереди.
Правила для CLAUDE.md
В проектные инструкции можно добавить такой блок:
## Параллельная браузерная автоматизация - Не запускай двух пишущих агентов в одной рабочей директории. - Отдельные окна терминала не обеспечивают изоляцию файлов. - Одна задача должна соответствовать одному worktree, одной ветке и одной зоне ответственности. - Каждый параллельный worktree должен использовать отдельную сессию 2Captcha Browser API или отдельный постоянный профиль. - Не позволяй двум агентам одновременно управлять одной постоянной браузерной сессией. - Для сценариев, меняющих состояние аккаунта, используй отдельные тестовые учетные записи. - Скриншоты, трассировки, HAR-файлы, загрузки и логи сохраняй внутри текущего worktree. - Миграции и документацию схемы базы данных изменяй последовательно. - Добавь `.claude/worktrees/` в `.gitignore`. - Не храни production-ключи Browser API в отслеживаемых файлах. - Не копируй production-секреты во все worktrees. - Назначай разные локальные порты параллельным серверам. - Агент, выполняющий ревью, не должен изменять файлы и состояние браузера. - После неинтерактивных запусков удаляй ненужные деревья вручную: `git worktree remove <path>`.
Когда параллельная работа оправдана
Этот подход полезен, когда задачи действительно не зависят друг от друга.
Например:
- авторизация и сбор данных с публичных страниц;
- desktop- и mobile-сценарии;
- автоматизация разных сайтов;
- новая функция и несвязанный с ней багфикс;
- разработка парсера и написание Playwright-тестов;
- сценарии для разных регионов или прокси;
- автоматизация разных аккаунтов;
- разработка браузерного сценария и интерфейса приложения.
Параллельная схема дает результат только тогда, когда изменения можно независимо проверить и принять.
Когда лучше не усложнять
Работать по очереди разумнее, если:
- задачи затрагивают одни и те же файлы;
- вторая задача зависит от первой;
- обоим агентам нужна одна сессия браузера;
- оба сценария работают с одним аккаунтом;
- нужно менять схему базы данных;
- в проекте нет надежных тестов;
- некому проверить несколько веток;
- изменение слишком небольшое для отдельного окружения.
Параллельный запуск ускоряет создание кода, но не его проверку.
Две непроверенные ветки — это не две готовые задачи, а две очереди на ревью.
Рабочий порядок
- Разделите работу на независимые задачи.
- Создайте worktree для каждой задачи.
- Назначьте каждому агенту отдельную сессию 2Captcha Browser API.
- Разведите тестовые аккаунты, прокси, порты и папки с результатами.
- Не запускайте параллельные изменения схемы базы данных.
- Запустите тесты в каждом дереве.
- Проверьте Git diff каждой ветки.
- Объединяйте ветки по одной.
- После каждого слияния запускайте полный набор тестов.
- Удаляйте старые worktrees и временные браузерные сессии.
Создание деревьев:
claude --worktree browser-auth claude --worktree product-parser
Просмотр веток:
git branch --list "worktree-*"
Проверка изменений:
git diff main...worktree-browser-auth git diff main...worktree-product-parser
Слияние первой ветки:
git switch main git merge worktree-browser-auth
После проверки можно объединить вторую:
git merge worktree-product-parser
Очистка:
git worktree remove .claude/worktrees/browser-auth git worktree remove .claude/worktrees/product-parser git branch -d worktree-browser-auth git branch -d worktree-product-parser git worktree prune
Итог
Worktree и Browser API решают разные задачи.
Worktree разделяет код, ветки и локальные изменения. 2Captcha Browser API разделяет браузерные сессии, вкладки, cookies, авторизацию и сетевые настройки.
Worktree отвечает за изоляцию разработки. 2Captcha Browser API — за изоляцию выполнения.
Такой подход подходит для независимых задач, которые можно разрабатывать и проверять отдельно.
Если сценарии используют одни файлы, одну базу, один аккаунт или одну браузерную сессию, безопаснее выполнять их последовательно.
Обсуждение