claude-git-hooks 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ Todos los cambios notables en este proyecto se documentarán en este archivo.
5
5
  El formato está basado en [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.5.1] - 2025-09-11
9
+
10
+ ### Added
11
+ - 📋 Sección CHEATSHEET en README
12
+
13
+ ### Fixed
14
+ - 🔧 SKIP_ANALYSIS_BLOCK funciona correctamente
15
+ - 📝 Estructura del proyecto en documentación
16
+
8
17
  ## [1.5.0] - 2025-09-10
9
18
 
10
19
  ### Added
@@ -36,7 +45,7 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
36
45
  ### Added
37
46
  - 🚫 Comentario `// SKIP-ANALYSIS` para excluir código del análisis
38
47
  - Una línea: excluye la siguiente línea
39
- - Bloque: código entre dos comentarios `// SKIP-ANALYSIS` es excluido
48
+ - Bloque: código entre dos comentarios `// SKIP_ANALYSIS_BLOCK` es excluido
40
49
  - 📝 Excepciones para Spring Framework en criterios de evaluación
41
50
  - `@Autowired` no es considerado issue bloqueante (máximo severidad MAJOR)
42
51
  - Inyección de dependencias con field injection es aceptable
package/README.md CHANGED
@@ -1,22 +1,129 @@
1
1
  # Pre-commit Hook con Claude CLI
2
2
 
3
3
  Este directorio contiene un pre-commit hook que utiliza Claude CLI para revisar automáticamente el código antes de cada commit.
4
+ Otras funciones de interés:
4
5
 
5
- ## 📁 Archivos en este Directorio
6
+ - Generación de mensaje de commit.
7
+ - Generación de información de PR y tests de validación de PR - Utiliza análisis de diferencias entre contenido local y origin.
6
8
 
7
- - **`README.md`** - Esta documentación
8
- - **`pre-commit`** - Hook principal para análisis de código (con auto-actualización)
9
- - **`prepare-commit-msg`** - Hook para generar mensajes de commit automáticos
10
- - **`.gitattributes`** - Configuración para mantener line endings correctos
11
- - **`.claude/CLAUDE_PRE_COMMIT.md`** - Pautas de evaluación formato estándar
12
- - **`.claude/CLAUDE_PRE_COMMIT_SONAR.md`** - Pautas de evaluación formato SonarQube
13
- - **`.claude/CLAUDE_ANALYSIS_PROMPT.md`** - Template de prompt para análisis estándar
14
- - **`.claude/CLAUDE_ANALYSIS_PROMPT_SONAR.md`** - Template de prompt para análisis SonarQube
15
- - **`.claude/CLAUDE_RESOLUTION_PROMPT.md`** - Template para generar prompt de resolución AI
9
+ ## 📋 CHEATSHEET
10
+
11
+ ### 🚀 Comandos Frecuentes
12
+
13
+ ```bash
14
+ # Commit rápido sin análisis + mensaje automático
15
+ git commit --no-verify -m "auto"
16
+
17
+ # Analizar diferencias con rama origin actual
18
+ claude-hooks analyze-diff
19
+
20
+ # Analizar diferencias para PR (comparar con develop)
21
+ claude-hooks analyze-diff develop
22
+
23
+ # Reinstalar durante desarrollo (después de npm link)
24
+ claude-hooks install --force --skip-auth
25
+ ```
26
+
27
+ ### 📦 Instalación y Gestión
28
+
29
+ ```bash
30
+ # Instalación inicial
31
+ claude-hooks install
32
+
33
+ # Actualizar a última versión
34
+ claude-hooks update
35
+
36
+ # Desinstalar hooks
37
+ claude-hooks uninstall
38
+
39
+ # Ver estado actual
40
+ claude-hooks status
41
+
42
+ # Desactivar temporalmente
43
+ claude-hooks disable
44
+
45
+ # Reactivar hooks
46
+ claude-hooks enable
47
+ ```
48
+
49
+ ### 💻 Flujos de Commit
50
+
51
+ ```bash
52
+ # Commit con análisis de código
53
+ git commit -m "feat: nueva funcionalidad"
54
+
55
+ # Generar mensaje de commit automático
56
+ git commit -m "auto"
57
+
58
+ # Saltar análisis (emergencias)
59
+ git commit --no-verify -m "hotfix: corrección urgente"
60
+
61
+ # Modificar último commit
62
+ git commit --amend
63
+ ```
64
+
65
+ ### 🚫 Exclusión de Código del Análisis
66
+
67
+ ```java
68
+ // SKIP-ANALYSIS
69
+ private String legacyCode = "no analizar siguiente línea";
70
+
71
+ // SKIP_ANALYSIS_BLOCK
72
+ public void methodToIgnore() {
73
+ // Todo este bloque será ignorado
74
+ String oldCode = "legacy";
75
+ }
76
+ // SKIP_ANALYSIS_BLOCK
77
+ ```
78
+
79
+ ### 🔧 Configuración Avanzada
80
+
81
+ ```bash
82
+ # Archivos de configuración
83
+ .claude/
84
+ ├── CLAUDE_PRE_COMMIT_SONAR.md # Personalizar criterios
85
+ ├── CLAUDE_ANALYSIS_PROMPT_SONAR.md # Modificar prompt
86
+ └── settings.local.json # Configuración local
87
+
88
+ # Variables de entorno
89
+ export CLAUDE_ANALYSIS_MODE=sonarqube # Modo de análisis
90
+ export CLAUDE_DEBUG=true # Debug detallado
91
+ ```
92
+
93
+ ### 🎯 Casos de Uso Específicos
94
+
95
+ ```bash
96
+ # Desarrollo local de claude-hooks
97
+ cd /path/to/claude-git-hooks
98
+ npm link
99
+ cd /path/to/your-project
100
+ claude-hooks install --force --skip-auth
101
+
102
+ # Preparar PR hacia develop
103
+ git checkout -b feature/nueva-funcionalidad
104
+ # ... hacer cambios ...
105
+ git add .
106
+ git commit -m "feat: implementar nueva funcionalidad"
107
+ claude-hooks analyze-diff develop # Genera título, descripción y tests
108
+
109
+ # Resolver issues bloqueantes
110
+ git commit -m "fix: resolver issues"
111
+ # Si falla, ver claude_resolution_prompt.md generado
112
+ # Copiar contenido y pegar en Claude para obtener solución
113
+ ```
114
+
115
+ ### ⚡ Tips y Trucos
116
+
117
+ 1. **Mensaje automático**: Usa `"auto"` como mensaje para que Claude lo genere
118
+ 2. **Skip auth**: Usa `--skip-auth` en CI/CD o desarrollo local
119
+ 3. **Force install**: Usa `--force` para reinstalar sin confirmación
120
+ 4. **Debug**: Activa `CLAUDE_DEBUG=true` para ver detalles completos
121
+ 5. **Archivos grandes**: Se omiten automáticamente archivos > 100KB
122
+ 6. **Límite de archivos**: Máximo 10 archivos por commit
16
123
 
