agent-ecosystem/docs/team-management/research-worktrees.md

9.7 KiB
Raw Permalink Blame History

Research: Git Worktrees + Agent Teams + Process Launch

Статус: Phase 2 (после базовой реализации Team Management)


ЧАСТЬ 1: Текущая ситуация

Agent Teams работают в ОДНОМ каталоге

Все тиммейты шарят один cwd — нет встроенной поддержки worktrees для команд.

Lead + Teammate-1 + Teammate-2 → все в /project/
→ Два агента могут редактировать один файл → перезапись
→ "Решение" Claude Code: лид вручную назначает разные файлы разным агентам

Worktrees в Claude Code — отдельный механизм

Worktrees существуют как способ ручного параллелизма пользователя:

git worktree add ../project-feature-a -b feature-a
cd ../project-feature-a
claude  # Новая независимая сессия

Это НЕ связано с Agent Teams. Каждый worktree = отдельный процесс claude, никакой координации.

У Task tool нет параметра cwd

При спавне тиммейта через Task нельзя указать рабочую директорию. Тиммейт наследует cwd лидера.


ЧАСТЬ 2: Существующая инфраструктура в Agent Teams

Уже реализовано (можно переиспользовать)

Компонент Файл Что делает
GitIdentityResolver src/main/services/parsing/GitIdentityResolver.ts Определяет worktree vs main repo, извлекает branch, remote URL
WorktreeGrouper src/main/services/discovery/WorktreeGrouper.ts Группирует проекты по git repository
WorktreeBadge src/renderer/components/common/WorktreeBadge.tsx UI badge для типа worktree (8 типов)
repositorySlice src/renderer/store/slices/repositorySlice.ts Store: repos, worktrees, grouped/flat view
worktreePatterns src/main/constants/worktreePatterns.ts 8 типов: vibe-kanban, conductor, auto-claude, 21st, claude-desktop, ccswitch, git, unknown
SidebarHeader src/renderer/components/layout/SidebarHeader.tsx Dropdown с repo → worktree навигацией

config.json содержит cwd у members

{
  "members": [
    {
      "name": "team-lead",
      "cwd": "/Users/belief/dev/projects/modularity"  // Все members имеют ОДИНАКОВЫЙ cwd
    }
  ]
}

Поле есть, но все members указывают одну директорию.


ЧАСТЬ 3: Идея — Запуск Claude Process из UI

Суть

Пользователь хочет не просто просматривать команды, но и запускать Claude Code процессы прямо из Electron UI. С предконфигурацией:

  1. Выбрать рабочую директорию (может быть worktree)
  2. Настроить agent teams заранее
  3. Запустить claude процесс с нужными параметрами
  4. Worktree создаётся автоматически перед запуском

Сценарии использования

Сценарий 1: Запуск одиночного Claude

UI: [Выбрать директорию] → [Запустить Claude]
→ spawn('claude', [], { cwd: '/selected/path' })

Сценарий 2: Запуск с предсозданным worktree

UI: [Выбрать репо] → [Создать worktree для branch X] → [Запустить Claude в worktree]
→ git worktree add ../project-branch-x -b branch-x
→ spawn('claude', [], { cwd: '../project-branch-x' })

Сценарий 3: Запуск команды с worktrees для каждого тиммейта

UI: [Настроить команду]
  - Lead: /project (main)
  - Teammate-1: /project-wt1 (branch auth)
  - Teammate-2: /project-wt2 (branch api)

→ git worktree add ../project-wt1 -b auth
→ git worktree add ../project-wt2 -b api
→ spawn('claude', ['--prompt', 'Create team... Teammate-1 works in /project-wt1...'], { cwd: '/project' })

Сценарий 4: Worktree per-task

UI: [Создать задачу] → [Auto-create worktree] → [Assign to teammate]
→ git worktree add ../project-task-15 -b task-15
→ Prompt: "For task #15, work in /project-task-15"

