⚙️ Automatización

Configuración de Git Hooks

Configure Git hooks para verificaciones automáticas de calidad de código y cumplimiento de flujos de trabajo

★★★ Avanzado 25 min 13 de enero de 2025

Caso de Uso

Los Git hooks automatizan las verificaciones de calidad antes de commits y pushes. Cowork puede generar hooks personalizados para linting, pruebas, validación de mensajes de commit y más.

Ejemplo de Prompt

Quiero configurar Git hooks para mi proyecto JavaScript en ~/Projects/myapp/. Por favor, cree:

1. Hook pre-commit:
   - Ejecutar ESLint en archivos preparados
   - Ejecutar verificación de formato con Prettier
   - Prevenir commits con console.log

2. Hook commit-msg:
   - Aplicar formato de conventional commits
   - Requerir referencia de ticket (PROJ-XXX)

3. Hook pre-push:
   - Ejecutar suite completa de pruebas
   - Verificar comentarios TODO/FIXME
   - Prevenir push directo a main sin PR

Guarde los hooks en .git/hooks/ y hágalos ejecutables

Qué Hace Cowork

  1. Generación de Hooks: Crea scripts de shell para cada tipo de hook
  2. Integración de Herramientas: Se integra con ESLint, Prettier, Jest
  3. Coincidencia de Patrones: Configura regex para validación de commits
  4. Configuración de Permisos: Hace los hooks ejecutables
  5. Documentación: Agrega instrucciones de uso

Salida de Ejemplo

#!/bin/sh
# .git/hooks/pre-commit

echo "🔍 Ejecutando verificaciones pre-commit..."

# Obtener archivos preparados
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|jsx|tsx)$')

if [ -z "$STAGED_FILES" ]; then
    echo "No hay archivos JS/TS para verificar"
    exit 0
fi

# Verificar console.log
echo "Buscando declaraciones console.log..."
if grep -n "console\.log" $STAGED_FILES; then
    echo "❌ Error: se encontró console.log en archivos preparados"
    echo "Elimine o reemplace con logging apropiado"
    exit 1
fi

# Ejecutar ESLint
echo "Ejecutando ESLint..."
npx eslint $STAGED_FILES
if [ $? -ne 0 ]; then
    echo "❌ ESLint falló"
    exit 1
fi

# Ejecutar verificación de Prettier
echo "Verificando formato..."
npx prettier --check $STAGED_FILES
if [ $? -ne 0 ]; then
    echo "❌ Se encontraron problemas de formato"
    echo "Ejecute: npx prettier --write <archivos>"
    exit 1
fi

echo "✅ ¡Verificaciones pre-commit pasaron!"
exit 0
#!/bin/sh
# .git/hooks/commit-msg

COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

# Patrón de conventional commit
PATTERN="^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\([a-z-]+\))?: .+"

# Patrón de referencia de ticket
TICKET_PATTERN="PROJ-[0-9]+"

if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
    echo "❌ Formato de mensaje de commit inválido"
    echo ""
    echo "Formato esperado: tipo(alcance): descripción"
    echo "Tipos: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert"
    echo ""
    echo "Ejemplo: feat(auth): agregar soporte OAuth2 PROJ-123"
    exit 1
fi

if ! echo "$COMMIT_MSG" | grep -qE "$TICKET_PATTERN"; then
    echo "❌ Falta referencia de ticket (PROJ-XXX)"
    exit 1
fi

echo "✅ Mensaje de commit validado"
exit 0
#!/bin/sh
# .git/hooks/pre-push

BRANCH=$(git rev-parse --abbrev-ref HEAD)

# Prevenir push directo a main
if [ "$BRANCH" = "main" ]; then
    echo "❌ No se puede hacer push directo a main"
    echo "Cree un PR en su lugar"
    exit 1
fi

# Ejecutar pruebas
echo "🧪 Ejecutando pruebas..."
npm test
if [ $? -ne 0 ]; then
    echo "❌ Las pruebas fallaron"
    exit 1
fi

# Verificar TODO/FIXME
echo "Buscando TODO/FIXME..."
if git diff origin/main...HEAD | grep -E "TODO|FIXME"; then
    echo "⚠️  Advertencia: se encontraron comentarios TODO/FIXME"
    read -p "¿Continuar de todos modos? (y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

echo "✅ ¡Verificaciones pre-push pasaron!"
exit 0

Consejos

  • Use husky o lefthook para facilitar la gestión de hooks
  • Incluya instrucciones de bypass para emergencias
  • Mantenga los hooks rápidos para evitar frustración
  • Considere compartir hooks en todo el equipo mediante npm