17
124
  ## 🔧 Configuración Previa Importante
18
125
 
19
- ### 1. Armonización de Line Endings (EOL)
126
+ ### 1. Armonización de Line Endings (EOL) -- Automatizada
20
127
 
21
128
  Debido a que Claude CLI corre en WSL y el desarrollo puede hacerse en Windows, es crucial configurar correctamente los line endings para evitar que los archivos de hooks se corrompan:
22
129
 
@@ -53,8 +160,6 @@ git config --global credential.helper store
53
160
 
54
161
  ## 🚀 Instalación
55
162
 
56
- ### Paquete NPM Global (Recomendado)
57
-
58
163
  **IMPORTANTE**: Claude CLI corre en WSL, por lo que toda la instalación y uso de git debe hacerse desde la terminal WSL.
59
164
 
60
165
  ```bash
@@ -80,35 +185,6 @@ El comando `claude-hooks install` ahora incluye:
80
185
  - `--force`: Reinstala aunque los hooks ya existan
81
186
  - `--skip-auth`: Omite la verificación de autenticación de Claude (útil para CI/CD)
82
187
 
83
- #### Añadir como Dependencia de Desarrollo
84
-
85
- ```bash
86
- # Instalar como devDependency
87
- npm install --save-dev claude-git-hooks
88
- ```
89
-
90
- Luego añade esto a tu `package.json`:
91
-
92
- ```json
93
- {
94
- "scripts": {
95
- "postinstall": "claude-hooks install"
96
- },
97
- "devDependencies": {
98
- "claude-git-hooks": "^1.2.0"
99
- }
100
- }
101
- ```
102
-
103
- ## 🤖 Características
104
-
105
- **✨ Auto-actualización**: Verifica automáticamente si hay nuevas versiones disponibles antes de cada commit y ofrece actualizar con un simple prompt interactivo.
106
-
107
- **Hooks disponibles**:
108
-
109
- - `pre-commit`: Análisis de código con Claude (solo archivos Java/config) con verificación automática de versión
110
- - `prepare-commit-msg`: Generación automática de mensajes de commit
111
-
112
188
  ## 📁 Gestión de Archivos
113
189
 
114
190
  ### Archivos creados durante la instalación
@@ -119,12 +195,9 @@ El comando `claude-hooks install` crea los siguientes archivos y directorios:
119
195
  2. **`.git/hooks/prepare-commit-msg`** - Hook de generación de mensajes
120
196
  3. **`.git/hooks/check-version.sh`** - Script de verificación de versión
121
197
  4. **`.claude/`** - Directorio para archivos de configuración
122
- - `CLAUDE_PRE_COMMIT.md` - Pautas de evaluación estándar
123
198
  - `CLAUDE_PRE_COMMIT_SONAR.md` - Pautas de evaluación SonarQube
124
- - `CLAUDE_ANALYSIS_PROMPT.md` - Template de prompt para análisis estándar
125
199
  - `CLAUDE_ANALYSIS_PROMPT_SONAR.md` - Template de prompt para análisis SonarQube
126
200
  - `CLAUDE_RESOLUTION_PROMPT.md` - Template para prompt de resolución AI
127
- 5. **`.claude-analysis-mode`** - Archivo de preferencia de modo (creado al primer uso)
128
201
 
129
202
  ### Actualización automática de .gitignore
130
203
 
@@ -133,9 +206,9 @@ Durante la instalación, Claude Hooks actualiza automáticamente tu `.gitignore`
133
206
  ```gitignore
134
207
  # Claude Git Hooks
135
208
  .claude/
136
- .claude-analysis-mode
137
209
  debug-claude-response.json