Технические вопросы

Как запустить claude из Electron?

import { spawn } from 'child_process';

const claude = spawn('claude', ['--prompt', initialPrompt], {
  cwd: workingDirectory,
  env: {
    ...process.env,
    CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: '1',  // Если нужны teams
  },
  stdio: ['pipe', 'pipe', 'pipe'],
});

// Слушаем stdout для отслеживания прогресса?
claude.stdout.on('data', (data) => { /* ... */ });

Вопросы:

  • claude запускается как interactive CLI. Можно ли передать начальный промпт через args?
  • Есть ли headless/non-interactive режим? (claude --message "..." — да, но одноразовый)
  • Как мониторить процесс после запуска?
  • Как связать запущенный процесс с нашим UI?

Claude CLI аргументы (известные)

claude                          # Interactive REPL
claude "prompt here"            # One-shot (non-interactive? needs check)
claude --resume <session-id>    # Resume session
claude --continue               # Continue last session
claude -p "prompt"              # Print mode (non-interactive, output to stdout)

Нужно исследовать:

  • Как запустить interactive сессию с начальным промптом
  • Можно ли передать agent teams конфигурацию через аргументы
  • Как получить session ID запущенного процесса

Worktree lifecycle

Создание:   git worktree add <path> -b <branch>
Удаление:   git worktree remove <path>
Список:     git worktree list

Вопросы:

  • Когда удалять worktree? После завершения задачи/команды?
  • Как мержить изменения из worktree обратно в main?
  • Что если worktree "зависает" (процесс упал)?

ЧАСТЬ 4: Варианты архитектуры

A: Prompt Injection (простой, хрупкий)

1. UI создаёт worktrees
2. В .claude/rules/worktrees.md: "Teammate X must cd to /path"
3. Агент (надеемся) делает cd

Compliance: ~70-80% Сложность: низкая Риск: агент забудет cd, или cd обратно

B: Отдельные сессии (надёжный, без Teams)

1. UI создаёт worktrees
2. Запускает N отдельных claude процессов в разных worktrees
3. Координация через наш UI (Kanban, inbox messaging)
4. Нет встроенных Teams инструментов

Isolation: 100% Сложность: высокая (наша координация вместо Teams) Плюс: полный контроль

C: Гибрид (3 режима)

shared       — один каталог (текущее поведение Teams)
per-teammate — worktree на каждого тиммейта
per-task     — worktree на каждую задачу

Юзер выбирает режим при создании команды. UI создаёт worktrees и инжектирует правила.

D: Только визуализация (безопасный)

Не управляем worktrees
Только показываем какой тиммейт в каком каталоге
Группировка через repositorySlice

ЧАСТЬ 5: Открытые вопросы для Phase 2

  1. Как запустить claude с начальным промптом из Electron?

    • Нужно исследовать CLI аргументы подробнее
    • Есть ли способ передать initial team config?
  2. Можно ли контролировать cwd тиммейта?

    • Через промпт lead'а: "spawn teammate in /path/to/worktree"
    • Через config.json manipulation?
    • Compliance?
  3. Worktree cleanup

    • Автоматическое удаление при завершении команды?
    • UI кнопка "Cleanup worktrees"?
    • Что делать с uncommitted changes?
  4. Merge strategy

    • Как мержить worktree branches обратно?
    • Кнопка "Merge all" в UI?
    • Conflict resolution?
  5. Process monitoring

    • Как отслеживать запущенный claude процесс?
    • Как получить его session ID?
    • Как определить что процесс завершился?
  6. Integration с Team Management

    • Worktree mode как часть team creation flow?
    • Или отдельная фича?
    • Как связать worktree с конкретным тиммейтом/задачей?

Решение

Phase 2 — после базовой реализации Team Management (Kanban, messaging, members). Требует дополнительного ресёрча по claude CLI аргументам и process management.