⚙️ 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
- Generación de Hooks: Crea scripts de shell para cada tipo de hook
- Integración de Herramientas: Se integra con ESLint, Prettier, Jest
- Coincidencia de Patrones: Configura regex para validación de commits
- Configuración de Permisos: Hace los hooks ejecutables
- 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