claude-git-hooks 2.0.0 → 2.3.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 (47) hide show
  1. package/CHANGELOG.md +212 -0
  2. package/README.md +217 -92
  3. package/bin/claude-hooks +311 -149
  4. package/lib/config.js +163 -0
  5. package/lib/hooks/pre-commit.js +180 -68
  6. package/lib/hooks/prepare-commit-msg.js +47 -41
  7. package/lib/utils/claude-client.js +93 -11
  8. package/lib/utils/file-operations.js +23 -74
  9. package/lib/utils/file-utils.js +65 -0
  10. package/lib/utils/package-info.js +75 -0
  11. package/lib/utils/preset-loader.js +209 -0
  12. package/lib/utils/prompt-builder.js +83 -67
  13. package/lib/utils/resolution-prompt.js +12 -2
  14. package/package.json +49 -50
  15. package/templates/ANALYZE_DIFF.md +33 -0
  16. package/templates/COMMIT_MESSAGE.md +24 -0
  17. package/templates/SUBAGENT_INSTRUCTION.md +1 -0
  18. package/templates/config.example.json +41 -0
  19. package/templates/presets/ai/ANALYSIS_PROMPT.md +133 -0
  20. package/templates/presets/ai/PRE_COMMIT_GUIDELINES.md +176 -0
  21. package/templates/presets/ai/config.json +12 -0
  22. package/templates/presets/ai/preset.json +42 -0
  23. package/templates/presets/backend/ANALYSIS_PROMPT.md +85 -0
  24. package/templates/presets/backend/PRE_COMMIT_GUIDELINES.md +87 -0
  25. package/templates/presets/backend/config.json +12 -0
  26. package/templates/presets/backend/preset.json +49 -0
  27. package/templates/presets/database/ANALYSIS_PROMPT.md +114 -0
  28. package/templates/presets/database/PRE_COMMIT_GUIDELINES.md +143 -0
  29. package/templates/presets/database/config.json +12 -0
  30. package/templates/presets/database/preset.json +38 -0
  31. package/templates/presets/default/config.json +12 -0
  32. package/templates/presets/default/preset.json +53 -0
  33. package/templates/presets/frontend/ANALYSIS_PROMPT.md +99 -0
  34. package/templates/presets/frontend/PRE_COMMIT_GUIDELINES.md +95 -0
  35. package/templates/presets/frontend/config.json +12 -0
  36. package/templates/presets/frontend/preset.json +50 -0
  37. package/templates/presets/fullstack/ANALYSIS_PROMPT.md +107 -0
  38. package/templates/presets/fullstack/CONSISTENCY_CHECKS.md +147 -0
  39. package/templates/presets/fullstack/PRE_COMMIT_GUIDELINES.md +125 -0
  40. package/templates/presets/fullstack/config.json +12 -0
  41. package/templates/presets/fullstack/preset.json +55 -0
  42. package/templates/shared/ANALYSIS_PROMPT.md +103 -0
  43. package/templates/shared/ANALYZE_DIFF.md +33 -0
  44. package/templates/shared/COMMIT_MESSAGE.md +24 -0
  45. package/templates/shared/PRE_COMMIT_GUIDELINES.md +145 -0
  46. package/templates/shared/RESOLUTION_PROMPT.md +32 -0
  47. package/templates/check-version.sh +0 -266
