Skip to content

Agentes de código en paralelo con git worktrees

Cómo SuperDevSpace separa varios agentes en un mismo repositorio: un git worktree y una rama por worker, commits por turno y squash merges.

Por SuperDevSpace

Publicado 6 min de lectura

También en: English Türkçe Deutsch Français Português (Brasil) 日本語 简体中文

La terminal real de Claude Code de un manager en SuperDevSpace aplicando un cambio de una línea, mostrado como diff

Ejecuta dos agentes de código en el mismo checkout y descubrirás enseguida por qué los equipos de software usan ramas. Un agente renombra un módulo mientras el otro ejecuta la suite de tests contra la mitad de ese renombrado. Uno añade al stage archivos que el otro acaba de borrar. Ninguno se equivoca; simplemente comparten escritorio.

SuperDevSpace ejecuta un manager y varios workers sobre un mismo repositorio a la vez. Este artículo explica el mecanismo que los mantiene separados —los git worktrees— y las reglas exactas que sigue la app con ellos.

Qué es un git worktree

Un repositorio git tiene normalmente un único directorio de trabajo. git worktree permite que un mismo repositorio tenga varios, cada uno en su propia rama, todos compartiendo la misma base de objetos. No hay un segundo clon ni una segunda copia del historial: un worktree nuevo cuesta los archivos de un checkout y nada más.

Puedes probarlo a mano en cualquier repositorio. Los comandos son los mismos en todas partes; solo cambia el shell:

macOS / Linux

Terminal
git worktree add -b agent/frontend-demo ../myrepo-frontend
git worktree list
cd ../myrepo-frontend && git status
cd - && git worktree remove ../myrepo-frontend

Windows (PowerShell)

Terminal
git worktree add -b agent/frontend-demo ..\myrepo-frontend
git worktree list
cd ..\myrepo-frontend; git status
cd ..\myrepo; git worktree remove ..\myrepo-frontend

Cada worktree tiene su propio HEAD, su propio índice y sus propios archivos. Dos procesos pueden editar, compilar y testear en dos worktrees a la vez sin ver los cambios a medias del otro. Es justo la propiedad que necesita un equipo de agentes.

Cómo los usa SuperDevSpace

Las reglas son sencillas y las mismas para todas las organizaciones:

  • El manager trabaja en tu checkout principal. Planifica, revisa y fusiona; es el único lugar donde se juntan las ramas.
  • Cada worker recibe su propio worktree en su propia rama. Cuando el manager contrata a un worker, la app ejecuta git worktree add -b <rama> <ruta> para él. La rama se llama agent/<nombre-del-worker>-<marca> salvo que tú le hayas dado un nombre.
  • Los worktrees viven en la carpeta de datos de la app, en worktrees/<organización>/<worker>, nunca dentro de tu repositorio. Tu carpeta de proyecto no se llena de directorios de agentes.
  • Cada turno se commitea. Cuando un worker termina un turno, la app hace commit de todo lo que cambió en su worktree (agent(<nombre>): turn). Nada de lo que hizo un worker queda solo en un directorio de trabajo sin commitear.
  • La fusión es un squash merge. Cuando el manager acepta el informe de un worker, la rama se fusiona en tu línea con git merge --squash y un solo commit. Si hay conflicto, la app aborta la fusión y deja el repositorio limpio para la siguiente operación, en lugar de dejarte en mitad de un merge con conflictos.
  • Una operación de git a la vez por repositorio. Los directorios de los worktrees aíslan los archivos; una cola por repositorio serializa los propios comandos de git, así que dos workers que terminan en el mismo instante nunca compiten por los metadatos de git.
Dos workers, dos ramas, dos squash mergesDos workers, dos ramas, dos squash merges
Dos workers, dos ramas, dos squash merges
El diagrama en texto
gitGraph
  commit id: "main"
  branch agent/frontend
  commit id: "frontend: turno 1"
  checkout main
  branch agent/qa
  commit id: "qa: turno 1"
  checkout agent/frontend
  commit id: "frontend: turno 2"
  checkout main
  merge agent/frontend id: "squash: frontend"
  merge agent/qa id: "squash: qa"

