UNPKG

claude-git-hooks

Version:

Git hooks with Claude CLI for code analysis and automatic commit messages

849 lines (631 loc) 31.9 kB
# Pre-commit Hook con Claude CLI 🚀 **Transforma tu flujo de desarrollo con IA**: análisis de código instantáneo, mensajes de commit automáticos y generación de PRs perfectas. Claude revisa tu código antes de cada commit, detecta issues críticos con análisis estructurado, y genera toda la documentación que necesitas. ¿Lo mejor? Se ejecuta localmente sin contaminar tu CI/CD. ## ✨ Novedad v2.7.1 - Improved Reliability **Nuevo v2.7.1**: Sistema de reintentos automáticos para errores transitorios de Claude API. Cuando Claude devuelve "Execution error" (típicamente por rate limiting), el sistema ahora reintenta automáticamente después de 2 segundos. ## ✨ Novedad v2.0.0 - Ahora Cross-Platform **¡Nueva arquitectura!** Migración completa a Node.js con ES6 modules para soporte más universal: -**Windows** - Git en Bash y Powershell -**WSL** - Subsistema de Linux -**Linux** - Funcionamiento nativo -**Worktrees** - Compatible con git worktrees en cualquier entorno -**IDEs** - Compatible con git manager de IntelliJ and VSCode -> mensaje de commit "auto" committea (y pushea si se quiere) con mensaje automático. Si el commit tiene problemas, se bloquea. ## 🎯 Características principales - 🔍 **Análisis de código pre-commit**: Detecta issues críticos antes de que lleguen al repo - 💬 **Mensajes de commit automáticos**: Escribe "auto" y Claude genera el mensaje con task-id (Jira, GitHub, Linear) - 📋 **Generación de PRs**: Análisis de diff y metadata automática con un comando - 🔗 **Creación de PRs en GitHub**: Claude genera metadata, Octokit crea el PR (determinista) - v2.5.0+ - 🎯 **Presets por tech-stack**: 6 configuraciones optimizadas (backend, frontend, fullstack, database, ai, default) - v2.3.0+ - 🚀 **Parallel Analysis**: Multiple Claude CLI processes analyzing file batches simultaneously (v2.2.0+) - 🔄 **Auto-actualización**: Se mantiene actualizado automáticamente - 🌍 **Cross-platform**: Windows, WSL, macOS, Linux sin configuración especial - ♻️ **Reintentos automáticos**: Recuperación automática de errores transitorios de API (v2.7.1+) ## 📋 CHEATSHEET ### 🚀 Comandos Frecuentes ```bash # Commit rápido sin análisis + mensaje automático git commit --no-verify -m "auto" # Analizar diferencias con origin de la rama actual claude-hooks analyze-diff # Analizar diferencias para PR (comparar con origin/develop) claude-hooks analyze-diff develop # Crear PR en GitHub con metadata automática (v2.5.0+) claude-hooks create-pr develop # Configurar token de GitHub para PRs (v2.5.0+) claude-hooks setup-github # Reinstalar durante desarrollo (después de npm link) claude-hooks install --force --skip-auth # Listar presets claude-hooks presets # Seleccionar preset claude-hooks --set-preset <name> # Mostrar preset actual claude-hooks preset current # Activar modo debug claude-hooks --debug true # Ver estado de debug claude-hooks --debug status # Ver estadísticas de telemetría (v2.9.0+, habilitada por defecto) claude-hooks telemetry show # Limpiar datos de telemetría (v2.9.0+) claude-hooks telemetry clear ``` ### 📦 Instalación y Gestión**v2.0.0+**: Funciona terminales WSL y Bash. Se debe instalar el paquete globalmente, para luego gestionarlo localmente en cada repositorio. ```bash # Instalar globalmente (desde cualquier terminal) npm install -g claude-git-hooks # Luego en cada proyecto cd /tu/proyecto claude-hooks install # Actualizar a última versión claude-hooks update # Desinstalar hooks claude-hooks uninstall # Ver estado actual claude-hooks status # Desactivar temporalmente claude-hooks disable # Reactivar hooks claude-hooks enable ``` ### 💻 Flujos de Commit ```bash # Commit con análisis de código git commit -m "feat: nueva funcionalidad" # Generar mensaje automático con task-id (v2.5.0+) # Branch: feature/IX-123-add-auth → detecta IX-123 git commit -m "auto" # Resultado: [IX-123] feat: add user authentication # Branch: feature/471459f-test → NO detecta (hash, no task-id) git commit -m "auto" # Resultado: feat: add test feature (sin task-id) # Saltar análisis (emergencias) git commit --no-verify -m "hotfix: corrección urgente" # Modificar último commit git commit --amend ``` ## 🚀 Quick Setup: GitHub PR Creation Para usar `create-pr` necesitas configurar autenticación con GitHub: ### 1. Ejecuta el setup wizard ```bash claude-hooks setup-github ``` El comando verificará tu token o te guiará a configurarlo. ### 2. Opciones de configuración del token **Opción A - Settings local (recomendado):** ```bash # Crear .claude/settings.local.json cat > .claude/settings.local.json << 'EOF' { "githubToken": "ghp_tu_token_aqui" } EOF ``` **Opción B - Variable de entorno:** ```bash export GITHUB_TOKEN="ghp_tu_token_aqui" # o export GITHUB_PERSONAL_ACCESS_TOKEN="ghp_tu_token_aqui" ``` **Opción C - Claude Desktop config** (auto-detectado si existe) ### 3. Crear GitHub token 1. Ir a https://github.com/settings/tokens 2. "Generate new token (classic)" 3. Scopes requeridos: **repo** (all) + **read:org** 4. Copiar token (empieza con `ghp_`) ### 4. Configurar reviewers y labels (opcional) ```bash # Ver .claude/config_example/ para más ejemplos cat > .claude/config.json << 'EOF' { "version": "2.8.0", "preset": "backend", "overrides": { "github": { "pr": { "defaultBase": "develop", "reviewers": ["tu-usuario-github", "teammate"], "labelRules": { "backend": ["backend", "java"], "frontend": ["frontend", "react"] } } } } } EOF ``` **Nota:** Los reviewers también se detectan automáticamente desde CODEOWNERS si existe. ### 5. Crear tu primer PR ```bash git checkout -b feature/mi-feature # ... hacer cambios ... git add . git commit -m "feat: nueva funcionalidad" git push -u origin feature/mi-feature # Crear PR claude-hooks create-pr develop ``` **Arquitectura:** Claude analiza el diff y genera metadata (título, descripción, reviewers, labels) → Octokit crea el PR de forma determinista. Ver `templates/config.github.example.json` para configuración avanzada (reviewer rules por path, custom labels, etc.). --- ## 📆 Próximos Desarrollos Toda idea es bienvenida, aunque parezca espantosa. Si hay bugs, incluirlos también. Dónde? en https://github.com/mscope-S-L/git-hooks/issues/new. ### 🔧 Configuración Avanzada (v2.8.0+) ```bash # Configuración vía .claude/config.json (v2.8.0+) .claude/ ├── config.json # Configuración principal (formato simplificado) ├── config_example/ # Ejemplos de configuración │ ├── config.example.json # Configuración básica │ └── config.advanced.example.json # Parámetros avanzados └── prompts/ # Templates de prompts (v2.8.0+) ├── CLAUDE_PRE_COMMIT.md # Criterios de análisis └── CLAUDE_ANALYSIS_PROMPT.md # Template del prompt # Ejemplo de config.json v2.8.0 (formato simplificado) cat > .claude/config.json << 'EOF' { "version": "2.8.0", "preset": "backend", "overrides": { "github": { "pr": { "defaultBase": "main", "reviewers": ["tech-lead"] } }, "subagents": { "batchSize": 2 } } } EOF # Para configuración avanzada, consultar: # .claude/config_example/config.advanced.example.json # Personalizar patrón de task-id # Default: 1-3 letras + separador + 3-5 dígitos # Ejemplos válidos: ABC-12345, IX-123, DE 4567 # No detecta: 471459f (hash), ABCD-123 (4 letras), IX-12 (2 dígitos) ``` #### 🎯 Presets Disponibles | Preset | Extensiones de Archivo | Caso de Uso | Tech Stack | | ------------- | -------------------------------------------------------------------------- | ----------------- | ---------------------------- | | **backend** | `.java`, `.xml`, `.yml`, `.yaml` | APIs Spring Boot | Spring Boot, JPA, SQL Server | | **frontend** | `.js`, `.jsx`, `.ts`, `.tsx`, `.css`, `.scss`, `.html` | Apps React | React, Redux, Material-UI | | **fullstack** | Todos backend + frontend | Apps full-stack | Spring Boot + React | | **database** | `.sql` | Scripts de BD | SQL Server, T-SQL | | **ai** | `.js`, `.json`, `.md`, `.sh` | Herramientas CLI | Node.js, Claude API | | **default** | `.js`, `.sh`, `.py`, `.rb`, `.pl`, `.sql`, `.yaml`, `.json`, `.xml`, `.md` | Propósito general | Lenguajes mixtos | --- #### 🔍 Qué Verifica Cada Preset **Backend (Spring Boot + SQL Server)** - ✅ Diseño de API REST y métodos HTTP - ✅ Entidades JPA y repositorios - ✅ Seguridad (OWASP Top 10) - ✅ Prevención de inyección SQL - ✅ Gestión de transacciones - ✅ Mapeos DTO - ✅ Mejores prácticas Spring Security **Frontend (React + Material-UI)** - ✅ Mejores prácticas de hooks React - ✅ Diseño de componentes y reusabilidad - ✅ Patrones de gestión de estado - ✅ Prevención XSS - ✅ Optimización de rendimiento - ✅ Accesibilidad (a11y) - ✅ Error boundaries **Fullstack (Spring Boot + React)** -**Consistencia de contrato API** (prioridad) - ✅ Flujo de datos (BD → API → UI) - ✅ Autenticación entre capas - ✅ Consistencia en manejo de errores - ✅ Todas las verificaciones backend - ✅ Todas las verificaciones frontend **Database (SQL Server)** - ✅ Riesgos de inyección SQL - ✅ UPDATE/DELETE sin WHERE - ✅ Índices faltantes - ✅ Rendimiento de consultas - ✅ Manejo de transacciones - ✅ Restricciones de integridad de datos **AI (Node.js + Claude)** - ✅ Mejores prácticas Claude API - ✅ Calidad de ingeniería de prompts - ✅ Experiencia de usuario CLI - ✅ Seguridad de operaciones Git - ✅ Compatibilidad multiplataforma - ✅ Protección de API key **Default (Propósito general)** - ✅ Fundamentos de calidad de código - ✅ Fundamentos de seguridad - ✅ Manejo de errores - ✅ Mejores prácticas por lenguaje - ✅ Mantenibilidad --- ##### ⚙️ Prioridad de Configuración ``` defaults (lib/config.js) ↓ user config (.claude/config.json) ← General preferences ↓ preset config (.claude/presets/{name}/config.json) ← MÁXIMA PRIORIDAD (tech-stack specific) ``` **Rationale**: User sets general preferences, preset provides tech-stack-specific overrides. **Nota v2.2.0+:** Variables de entorno ya NO son soportadas. Usar `.claude/config.json` en su lugar. ### 🎯 Casos de Uso Específicos ```bash # Desarrollo local de claude-hooks cd /path/to/claude-git-hooks npm link cd /path/to/your-project claude-hooks install --force --skip-auth # Preparar PR hacia develop git checkout -b feature/nueva-funcionalidad # ... hacer cambios ... git add . git commit -m "feat: implementar nueva funcionalidad" claude-hooks analyze-diff develop # Genera título, descripción y tests # Resolver issues bloqueantes git commit -m "fix: resolver issues" # Si falla, ver claude_resolution_prompt.md generado # Copiar contenido y pegar en Claude para obtener solución ``` ### ⚡ Tips y Trucos 1. **Mensaje automático**: Usa `"auto"` como mensaje para que Claude lo genere con task-id automático 2. **Task-ID pattern**: Default 1-3 letras + separador + 3-5 dígitos (ABC-12345, IX-123). Configurable en `.claude/config_example/config.advanced.example.json` 3. **Skip auth**: Usa `--skip-auth` en CI/CD o desarrollo local 4. **Force install**: Usa `--force` para reinstalar sin confirmación 5. **Debug**: Activa con `claude-hooks --debug true` 6. **Archivos grandes**: Se omiten automáticamente archivos > 1MB (hardcoded desde v2.8.0) 7. **Límite de archivos**: Máximo 20 archivos por commit (hardcoded desde v2.8.0) ### 🚀 Parallel Analysis (Enabled by default desde v2.8.0) **When analyzing 3+ files**, parallel execution runs multiple Claude CLI processes simultaneously for faster analysis. **Configuración automática (hardcoded):** -**Enabled**: `true` (siempre activo) -**Model**: `haiku` (rápido y económico) - 📦 **BatchSize**: `3` files per batch (puede overridearse) **Customizar batch size (opcional):** ```bash # En .claude/config.json v2.8.0 { "version": "2.8.0", "preset": "backend", "overrides": { "subagents": { "batchSize": 2 } } } ``` **Model options (solo en config avanzado):** - `haiku` - Fast & cheap (default) - `sonnet` - Balanced quality/speed - `opus` - Maximum quality (slower) **How batching works:** - Files are split into batches of size `batchSize` - Each batch runs in a separate Claude CLI process - All batches execute in parallel (true OS-level parallelism) - Results are consolidated automatically **Examples with 4 files:** - `batchSize: 1` → 4 parallel Claude processes (1 file each) - **fastest** - `batchSize: 2` → 2 parallel Claude processes (2 files each) - **balanced** - `batchSize: 4` → 1 process (all files) - no parallelization **Speed improvement:** - Sequential: 60s per file × 4 = 240s total - Parallel (batch=1): max(60s) = 60s total ✅ **4x faster** **Console output:** ``` 🚀 PARALLEL EXECUTION: 4 Claude processes ⚡ Launching batch 1/4... ⚡ Launching batch 2/4... ⚡ Launching batch 3/4... ⚡ Launching batch 4/4... ⏳ Waiting for all batches to complete... ✅ PARALLEL EXECUTION COMPLETE: 4 results in 62.5s ``` **Best for:** Large commits (3+ files), refactoring, multi-file features ### 🎨 Personalización y Customización **Archivos clave para modificar:** - `.claude/config.json` - Configuración principal (v2.8.0+) - `.claude/prompts/CLAUDE_PRE_COMMIT.md` - Criterios (backend/frontend/data/db) - `.claude/prompts/CLAUDE_ANALYSIS_PROMPT.md` - Template del prompt **Crear o modificar presets personalizados:** ```bash # Ver guía completa de customización cat templates/CUSTOMIZATION_GUIDE.md # O en GitHub # https://github.com/pablorovito/claude-git-hooks/blob/main/templates/CUSTOMIZATION_GUIDE.md ``` **Ejemplo:** ```bash vim .claude/prompts/CLAUDE_PRE_COMMIT.md # Agregar reglas API REST/Spring Boot ``` ## 🔧 Configuración Previa Importante ### Requisitos del Sistema**v2.0.0+**: Los hooks funcionan en cualquier terminal donde tengas: - **Node.js** >= 16.9.0 - **Git** configurado - **Claude CLI** instalado y autenticado 🆕 **v2.6.0+**: Totalmente compatible con Node.js 24 ### Credenciales Git Si es tu primera vez configurando git en esta terminal, configura tus credenciales: ```bash git config --global user.name "Tu Nombre" git config --global user.email "tu.email@ejemplo.com" # Si usas credential helper (opcional) git config --global credential.helper store ``` ## 🚀 Instalación**v2.0.0+**: Instalación cross-platform. Funciona en PowerShell, CMD, WSL, macOS Terminal, Linux shell. ```bash # Instalar el paquete globalmente npm install -g claude-git-hooks # En cualquier repositorio, instalar los hooks cd tu-proyecto claude-hooks install ``` El comando `claude-hooks install` incluye: - ✅ Verificación completa de dependencias del sistema (Node.js, Git, Claude CLI) - ✅ Verificación de autenticación Claude con entretenimiento (omitible con `--skip-auth`) - ✅ Instalación de hooks con arquitectura bash wrapper + Node.js - ✅ Instalación de archivos de pautas y templates - ✅ Actualización automática de .gitignore con archivos de Claude **Nuevo en v2.0.0 - Soporte Cross-Platform:** Auto-detecta plataforma, convierte CRLF→LF en install, busca Claude en WSL (Windows), instala bash wrappers que convierten rutas C:\ a /c/ **Opciones de instalación:** - `--force`: Reinstala aunque los hooks ya existan - `--skip-auth`: Omite la verificación de autenticación de Claude (útil para CI/CD) ## 📁 Gestión de Archivos ### Archivos creados durante la instalación El comando `claude-hooks install` crea los siguientes archivos y directorios: 1. **`.git/hooks/pre-commit`** - Hook de análisis de código 2. **`.git/hooks/prepare-commit-msg`** - Hook de generación de mensajes 3. **`.git/hooks/check-version.sh`** - Script de verificación de versión 4. **`.claude/`** - Directorio para archivos de configuración - `CLAUDE_PRE_COMMIT.md` - Criterios de evaluación de calidad - `CLAUDE_ANALYSIS_PROMPT.md` - Template de prompt para análisis - `CLAUDE_RESOLUTION_PROMPT.md` - Template para prompt de resolución AI ### Actualización automática de .gitignore Durante la instalación, Claude Hooks actualiza automáticamente tu `.gitignore` para incluir: ```gitignore # Claude Git Hooks .claude/ ``` Esto asegura que: - Los archivos de configuración de Claude específicos del proyecto no se suban al repositorio - Los archivos de debug temporales se ignoren - Cada desarrollador pueda tener sus propias preferencias de análisis Si no existe un `.gitignore`, se creará uno nuevo. Si ya existe, las entradas se agregarán al final solo si no están presentes. ## 🎯 Funcionamiento ### Hook pre-commit (Análisis de código) 1. **Intercepta cada intento de commit** 2. **Extrae y filtra archivos modificados**: - Solo analiza: Java, XML, properties, yml, yaml - Omite archivos mayores a 1MB - Límite de 30 archivos por commit 3. **Construye prompt inteligente**: - Usa template de prompt desde `.claude/prompts/CLAUDE_ANALYSIS_PROMPT*.md` - Lee las pautas desde `.claude/prompts/CLAUDE_PRE_COMMIT*.md` - Incluye el diff completo para archivos nuevos - Muestra solo cambios para archivos existentes 4. **Envía a Claude CLI para revisión** 5. **Procesa respuesta JSON estructurada**: - blockingIssues siempre como objetos con localización precisa - verifica `QUALITY_GATE`, muestra métricas y issues por severidad 6. **Decisión final**: - Si hay problemas críticos → genera prompt AI de resolución y bloquea commit - Si todo está bien → commit procede 7. **Generación de Prompt de Resolución AI** (opcional): Cuando se detectan problemas críticos: - Se genera automáticamente un archivo `claude_resolution_prompt.md` - Contiene información estructurada y AI-friendly de todos los issues - Incluye localización precisa (archivo, línea, método) - Puede copiarse a otra instancia de Claude para resolución automática ### Hook prepare-commit-msg (Generación automática de mensajes) 1. **Se activa cuando el mensaje es**: - `"auto"` 2. **Analiza los cambios del staging area**: - Lista archivos modificados con estadísticas - Incluye diffs completos para archivos < 1MB 3. **Genera mensaje en formato Conventional Commits**: - Determina tipo: feat, fix, docs, style, refactor, test, chore - Crea título conciso y descriptivo - Añade body con detalles si es necesario 4. **Manejo de errores**: - Si falla la generación → cancela el commit completamente - No usa mensajes genéricos de fallback ### Características adicionales - **Generación de información para Pull Requests**: `claude-hooks analyze-diff [branch]` para comparar rama local con rama origin, propone nombre para rama actual, título y detalles para pull request, da tips para verificar trabajo. Si se especifica branch, compara con origin/branch. Si no, compara con origin de la rama actual. Este comando genera automáticamente: - 📝 Título de PR conciso (máx. 72 caracteres) - 📄 Descripción detallada con markdown - 🌿 Nombre de rama sugerido (formato: tipo/descripcion) - 📋 Tipo de cambio (feature/fix/refactor/docs/test/chore) - ⚠️ Indicador de breaking changes - 🧪 Notas de testing recomendado - 📝 Archivo `.claude-pr-analysis.json` - **Creación de PRs en GitHub (v2.5.0+)**: `claude-hooks create-pr [branch]` crea pull requests directamente en GitHub vía MCP. Extrae task-id de branch, genera metadata con Claude, detecta reviewers desde CODEOWNERS o config, aplica labels por preset, y muestra preview interactivo antes de crear - **Auto-actualización**: Verificación automática de versiones antes de cada commit con prompt interactivo para actualizar - **Comando update**: `claude-hooks update` para actualizar manualmente a la última versión - **Modo debug**: `claude-hooks --debug true` activa logging detallado para troubleshooting - **Análisis de PR**: Nuevo comando `analyze-diff` para generar información de Pull Requests - **Validación de dependencias**: Verifica que Claude CLI esté autenticado antes de ejecutar ### Desactivar/Activar hooks ```bash # Desactivar todos los hooks claude-hooks disable # Desactivar un hook específico claude-hooks disable pre-commit claude-hooks disable prepare-commit-msg # Habilitar todos los hooks claude-hooks enable # Habilitar un hook específico claude-hooks enable pre-commit claude-hooks enable prepare-commit-msg # Ver estado actual claude-hooks status ``` ## ⚙️ Configuración ### Scripts**v2.0.0+**: Configuración en archivos Node.js dentro de `lib/hooks/`. En `lib/hooks/pre-commit.js`: - **`MAX_FILE_SIZE`**: Tamaño máximo de archivo a analizar (default: 1MB) - **`MAX_FILES`**: Número máximo de archivos por commit (default: 30) - **`ALLOWED_EXTENSIONS`**: Extensiones permitidas (default: .java, .xml, .properties, .yml, .yaml) En `lib/hooks/prepare-commit-msg.js`: - **`MAX_FILE_SIZE`**: Tamaño máximo para incluir diff completo (default: 1MB) ### Pautas de Evaluación - **`CLAUDE_PRE_COMMIT.md`** - Criterios de evaluación de calidad ### Templates de Prompts - **`CLAUDE_ANALYSIS_PROMPT.md`** - Estructura del prompt de análisis - **`CLAUDE_RESOLUTION_PROMPT.md`** - Template para generar prompts de resolución Todos estos archivos son personalizables y específicos de tu proyecto. Puedes: - Modificar los criterios de evaluación según estándares del equipo - Ajustar la estructura de los prompts para obtener respuestas más precisas - Personalizar el formato de salida del prompt de resolución ## 🐛 Troubleshooting No hay... esto es la perfección hecha código. ## 🔧 Desarrollo y Contribución ### Estructura del Proyecto**v2.0.0+**: Nueva arquitectura modular con ES6 modules. ``` claude-git-hooks/ ├── bin/ │ └── claude-hooks # CLI principal (ES6 modules) ├── lib/ # 🆕 Código Node.js modular │ ├── config.js # Configuración centralizada con merge │ ├── hooks/ │ │ ├── pre-commit.js # Hook de análisis (Node.js) │ │ └── prepare-commit-msg.js # Hook de mensajes (Node.js) │ └── utils/ │ ├── logger.js # Sistema de logging centralizado │ ├── git-operations.js # Operaciones git abstractas │ ├── file-utils.js # Utilidades de sistema de archivos │ ├── claude-client.js # Cliente Claude CLI │ ├── prompt-builder.js # Constructor de prompts │ ├── resolution-prompt.js # Generador de resolution prompts │ ├── preset-loader.js # Cargador de presets │ ├── installation-diagnostics.js # Diagnósticos de instalación │ ├── claude-diagnostics.js # Diagnósticos de errores Claude CLI │ ├── github-api.js # 🆕 Integración Octokit (determinista) │ ├── github-client.js # Cliente GitHub (CODEOWNERS, reviewers) │ ├── task-id.js # Extracción task-id (Jira, GitHub, Linear) │ ├── interactive-ui.js # UI interactiva CLI (preview, prompts) │ └── mcp-setup.js # Setup y detección MCP ├── templates/ │ ├── pre-commit # Bash wrapper (llama a lib/hooks/pre-commit.js) │ ├── prepare-commit-msg # Bash wrapper (llama a lib/hooks/prepare-commit-msg.js) │ ├── check-version.sh # Script de verificación de versión │ ├── CLAUDE_PRE_COMMIT.md # Criterios de evaluación │ ├── CLAUDE_ANALYSIS_PROMPT.md # Template de prompt para análisis │ ├── CLAUDE_RESOLUTION_PROMPT.md # Template para resolución de issues │ ├── ANALYZE_DIFF.md # Template para análisis de diff (PR metadata) │ ├── CREATE_GITHUB_PR.md # Template para creación de PR │ ├── config.github.example.json # 🆕 Ejemplo configuración GitHub │ └── settings.local.example.json # 🆕 Ejemplo token local (gitignored) ├── test/ # 🆕 Tests unitarios con Jest │ └── unit/ │ └── logger.test.js # Tests del logger ├── .claude/ # Directorio de configuración local (gitignore) │ └── settings.local.json # Configuración local del usuario ├── jest.config.js # 🆕 Configuración Jest para ES6 ├── .eslintrc.json # 🆕 Configuración ESLint ├── .prettierrc.json # 🆕 Configuración Prettier ├── package.json # Configuración NPM (type: "module") ├── package-lock.json # Lock file de NPM ├── README.md # Este archivo ├── CHANGELOG.md # Historial de versiones └── .gitignore # Archivos ignorados por git ``` ### 🔌 Utility Modules Reference **Purpose**: Reusable modules for extending claude-hooks or building similar tools #### Core Utilities | Module | Purpose | Key Exports | Usage Context | | --------------------------------- | ------------------------------------- | ------------------------------------------------- | ---------------------------------------------- | | **`config.js`** | Centralized configuration management | `getConfig()`, `defaults` | Priority merging: defaults < user < preset | | **`logger.js`** | Structured logging with debug support | `info()`, `warning()`, `error()`, `debug()` | Console output with context tracking | | **`git-operations.js`** | Git command abstractions | `getRepoRoot()`, `getStagedFiles()`, `getDiff()` | Safe git operations with error handling | | **`file-utils.js`** | File system operations | `ensureDir()`, `writeFile()` | Repo-root-relative path handling | | **`claude-client.js`** | Claude CLI integration | `analyzeCode()`, `analyzeCodeParallel()` | Prompt execution with timeout/retry | | **`prompt-builder.js`** | Template-based prompts | `buildAnalysisPrompt()`, `loadTemplate()` | Dynamic prompt construction from .md files | | **`preset-loader.js`** | Preset system | `loadPreset()`, `listPresets()`, `loadTemplate()` | Metadata, config, template loading | | **`resolution-prompt.js`** | Issue resolution prompts | `generateResolutionPrompt()` | AI-friendly error remediation prompts | | **`installation-diagnostics.js`** | Installation error diagnostics | `formatError()`, `getInstallationDiagnostics()` | Installation error formatting with remediation | | **`claude-diagnostics.js`** | Claude CLI error diagnostics | `detectClaudeError()`, `formatClaudeError()` | Rate limit, auth, network error detection | | **`github-api.js`** | Octokit GitHub integration | `createPullRequest()`, `readCodeowners()` | Deterministic PR creation, token resolution | | **`github-client.js`** | GitHub operations | `getReviewersForFiles()`, `parseGitHubRepo()` | CODEOWNERS parsing, reviewer detection | | **`task-id.js`** | Task ID extraction | `getOrPromptTaskId()`, `formatWithTaskId()` | Jira, GitHub, Linear task-id extraction | | **`interactive-ui.js`** | Interactive CLI components | `showPRPreview()`, `promptConfirmation()` | Terminal UI helpers (spinners, menus) | | **`mcp-setup.js`** | MCP detection and setup | `findGitHubTokenInDesktopConfig()` | Claude Desktop config token resolution | #### Using Utilities in Other Claude Instances **Example: Check installation health** ```javascript import { formatError } from './lib/utils/installation-diagnostics.js'; try { // ... operation that may fail } catch (error) { console.error(formatError('Operation failed', ['Additional context line'])); process.exit(1); } ``` **Example: Load configuration** ```javascript import { getConfig } from './lib/config.js'; const config = await getConfig(); const maxFiles = config.analysis.maxFiles; ``` **Example: Execute git operations** ```javascript import { getRepoRoot, getStagedFiles } from './lib/utils/git-operations.js'; const repoRoot = getRepoRoot(); const files = getStagedFiles({ extensions: ['.js', '.ts'] }); ``` **Example: Build custom prompts** ```javascript import { buildAnalysisPrompt } from './lib/utils/prompt-builder.js'; const prompt = await buildAnalysisPrompt({ templateName: 'CUSTOM_PROMPT.md', files: filesData, metadata: { REPO_NAME: 'my-repo' } }); ``` **Note**: All utilities follow single-responsibility principle and include JSDoc documentation inline. ### Configuración del Entorno de Desarrollo ```bash # 1. Clonar el repositorio git clone https://github.com/pablorovito/claude-git-hooks.git cd claude-git-hooks # 2. Instalar dependencias (si las hubiera) npm install # 3. Enlazar para desarrollo local npm link # 4. Probar en un repositorio de prueba cd /path/to/test-repo claude-hooks install ``` ### Workflow de Desarrollo #### 1. Modificar Hooks**v2.0.0+**: La lógica de los hooks está en `lib/hooks/`: - `lib/hooks/pre-commit.js` - Lógica de análisis de código (Node.js ES6) - `lib/hooks/prepare-commit-msg.js` - Lógica de generación de mensajes (Node.js ES6) - `templates/pre-commit` - Bash wrapper que llama al script Node.js - `templates/prepare-commit-msg` - Bash wrapper que llama al script Node.js #### 2. Probar Localmente ```bash # Después de modificar archivos, repo de claude-hooks npm link # En un repo de prueba claude-hooks install --force # Fuerza reinstalación, luego probar lo que se desee ``` #### 3. Actualizar Documentación - `README.md` - Documentación principal - `CHANGELOG.md` - Documentación principal - `README-NPM.md` - Para usuarios de NPM #### 4. Versioning y Publicación ```bash # Actualizar versión npm version patch # 1.0.0 -> 1.0.1 npm version minor # 1.0.0 -> 1.1.0 npm version major # 1.0.0 -> 2.0.0 # Publicar nueva versión npm publish ```