@@ -1,266 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Script compartido para verificar versión de claude-git-hooks
4
- # Este script puede ser invocado desde cualquier hook
5
-
6
- # Colores para output
7
- RED='\033[0;31m'
8
- GREEN='\033[0;32m'
9
- YELLOW='\033[1;33m'
10
- BLUE='\033[0;34m'
11
- NC='\033[0m' # No Color
12
-
13
- # Función para logging
14
- log() {
15
- echo -e "${GREEN}[VERSION-CHECK]${NC} $1"
16
- }
17
-
18
- error() {
19
- echo -e "${RED}[ERROR]${NC} $1"
20
- }
21
-
22
- warning() {
23
- echo -e "${YELLOW}[WARNING]${NC} $1"
24
- }
25
-
26
- info() {
27
- echo -e "${BLUE}[INFO]${NC} $1"
28
- }
29
-
30
- # Función compartida para comparar versiones semánticas
31
- # Retorna: 1 si v1 > v2, 2 si v1 < v2, 0 si son iguales
32
- compare_versions() {
33
- local v1="$1"
34
- local v2="$2"
35
-
36
- if [ -n "$DEBUG_VERSION" ]; then
37
- echo "[DEBUG] compare_versions: comparando '$v1' con '$v2'"
38
- fi
39
-
40
- # Si son exactamente iguales
41
- if [ "$v1" = "$v2" ]; then
42
- if [ -n "$DEBUG_VERSION" ]; then
43
- echo "[DEBUG] compare_versions: versiones iguales, retornando 0"
44
- fi
45
- return 0
46
- fi
47
-
48
- # Usar sort -V que entiende versiones semánticas correctamente
49
- local sorted=$(printf "%s\n%s" "$v1" "$v2" | sort -V)
50
- local smaller=$(echo "$sorted" | head -1)
51
- local larger=$(echo "$sorted" | tail -1)
52
-
53
- if [ -n "$DEBUG_VERSION" ]; then
54
- echo "[DEBUG] compare_versions: sorted='$sorted', smaller='$smaller', larger='$larger'"
55
- fi
56
-
57
- if [ "$v1" = "$larger" ]; then
58
- if [ -n "$DEBUG_VERSION" ]; then
59
- echo "[DEBUG] compare_versions: v1 es mayor, retornando 1"
60
- fi
61
- return 1 # v1 es mayor que v2
62
- else
63
- if [ -n "$DEBUG_VERSION" ]; then
64
- echo "[DEBUG] compare_versions: v1 es menor, retornando 2"
65
- fi
66
- return 2 # v1 es menor que v2 (cambié de 255 a 2 para evitar problemas con set -e)
67
- fi
68
- }
69
-
70
- # Función principal de verificación
71
- check_version() {
72
- # Debug mode si está activado
73
- if [ -n "$DEBUG_VERSION" ]; then
74
- echo "[DEBUG] Iniciando verificación de versión..."
75
- fi
76
-
77
- info "Verificando versión instalada..."
78
-
79
- # Intentar obtener versión actual desde package.json global
80
- CURRENT_VERSION=""
81
- NPM_PREFIX=$(npm prefix -g 2>/dev/null || echo "/usr/local")
82
- PACKAGE_JSON_PATHS=(
83
- "$NPM_PREFIX/lib/node_modules/claude-git-hooks/package.json"
84
- "/usr/lib/node_modules/claude-git-hooks/package.json"
85
- "/usr/local/lib/node_modules/claude-git-hooks/package.json"
86
- "$HOME/.npm-global/lib/node_modules/claude-git-hooks/package.json"
87
- )
88
-
89
- for path in "${PACKAGE_JSON_PATHS[@]}"; do
90
- if [ -f "$path" ]; then
91
- CURRENT_VERSION=$(grep '"version"' "$path" 2>/dev/null | sed 's/.*"version".*"\(.*\)".*/\1/')
92
- break
93
- fi
94
- done
95
-
96
- if [ -z "$CURRENT_VERSION" ]; then
97
- warning "No se pudo determinar la versión actual"
98
- return 0 # Continuar sin bloquear
99
- fi
100
-
101
- if [ -n "$DEBUG_VERSION" ]; then
102
- echo "[DEBUG] Versión actual encontrada: $CURRENT_VERSION"
103
- fi
104
-
105
- # Obtener última versión desde NPM (usando npm view que es más confiable)
106
- info "Verificando última versión disponible..."
107
-
108
- # Método principal: usar npm view que es más confiable
109
- if [ -n "$DEBUG_VERSION" ]; then
110
- echo "[DEBUG] Ejecutando: npm view claude-git-hooks version"
111
- fi
112
-
113
- LATEST_VERSION=$(npm view claude-git-hooks version 2>/dev/null || echo "")
114
-
115
- if [ -n "$DEBUG_VERSION" ]; then
116
- echo "[DEBUG] npm view retornó: '$LATEST_VERSION'"
117
- echo "[DEBUG] Longitud de LATEST_VERSION: ${#LATEST_VERSION}"
118
- fi
119
-
120
- # Si npm view falla, intentar con la API de NPM
121
- if [ -z "$LATEST_VERSION" ]; then
122
- # Obtener el JSON completo y extraer dist-tags.latest con jq si está disponible
123
- if command -v jq &> /dev/null; then
124
- LATEST_VERSION=$(curl -s https://registry.npmjs.org/claude-git-hooks 2>/dev/null | jq -r '."dist-tags".latest' 2>/dev/null || echo "")
125
- if [ -n "$DEBUG_VERSION" ]; then
126
- echo "[DEBUG] jq parsing retornó: '$LATEST_VERSION'"
127
- fi
128
- else
129
- # Sin jq, usar método más robusto con sed
130
- LATEST_VERSION=$(curl -s https://registry.npmjs.org/claude-git-hooks 2>/dev/null | sed -n 's/.*"dist-tags":{[^}]*"latest":"\([^"]*\)".*/\1/p' | head -1)
131
- if [ -n "$DEBUG_VERSION" ]; then
132
- echo "[DEBUG] sed parsing retornó: '$LATEST_VERSION'"
133
- fi
134
- fi
135
- fi
136
-
137
- # Validar que lo obtenido parece una versión (formato X.Y.Z)
138
- if [ -n "$DEBUG_VERSION" ]; then
139
- echo "[DEBUG] Validando versión: '$LATEST_VERSION'"
140
- fi
141
-
142
- if ! echo "$LATEST_VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+' ; then
143
- if [ -n "$DEBUG_VERSION" ]; then
144
- echo "[DEBUG] Versión obtenida no es válida: '$LATEST_VERSION'"
145
- fi
146
- warning "No se pudo obtener una versión válida del registro NPM"
147
- return 0
148
- fi
149
-
150
- if [ -n "$DEBUG_VERSION" ]; then
151
- echo "[DEBUG] Versión válida confirmada: '$LATEST_VERSION'"
152
- fi
153
-
154
- if [ -z "$LATEST_VERSION" ]; then
155
- # Si no se puede obtener la versión, continuar sin bloquear
156
- return 0
157
- fi
158
-
159
- if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
160
- log "Versión actual ($CURRENT_VERSION) está actualizada ✓"
161
- return 0
162
- fi
163
-
164
- # Comparar versiones usando la función compartida
165
- if [ -n "$DEBUG_VERSION" ]; then
166
- echo "[DEBUG] Comparando versiones: '$CURRENT_VERSION' vs '$LATEST_VERSION'"
167
- fi
168
-
169
- # Deshabilitar set -e temporalmente para capturar el código de retorno
170
- set +e
171
- compare_versions "$CURRENT_VERSION" "$LATEST_VERSION"
172
- comparison_result=$?
173
- set -e
174
-
175
- if [ -n "$DEBUG_VERSION" ]; then
176
- echo "[DEBUG] Resultado de comparación: $comparison_result"
177
- fi
178
-
179
- if [ $comparison_result -eq 0 ]; then
180
- # Las versiones son iguales
181
- if [ -n "$DEBUG_VERSION" ]; then
182
- echo "[DEBUG] Las versiones son iguales"
183
- fi
184
- log "Versión actual ($CURRENT_VERSION) está actualizada ✓"
185
- return 0
186
- elif [ $comparison_result -eq 1 ]; then
187
- # La versión actual es mayor que la publicada (desarrollo local)
188
- if [ -n "$DEBUG_VERSION" ]; then
189
- echo "[DEBUG] Versión local ($CURRENT_VERSION) es más nueva que la publicada ($LATEST_VERSION)"
190
- fi
191
- log "Versión de desarrollo ($CURRENT_VERSION) > versión publicada ($LATEST_VERSION) ✓"
192
- return 0
193
- elif [ $comparison_result -eq 2 ]; then
194
- # La versión publicada es mayor, continuar con prompt de actualización
195
- if [ -n "$DEBUG_VERSION" ]; then
196
- echo "[DEBUG] La versión publicada ($LATEST_VERSION) es más nueva que la local ($CURRENT_VERSION)"
197
- fi
198
- # Continuar con el prompt de actualización (no return aquí)
199
- fi
200
-
201
- if [ -n "$DEBUG_VERSION" ]; then
202
- echo "[DEBUG] La versión publicada es más nueva, procediendo con prompt de actualización"
203
- fi
204
-
205
- # Solo mostrar actualización si la versión publicada es realmente más nueva
206
- echo
207
- warning "Nueva versión disponible: $LATEST_VERSION (actual: $CURRENT_VERSION)"
208
- echo -e "${YELLOW}╭─────────────────────────────────────────────╮${NC}"
209
- echo -e "${YELLOW}│${NC} Una nueva versión de claude-git-hooks está ${YELLOW}│${NC}"
210
- echo -e "${YELLOW}│${NC} disponible con mejoras y correcciones ${YELLOW}│${NC}"
211
- echo -e "${YELLOW}╰─────────────────────────────────────────────╯${NC}"
212
- echo
213
-
214
- # Leer respuesta del usuario de forma compatible con todas las consolas
215
- echo -n "¿Deseas actualizar ahora? (s/n): "
216
-
217
- # Intentar varios métodos de lectura para máxima compatibilidad
218
- REPLY=""
219
-
220
- # Método 1: Leer desde /dev/tty si existe
221
- if [ -c /dev/tty ]; then
222
- read -r REPLY </dev/tty 2>/dev/null || REPLY=""
223
- fi
224
-
225
- # Método 2: Si falla, intentar leer desde stdin estándar
226
- if [ -z "$REPLY" ]; then
227
- read -r REPLY 2>/dev/null || REPLY=""
228
- fi
229
-
230
- # Método 3: Si aún no tenemos respuesta, usar bash -c
231
- if [ -z "$REPLY" ]; then
232
- REPLY=$(bash -c 'read -r reply && echo "$reply"' 2>/dev/null || echo "")
233
- fi
234
-
235
- # Si ningún método funcionó, informar y continuar
236
- if [ -z "$REPLY" ]; then
237
- echo
238
- info "No se pudo leer la respuesta. Continuando sin actualizar."
239
- info "Para actualizar manualmente, ejecuta: claude-hooks update"
240
- return 0
241
- fi
242
-
243
- if [ "$REPLY" = "s" ] || [ "$REPLY" = "S" ] || [ "$REPLY" = "si" ] || [ "$REPLY" = "SI" ] || [ "$REPLY" = "sí" ] || [ "$REPLY" = "SÍ" ] || [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ] || [ "$REPLY" = "yes" ] || [ "$REPLY" = "YES" ]; then
244
- echo
245
- info "Actualizando claude-git-hooks..."
246
-
247
- if npm install -g claude-git-hooks@latest; then
248
- echo
249
- log "✅ Actualización completada exitosamente"
250
- info "Por favor, vuelve a ejecutar tu comando git commit"
251
- exit 0 # Salir para que el usuario reinicie con la nueva versión
252
- else
253
- error "Error al actualizar. Intenta manualmente con: npm install -g claude-git-hooks@latest"
254
- return 1
255
- fi
256
- else
257
- info "Actualización pospuesta. Puedes actualizar más tarde con: claude-hooks update"
258
- echo
259
- return 0
260
- fi
261
- }
262
-
263
- # Si se ejecuta directamente (no como source), ejecutar la verificación
264
- if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
265
- check_version
266
- fi