138
210
  claude_resolution_prompt.md
211
+ .claude-pr-analysis.json
139
212
  ```
140
213
 
141
214
  Esto asegura que:
@@ -155,26 +228,19 @@ Si no existe un `.gitignore`, se creará uno nuevo. Si ya existe, las entradas s
155
228
  - Solo analiza: Java, XML, properties, yml, yaml
156
229
  - Omite archivos mayores a 100KB
157
230
  - Límite de 10 archivos por commit
158
- 3. **Modos de análisis disponibles**:
159
- - **Estándar**: Formato clásico con score y recomendaciones detalladas
160
- - **SonarQube**: Simula salida de SonarQube con Quality Gate, métricas y clasificación de issues
161
- 4. **Construye prompt inteligente**:
231
+ 3. **Construye prompt inteligente**:
162
232
  - Usa template de prompt desde `.claude/CLAUDE_ANALYSIS_PROMPT*.md`
163
233
  - Lee las pautas desde `.claude/CLAUDE_PRE_COMMIT*.md`
164
234
  - Incluye el diff completo para archivos nuevos
165
235
  - Muestra solo cambios para archivos existentes
166
- 5. **Envía a Claude CLI para revisión**
167
- 6. **Procesa respuesta JSON estructurada**:
236
+ 4. **Envía a Claude CLI para revisión**
237
+ 5. **Procesa respuesta JSON estructurada**:
168
238
  - blockingIssues siempre como objetos con localización precisa
169
- - En modo estándar: evalúa `approved`, `score`, `recommendations`
170
- - En modo SonarQube: verifica `QUALITY_GATE`, muestra métricas y issues por severidad
171
- 7. **Decisión final**:
239
+ - verifica `QUALITY_GATE`, muestra métricas y issues por severidad
240
+ 6. **Decisión final**:
172
241
  - Si hay problemas críticos → genera prompt AI de resolución y bloquea commit
173
242
  - Si todo está bien → commit procede
174
-
175
- #### 🤖 Generación de Prompt de Resolución AI
176
-
177
- Cuando se detectan problemas críticos:
243
+ 7. **Generación de Prompt de Resolución AI** (opcional): Cuando se detectan problemas críticos:
178
244
 
179
245
  - Se genera automáticamente un archivo `claude_resolution_prompt.md`
180
246
  - Contiene información estructurada y AI-friendly de todos los issues
@@ -198,42 +264,20 @@ Cuando se detectan problemas críticos:
198
264
 
199
265
  ### Características adicionales
200
266
 
267
+ - **Generación de información para Pull Requests**: `claude-hooks analyze-diffs {branch}` para comparar rama local con otra rama, propone nombre para rama actual, título y detalles para pull request, da tips para verificar trabajo. Este comando genera automáticamente:
268
+ - 📝 Título de PR conciso (máx. 72 caracteres)
269
+ - 📄 Descripción detallada con markdown
270
+ - 🌿 Nombre de rama sugerido (formato: tipo/descripcion)
271
+ - 📋 Tipo de cambio (feature/fix/refactor/docs/test/chore)
272
+ - ⚠️ Indicador de breaking changes
273
+ - 🧪 Notas de testing recomendado
274
+ - 📝 Archivo `.claude-pr-analysis.json`
201
275
  - **Auto-actualización**: Verificación automática de versiones antes de cada commit con prompt interactivo para actualizar
202
276
  - **Comando update**: `claude-hooks update` para actualizar manualmente a la última versión
203
277
  - **Modo debug**: `DEBUG=1 git commit` guarda respuestas en `debug-claude-response.json`
204
278
  - **Análisis de PR**: Nuevo comando `analyze-diff` para generar información de Pull Requests
205
279
  - **Validación de dependencias**: Verifica que Claude CLI esté autenticado antes de ejecutar
206
-
207
- ## 🛠️ Uso
208
-
209
- **IMPORTANTE**: Todos los comandos git deben ejecutarse desde WSL.
210
-
211
- ### Casos de uso de commits
212
-
213
- ```bash
214
- # Desde WSL
215
- git add .
216
-
217
- # 1. Mensaje manual + análisis bloqueante
218
- git commit -m "feat: nueva funcionalidad"
219
-
220
- # 2. Mensaje automático + análisis bloqueante
221
- git commit -m "auto" # Claude generará el mensaje automáticamente
222
-
223
- # 3. Mensaje manual sin análisis
224
- git commit --no-verify -m "fix: corrección urgente"
225
-
226
- # 4. Mensaje automático sin análisis
227
- git commit --no-verify -m "auto"
228
- ```
229
-
230
- Claude analizará los cambios y generará un mensaje de commit siguiendo las convenciones (feat, fix, docs, etc.).
231
-
232
- **⚠️ Si la generación automática falla**: El commit se cancelará completamente. Simplemente ejecuta `git commit -m "tu mensaje"` manualmente.
233
-
234
- ### Excluir código del análisis con SKIP-ANALYSIS
235
-
236
- Puedes excluir código específico del análisis usando comentarios `// SKIP-ANALYSIS`:
280
+ - **Exclusión de código del análisis con SKIP-ANALYSIS**: Puedes excluir código específico del análisis usando comentarios `// SKIP-ANALYSIS`:
237
281
 
