360 lines
10 KiB
Markdown
360 lines
10 KiB
Markdown
---
|
|
version: 1.0.0
|
|
updated: 2026-03-11
|
|
tags: [issues, parallel, execution, automation, worktree, golang]
|
|
---
|
|
|
|
# Command: execute-parallel-issues
|
|
|
|
Ejecuta automáticamente las issues de un grupo paralelo del plan generado por `/issues:parallel`. Crea worktrees, ejecuta `/issues:fix-issue` en cada uno, mergea los cambios y limpia los worktrees al finalizar.
|
|
|
|
**Flujo completo:**
|
|
1. Validar que existe `PARALLEL_EXECUTION_ORDER.md`
|
|
2. Compilar programa Go si es necesario
|
|
3. Ejecutar el orquestador Go para el grupo especificado
|
|
4. El programa Go maneja:
|
|
- Creación de worktrees y ramas
|
|
- Ejecución paralela de `claude -p /issues:fix-issue`
|
|
- Push de cada rama al completar
|
|
- Limpieza de worktrees y ramas
|
|
- Logging estructurado en `logs/`
|
|
|
|
## Para el usuario
|
|
|
|
### Cuándo usar este comando
|
|
|
|
- Después de ejecutar `/issues:parallel` y revisar el plan
|
|
- Cuando quieres ejecutar issues automáticamente
|
|
- Para aprovechar la ejecución paralela de issues independientes
|
|
- Cuando prefieres automatización completa vs ejecutar manualmente cada issue
|
|
|
|
### Sintaxis
|
|
|
|
```bash
|
|
# Ejecutar TODOS los grupos secuencialmente (por defecto)
|
|
/issues:execute-parallel [--sequential]
|
|
|
|
# Ejecutar un grupo específico
|
|
/issues:execute-parallel --group <numero> [--sequential]
|
|
```
|
|
|
|
### Parámetros
|
|
|
|
- `--group <numero>` (opcional): Ejecutar solo un grupo específico (1, 2, 3, etc.). Si no se especifica, ejecuta TODOS los grupos.
|
|
- `--sequential` (opcional): Ejecutar issues una por una en vez de en paralelo
|
|
|
|
### Ejemplos
|
|
|
|
**Ejemplo 1: Ejecutar TODOS los grupos (comportamiento por defecto)**
|
|
|
|
```bash
|
|
/issues:execute-parallel
|
|
```
|
|
|
|
**Ejemplo 2: Ejecutar solo el Grupo 1**
|
|
|
|
```bash
|
|
/issues:execute-parallel --group 1
|
|
```
|
|
|
|
**Ejemplo 3: Ejecutar TODOS los grupos secuencialmente (sin paralelismo)**
|
|
|
|
```bash
|
|
/issues:execute-parallel --sequential
|
|
```
|
|
|
|
Comportamiento por defecto:
|
|
- Ejecuta todos los grupos secuencialmente: Grupo 1 → Grupo 2 → Grupo 3 → etc.
|
|
- Dentro de cada grupo, las issues se ejecutan en paralelo
|
|
- Genera resumen consolidado de TODOS los grupos al final
|
|
- Log detallado en `logs/consolidated-summary.txt`
|
|
|
|
## Para Claude
|
|
|
|
### Precondiciones
|
|
|
|
Verificar antes de ejecutar:
|
|
|
|
- [ ] Si no existe `PARALLEL_EXECUTION_ORDER.md`, generarlo automáticamente con `/issues:parallel`
|
|
- [ ] El usuario está en la rama correcta (usualmente `main`)
|
|
- [ ] No hay cambios sin commitear que puedan causar conflictos
|
|
|
|
### Inputs
|
|
|
|
**Por defecto, ejecuta TODOS los grupos automáticamente.** No es necesario preguntar al usuario.
|
|
|
|
Parámetros opcionales:
|
|
- `--group <numero>` (opcional): Ejecutar solo un grupo específico
|
|
- `--sequential` (opcional): Ejecutar secuencialmente en vez de en paralelo
|
|
|
|
**IMPORTANTE:** Si no se especifica `--group`, ejecuta todos los grupos automáticamente.
|
|
|
|
### Flujo obligatorio
|
|
|
|
#### 1. Validar precondiciones
|
|
|
|
```bash
|
|
# Verificar que existe el plan, si no existe, generarlo automáticamente
|
|
if [ ! -f "PARALLEL_EXECUTION_ORDER.md" ]; then
|
|
echo "📋 PARALLEL_EXECUTION_ORDER.md no existe, generando plan automáticamente..."
|
|
echo ""
|
|
|
|
# Ejecutar /issues:parallel para generar el plan
|
|
claude -p /issues:parallel
|
|
|
|
# Verificar que se generó correctamente
|
|
if [ ! -f "PARALLEL_EXECUTION_ORDER.md" ]; then
|
|
echo "❌ Error: No se pudo generar PARALLEL_EXECUTION_ORDER.md"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "✓ Plan de ejecución generado exitosamente"
|
|
echo ""
|
|
fi
|
|
|
|
# Verificar que no hay cambios sin commitear (solo advertir, no bloquear)
|
|
UNCOMMITTED=$(git status --porcelain | wc -l)
|
|
if [ "$UNCOMMITTED" -gt 0 ]; then
|
|
echo "⚠️ Advertencia: Hay cambios sin commitear"
|
|
git status --short
|
|
echo ""
|
|
echo "Continuando de todas formas..."
|
|
echo ""
|
|
fi
|
|
```
|
|
|
|
#### 2. Parsear argumentos
|
|
|
|
```bash
|
|
# Por defecto ejecutar todos los grupos
|
|
GRUPO=""
|
|
ALL_GROUPS=true
|
|
SEQUENTIAL=false
|
|
|
|
# Parsear argumentos
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--group)
|
|
if [ -z "$2" ] || [[ ! "$2" =~ ^[0-9]+$ ]]; then
|
|
echo "Error: --group requiere un número"
|
|
exit 1
|
|
fi
|
|
GRUPO=$2
|
|
ALL_GROUPS=false
|
|
shift 2
|
|
;;
|
|
--sequential)
|
|
SEQUENTIAL=true
|
|
shift
|
|
;;
|
|
*)
|
|
echo "Error: Flag desconocido '$1'"
|
|
echo "Uso: /issues:execute-parallel [--group <numero>] [--sequential]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
```
|
|
|
|
#### 3. Ejecutar programa Go
|
|
|
|
```bash
|
|
echo ""
|
|
|
|
# Mensaje de inicio
|
|
if [ "$ALL_GROUPS" = true ]; then
|
|
echo "🚀 Iniciando ejecución de TODOS los grupos secuencialmente"
|
|
else
|
|
echo "🚀 Iniciando ejecución paralela del Grupo $GRUPO"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# Construir argumentos para el programa Go
|
|
if [ "$ALL_GROUPS" = true ]; then
|
|
ARGS="--all-groups"
|
|
else
|
|
ARGS="--group $GRUPO"
|
|
fi
|
|
|
|
if [ "$SEQUENTIAL" = true ]; then
|
|
ARGS="$ARGS --sequential"
|
|
fi
|
|
|
|
# Ejecutar el orquestador
|
|
./cmd/parallel-executor/parallel-executor $ARGS
|
|
|
|
EXIT_CODE=$?
|
|
|
|
# Verificar resultado
|
|
if [ $EXIT_CODE -eq 0 ]; then
|
|
echo ""
|
|
echo "✓ Ejecución completada exitosamente"
|
|
echo ""
|
|
|
|
if [ "$ALL_GROUPS" = true ]; then
|
|
echo "Logs guardados en:"
|
|
echo " - logs/parallel-execution-*.log (logs individuales)"
|
|
echo " - logs/consolidated-summary.txt (resumen consolidado)"
|
|
else
|
|
echo "Logs guardados en: logs/parallel-execution-*.log"
|
|
fi
|
|
|
|
# Eliminar el archivo PARALLEL_EXECUTION_ORDER.md después de ejecución exitosa
|
|
if [ -f "PARALLEL_EXECUTION_ORDER.md" ]; then
|
|
rm -f PARALLEL_EXECUTION_ORDER.md
|
|
echo ""
|
|
echo "✓ Plan de ejecución eliminado (PARALLEL_EXECUTION_ORDER.md)"
|
|
fi
|
|
else
|
|
echo ""
|
|
echo "❌ Ejecución falló con código $EXIT_CODE"
|
|
echo ""
|
|
echo "Revisa los logs para más detalles:"
|
|
echo " ls -lt logs/parallel-execution-*.log | head -1"
|
|
exit $EXIT_CODE
|
|
fi
|
|
```
|
|
|
|
#### 4. Mostrar resumen
|
|
|
|
```bash
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Resumen de ejecución:"
|
|
echo ""
|
|
|
|
# El programa Go debe generar un archivo de resumen
|
|
if [ -f "logs/last-execution-summary.txt" ]; then
|
|
cat logs/last-execution-summary.txt
|
|
fi
|
|
|
|
echo ""
|
|
echo "Estado de worktrees:"
|
|
git worktree list | grep -v "(bare)" || echo " (ninguno - todos limpiados)"
|
|
|
|
echo ""
|
|
echo "Próximos pasos:"
|
|
echo " 1. Verificar que todas las issues fueron mergeadas"
|
|
if [ "$ALL_GROUPS" = false ]; then
|
|
echo " 2. Si el Grupo $GRUPO fue exitoso, ejecutar siguiente grupo"
|
|
fi
|
|
echo " 3. Si hubo errores, revisar logs y reintentar"
|
|
```
|
|
|
|
### Arquitectura del programa Go
|
|
|
|
El comando invoca un programa Go en `cmd/parallel-executor/` con la siguiente estructura:
|
|
|
|
```
|
|
cmd/parallel-executor/
|
|
├── main.go → Entry point, parseo de CLI
|
|
├── parser.go → Parse PARALLEL_EXECUTION_ORDER.md
|
|
├── worktree.go → Git worktree operations (shell layer)
|
|
├── executor.go → Execute claude commands (shell layer)
|
|
├── logger.go → Structured logging
|
|
├── orchestrator.go → Orchestration logic con goroutines
|
|
└── types.go → Estructuras de datos (core types)
|
|
```
|
|
|
|
**Responsabilidades del programa Go:**
|
|
|
|
1. **Parser** (`parser.go`):
|
|
- Leer `PARALLEL_EXECUTION_ORDER.md`
|
|
- Extraer issues del grupo especificado
|
|
- Parsear archivos afectados, dependencias, etc.
|
|
|
|
2. **Worktree Manager** (`worktree.go`):
|
|
- Crear worktrees: `git worktree add worktrees/issue-NNNN -b issue/NNNN-slug`
|
|
- Eliminar worktrees después de merge
|
|
- Verificar estado de worktrees
|
|
|
|
3. **Executor** (`executor.go`):
|
|
- Ejecutar `claude -p /issues:fix-issue NNNN` en cada worktree
|
|
- Capturar output en tiempo real
|
|
- Detectar éxito/fallo del comando
|
|
- Ejecutar `/git:push` al completar exitosamente
|
|
|
|
4. **Logger** (`logger.go`):
|
|
- Logging estructurado con timestamps
|
|
- Archivo por ejecución: `logs/parallel-execution-YYYYMMDD-HHMMSS.log`
|
|
- Output a consola + archivo simultáneamente
|
|
- Niveles: INFO, WARN, ERROR, SUCCESS
|
|
|
|
5. **Orchestrator** (`orchestrator.go`):
|
|
- Coordinar goroutines para ejecución paralela
|
|
- Manejar canales de comunicación entre workers
|
|
- Recolectar resultados y errores
|
|
- Implementar timeout por issue (configurable)
|
|
- Rollback en caso de fallo crítico
|
|
|
|
**Flujo del programa Go:**
|
|
|
|
```
|
|
1. Parse CLI args (grupo, flags)
|
|
2. Parse PARALLEL_EXECUTION_ORDER.md
|
|
3. Extraer issues del grupo especificado
|
|
4. Para cada issue en el grupo:
|
|
4.1. Crear worktree + rama
|
|
4.2. En el worktree:
|
|
→ cd worktrees/issue-NNNN
|
|
→ claude -p /issues:fix-issue NNNN
|
|
→ Esperar a que termine
|
|
→ Si exitoso: ejecutar /git:push
|
|
→ Si fallo: reportar error y continuar
|
|
4.3. Limpiar worktree y rama
|
|
5. Generar resumen de ejecución
|
|
6. Return exit code (0 si todo OK, 1 si hubo errores)
|
|
```
|
|
|
|
### Verificación final
|
|
|
|
El programa Go se encarga de limpiar los worktrees automáticamente. El resumen final mostrará el estado de todas las ejecuciones.
|
|
|
|
## Convenciones
|
|
|
|
- **Logs persistentes:** Cada ejecución genera un archivo en `logs/parallel-execution-YYYYMMDD-HHMMSS.log`
|
|
- **Resumen ejecutivo:** Archivo `logs/last-execution-summary.txt` con métricas clave
|
|
- **Timeouts:** 30 minutos por issue por defecto (configurable en código Go)
|
|
- **Paralelismo:** Por defecto ejecuta issues en paralelo con `runtime.NumCPU()` goroutines
|
|
- **Limpieza automática:** Siempre limpia worktrees al terminar (éxito o fallo)
|
|
- **Eliminación del plan:** El archivo `PARALLEL_EXECUTION_ORDER.md` se elimina automáticamente al completar exitosamente
|
|
|
|
## Troubleshooting
|
|
|
|
### Error: "No existe PARALLEL_EXECUTION_ORDER.md"
|
|
|
|
**Causa:** No se ha generado el plan de ejecución paralela
|
|
|
|
**Solución:**
|
|
El comando genera automáticamente el plan si no existe. Si este error persiste:
|
|
```bash
|
|
/issues:parallel
|
|
```
|
|
|
|
### Advertencia: "Quedaron N worktrees sin limpiar"
|
|
|
|
**Causa:** Alguna issue falló y el worktree no pudo ser limpiado
|
|
|
|
**Solución:**
|
|
```bash
|
|
# Revisar el error en los logs
|
|
cat logs/parallel-execution-*.log | grep ERROR
|
|
|
|
# Limpiar manualmente
|
|
/workspace:cleanup-worktrees --all
|
|
```
|
|
|
|
## Reglas críticas
|
|
|
|
- **SIEMPRE generar plan automáticamente** si no existe `PARALLEL_EXECUTION_ORDER.md`
|
|
- **SIEMPRE ejecutar todos los grupos por defecto** - no preguntar al usuario
|
|
- **SOLO advertir si hay cambios sin commitear** - nunca bloquear la ejecución
|
|
- **SIEMPRE capturar logs** en archivo persistente
|
|
- **SIEMPRE limpiar worktrees** incluso si hubo errores (usar defer en Go)
|
|
- **NUNCA bloquear indefinidamente** - implementar timeouts razonables
|
|
- **SIEMPRE reportar progreso** en tiempo real
|
|
- **SIEMPRE eliminar el plan** después de ejecución exitosa
|
|
- **VERIFICAR estado de git** antes de la ejecución (solo advertencia, no bloqueante)
|