claude-git-hooks 1.0.0 → 1.1.0

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.
Files changed (3) hide show
  1. package/README.md +232 -36
  2. package/bin/claude-hooks +53 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -49,10 +49,47 @@ git config --global credential.helper store
49
49
  # O configura tu credential helper específico
50
50
  ```
51
51
 
52
- ## 🚀 Instalación Rápida (WSL)
52
+ ## 🚀 Instalación
53
+
54
+ ### Opción 1: Paquete NPM Global (Recomendado)
53
55
 
54
56
  **IMPORTANTE**: Claude CLI corre en WSL, por lo que toda la instalación y uso de git debe hacerse desde la terminal WSL.
55
57
 
58
+ #### Instalación Global
59
+
60
+ ```bash
61
+ # Instalar el paquete globalmente
62
+ sudo npm install -g claude-git-hooks
63
+
64
+ # En cualquier repositorio, instalar los hooks
65
+ cd tu-proyecto
66
+ claude-hooks install
67
+ ```
68
+
69
+ #### Añadir como Dependencia de Desarrollo
70
+
71
+ ```bash
72
+ # Instalar como devDependency
73
+ npm install --save-dev claude-git-hooks
74
+
75
+ # Añadir script al package.json
76
+ ```
77
+
78
+ Luego añade esto a tu `package.json`:
79
+
80
+ ```json
81
+ {
82
+ "scripts": {
83
+ "postinstall": "claude-hooks install"
84
+ },
85
+ "devDependencies": {
86
+ "claude-git-hooks": "^1.0.0"
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Opción 2: Instalación Local con Scripts
92
+
56
93
  ```bash
57
94
  # Desde WSL - Instalación completa
58
95
  ./git-hooks/setup-wsl.sh
@@ -70,14 +107,15 @@ git config --global credential.helper store
70
107
  ./git-hooks/setup-wsl.sh --disable-hooks prepare-commit-msg # Deshabilita solo prepare-commit-msg
71
108
  ```
72
109
 
110
+ ## 🤖 Características
111
+
73
112
  **✨ Auto-actualización incorporada**: Los hooks se actualizan automáticamente en cada commit.
74
113
 
75
- **🤖 Hooks instalados**:
114
+ **Hooks disponibles**:
76
115
 
77
116
  - `pre-commit`: Análisis de código con Claude (solo archivos Java/config)
78
117
  - `prepare-commit-msg`: Generación automática de mensajes de commit
79
118
 
80
-
81
119
  ## 🎯 Funcionamiento
82
120
 
83
121
  ### Hook pre-commit (Análisis de código)
@@ -105,10 +143,7 @@ git config --global credential.helper store
105
143
  ### Hook prepare-commit-msg (Generación automática de mensajes)
106
144
 
107
145
  1. **Se activa cuando el mensaje es**:
108
- - Vacío (`""`)
109
146
  - `"auto"`
110
- - `"--"`
111
- - `"tmp"`
112
147
  2. **Analiza los cambios del staging area**:
113
148
  - Lista archivos modificados con estadísticas
114
149
  - Incluye diffs completos para archivos < 100KB
@@ -151,48 +186,54 @@ Claude analizará los cambios y generará un mensaje de commit siguiendo las con
151
186
 
152
187
  **⚠️ Si la generación automática falla**: El commit se cancelará completamente. Simplemente ejecuta `git commit -m "tu mensaje"` manualmente.
153
188
 
154
- ### Selección de formato de análisis 📊
189
+ ### Modos de análisis 📊
155
190
 
156
- **Opción 1: Con variable de entorno (recomendado)**
191
+ Puedes elegir entre dos formatos de análisis:
192
+
193
+ #### 🎯 Configurar Modo (Recomendado)
157
194
 
158
195
  ```bash
159
- # Para formato estándar
160
- export CLAUDE_ANALYSIS_MODE=standard
161
- git commit -m "mensaje"
196
+ # Cambiar a modo SonarQube (métricas y quality gate)
197
+ claude-hooks set-mode sonar
162
198
 
163
- # Para formato SonarQube
164
- export CLAUDE_ANALYSIS_MODE=sonar
165
- git commit -m "mensaje"
199
+ # Cambiar a modo estándar (score y recomendaciones)
200
+ claude-hooks set-mode standard
201
+
202
+ # Ver modo actual
203
+ claude-hooks status
166
204
  ```
167
205
 
168
- **Opción 2: Configuración interactiva**
206
+ #### 🔧 Variable de Entorno (Temporal)
169
207
 
170
208
  ```bash
209
+ # Sobrescribir temporalmente el modo configurado
210
+ export CLAUDE_ANALYSIS_MODE=sonar
171
211
  git commit -m "mensaje"
172
- # En la primera ejecución te preguntará:
173
- # 1) Estándar - Formato clásico con recomendaciones
174
- # 2) SonarQube - Formato similar a SonarQube con métricas
212
+
213
+ # Volver al modo configurado
214
+ unset CLAUDE_ANALYSIS_MODE
175
215
  ```
176
216
 
177
- **⚠️ Nota sobre compatibilidad**: La selección interactiva requiere una terminal con soporte TTY (terminal interactiva). En WSL generalmente funciona correctamente. Sin embargo, en algunos entornos como:
217
+ #### 📋 Diferencias entre Modos
178
218
 
179
- - Scripts automatizados
180
- - CI/CD pipelines
181
- - Algunos emuladores de terminal
182
- - Cuando no hay TTY disponible
219
+ **Modo Estándar**:
220
+ - Análisis con puntuación del 1-10
221
+ - Recomendaciones detalladas por categoría
222
+ - Formato tradicional fácil de leer
183
223
 
184
- El sistema automáticamente usará el modo **estándar** como fallback sin preguntar.
224
+ **Modo SonarQube**:
225
+ - Quality Gate (PASSED/FAILED)
226
+ - Métricas: Reliability, Security, Maintainability
227
+ - Issues clasificados por severidad (Blocker, Critical, Major, Minor, Info)
228
+ - Security hotspots
185
229
 
186
- **Opción 3: Cambiar configuración guardada**
230
+ #### 🔄 Cambio de Modo Interactivo
187
231
 
188
232
  ```bash
189
- .git/hooks/pre-commit --change-mode
233
+ # Sin parámetros muestra ayuda interactiva
234
+ claude-hooks set-mode
190
235
  ```
191
236
 
192
- **Formato Estándar**: Análisis tradicional con score, recomendaciones y detalles por categoría.
193
-
194
- **Formato SonarQube**: Análisis con Quality Gate, métricas (Reliability, Security, Maintainability), clasificación de issues por severidad (Blocker, Critical, Major, Minor, Info), y security hotspots.
195
-
196
237
  ### Saltar la revisión (usar con precaución)
197
238
 
198
239
  ```bash
@@ -221,18 +262,21 @@ Claude responde con un JSON que incluye:
221
262
 
222
263
  ```bash
223
264
  # Desactivar todos los hooks
224
- ./git-hooks/setup-wsl.sh --disable-hooks
265
+ claude-hooks disable
225
266
 
226
267
  # Desactivar un hook específico
227
- ./git-hooks/setup-wsl.sh --disable-hooks pre-commit
228
- ./git-hooks/setup-wsl.sh --disable-hooks prepare-commit-msg
268
+ claude-hooks disable pre-commit
269
+ claude-hooks disable prepare-commit-msg
229
270
 
230
271
  # Habilitar todos los hooks
231
- ./git-hooks/setup-wsl.sh --enable-hooks
272
+ claude-hooks enable
232
273
 
233
274
  # Habilitar un hook específico
234
- ./git-hooks/setup-wsl.sh --enable-hooks pre-commit
235
- ./git-hooks/setup-wsl.sh --enable-hooks prepare-commit-msg
275
+ claude-hooks enable pre-commit
276
+ claude-hooks enable prepare-commit-msg
277
+
278
+ # Ver estado actual
279
+ claude-hooks status
236
280
  ```
237
281
 
238
282
  ## ⚙️ Configuración
@@ -353,3 +397,155 @@ WSL Terminal
353
397
  2. **Line Endings**: La configuración de `core.autocrlf` es crítica para evitar problemas entre Windows y Linux
354
398
  3. **Credenciales**: Necesitarás reconfigurar tus credenciales git en WSL
355
399
  4. **Performance**: La revisión puede tardar unos segundos dependiendo del tamaño de los cambios
400
+
401
+ ## 🔧 Desarrollo y Contribución
402
+
403
+ ### Estructura del Proyecto
404
+
405
+ ```
406
+ claude-git-hooks/
407
+ ├── bin/
408
+ │ └── claude-hooks # CLI principal
409
+ ├── templates/
410
+ │ ├── pre-commit # Hook de análisis de código
411
+ │ ├── prepare-commit-msg # Hook de generación de mensajes
412
+ │ ├── CLAUDE_PRE_COMMIT.md # Pautas estándar
413
+ │ └── CLAUDE_PRE_COMMIT_SONAR.md # Pautas SonarQube
414
+ ├── setup-wsl.sh # Script de instalación local (legacy)
415
+ ├── package.json # Configuración NPM
416
+ ├── README.md # Este archivo
417
+ ├── README-NPM.md # Documentación para NPM
418
+ └── PUBLISH.md # Guía de publicación
419
+ ```
420
+
421
+ ### Configuración del Entorno de Desarrollo
422
+
423
+ ```bash
424
+ # 1. Clonar el repositorio
425
+ git clone https://github.com/pablorovito/claude-git-hooks.git
426
+ cd claude-git-hooks
427
+
428
+ # 2. Instalar dependencias (si las hubiera)
429
+ npm install
430
+
431
+ # 3. Enlazar para desarrollo local
432
+ npm link
433
+
434
+ # 4. Probar en un repositorio de prueba
435
+ cd /path/to/test-repo
436
+ claude-hooks install
437
+ ```
438
+
439
+ ### Workflow de Desarrollo
440
+
441
+ #### 1. Modificar Hooks
442
+
443
+ Los hooks están en `templates/`:
444
+
445
+ - `templates/pre-commit` - Lógica de análisis de código
446
+ - `templates/prepare-commit-msg` - Lógica de generación de mensajes
447
+
448
+ #### 2. Probar Localmente
449
+
450
+ ```bash
451
+ # Después de modificar archivos
452
+ npm link
453
+
454
+ # En un repo de prueba
455
+ claude-hooks install --force # Fuerza reinstalación
456
+
457
+ # Probar funcionalidad
458
+ git add .
459
+ git commit -m "auto" # Probar generación automática
460
+ git commit -m "test" # Probar análisis
461
+ ```
462
+
463
+ #### 3. Actualizar Documentación
464
+
465
+ - `README.md` - Documentación principal
466
+ - `README-NPM.md` - Para usuarios de NPM
467
+ - `templates/CLAUDE_PRE_COMMIT*.md` - Pautas de evaluación
468
+
469
+ #### 4. Versioning y Publicación
470
+
471
+ ```bash
472
+ # Actualizar versión
473
+ npm version patch # 1.0.0 -> 1.0.1
474
+ npm version minor # 1.0.0 -> 1.1.0
475
+ npm version major # 1.0.0 -> 2.0.0
476
+
477
+ # Publicar nueva versión
478
+ npm publish
479
+
480
+ # Tag en git
481
+ git push --tags
482
+ ```
483
+
484
+ ### Debugging
485
+
486
+ #### Modo Debug
487
+
488
+ ```bash
489
+ # Activar debug en hooks
490
+ DEBUG=1 git commit -m "test"
491
+
492
+ # Ver logs del CLI
493
+ claude-hooks install --debug
494
+ ```
495
+
496
+ #### Logs Útiles
497
+
498
+ - `debug-claude-response.json` - Respuestas de Claude en modo debug
499
+ - `~/.npm/_logs/` - Logs de npm install
500
+ - `.git/hooks/` - Verificar que hooks están instalados
501
+
502
+ ### Testing
503
+
504
+ #### Test Manual
505
+
506
+ ```bash
507
+ # 1. Crear repo de prueba
508
+ mkdir test-repo && cd test-repo
509
+ git init
510
+
511
+ # 2. Instalar hooks
512
+ claude-hooks install
513
+
514
+ # 3. Crear archivos de prueba
515
+ echo 'public class Test {}' > Test.java
516
+ git add .
517
+
518
+ # 4. Probar análisis
519
+ git commit -m "test: nueva clase"
520
+
521
+ # 5. Probar generación automática
522
+ echo 'public void newMethod() {}' >> Test.java
523
+ git add .
524
+ git commit -m "auto"
525
+ ```
526
+
527
+ #### Casos de Prueba
528
+
529
+ - ✅ Análisis de código Java
530
+ - ✅ Generación automática de mensajes
531
+ - ✅ Modo SonarQube
532
+ - ✅ Archivos grandes (>100KB)
533
+ - ✅ Commits sin archivos Java
534
+ - ✅ Enable/disable hooks
535
+ - ✅ Modo debug
536
+
537
+ ### Contribuir
538
+
539
+ 1. **Fork** el repositorio
540
+ 2. **Crear branch** para tu feature: `git checkout -b feature/nueva-funcionalidad`
541
+ 3. **Commit** tus cambios: `git commit -m "feat: nueva funcionalidad"`
542
+ 4. **Push** al branch: `git push origin feature/nueva-funcionalidad`
543
+ 5. **Abrir Pull Request**
544
+
545
+ ### Roadmap
546
+
547
+ - [ ] Soporte para más lenguajes (Python, JavaScript, etc.)
548
+ - [ ] Configuración más granular por proyecto
549
+ - [ ] Integration con IDEs populares
550
+ - [ ] Métricas de uso y performance
551
+ - [ ] Tests automatizados
package/bin/claude-hooks CHANGED
@@ -224,6 +224,18 @@ function status() {
224
224
  }
225
225
  });
226
226
 
227
+ // Verificar modo de análisis actual
228
+ console.log('\nModo de análisis:');
229
+ const analysisMode = fs.existsSync('.claude-analysis-mode')
230
+ ? fs.readFileSync('.claude-analysis-mode', 'utf8').trim()
231
+ : 'standard (por defecto)';
232
+
233
+ if (analysisMode === 'sonar') {
234
+ info(`Modo actual: SonarQube`);
235
+ } else {
236
+ info(`Modo actual: Estándar`);
237
+ }
238
+
227
239
  // Verificar archivos de pautas
228
240
  console.log('\nArchivos de pautas:');
229
241
  const guidelines = ['CLAUDE_PRE_COMMIT.md', 'CLAUDE_PRE_COMMIT_SONAR.md'];
@@ -236,6 +248,40 @@ function status() {
236
248
  });
237
249
  }
238
250
 
251
+ // Comando set-mode
252
+ function setMode(mode) {
253
+ if (!checkGitRepo()) {
254
+ error('No estás en un repositorio Git.');
255
+ }
256
+
257
+ const validModes = ['standard', 'sonar'];
258
+
259
+ if (!mode) {
260
+ // Modo interactivo
261
+ console.log('\nSelecciona el modo de análisis:');
262
+ console.log('1) Standard - Formato clásico con score y recomendaciones');
263
+ console.log('2) SonarQube - Formato similar a SonarQube con métricas');
264
+ console.log('\nEjemplo de uso: claude-hooks set-mode standard');
265
+ console.log(' claude-hooks set-mode sonar');
266
+ return;
267
+ }
268
+
269
+ if (!validModes.includes(mode)) {
270
+ error(`Modo inválido: ${mode}. Usa 'standard' o 'sonar'`);
271
+ }
272
+
273
+ // Guardar el modo
274
+ fs.writeFileSync('.claude-analysis-mode', mode);
275
+
276
+ if (mode === 'sonar') {
277
+ success('Modo cambiado a: SonarQube');
278
+ info('Los commits usarán formato SonarQube con métricas y quality gate');
279
+ } else {
280
+ success('Modo cambiado a: Estándar');
281
+ info('Los commits usarán formato clásico con score y recomendaciones');
282
+ }
283
+ }
284
+
239
285
  // Comando help
240
286
  function showHelp() {
241
287
  console.log(`
@@ -248,6 +294,7 @@ Comandos:
248
294
  uninstall Desinstala los hooks del repositorio
249
295
  enable [hook] Habilita hooks (todos o uno específico)
250
296
  disable [hook] Deshabilita hooks (todos o uno específico)
297
+ set-mode [standard|sonar] Cambia el modo de análisis
251
298
  status Muestra el estado de los hooks
252
299
  help Muestra esta ayuda
253
300
 
@@ -257,11 +304,13 @@ Hooks disponibles:
257
304
 
258
305
  Ejemplos:
259
306
  claude-hooks install # Instala todos los hooks
307
+ claude-hooks set-mode sonar # Cambiar a modo SonarQube
308
+ claude-hooks set-mode standard # Cambiar a modo estándar
260
309
  claude-hooks disable pre-commit # Deshabilita solo pre-commit
261
310
  claude-hooks enable # Habilita todos los hooks
262
311
  claude-hooks status # Ver estado actual
263
312
 
264
- Más información: https://github.com/tresmares/claude-git-hooks
313
+ Más información: https://github.com/pablorovito/claude-git-hooks
265
314
  `);
266
315
  }
267
316
 
@@ -282,6 +331,9 @@ switch (command) {
282
331
  case 'disable':
283
332
  disable(args[1]);
284
333
  break;
334
+ case 'set-mode':
335
+ setMode(args[1]);
336
+ break;
285
337
  case 'status':
286
338
  status();
287
339
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-git-hooks",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
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": {