238
282
  ```java
239
283
  // Excluir una sola línea
@@ -241,152 +285,15 @@ Puedes excluir código específico del análisis usando comentarios `// SKIP-ANA
241
285
  @Autowired private LegacyService legacyService; // Esta línea no será analizada
242
286
 
243
287
  // Excluir un bloque de código
244
- // SKIP-ANALYSIS
288
+ // SKIP-ANALYSIS_BLOCK
245
289
  @Deprecated
246
290
  public void methodWithKnownIssues() {
247
291
  // Código legacy que no queremos que sea analizado
248
292
  System.out.println("Debug temporal");
249
293
  }
250
- // SKIP-ANALYSIS
251
- ```
252
-
253
- **Nota**: El código entre comentarios `SKIP-ANALYSIS` no será enviado a Claude para su análisis.
254
-
255
- ### Análisis de diferencias entre ramas 🔍
256
-
257
- Nueva funcionalidad para analizar cambios y generar información para Pull Requests:
258
-
259
- ```bash
260
- # Analizar diferencias con la rama main
261
- claude-hooks analyze-diff
262
-
263
- # Analizar diferencias con otra rama base
264
- claude-hooks analyze-diff develop
265
- ```
266
-
267
- Este comando genera automáticamente:
268
- - 📝 Título de PR conciso (máx. 72 caracteres)
269
- - 📄 Descripción detallada con markdown
270
- - 🌿 Nombre de rama sugerido (formato: tipo/descripcion)
271
- - 📋 Tipo de cambio (feature/fix/refactor/docs/test/chore)
272
- - ⚠️ Indicador de breaking changes
273
- - 🧪 Notas de testing recomendado
274
-
275
- Los resultados se guardan en `.claude-pr-analysis.json` para fácil acceso.
276
-
277
- ### Modo debug
278
-
279
- ```bash
280
- # Desde WSL
281
- DEBUG=1 git commit -m "mensaje"
282
- ```
283
-
284
- ## 📊 Formato de Respuesta
285
-
286
- Claude responde con un JSON estructurado que incluye:
287
-
288
- - `approved`: Si el commit es aprobado (boolean)
289
- - `score`: Puntuación del 1-10 (integer)
290
- - `blockingIssues`: Array de objetos con problemas críticos:
291
- - `description`: Descripción del problema
292
- - `file`: Archivo afectado
293
- - `line`: Línea del problema
294
- - `method`: Método o clase afectada
295
- - `severity`: Severidad (critical, high, etc.)
296
- - `recommendations`: Array de strings con sugerencias no bloqueantes
297
- - `details`: Objeto con comentarios por categoría (security, performance, etc.)
298
-
299
- ### Ejemplos de Respuestas con Problemas Críticos
300
-
301
- #### Modo Estándar - Commit Bloqueado
302
-
303
- ```json
304
- {
305
- "approved": false,
306
- "score": 3,
307
- "blockingIssues": [
308
- {
309
- "description": "SQL Injection vulnerability: concatenación directa de strings en query",
310
- "file": "src/main/java/UserRepository.java",
311
- "line": 45,
312
- "method": "findUserByName",
313
- "severity": "critical"
314
- },
315
- {
316
- "description": "Posible NullPointerException: variable 'user' no validada",
317
- "file": "src/main/java/UserService.java",
318
- "line": 78,
319
- "method": "processUser",
320
- "severity": "high"
321
- }
322
- ],
323
- "recommendations": [
324
- "Usar PreparedStatement en lugar de concatenación de strings",
325
- "Agregar validación de null antes de acceder a propiedades"
326
- ]
327
- }
328
- ```
329
-
330
- #### Modo SonarQube - Quality Gate Failed
331
-
332
- ```json
333
- {
334
- "QUALITY_GATE": "FAILED",
335
- "approved": false,
336
- "score": 4,
337
- "metrics": {
338
- "reliability": "D",
339
- "security": "E",
340
- "maintainability": "C"
341
- },
342
- "issues": {
343
- "blocker": 1,
344
- "critical": 2,
345
- "major": 3,
346
- "minor": 1
347
- },
348
- "blockingIssues": [
349
- {
350
- "description": "Security Hotspot: Hardcoded credentials detected",
351
- "file": "src/main/resources/application.yml",
352
- "line": 23,
353
- "method": "datasource.password",
354
- "severity": "blocker"
355
- },
356
- {
357
- "description": "Resource leak: Connection not closed in finally block",
358
- "file": "src/main/java/DatabaseUtil.java",
359
- "line": 112,
360
- "method": "executeQuery",
361
- "severity": "critical"
362
- }
363
- ],
364
- "details": [
365
- {
366
- "severity": "BLOCKER",
367
- "type": "VULNERABILITY",
368
- "file": "src/main/resources/application.yml",
369
- "line": 23,
370
- "message": "Never store passwords in plain text",
371
- "rule": "java:S2068"
372
- }
373
- ]
374
- }
294
+ // SKIP-ANALYSIS_BLOCK
375
295
  ```
376
296
 
377
- Cuando se detectan estos problemas críticos, se genera automáticamente un archivo `claude_resolution_prompt.md` con toda la información necesaria para que otra instancia de Claude pueda resolver los issues de forma eficiente.
378
-
379
- ## 🔄 Actualización y Gestión
380
-
381
- ### Actualizar a la última versión
382
-
383
- ```bash
384
- # Actualizar manualmente a la última versión
385
- claude-hooks update
386
- ```
387
-
388
- El comando `update` descarga e instala automáticamente la última versión disponible desde NPM, y luego reinstala los hooks con las nuevas características.
389
-
390
297
  ### Desactivar/Activar hooks
391
298
 
392
299
  ```bash