En el tablero, esto se ve como varias tareas en curso a la vez, cada una de un worker distinto, cada una con su propia rama debajo.

Un tablero de sprint con tareas repartidas entre por hacer, en curso, esperando aprobación, en revisión y hecho
Tareas avanzando en paralelo en el tablero de una organización, cada worker en su propia rama (app real, en turco).

Lo que lo hace práctico

Un worktree recién creado solo contiene lo que git rastrea. Eso no suele bastar para ejecutar un proyecto: node_modules, un .env local, archivos generados. Dos detalles lo resuelven.

Un script de preparación por repositorio

Si tu repositorio tiene .super/scripts/setup-worktree.sh, la app lo ejecuta dentro de cada worktree nuevo antes de que arranque el worker, con SUPERDEV_MAIN_REPO apuntando a tu checkout principal. Su salida se muestra en directo —una instalación larga no es una espera a ciegas— y puedes cancelarlo.

.super/scripts/setup-worktree.sh
#!/usr/bin/env bash
set -euo pipefail
# Copiar archivos solo locales desde el checkout principal
cp "$SUPERDEV_MAIN_REPO/.env" .env 2>/dev/null || true
# Instalar dependencias (pnpm enlaza desde un store compartido, así que es rápido)
pnpm install --frozen-lockfile

Submódulos

git worktree add deja los submódulos vacíos. Si el worktree nuevo tiene un archivo .gitmodules, la app ejecuta en él git submodule update --init --recursive, para que ningún worker compile contra una dependencia que falta sin avisar.

Limpiar sin perder trabajo

Los worktrees se acumulan. La app los recupera, pero con cautela:

Cuándo se puede eliminar el worktree de un workerCuándo se puede eliminar el worktree de un worker
Cuándo se puede eliminar el worktree de un worker
El diagrama en texto
flowchart TD
  start["El worker ha terminado"] --> clean{"¿Árbol de trabajo limpio?"}
  clean -->|"no"| keep["El worktree se queda"]
  clean -->|"sí"| merged{"¿Rama fusionada en tu línea?"}
  merged -->|"no"| keep
  merged -->|"sí"| remove["Se elimina el worktree"]

Un worktree con cambios sin commitear, o con una rama que tiene trabajo que aún no está en tu línea, se queda donde está. Una carpeta borrada se puede recrear; el trabajo perdido, no. La misma cautela se aplica a las ramas: la app lleva la cuenta de las ramas que creó y solo toca esas.

Qué cambia para ti

Con cada worker en su propia rama, «ejecutar cuatro agentes a la vez» deja de ser una apuesta. Puedes:

  • dar al manager una directiva que se divide en tareas independientes y dejar que los workers trabajen en paralelo;
  • leer el diff de cualquier worker por separado, junto a la conversación que lo produjo;
  • rechazar el cambio de un worker sin molestar a los demás;
  • seguir usando tu checkout principal mientras el equipo trabaja.

Es la misma disciplina que usa un equipo humano, aplicada a agentes que no pueden avisarte de que están a punto de pisarse. Si te preguntas por qué construimos toda una app alrededor de esto, el primer artículo cuenta la historia.

Pruébalo

La prueba de 14 días es Premium, sin tarjeta. Descarga SuperDevSpace, apunta una organización nueva a un repositorio y mira cómo aparecen los worktrees a medida que el manager contrata a sus primeros workers.

SuperDevSpace

Escrito por el equipo que construye SuperDevSpace, una app de escritorio que pone a trabajar un equipo de agentes de código con IA sobre la suscripción de CLI que ya tienes.

Compartir

Recibe el e-mail de lanzamiento

Un solo e-mail cuando SuperDevSpace abra para todos. Primero confirmas la dirección desde tu bandeja de entrada; te das de baja con un clic.

Tu propio equipo de IA

SuperDevSpace funciona con la suscripción CLI que ya tienes. Prueba gratis de 14 días, sin tarjeta.

Prueba gratis

Sigue leyendo