Przejdź do głównej zawartości

Dziesięciu agentów naraz: herdr, Conductor i worktree

Dziesięciu agentów kodujących naraz wymaga trzech warstw: osobnego git worktree na każde zadanie, żeby edycje się nie zderzały, nadzorcy, który pokazuje, który agent na ciebie czeka (agent view w Claude Code, herdr albo Conductor), oraz kolejki review, która scala po jednym zweryfikowanym pull requeście. Worktree izoluje tylko pliki, więc porty, bazy i profile przeglądarki wymagają osobnego planu.

Jest piątkowe popołudnie, a w backlogu leży dwanaście małych, niezależnych zgłoszeń. Otwierasz trzy terminale, w każdym startujesz agenta i idziesz na spotkanie. Po powrocie okazuje się, że jeden agent od 40 minut czeka na zgodę na uprawnienia, serwer deweloperski drugiego po cichu wystartował na kolejnym wolnym porcie, a testy Playwright trzeciego przeszły na serwerze drugiego. W poniedziałek masz dziewięć pull requestów i nie wiesz, które z nich naprawdę przetestowano.

Ta strona jest dla programisty, który uruchamia partię agentów, i dla tech leada, który robi z tego powtarzalny proces zespołu.

  • Przepis na uruchomienie od trzech do dziesięciu agentów w worktree, w Claude Code, Codex i Cursorze
  • Przykład Worktrunk plus herdr: trzy polecenia wt switch i jeden ekran, który pokazuje, kto jest zablokowany
  • Plan na porty, bazy danych, sekrety i profile przeglądarki dla każdego worktree
  • Workflow od partii zgłoszeń do merge train z trzema promptami do skopiowania
  • Dowody, które każdy pull request niesie przed zatwierdzeniem, i typowe awarie

Ograniczeniem nie jest liczba agentów, które da się wystartować, tylko przepustowość review, limit użycia i maszyna.

  • Limit użycia. Dokumentacja agent view Anthropic mówi, że sesje w tle „consume your subscription usage the same as interactive sessions, so running ten agents in parallel uses quota roughly ten times as fast as running one” (code.claude.com, odczyt 2026-09-26).
  • Dysk i CPU. Plik conductor.json w repozytorium Next.js zaleca "parallel_agents": 3 i zaznacza: „Each worktree uses ~500MB-1GB disk space after build” (vercel/next.js, gałąź canary, odczyt 2026-09-26).
  • Review. Raport Faros AI z 2025 roku podaje, że programiści w zespołach intensywnie korzystających z AI scalają o około 98% więcej pull requestów, a czas review rośnie o około 91% (źródło wtórne: wyciąg wyszukiwarki ze strony faros.ai, odczyt 2026-09-26). Więcej agentów przesuwa wąskie gardło do review.
  • Pomiar. METR napisał 2026-02-24: „our measurements of time-spent on each task are unreliable for the fraction of developers who use multiple AI agents concurrently”. Mierz raczej scalone i wycofane pull requesty oraz czas w review.
Agentów narazCo działaGdzie widać granicę
1–3Natywne worktree i karty terminala albo agent view w Claude CodePamiętanie, która karta czeka
3–10Nadzorca: herdr, cmux albo aplikacja desktopowa w rodzaju Conductora, plus porty per worktreeKolejka review i limit użycia
10+Orkiestrator (Gas Town, CLI Agent Orchestrator) z wstrzymaniem nowych zadań, gdy kolejka review jest pełnaKonflikty przy scalaniu i obciążenie recenzentów

Każde narzędzie z tabeli stoi na git worktree i dokłada launcher, terminal świadomy stanu agentów albo GUI do review. Zacznij od funkcji wbudowanych; narzędzie zewnętrzne musi zapracować na miejsce flotą mieszanych agentów, detekcją stanu albo tablicą do review.