@@ -410,97 +317,26 @@ claude-hooks status
410
317
 
411
318
  ## ⚙️ Configuración
412
319
 
413
- ### Variables de entorno disponibles
414
-
415
- - **`DEBUG`**: Activa el modo debug
416
- - Valores: `1` para activar
417
- - Ejemplo: `DEBUG=1 git commit -m "mensaje"`
418
- - Guarda las respuestas de Claude en `debug-claude-response.json`
419
-
420
- ### Variables modificables en los archivos de hooks
320
+ ### Scripts
421
321
 
422
322
  En el archivo `pre-commit`:
423
323
 
424
324
  - **`MAX_FILE_SIZE`**: Tamaño máximo de archivo a analizar (default: 100KB)
425
325
  - **`MAX_FILES`**: Número máximo de archivos por commit (default: 10)
426
326
  - **`CLAUDE_CLI`**: Comando de Claude CLI (default: "claude")
427
- - **`GUIDELINES_FILE`**: Archivo de pautas para modo estándar (default: ".claude/CLAUDE_PRE_COMMIT.md")
428
- - **`GUIDELINES_FILE_SONAR`**: Archivo de pautas para modo SonarQube (default: ".claude/CLAUDE_PRE_COMMIT_SONAR.md")
327
+ - **`GUIDELINES_FILE`**: Archivo de pautas (default: ".claude/CLAUDE_PRE_COMMIT_SONAR.md")
429
328
 
430
329
  En el archivo `prepare-commit-msg`:
431
330
 
432
331
  - **`MAX_FILE_SIZE`**: Tamaño máximo para incluir diff completo (default: 100KB)
433
332
  - **`CLAUDE_CLI`**: Comando de Claude CLI (default: "claude")
434
333
 
435
- ## 🐛 Troubleshooting
436
-
437
- ### "Claude CLI no está instalado"
438
-
439
- ```bash
440
- # Desde WSL
441
- npm install -g @anthropic-ai/claude-cli
442
- claude auth login
443
- ```
444
-
445
- ### "No se recibió respuesta JSON válida"
446
-
447
- - Verifica que Claude CLI esté autenticado en WSL
448
- - Ejecuta en modo DEBUG para ver la respuesta completa
449
- - Revisa que el archivo de pautas esté bien formateado
450
-
451
- ### El hook no se ejecuta
452
-
453
- - Verifica que estés ejecutando git desde WSL
454
- - Verifica permisos: `ls -la .git/hooks/pre-commit`
455
- - Debe mostrar permisos de ejecución (-rwxr-xr-x)
456
-
457
- ### Problemas con line endings
458
-
459
- - Si ves errores de "^M" o caracteres extraños:
460
- ```bash
461
- # En WSL
462
- git config core.autocrlf input
463
- ```
464
-
465
- ### Los hooks se vacían o corrompen
334
+ ### Pautas de Evaluación
466
335
 
467
- Este problema suele ocurrir por conflictos de configuración de line endings:
468
-
469
- 1. **Verifica configuraciones**:
470
-
471
- ```bash
472
- git config --local core.autocrlf # Debe ser 'input'
473
- git config --global core.autocrlf # Debe ser 'input'
474
- ```
475
-
476
- 2. **Si están diferentes, corrige**:
477
-
478
- ```bash
479
- git config --local core.autocrlf input
480
- ```
481
-
482
- 3. **Restaura los hooks**:
483
- ```bash
484
- ./git-hooks/setup-wsl.sh --sync
485
- ```
486
-
487
- ### Credenciales no funcionan en WSL
488
-
489
- - Las credenciales de Windows no se comparten automáticamente con WSL
490
- - Reconfigura tus credenciales git en WSL
491
-
492
- ## 📝 Personalización
493
-
494
- ### Archivos de Configuración en `.claude/`
495
-
496
- #### Pautas de Evaluación
497
-
498
- - **`CLAUDE_PRE_COMMIT.md`** - Criterios de evaluación para modo estándar
499
336
  - **`CLAUDE_PRE_COMMIT_SONAR.md`** - Criterios para modo SonarQube
500
337
 
501
- #### Templates de Prompts
338
+ ### Templates de Prompts
502
339
 
503
- - **`CLAUDE_ANALYSIS_PROMPT.md`** - Estructura del prompt de análisis estándar
504
340
  - **`CLAUDE_ANALYSIS_PROMPT_SONAR.md`** - Estructura del prompt SonarQube
505
341
  - **`CLAUDE_RESOLUTION_PROMPT.md`** - Template para generar prompts de resolución
506
342
 
@@ -510,33 +346,9 @@ Todos estos archivos son personalizables y específicos de tu proyecto. Puedes:
510
346
  - Ajustar la estructura de los prompts para obtener respuestas más precisas
511
347
  - Personalizar el formato de salida del prompt de resolución
512
348
 
