Skill: commits-real
Commits que cuentan una historia, no que parecen generados por una máquina.
Trigger
- Terminaste un cambio y hay que comitear
- Estás creando un PR o issue
- Necesitás actualizar un CHANGELOG
- Vas a versionar semver
Modos de commit
Modo Humano (default — español rioplatense)
Cálido, claro, directo. Como si se lo explicaras a un colega.
feat(api): agrego endpoint de login pa que los users entren tranqui
Ahora se puede autenticar con email + password. Devuelve un JWT
con expiración de 24hs. Implementé middleware de verificación
también, así que ya estamos cubiertos del lado del server.
Closes #42
fix(data): corrijo el cálculo de interés compuesto
El error estaba en la línea 47 — estaba usando la tasa nominal
cuando tenía que ser la tasa efectiva mensual. Afectaba todos
los préstamos con periodo > 30 días.
feat(ui): agrego dark mode que tanto venías pidiendo
Toggle en el header, usa CSS variables, persiste en localStorage.
Anda en todos los browsers que importan.
Modo Técnico (inglés — para proyectos open source / internacional)
Conventional Commits clásico en inglés US.
feat(api): add JWT authentication endpoint
Implements email+password login returning a signed JWT.
Token expires in 24h. Includes middleware for route protection.
Closes #42
Reglas de oro
- Máximo 300 líneas por commit/PR/issue — si supera, usá
chained-pr
- Atomic commits — un cambio lógico por commit
- Contá una historia — el título dice QUÉ, el body dice POR QUÉ y el PATRÓN
- Nunca hagas commit sin testear antes — primero delegá a
lend-ai-testing
- Engram siempre — guardá lo que se hizo con mem_save
Workflow LEND
ANALIZAR
├── ¿Qué cambió? archivos, funcionalidad, bug, refactor?
├── Scope: ¿qué módulo? (api, ui, data, infra, docs)
├── Breaking: ¿rompe compatibilidad hacia atrás?
└── Issues: ¿hay issues o PRs relacionados?
OFRECER (Menú del Senior)
├── A) Modo humano — español rioplatense, título + breve descripción
├── B) Modo técnico — conventional commit en inglés
├── C) Full — commit + PR + changelog update
└── D) Chained PR — si supera 300 líneas, partilo en PRs encadenados
ELEGIR → user confirma
HACER (PRE-COMMIT GATES primero!)
├── ¿Ya corriste tests? Si no → task('lend-ai-testing', 'verificar que todo anda')
├── ¿Está todo en verde? Ok seguí
├── ¿Supera 300 líneas? → task('chained-pr', ...), no commits gigantes
├── Formato humano: tipo(scope): título en español cálido
├── Tipos: feat, fix, chore, docs, refactor, test, style, perf, ci
├── Mensaje: imperativo, presente, < 60 chars título, < 80 chars body
├── Atomic: un cambio por commit
└── Issues: Closes #123 en el body
VERIFICAR
├── El mensaje es claro y útil para el futuro
├── No hay archivos no relacionados
├── Breaking changes están documentados
└── Tests pasan (siempre)
Post-task (siempre)
- mem_save a Engram con lo que se hizo
- Revisar si hay que actualizar docs (README, AGENTS.md, ARCHITECTURE.md)
Regla del título (modo humano)
tipo(scope): qué hace, en menos de 60 caracteres, en español
Tipos: feat (nueva funcionalidad), fix (bug fix), refactor, test,
docs, style, chore, perf, ci
Scope: api, ui, data, infra, docs, deps, config
Ejemplos:
feat(api): agrego ruta de login con JWT
fix(data): corrijo cálculo de interés compuesto
refactor(ui): extraigo Navbar a componente separado
test(api): agrego tests para auth middleware
docs(readme): actualizo ejemplos de uso
chore(deps): actualizo pandas a 2.0
Comment/Voice rules (PRs, issues, reviews)
- Cálido y directo: "Che, esto está mal porque..." no "Se sugiere reconsiderar..."
- Corto: 1-2 oraciones. Expandí solo si hace falta.
- Explicá el por qué: cada observación incluye la razón
- Idioma: español rioplatense con voseo
- Sé útil rápido: arrancá con lo que importa
Comment formula
Observación directa → Por qué importa → Acción concreta
"Este hook necesita useCallback. Sin memoization se recrea en cada
render y rompe las dependencias del useEffect de abajo.
Metele useCallback con [] y tiramos."
PR guidelines
- Qué revisar PRIMERO (archivos de alto impacto)
- Qué está FUERA DE SCOPE (no hagas adivinar al reviewer)
- Link de contexto si es parte de una cadena de PRs
- Test plan: qué se testeó manual y automáticamente
Anti-patterns
- ❌ Mensajes vagos: "update", "fix", "cambios"
- ❌ Múltiples features en un solo commit
- ❌ Breaking changes sin nota
- ❌ Archivos no relacionados en el mismo commit
- ❌ Commits sin test previo
- ❌ Superar 300 líneas sin partir en chained-pr
1---2name: commits-real3description: Escribe mensajes de commit, PRs e issues con tono humano en español rioplatense o técnico en inglés, siguiendo reglas de atomicidad, límite de 300 líneas y verificación previa de tests.4license: MIT5---67# Skill: commits-real89Commits que cuentan una historia, no que parecen generados por una máquina.1011## Trigger1213- Terminaste un cambio y hay que comitear14- Estás creando un PR o issue15- Necesitás actualizar un CHANGELOG16- Vas a versionar semver1718## Modos de commit1920### Modo Humano (default — español rioplatense)21Cálido, claro, directo. Como si se lo explicaras a un colega.2223```24feat(api): agrego endpoint de login pa que los users entren tranqui2526Ahora se puede autenticar con email + password. Devuelve un JWT27con expiración de 24hs. Implementé middleware de verificación28también, así que ya estamos cubiertos del lado del server.2930Closes #4231```3233```34fix(data): corrijo el cálculo de interés compuesto3536El error estaba en la línea 47 — estaba usando la tasa nominal37cuando tenía que ser la tasa efectiva mensual. Afectaba todos38los préstamos con periodo > 30 días.39```4041```42feat(ui): agrego dark mode que tanto venías pidiendo4344Toggle en el header, usa CSS variables, persiste en localStorage.45Anda en todos los browsers que importan.46```4748### Modo Técnico (inglés — para proyectos open source / internacional)49Conventional Commits clásico en inglés US.5051```52feat(api): add JWT authentication endpoint5354Implements email+password login returning a signed JWT.55Token expires in 24h. Includes middleware for route protection.5657Closes #4258```5960## Reglas de oro61621. **Máximo 300 líneas por commit/PR/issue** — si supera, usá `chained-pr`632. **Atomic commits** — un cambio lógico por commit643. **Contá una historia** — el título dice QUÉ, el body dice POR QUÉ y el PATRÓN654. **Nunca hagas commit sin testear antes** — primero delegá a `lend-ai-testing`665. **Engram siempre** — guardá lo que se hizo con mem_save6768## Workflow LEND69701. ANALIZAR71 ├── ¿Qué cambió? archivos, funcionalidad, bug, refactor?72 ├── Scope: ¿qué módulo? (api, ui, data, infra, docs)73 ├── Breaking: ¿rompe compatibilidad hacia atrás?74 └── Issues: ¿hay issues o PRs relacionados?75762. OFRECER (Menú del Senior)77 ├── A) Modo humano — español rioplatense, título + breve descripción78 ├── B) Modo técnico — conventional commit en inglés79 ├── C) Full — commit + PR + changelog update80 └── D) Chained PR — si supera 300 líneas, partilo en PRs encadenados81823. ELEGIR → user confirma83844. HACER (PRE-COMMIT GATES primero!)85 ├── ¿Ya corriste tests? Si no → `task('lend-ai-testing', 'verificar que todo anda')`86 ├── ¿Está todo en verde? Ok seguí87 ├── ¿Supera 300 líneas? → `task('chained-pr', ...)`, no commits gigantes88 ├── Formato humano: `tipo(scope): título en español cálido`89 ├── Tipos: feat, fix, chore, docs, refactor, test, style, perf, ci90 ├── Mensaje: imperativo, presente, < 60 chars título, < 80 chars body91 ├── Atomic: un cambio por commit92 └── Issues: `Closes #123` en el body93945. VERIFICAR95 ├── El mensaje es claro y útil para el futuro96 ├── No hay archivos no relacionados97 ├── Breaking changes están documentados98 └── Tests pasan (siempre)99100### Post-task (siempre)1011. mem_save a Engram con lo que se hizo1022. Revisar si hay que actualizar docs (README, AGENTS.md, ARCHITECTURE.md)103104## Regla del título (modo humano)105106```107tipo(scope): qué hace, en menos de 60 caracteres, en español108109Tipos: feat (nueva funcionalidad), fix (bug fix), refactor, test,110 docs, style, chore, perf, ci111Scope: api, ui, data, infra, docs, deps, config112113Ejemplos:114 feat(api): agrego ruta de login con JWT115 fix(data): corrijo cálculo de interés compuesto116 refactor(ui): extraigo Navbar a componente separado117 test(api): agrego tests para auth middleware118 docs(readme): actualizo ejemplos de uso119 chore(deps): actualizo pandas a 2.0120```121122## Comment/Voice rules (PRs, issues, reviews)123124- **Cálido y directo**: "Che, esto está mal porque..." no "Se sugiere reconsiderar..."125- **Corto**: 1-2 oraciones. Expandí solo si hace falta.126- **Explicá el por qué**: cada observación incluye la razón127- **Idioma**: español rioplatense con voseo128- **Sé útil rápido**: arrancá con lo que importa129130## Comment formula131132```133Observación directa → Por qué importa → Acción concreta134135"Este hook necesita useCallback. Sin memoization se recrea en cada136render y rompe las dependencias del useEffect de abajo.137Metele useCallback con [] y tiramos."138```139140## PR guidelines141142- Qué revisar PRIMERO (archivos de alto impacto)143- Qué está FUERA DE SCOPE (no hagas adivinar al reviewer)144- Link de contexto si es parte de una cadena de PRs145- Test plan: qué se testeó manual y automáticamente146147## Anti-patterns148149- ❌ Mensajes vagos: "update", "fix", "cambios"150- ❌ Múltiples features en un solo commit151- ❌ Breaking changes sin nota152- ❌ Archivos no relacionados en el mismo commit153- ❌ Commits sin test previo154- ❌ Superar 300 líneas sin partir en chained-pr