NarzędzieWarstwaCo dodajeInstalacja (zweryfikowana)Licencja
Wbudowane w Claude CodeWorktree + nadzorca--worktree, .worktreeinclude, --bg, claude agents (agent view, research preview), --tmuxw Claude Code 2.1.283dostawca
Wbudowane w CodexWorktree + lista sesji--worktree, codex agentsw codex-cli 0.157.1dostawca
CursorWorktree + chmuraWorktrees, Cloud Agents w izolowanych maszynach wirtualnychw aplikacjidostawca
Worktrunk (wt)Launcher worktreeWorktree i agent jednym poleceniem; hooki; hash_portbrew install worktrunk && wt config shell installMIT lub Apache-2.0
git gtr (CodeRabbit)Launcher worktreegit gtr new … --ai, worktree dla PR, sprzątanie scalonych gałęzibrew tap coderabbitai/tap && brew install git-gtrApache-2.0
herdrTerminal nadzorcyPanele oznaczone working, blocked, idle, done albo unknown; CLI i socket API; 24 rodzaje agentówbrew install herdrApache-2.0
cmuxTerminal nadzorcy (macOS)Terminal oparty na Ghostty, pierścienie powiadomień, cmux claude-teamsbrew tap manaflow-ai/cmux && brew install --cask cmuxGPL-3.0-or-later
Claude Squad (claude-squad)TUI na tmux + worktreePodgląd diffa, commit i push per sesjabrew install claude-squad (krótka nazwa cs wymaga dowiązania z README)AGPL-3.0
ccmanagerTUI sesjiStan busy/waiting/idle, .worktreeinclude, devcontainerynpm install -g ccmanagerMIT
ConductorAplikacja desktopowa (macOS, zamknięta)Claude Code i Codex w worktree, jedna tablica do reviewpobranie z conductor.buildwłasnościowa
Gas Town (gt)OrkiestratorAgent „Mayor” koordynujący workerów przez Beadsbrew install gastownMIT
CLI Agent Orchestrator (cao)OrkiestratorAgenci supervisor i worker w tmux, interfejs webowyuv tool install git+https://github.com/awslabs/cli-agent-orchestrator.git@main --upgradeApache-2.0

Popularność na 2026-09-26 (gwiazdki na GitHubie odczytane przez GitHub API na potrzeby dossier ekosystemu tej strony): herdr 40 779; cmux 27 412; Gas Town 18 195; Claude Squad 8533; Worktrunk 8416; git gtr 1786; CLI Agent Orchestrator 1350; ccmanager 1250. Conductor ma zamknięty kod i nie publikuje porównywalnej metryki. Gwiazdki mierzą uwagę, a nie dopasowanie.

Każde z trzech narzędzi potrafi umieścić sesję w osobnym worktree bez dodatkowego oprogramowania.

Uruchom jedną sesję na zgłoszenie, każdą w osobnym worktree. Claude Code tworzy worktree w .claude/worktrees/<name>/ na nowej gałęzi worktree-<name>:

Okno terminala
# Terminal (katalog główny repozytorium). Jeden terminal na agenta.
claude --worktree issue-101
claude --worktree issue-102 --tmux # to samo, w sesji tmux
claude --worktree "#1234" # worktree z pull requesta 1234

Przy więcej niż trzech agentach wyślij ich w tło i nadzoruj z jednego ekranu; każda sesja w tle przenosi się do własnego worktree, zanim zacznie edytować pliki:

Okno terminala
claude --bg --name issue-101 "Fix issue #101: pagination skips the last page. Add a failing test first."
claude --bg --name issue-102 "Fix issue #102: CSV export drops the header row. Add a failing test first."
claude agents # jeden ekran: Ready for review, Needs input, Working, Completed
claude agents --json # ten sam stan dla skryptów

Przed pierwszym uruchomieniem dodaj .claude/worktrees/ do .gitignore i utwórz .worktreeinclude w katalogu głównym repozytorium. Plik ma składnię .gitignore i kopiuje tylko pliki, które są jednocześnie wymienione i ignorowane przez git:

.env
.env.local

Agent teams (eksperymentalne, CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1) pasują do jednej funkcji podzielonej między współpracujących agentów, a nie do partii niezależnych zgłoszeń; wbudowany skill /batch dzieli jedną dużą zmianę na 5–30 jednostek w osobnych worktree.

Uruchom trzech agentów przez Worktrunk i obserwuj ich w herdr

Dział zatytułowany „Uruchom trzech agentów przez Worktrunk i obserwuj ich w herdr”