513
- ## 🔄 Arquitectura del Sistema
514
-
515
- ```
516
- WSL Terminal
517
-
518
- ├─→ git add/commit
519
-
520
- └─→ .git/hooks/pre-commit
521
-
522
- ├─→ Lee archivos modificados
523
- ├─→ Lee CLAUDE_PRE_COMMIT.md
524
- ├─→ Construye prompt
525
-
526
- └─→ Claude CLI
527
-
528
- └─→ Respuesta JSON
529
-
530
- ├─→ ✅ Approved → Commit procede
531
- └─→ ❌ Rejected → Commit bloqueado
532
- ```
533
-
534
- ## 📌 Notas Importantes
349
+ ## 🐛 Troubleshooting
535
350
 
536
- 1. **Todo en WSL**: Claude CLI solo funciona en WSL, por lo que todos los comandos git deben ejecutarse desde ahí
537
- 2. **Line Endings**: La configuración de `core.autocrlf` es crítica para evitar problemas entre Windows y Linux
538
- 3. **Credenciales**: Necesitarás reconfigurar tus credenciales git en WSL
539
- 4. **Performance**: La revisión puede tardar unos segundos dependiendo del tamaño de los cambios
351
+ No hay... esto es la perfección hecha código.
540
352
 
541
353
  ## 🔧 Desarrollo y Contribución
542
354
 
@@ -545,19 +357,25 @@ WSL Terminal
545
357
  ```
546
358
  claude-git-hooks/
547
359
  ├── bin/
548
- │ └── claude-hooks # CLI principal con verificación completa
360
+ │ └── claude-hooks # CLI principal con verificación completa
549
361
  ├── templates/
550
- │ ├── pre-commit # Hook de análisis de código
551
- │ ├── prepare-commit-msg # Hook de generación de mensajes
552
- │ ├── CLAUDE_PRE_COMMIT.md # Pautas estándar
553
- └── CLAUDE_PRE_COMMIT_SONAR.md # Pautas SonarQube
554
- ├── .claude/ # Directorio creado en el repo del usuario
555
- ├── CLAUDE_PRE_COMMIT.md # Pautas copiadas aquí durante la instalación
556
- │ └── CLAUDE_PRE_COMMIT_SONAR.md
557
- ├── package.json # Configuración NPM
558
- ├── README.md # Este archivo
559
- ├── CHANGELOG.md # Historial de versiones
560
- └── PUBLISH.md # Guía de publicación
362
+ │ ├── pre-commit # Hook de análisis de código
363
+ │ ├── prepare-commit-msg # Hook de generación de mensajes
364
+ │ ├── check-version.sh # Script de verificación de versión
365
+ ├── CLAUDE_PRE_COMMIT_SONAR.md # Pautas SonarQube para pre commit
366
+ ├── CLAUDE_ANALYSIS_PROMPT_SONAR.md # Template de prompt para análisis
367
+ └── CLAUDE_RESOLUTION_PROMPT.md # Template para resolución de issues
368
+ ├── .claude/ # Directorio de configuración local (gitignore)
369
+ │ └── settings.local.json # Configuración local del usuario
370
+ ├── package.json # Configuración NPM
371
+ ├── package-lock.json # Lock file de NPM
372
+ ├── README.md # Este archivo
373
+ ├── README-NPM.md # Documentación para publicación NPM
374
+ ├── CHANGELOG.md # Historial de versiones
375
+ ├── PUBLISH.md # Guía de publicación
376
+ ├── CLAUDE_PRE_COMMIT_SONAR.md # Pautas de evaluación (legacy)
377
+ ├── pre-commit # Hook principal (legacy)
378
+ └── .gitignore # Archivos ignorados por git
561
379
  ```
562
380
 
563
381
  ### Configuración del Entorno de Desarrollo
@@ -590,23 +408,18 @@ Los hooks están en `templates/`:
590
408
  #### 2. Probar Localmente
591
409
 
592
410
  ```bash
593
- # Después de modificar archivos
411
+ # Después de modificar archivos, repo de claude-hooks
594
412
  npm link
595
413
 
596
414
  # En un repo de prueba
597
- claude-hooks install --force # Fuerza reinstalación
598
-
599
- # Probar funcionalidad
600
- git add .
601
- git commit -m "auto" # Probar generación automática
602
- git commit -m "test" # Probar análisis
415
+ claude-hooks install --force # Fuerza reinstalación, luego probar lo que se desee
603
416
  ```
604
417
 
605
418
  #### 3. Actualizar Documentación
606
419
 
607
420
  - `README.md` - Documentación principal
421
+ - `CHANGELOG.md` - Documentación principal
608
422
  - `README-NPM.md` - Para usuarios de NPM
609
- - `templates/CLAUDE_PRE_COMMIT*.md` - Pautas de evaluación
610
423
 
611
424
  #### 4. Versioning y Publicación
612
425
 
@@ -618,68 +431,4 @@ npm version major # 1.0.0 -> 2.0.0
618
431
 
619
432
  # Publicar nueva versión
620
433
  npm publish
