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 +10 -1
- package/README.md +163 -414
- package/bin/claude-hooks +6 -41
- package/package.json +1 -1
- package/templates/pre-commit +9 -15
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 `//
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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. **
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
-
|
|
170
|
-
|
|
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-
|
|
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-
|
|
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
|
-
###
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
360
|
+
│ └── claude-hooks # CLI principal con verificación completa
|
|
549
361
|
├── templates/
|
|
550
|
-
│ ├── pre-commit
|
|
551
|
-
│ ├── prepare-commit-msg
|
|
552
|
-
│ ├──
|
|
553
|
-
│
|
|
554
|
-
├── .
|
|
555
|
-
│
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
├──
|
|
559
|
-
├──
|
|
560
|
-
|
|
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(' //
|
|
450
|
+
console.log(' // SKIP_ANALYSIS_BLOCK # Excluye bloque hasta encontrar otro igual');
|
|
451
451
|
console.log(' ...código excluido...');
|
|
452
|
-
console.log(' //
|
|
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 = ['
|
|
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/', '
|
|
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
|
-
//
|
|
1245
|
+
// SKIP_ANALYSIS_BLOCK # Excluye bloque hasta encontrar otro igual
|
|
1281
1246
|
...código excluido...
|
|
1282
|
-
//
|
|
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
package/templates/pre-commit
CHANGED
|
@@ -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
|
|
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
|
|
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 [
|
|
337
|
+
if [ -n "$QUALITY_GATE" ] && [ "$QUALITY_GATE" != "null" ]; then
|
|
344
338
|
# Mostrar resultados estilo SonarQube
|
|
345
339
|
echo
|
|
346
340
|
echo "╔════════════════════════════════════════════════════════════════════╗"
|