Worktrunk tworzy worktree i startuje agenta jednym poleceniem, a herdr pokazuje stan każdego agenta w pasku bocznym. Oba narzędzia działają na macOS i Linuksie.

  1. Zainstaluj oba narzędzia i integrację herdr dla swojego agenta, dzięki której restart przywraca sesję agenta:

    Okno terminala
    brew install worktrunk && wt config shell install
    brew install herdr
    herdr integration install claude # także: codex, cursor, opencode, …

    Na Windowsie winget instaluje Worktrunk jako git-wt, bo wt koliduje z Windows Terminal, więc uruchom git-wt config shell install.

  2. Zacommituj konfigurację projektu, żeby każde nowe worktree dostawało pliki ignorowane przez git, zależności i własny port serwera deweloperskiego. Kroki pre-start blokują do zakończenia, więc .env i node_modules istnieją, zanim wystartuje agent; post-start działa w tle, co pasuje tylko do serwera deweloperskiego. hash_port zamienia nazwę gałęzi na stały port z zakresu 10000–19999:

    .config/wt.toml
    [[pre-start]]
    copy = "wt step copy-ignored"
    [[pre-start]]
    install = "pnpm install"
    [post-start]
    server = "wt step tether -- pnpm dev --port {{ branch | hash_port }} --strictPort"
    [list]
    url = "http://localhost:{{ branch | hash_port }}"

    Worktrunk kopiuje wszystkie pliki ignorowane przez git, chyba że ogranicza je .worktreeinclude (jak na karcie Claude Code).

  3. Uruchom herdr i utwórz jeden workspace na agenta, z paska bocznego albo przez herdr workspace create --label feature-a. W każdym wpisz jedną linię:

    Okno terminala
    wt switch -c feature-a -x env -- 'PORT={{ branch | hash_port }}' claude 'Add user authentication'
    wt switch -c feature-b -x env -- 'PORT={{ branch | hash_port }}' claude 'Fix the pagination bug'
    wt switch -c feature-c -x env -- 'PORT={{ branch | hash_port }}' claude 'Write tests for the API'

    -c tworzy gałąź i worktree, a -x uruchamia po przełączeniu jeden program z argumentami podanymi po --. Worktrunk rozwija w nich szablony, więc env startuje agenta ze zmienną PORT ustawioną na tę samą wartość hash_port, której używa serwer deweloperski. Prompt wykonawcy i konfiguracja Playwright w dalszej części strony czytają właśnie ten PORT, więc testy agenta trafiają w jego własny serwer.

  4. Odczytaj przegląd. Pasek boczny herdr pokazuje stan każdego agenta i zbiera go na poziomie workspace’u, więc przy jednym workspace na agenta zablokowanego agenta widzisz bez odwiedzania każdego panelu. Dla skryptów CLI daje ten sam widok; agent uruchomiony ręcznie nie ma nazwy, więc wskazuj go identyfikatorem panelu z agent list:

    Okno terminala
    herdr agent list
    herdr agent wait w2:p1 --until blocked --timeout 600000
    herdr agent read w2:p1 --source recent-unwrapped --lines 80
  5. Scalaj każdą skończoną gałąź, po jednej naraz. wt merge main robi squash, rebase na main, fast-forward i usuwa worktree; w workflow z pull requestami uruchom gh pr create z worktree, a po scaleniu wt remove.

Co powinieneś zobaczyć: trzy workspace’y, w każdym Claude Code działający w ../repo.feature-a, ../repo.feature-b albo ../repo.feature-c; wt list pokazuje trzy gałęzie z trzema różnymi portami w kolumnie URL; stan każdego workspace’u w pasku bocznym zmienia się z working na idle albo blocked w miarę postępu agenta.

Większą partię uruchom skryptem. Tę pętlę złożyliśmy na podstawie dokumentacji CLI herdr 0.9.1:

Okno terminala
# Uruchom z powłoki wewnątrz herdr, w katalogu głównym repozytorium.
while IFS='|' read -r branch task; do
created=$(herdr workspace create --cwd "$PWD" --label "$branch" --no-focus)
pane=$(printf '%s\n' "$created" | jq -r '.result.root_pane.pane_id')
# tekst zadania nie może zawierać apostrofów (pojedynczych cudzysłowów)
herdr pane run "$pane" "wt switch -c $branch -x env -- 'PORT={{ branch | hash_port }}' claude '$task'"
done <<'EOF'
issue-101|Fix issue #101 (pagination skips the last page). Write a failing test first.
issue-102|Fix issue #102 (CSV export drops the header row). Write a failing test first.
issue-103|Fix issue #103 (date filter ignores the time zone). Write a failing test first.
EOF

Conductor (Melty Labs) to zamknięta aplikacja na Maca, która uruchamia równolegle agentów Claude Code i Codex w worktree, z jedną tablicą do review. Wybierz ją dla graficznej tablicy z diffami na macOS; nie działa na Linuksie ani Windowsie.

Weryfikowalna część to konfiguracja w repozytorium. Poniżej skrócona wersja pliku conductor.json, który commituje repozytorium Next.js (odczyt 2026-09-26; pełny plik ma też name, description, TURBO_TELEMETRY_DISABLED i listę notes):

{
"scripts": {
"setup": "./.conductor/scripts/setup.sh",
"run": "./.conductor/scripts/run.sh"
},
"worktree": { "default_branch": "canary" },
"environment": { "NEXT_TELEMETRY_DISABLED": "1" },
"recommendations": { "parallel_agents": 3 }
}

Daj każdemu worktree własne porty, bazę i przeglądarkę

Dział zatytułowany „Daj każdemu worktree własne porty, bazę i przeglądarkę”

Worktree izoluje pliki i gałąź. Wszystko inne jest współdzielone, dopóki tego nie rozdzielisz, a większość kolizji jest cicha.

ZasóbWspółdzielony domyślnie?Co się psujeRozwiązanie
Pliki i gałąźNie—Samo worktree
Pliki ignorowane przez git (.env)Brak w nowym worktreeTesty padają na konfiguracji albo agent wymyśla wartości.worktreeinclude (Claude Code, Worktrunk, ccmanager), wt step copy-ignored, gtr.copy.include
Port serwera deweloperskiegoTakVite przechodzi na kolejny wolny port, jeśli nie ustawisz strictPortStały port per worktree: hash_port, blok portów na indeks worktree albo CONDUCTOR_PORT (źródło wtórne)
Serwer test runneraTakreuseExistingServer w Playwright podłącza się do tego, co nasłuchuje na porcie, nawet do serwera innego agentabaseURL, webServer.url i port serwera wyprowadzaj z jednej wartości per worktree
Profil przeglądarkiTakZ trwałego profilu Playwright MCP może naraz korzystać tylko jedna przeglądarkaUruchamiaj Playwright MCP z --isolated w każdym agencie
Lokalna baza danychTakDwóch agentów migruje ten sam schematJedna baza na worktree (zmienne hash_port w Worktrunk, kontener na gałąź) albo sandbox
git config i katalog .gitTakZapis konfiguracji w jednym worktree zmienia wszystkieNie pozwalaj agentowi uruchamiać git config; trzymaj ustawienia w commitowanych plikach
Zgody na uprawnienia (Claude Code)Tak„Don’t ask again” w jednym worktree obowiązuje we wszystkichŚwiadome reguły zapisz w .claude/settings.json i przejrzyj je
Dane produkcyjne, deploye, sekrety, zewnętrzne APITak„Szybkie sprawdzenie” jednego agenta zapisuje dane produkcyjneZablokuj te polecenia i dawaj agentom wyłącznie poświadczenia do sandboxa

Powiąż test runner z tym samym PORT, który launcher przekazał agentowi (prefiks env w kroku z Worktrunk), i przerywaj głośno, gdy go brakuje, zamiast wracać do wspólnego portu domyślnego. Dla projektu Vite z Playwright:

playwright.config.ts
import { defineConfig } from '@playwright/test';
// Locally, PORT comes from the agent's launch line; CI runs one server, so a default is safe there.
const port = process.env.PORT ?? (process.env.CI ? '5173' : '');
if (!port) throw new Error('PORT is not set: start the agent with its worktree port');
const baseURL = `http://localhost:${port}`;
export default defineConfig({
use: { baseURL },
webServer: {
command: `pnpm dev --port ${port} --strictPort`,
url: baseURL,
reuseExistingServer: !process.env.CI,
},
});

