355 lines
9.3 KiB
Markdown
355 lines
9.3 KiB
Markdown
## Mensaje de Commit
|
|
|
|
Genera mensajes de commit a partir de cambios staged (git diff --staged). Este comando solo crea mensajes y los copia al portapapeles—no ejecuta ningún comando git.
|
|
|
|
### Uso
|
|
|
|
```bash
|
|
/commit-message [opciones]
|
|
```
|
|
|
|
### Opciones
|
|
|
|
- `--format <formato>` : Elegir formato de mensaje (conventional, gitmoji, angular)
|
|
- `--lang <idioma>` : Establecer idioma explícitamente (en, es)
|
|
- `--breaking` : Incluir detección de cambios disruptivos
|
|
|
|
### Ejemplos Básicos
|
|
|
|
```bash
|
|
# Generar mensaje a partir de cambios staged (idioma auto-detectado)
|
|
# La sugerencia principal se copia automáticamente al portapapeles
|
|
/commit-message
|
|
|
|
# Especificar idioma explícitamente
|
|
/commit-message --lang es
|
|
/commit-message --lang en
|
|
|
|
# Incluir detección de cambios disruptivos
|
|
/commit-message --breaking
|
|
```
|
|
|
|
### Prerrequisitos
|
|
|
|
**Importante**: Este comando solo funciona con cambios staged. Ejecuta `git add` primero para staged tus cambios.
|
|
|
|
```bash
|
|
# Si no hay nada staged, verás:
|
|
$ /commit-message
|
|
No staged changes found. Please run git add first.
|
|
```
|
|
|
|
### Función Automática de Portapapeles
|
|
|
|
La sugerencia principal se copia al portapapeles como comando completo: `git commit -m "mensaje"`. Solo pégalo y ejecútalo en tu terminal.
|
|
|
|
**Notas de Implementación**:
|
|
|
|
- Ejecutar `pbcopy` en un proceso separado de la salida del mensaje
|
|
- Usar `printf` en lugar de `echo` para evitar saltos de línea no deseados
|
|
|
|
### Detección Automática de Convenciones del Proyecto
|
|
|
|
**Importante**: Si existen convenciones específicas del proyecto, tienen prioridad.
|
|
|
|
#### 1. Verificación de Configuración CommitLint
|
|
|
|
Detecta automáticamente configuraciones de los siguientes archivos:
|
|
|
|
- `commitlint.config.js`
|
|
- `commitlint.config.mjs`
|
|
- `commitlint.config.cjs`
|
|
- `commitlint.config.ts`
|
|
- `.commitlintrc.js`
|
|
- `.commitlintrc.json`
|
|
- `.commitlintrc.yml`
|
|
- `.commitlintrc.yaml`
|
|
- `package.json` con sección `commitlint`
|
|
|
|
```bash
|
|
# Buscar archivos de configuración
|
|
find . -name "commitlint.config.*" -o -name ".commitlintrc.*" | head -1
|
|
```
|
|
|
|
#### 2. Detección de Tipos Personalizados
|
|
|
|
Ejemplo de tipos específicos del proyecto:
|
|
|
|
```javascript
|
|
// commitlint.config.mjs
|
|
export default {
|
|
extends: ["@commitlint/config-conventional"],
|
|
rules: {
|
|
"type-enum": [
|
|
2,
|
|
"always",
|
|
[
|
|
"feat",
|
|
"fix",
|
|
"docs",
|
|
"style",
|
|
"refactor",
|
|
"test",
|
|
"chore",
|
|
"wip", // work in progress
|
|
"hotfix", // urgent fix
|
|
"release", // release
|
|
"deps", // dependency update
|
|
"config", // configuration change
|
|
],
|
|
],
|
|
},
|
|
};
|
|
```
|
|
|
|
#### 3. Detección de Configuración de Idioma
|
|
|
|
```javascript
|
|
// El proyecto usa mensajes en español
|
|
export default {
|
|
rules: {
|
|
"subject-case": [0], // Deshabilitar para soporte español
|
|
"subject-max-length": [2, "always", 72], // Ajustar límite de caracteres para español
|
|
},
|
|
};
|
|
```
|
|
|
|
#### 4. Análisis de Historial de Commits Existentes
|
|
|
|
```bash
|
|
# Aprender patrones de uso de commits recientes
|
|
git log --oneline -50 --pretty=format:"%s"
|
|
|
|
# Estadísticas de tipos utilizados
|
|
git log --oneline -100 --pretty=format:"%s" | \
|
|
grep -oE '^[a-z]+(\([^)]+\))?' | \
|
|
sort | uniq -c | sort -nr
|
|
```
|
|
|
|
### Detección Automática de Idioma
|
|
|
|
Cambia automáticamente entre español/inglés/japonés basado en:
|
|
|
|
1. **Configuración CommitLint** configuraciones de idioma
|
|
2. **análisis git log** detección automática
|
|
3. **archivo del proyecto** configuraciones de idioma
|
|
4. **archivo cambiado** análisis de comentarios y cadenas
|
|
|
|
Por defecto es inglés. Genera en español si se detecta como proyecto en español.
|
|
|
|
### Formato de Mensaje
|
|
|
|
#### Conventional Commits (Por defecto)
|
|
|
|
```text
|
|
<type>: <description>
|
|
```
|
|
|
|
**Importante**: Siempre genera mensajes de commit de una sola línea. No genera mensajes multilínea.
|
|
|
|
**Nota**: Las convenciones específicas del proyecto tienen prioridad si existen.
|
|
|
|
### Tipos Estándar
|
|
|
|
**Tipos Requeridos**:
|
|
|
|
- `feat`: Nueva característica (adición de característica visible al usuario)
|
|
- `fix`: Corrección de error
|
|
|
|
**Tipos Opcionales**:
|
|
|
|
- `build`: Cambios en sistema de build o dependencias externas
|
|
- `chore`: Otros cambios (sin impacto en release)
|
|
- `ci`: Cambios en archivos y scripts de configuración CI
|
|
- `docs`: Cambios solo en documentación
|
|
- `style`: Cambios que no afectan el significado del código (espacios, formato, punto y coma, etc.)
|
|
- `refactor`: Cambios de código sin correcciones de errores o adiciones de características
|
|
- `perf`: Mejoras de rendimiento
|
|
- `test`: Agregando o corrigiendo pruebas
|
|
|
|
### Ejemplo de Salida (Proyecto en Inglés)
|
|
|
|
```bash
|
|
$ /commit-message
|
|
|
|
📝 Sugerencias de Mensaje de Commit
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
✨ Candidato Principal:
|
|
feat: implement JWT-based authentication system
|
|
|
|
📋 Alternativas:
|
|
1. feat: add user authentication with JWT tokens
|
|
2. fix: resolve token validation error in auth middleware
|
|
3. refactor: extract auth logic into separate module
|
|
|
|
✅ `git commit -m "feat: implement JWT-based authentication system"` copiado al portapapeles
|
|
```
|
|
|
|
**Ejemplo de Implementación (Versión Corregida)**:
|
|
|
|
```bash
|
|
# Copiar comando de commit al portapapeles primero (sin salto de línea)
|
|
printf 'git commit -m "%s"' "$COMMIT_MESSAGE" | pbcopy
|
|
|
|
# Después mostrar mensaje
|
|
cat << EOF
|
|
📝 Sugerencias de Mensaje de Commit
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
✨ Candidato Principal:
|
|
$COMMIT_MESSAGE
|
|
|
|
📋 Alternativas:
|
|
1. ...
|
|
2. ...
|
|
3. ...
|
|
|
|
✅ \`git commit -m "$COMMIT_MESSAGE"\` copiado al portapapeles
|
|
EOF
|
|
```
|
|
|
|
### Ejemplo de Salida (Proyecto en Español)
|
|
|
|
```bash
|
|
$ /commit-message
|
|
|
|
📝 Sugerencias de Mensaje de Commit
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
✨ Candidato Principal:
|
|
feat: implementar sistema de autenticación JWT
|
|
|
|
📋 Alternativas:
|
|
1. feat: agregar autenticación de usuario con tokens JWT
|
|
2. fix: resolver error de validación de token en middleware auth
|
|
3. refactor: extraer lógica de auth a módulo separado
|
|
|
|
✅ `git commit -m "feat: implementar sistema de autenticación JWT"` copiado al portapapeles
|
|
```
|
|
|
|
### Resumen de Operación
|
|
|
|
1. **Análisis**: Analizar contenido de `git diff --staged`
|
|
2. **Generación**: Generar mensaje de commit apropiado
|
|
3. **Copiar**: Copiar automáticamente candidato principal al portapapeles
|
|
|
|
**Nota**: Este comando no ejecuta git add o git commit. Solo genera mensajes de commit y copia al portapapeles.
|
|
|
|
### Características Inteligentes
|
|
|
|
#### 1. Clasificación Automática de Cambios (Solo Archivos Staged)
|
|
|
|
- Adición de archivo nuevo → `feat`
|
|
- Patrones de corrección de errores → `fix`
|
|
- Solo archivos de prueba → `test`
|
|
- Cambios en archivos de configuración → `chore`
|
|
- Actualizaciones README/docs → `docs`
|
|
|
|
#### 2. Detección Automática de Convenciones del Proyecto
|
|
|
|
- Archivo `.gitmessage`
|
|
- Convenciones en `CONTRIBUTING.md`
|
|
- Patrones de historial de commits pasados
|
|
|
|
#### 3. Detalles de Detección de Idioma (Solo Cambios Staged)
|
|
|
|
```bash
|
|
# Criterios de detección (orden de prioridad)
|
|
1. Detectar idioma del contenido git diff --staged
|
|
2. Análisis de comentarios de archivos staged
|
|
3. Análisis de idioma de git log --oneline -20
|
|
4. Configuraciones de idioma principal del proyecto
|
|
```
|
|
|
|
#### 4. Detalles de Análisis de Staging
|
|
|
|
Información utilizada para análisis (solo lectura):
|
|
|
|
- `git diff --staged --name-only` - Lista de archivos cambiados
|
|
- `git diff --staged` - Contenido real de cambios
|
|
- `git status --porcelain` - Estado de archivos
|
|
|
|
### Detección de Cambios Disruptivos
|
|
|
|
Para cambios disruptivos de API:
|
|
|
|
**Inglés**:
|
|
|
|
```bash
|
|
feat!: change user API response format
|
|
|
|
BREAKING CHANGE: user response now includes additional metadata
|
|
```
|
|
|
|
O:
|
|
|
|
```bash
|
|
feat(api)!: change authentication flow
|
|
```
|
|
|
|
**Español**:
|
|
|
|
```bash
|
|
feat!: cambiar formato de respuesta de API de usuario
|
|
|
|
BREAKING CHANGE: la respuesta del usuario ahora incluye metadatos adicionales
|
|
```
|
|
|
|
O:
|
|
|
|
```bash
|
|
feat(api)!: cambiar flujo de autenticación
|
|
```
|
|
|
|
### Mejores Prácticas
|
|
|
|
1. **Coincidir con proyecto**: Seguir idioma de commits existentes
|
|
2. **Concisión**: Claro dentro de 50 caracteres
|
|
3. **Consistencia**: No mezclar idiomas (mantener consistencia en español)
|
|
4. **OSS**: Inglés recomendado para código abierto
|
|
5. **Una línea**: Siempre mensaje de commit de una línea (complementar con PR para explicaciones detalladas)
|
|
|
|
### Patrones Comunes
|
|
|
|
**Inglés**:
|
|
|
|
```text
|
|
feat: add user registration endpoint
|
|
fix: resolve memory leak in cache manager
|
|
docs: update API documentation
|
|
```
|
|
|
|
**Español**:
|
|
|
|
```text
|
|
feat: agregar endpoint de registro de usuario
|
|
fix: resolver fuga de memoria en gestor de caché
|
|
docs: actualizar documentación de API
|
|
```
|
|
|
|
### Integración con Claude
|
|
|
|
```bash
|
|
# Usar con cambios staged
|
|
git add -p # Staging interactivo
|
|
/commit-message
|
|
"Generar mensaje de commit óptimo"
|
|
|
|
# Staged y analizar archivos específicos
|
|
git add src/auth/*.js
|
|
/commit-message --lang es
|
|
"Generar mensaje para cambios de autenticación"
|
|
|
|
# Detección y manejo de cambios disruptivos
|
|
git add -A
|
|
/commit-message --breaking
|
|
"Marcar apropiadamente si hay cambios disruptivos"
|
|
```
|
|
|
|
### Notas Importantes
|
|
|
|
- **Prerrequisito**: Los cambios deben estar staged con `git add` de antemano
|
|
- **Limitación**: Los cambios no staged no se analizan
|
|
- **Recomendación**: Verificar primero las convenciones de commit del proyecto existente
|