621
-
622
- # Tag en git
623
- git push --tags
624
- ```
625
-
626
- ### Debugging
627
-
628
- #### Modo Debug
629
-
630
- ```bash
631
- # Activar debug en hooks
632
- DEBUG=1 git commit -m "test"
633
-
634
- # Ver logs del CLI
635
- claude-hooks install --debug
636
- ```
637
-
638
- #### Logs Útiles
639
-
640
- - `debug-claude-response.json` - Respuestas de Claude en modo debug
641
- - `~/.npm/_logs/` - Logs de npm install
642
- - `.git/hooks/` - Verificar que hooks están instalados
643
-
644
- ### Testing
645
-
646
- #### Test Manual
647
-
648
- ```bash
649
- # 1. Crear repo de prueba
650
- mkdir test-repo && cd test-repo
651
- git init
652
-
653
- # 2. Instalar hooks
654
- claude-hooks install
655
-
656
- # 3. Crear archivos de prueba
657
- echo 'public class Test {}' > Test.java
658
- git add .
659
-
660
- # 4. Probar análisis
661
- git commit -m "test: nueva clase"
662
-
663
- # 5. Probar generación automática
664
- echo 'public void newMethod() {}' >> Test.java
665
- git add .
666
- git commit -m "auto"
667
434
  ```
668
-
669
- #### Casos de Prueba
670
-
671
- - ✅ Análisis de código Java
672
- - ✅ Generación automática de mensajes
673
- - ✅ Modo SonarQube
674
- - ✅ Archivos grandes (>100KB)
675
- - ✅ Commits sin archivos Java
676
- - ✅ Enable/disable hooks
677
- - ✅ Modo debug
678
-
679
- ### Contribuir
680
-
681
- 1. **Fork** el repositorio
682
- 2. **Crear branch** para tu feature: `git checkout -b feature/nueva-funcionalidad`
683
- 3. **Commit** tus cambios: `git commit -m "feat: nueva funcionalidad"`
684
- 4. **Push** al branch: `git push origin feature/nueva-funcionalidad`
685
- 5. **Abrir Pull Request**
package/bin/claude-hooks CHANGED
@@ -447,9 +447,9 @@ async function install(args) {
447
447
  console.log(' git commit --no-verify # Omite el análisis completamente');
448
448
  console.log('\nExcluir código del análisis:');
449
449
  console.log(' // SKIP-ANALYSIS # Excluye la siguiente línea');
450
- console.log(' // SKIP-ANALYSIS # Entre dos comentarios excluye el bloque');
450
+ console.log(' // SKIP_ANALYSIS_BLOCK # Excluye bloque hasta encontrar otro igual');
451
451
  console.log(' ...código excluido...');
452
- console.log(' // SKIP-ANALYSIS');
452
+ console.log(' // SKIP_ANALYSIS_BLOCK');
453
453
  console.log('\nPara más opciones: claude-hooks --help');
454
454
  }
455
455
 
@@ -638,7 +638,6 @@ function updateGitignore() {
638
638
  const claudeEntries = [
639
639
  '# Claude Git Hooks',
640
640
  '.claude/',
641
- '.claude-analysis-mode',
642
641
  'debug-claude-response.json',
643
642
  'claude_resolution_prompt.md',
644
643
  '.claude-pr-analysis.json',
@@ -1069,21 +1068,9 @@ function status() {
1069
1068
  }
1070
1069
  });
1071
1070
 
1072
- // Verificar modo de análisis actual
1073
- console.log('\nModo de análisis:');
1074
- const analysisMode = fs.existsSync('.claude-analysis-mode')
1075
- ? fs.readFileSync('.claude-analysis-mode', 'utf8').trim()
1076
- : 'standard (por defecto)';
1077
-
1078
- if (analysisMode === 'sonar') {
1079
- info(`Modo actual: SonarQube`);
1080
- } else {
1081
- info(`Modo actual: Estándar`);
1082
- }
1083
-
1084
1071
  // Verificar archivos de pautas
1085
1072
  console.log('\nArchivos de pautas:');
1086
- const guidelines = ['CLAUDE_PRE_COMMIT.md', 'CLAUDE_PRE_COMMIT_SONAR.md'];
1073
+ const guidelines = ['CLAUDE_PRE_COMMIT_SONAR.md'];
1087
1074
  guidelines.forEach(guideline => {
1088
1075
  const claudePath = path.join('.claude', guideline);
1089
1076
  if (fs.existsSync(claudePath)) {
@@ -1100,7 +1087,7 @@ function status() {
1100
1087
  const gitignorePath = '.gitignore';
1101
1088
  if (fs.existsSync(gitignorePath)) {
1102
1089
  const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
1103
- const claudeIgnores = ['.claude/', '.claude-analysis-mode', 'debug-claude-response.json'];
1090
+ const claudeIgnores = ['.claude/', 'debug-claude-response.json', '.claude-pr-analysis.json'];
1104
1091
  let allPresent = true;
1105
1092
 
1106
1093
  claudeIgnores.forEach(entry => {
@@ -1126,28 +1113,6 @@ function setMode(mode) {
1126
1113
  if (!checkGitRepo()) {
1127
1114
  error('No estás en un repositorio Git.');
1128
1115
  }
1129
-
1130
- const validModes = ['sonar'];
1131
-
1132
- if (!mode) {
1133
- // Modo interactivo
1134
- console.log('\nModo de análisis configurado:');
1135
- console.log('SonarQube - Formato con métricas y quality gate');
1136
- console.log('\nEjemplo de uso: claude-hooks set-mode sonar');
1137
- return;
1138
- }
1139
-
1140
- if (!validModes.includes(mode)) {
1141
- error(`Modo inválido: ${mode}. Usa 'sonar'`);
1142
- }
1143
-
1144
- // Guardar el modo
1145
- fs.writeFileSync('.claude-analysis-mode', mode);
1146
-
1147
- if (mode === 'sonar') {
1148
- success('Modo configurado: SonarQube');
1149
- info('Los commits usarán formato SonarQube con métricas y quality gate');
1150
- }
1151
1116
  }
1152
1117
 
1153
1118
  // Función para comparar versiones usando el script compartido
@@ -1277,9 +1242,9 @@ Caso de uso analyze-diff:
1277
1242
 
1278
1243
  Excluir código del análisis:
1279
1244
  // SKIP-ANALYSIS # Excluye la siguiente línea del análisis
1280
- // SKIP-ANALYSIS # Entre dos comentarios excluye el bloque
1245
+ // SKIP_ANALYSIS_BLOCK # Excluye bloque hasta encontrar otro igual
1281
1246
  ...código excluido...
1282
- // SKIP-ANALYSIS
1247
+ // SKIP_ANALYSIS_BLOCK
1283
1248
 
1284
1249
  Más información: https://github.com/pablorovito/claude-git-hooks
1285
1250
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-git-hooks",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Git hooks con Claude CLI para análisis de código y generación automática de mensajes de commit",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -109,7 +109,6 @@ generate_resolution_prompt() {
109
109
  sed -i "s|{{BRANCH_NAME}}|${BRANCH_NAME}|g" "$RESOLUTION_FILE"
110
110
  sed -i "s|{{COMMIT_SHA}}|${COMMIT_SHA}|g" "$RESOLUTION_FILE"
111
111
  sed -i "s|{{FILE_COUNT}}|${FILE_COUNT}|g" "$RESOLUTION_FILE"
112
- sed -i "s|{{ANALYSIS_MODE}}|sonar|g" "$RESOLUTION_FILE"
113
112
 
114
113
  # Crear archivo temporal para issues formateados
115
114
  local TEMP_ISSUES_FILE=$(mktemp)
@@ -149,18 +148,10 @@ generate_resolution_prompt() {
149
148
  echo
150
149
  }
151
150
 
152
- # Usar siempre modo SonarQube
153
- ANALYSIS_MODE="sonar"
154
-
155
151
  # Configurar archivos para modo SonarQube
156
152
  GUIDELINES_FILE=".claude/CLAUDE_PRE_COMMIT_SONAR.md"
157
153
  PROMPT_TEMPLATE=".claude/CLAUDE_ANALYSIS_PROMPT_SONAR.md"
158
- log "Usando modo de análisis: SonarQube"
159
154
 
160
- # Guardar preferencia si no existe
161
- if [ ! -f ".claude-analysis-mode" ]; then
162
- echo "sonar" > .claude-analysis-mode
163
- fi
164
155
 
165
156
  # Verificar que el template de prompt existe
166
157
  if [ ! -f "$PROMPT_TEMPLATE" ]; then
@@ -214,15 +205,20 @@ filter_skip_analysis() {
214
205
  local inside_skip_block=false
215
206
 
216
207
  while IFS= read -r line; do
217
- # Detectar inicio de bloque SKIP-ANALYSIS
208
+ # Detectar SKIP-ANALYSIS para línea única
218
209
  if echo "$line" | grep -q "// SKIP-ANALYSIS"; then
210
+ skip_next_line=true
211
+ continue
212
+ fi
213
+
214
+ # Detectar inicio/fin de bloque SKIP_ANALYSIS_BLOCK
215
+ if echo "$line" | grep -q "// SKIP_ANALYSIS_BLOCK"; then
219
216
  if [ "$inside_skip_block" = true ]; then
220
217
  # Fin del bloque
221
218
  inside_skip_block=false
222
219
  else
223
- # Inicio del bloque o línea única
220
+ # Inicio del bloque
224
221
  inside_skip_block=true
225
- skip_next_line=true
226
222
  fi
227
223
  continue
228
224
  fi
@@ -235,7 +231,6 @@ filter_skip_analysis() {
235
231
  # Si debemos saltar la siguiente línea (comentario único)
236
232
  if [ "$skip_next_line" = true ]; then
237
233
  skip_next_line=false
238
- inside_skip_block=false
239
234
  continue
240
235
  fi
241
236
 
@@ -337,10 +332,9 @@ if $CLAUDE_CLI < "$PROMPT_FILE" > "$RESPONSE_FILE" 2>&1; then
337
332
  BLOCKING_ISSUES=$(echo "$JSON_RESPONSE" | jq -r '.blockingIssues[].description' 2>/dev/null | sed '/^$/d')
338
333
  fi
339
334
 
340
- # Verificar si estamos en modo SonarQube
341
335
  QUALITY_GATE=$(echo "$JSON_RESPONSE" | jq -r '.QUALITY_GATE // ""' 2>/dev/null)
342
336
 
343
- if [ "$ANALYSIS_MODE" = "sonar" ] && [ -n "$QUALITY_GATE" ] && [ "$QUALITY_GATE" != "null" ]; then
337
+ if [ -n "$QUALITY_GATE" ] && [ "$QUALITY_GATE" != "null" ]; then
344
338
  # Mostrar resultados estilo SonarQube
345
339
  echo
346
340
  echo "╔════════════════════════════════════════════════════════════════════╗"