Daj każdemu agentowi własną przeglądarkę do sprawdzania UI. Flaga --isolated trzyma profil przeglądarki w pamięci, więc równolegli agenci nie walczą o jeden trwały profil. Polecenia wyprowadziliśmy z instrukcji instalacji dostawcy dla każdego narzędzia:

Okno terminala
claude mcp add playwright -- npx @playwright/mcp@latest --isolated

Schematy narzędzi serwera MCP trafiają do kontekstu każdego agenta. Uruchom /context w Claude Code przed dodaniem serwera i po nim, żeby zobaczyć, ile kosztuje każdą z dziesięciu sesji.

Gdy izolacja na poziomie plików nie wystarcza (usługi, kontenery, sieci), przenieś każdego agenta do sandboxa; opcje porównuje strona sandboksy dla agentów, a wzorzec pełnego stosu opisuje strona efemeryczne środowiska dla każdego zadania agenta.

Przeprowadź workflow od partii zgłoszeń do merge train

Dział zatytułowany „Przeprowadź workflow od partii zgłoszeń do merge train”

Launcher to łatwiejsza połowa. O tym, czy dziesięciu agentów pomaga, decyduje praca wokół nich: partia bez kolizji, standardowy prompt, nadzór tylko przy wyjątkach i kolejka, która scala po jednej zweryfikowanej zmianie.

  1. Wybierz partię, która nie może się zderzyć. Wybierz niezależne zgłoszenia z kryteriami akceptacji, żadnych dwóch w tym samym module. Triaż zrobi agent planujący tylko do odczytu.

  2. Utwórz jedno worktree na zgłoszenie i nazwij je od zgłoszenia (issue-101), żeby gałąź, pull request i wiersz agenta miały jedną nazwę.

  3. Roześlij agentów z jednym standardowym promptem. Każdy agent pisze nieprzechodzący test, naprawia zgłoszenie, uruchamia kontrole na własnym porcie i otwiera draft pull requesta z dowodami.

  4. Nadzoruj tylko przy wyjątkach. Obserwuj tylko blocked albo Needs input. Wstrzymaj rozsyłanie, gdy kolejka review dojdzie do limitu; przewodnik po kolejce review pokazuje, jak go wyznaczyć.

  5. Recenzuj dowody, a nie każdą linię. Agent recenzent najpierw sprawdza każdy diff względem kryteriów akceptacji (/code-review w Claude Code, codex review --base main w Codex). Człowiek czyta nazwy testów, dowody i uwagi, a kod tam, gdzie wskazuje go uwaga albo poziom ryzyka.

  6. Scalaj jak pociąg. Scalaj po jednym pull requeście, kolejny rebase’uj na nowe main i uruchamiaj CI ponownie. W zespole robi to merge queue na GitHubie (dodaj zdarzenie merge_group do workflow, który uruchamia wymagane kontrole); lokalnie robi to wt merge main. Gdy rebase kończy się konfliktem, wyślij przegrane zgłoszenie jeszcze raz na świeżym worktree.

  7. Posprzątaj. Usuń scalone worktree: wt remove, git gtr clean --merged --closed albo claude rm <id> dla sesji w tle. Zacommituj i wypchnij pracę, zanim usuniesz sesję w agent view: usunięcie sesji może skasować worktree, które Claude dla niej utworzył (zostaje, gdy zawiera niewypchnięte commity, chyba że podasz --discard-unpushed).

Start agentów z trackera zgłoszeń opisuje potok od zgłoszenia do PR, a podział jednego zadania między agentów — wzorce orkiestracji wielu agentów.

Skąd wiesz, że dziesięć równoległych pull requestów można bezpiecznie scalić?

Dział zatytułowany „Skąd wiesz, że dziesięć równoległych pull requestów można bezpiecznie scalić?”

Każda zmiana musi się obronić bez człowieka czytającego każdą linię. Wymagaj czterech rzeczy od każdego pull requesta, a ostatnią niech wymusza merge queue.

DowódKto go wytwarzaKto go sprawdza
Test, który nie przechodzi bez zmiany i przechodzi z niąAgent wykonawca, w sekcji EvidenceAgent recenzent (PASS w pierwszym punkcie)
Type check, lint i testy uruchomione we własnym worktree agenta, na jego porcieAgent wykonawcaCI na pull requeście
Diff ograniczony do plików zgłoszenia, bez zmian w konfiguracji, migracjach i lockfile’achAgent wykonawcaAgent recenzent, potem reguła CODEOWNERS dla wrażliwych ścieżek
Zielone CI na HEAD zrebase’owanym na najnowsze mainMerge queueWymagany status check

Zatwierdzenie zostaje przy człowieku. Programista, który rozesłał partię, odpowiada za każde scalenie. Tech lead odpowiada za reguły: rozmiar partii, limit kolejki review, ścieżki, które zawsze wymagają człowieka, i liczby do obserwacji (scalone pull requesty dziennie, czas w review, wycofania w ciągu tygodnia). Rosnąca liczba wycofań oznacza za dużą partię albo za słabe kryteria; rozwiązaniem jest mniej agentów, nie szybsze review. Boty, które mogą zrobić pierwszy przebieg review, opisuje strona boty AI do code review.

Co się psuje, gdy uruchamiasz dziesięciu agentów naraz?

Dział zatytułowany „Co się psuje, gdy uruchamiasz dziesięciu agentów naraz?”

Testy przechodzą na niewłaściwym serwerze. Serwer deweloperski przeszedł na kolejny wolny port, a test runner użył serwera innego agenta. Naprawa: zatrzymaj wszystkie serwery deweloperskie, przekaż każdemu agentowi stały PORT z --strictPort i uruchom ponownie testy każdego pull requesta z tej partii.

Dwóch agentów edytuje ten sam plik. Drugi rebase kończy się konfliktem. Naprawa: scal pierwszy i wyślij drugie zgłoszenie ponownie na świeżym worktree z nowego main. Zapobiegaj temu, wypisując oczekiwane pliki na etapie triażu.

Nikt nie zauważa zablokowanego agenta. herdr pokazuje nierozpoznany prompt jako idle (w Codex jako unknown). Naprawa: sprawdzaj przez herdr agent read wszystko, co jest idle albo unknown od kilku minut, albo rozsyłaj przez claude --bg, żeby sesja trafiała do Needs input.

W worktree brakuje .env albo zależności. Testy padają na konfiguracji albo agent wpisuje wartości zastępcze. Naprawa: dodaj pliki do .worktreeinclude (albo wt step copy-ignored), dodaj instalację zależności jako hook pre-start i uruchom agenta ponownie.

Kończy się miejsce na dysku. Next.js podaje od 500 MB do 1 GB na worktree. Naprawa: git worktree list, a potem git worktree remove dla scalonej pracy; gdy git odmawia z powodu blokady, którą Claude Code zostawił po uruchomieniu z -p, najpierw uruchom git worktree unlock.

Praca znika. Usunięcie sesji w agent view może skasować jej worktree (zostaje, gdy zawiera niewypchnięte commity, chyba że podasz --discard-unpushed), a git worktree remove --force wyrzuca niezacommitowaną pracę. Naprawa: commituj i pushuj przed usunięciem; jeśli zniknęła gałąź, git fsck --lost-found wypisze jej commity do czasu garbage collection.

Limit użycia kończy się w połowie partii. Naprawa: ogranicz partię, rutynowe zgłoszenia przenieś na tańszy model, gdy potwierdzą to twoje ewaluacje (zobacz hub modeli), a długie partie uruchamiaj poza godzinami pracy.

Agent dotyka współdzielonego stanu. Migracja na wspólnej lokalnej bazie, zapis git config albo polecenie na produkcji dotyka wszystkich worktree. Naprawa: odtwórz dane z backupu, zablokuj to polecenie i dawaj agentom wyłącznie poświadczenia do sandboxa. Aktualizuj Claude Code: jego zgłoszenia bezpieczeństwa wymieniają „Sandbox Escape via Git Worktree Path Confusion” z oceną High (2026-06-25).