release
Corta una nueva versión — mueve la sección Unreleased del CHANGELOG a una versión SemVer con fecha, crea el commit y el tag, y opcionalmente el release de GitHub. Úsalo cuando la persona pida publicar
SKILL.md.claude/skills/release/SKILL.md
GitHubCorta una versión siguiendo Keep a Changelog y Semantic Versioning (ver CHANGELOG.md
y CONTRIBUTING.md).
Automatización: al fusionar
develop→main, el workflow.github/workflows/release.ymldetecta la versión fechada más reciente del CHANGELOG y, si no tiene tag, publica el tag y el release de GitHub solo. Esta skill prepara el corte (mover Unreleased →X.Y.Zcon fecha y elegir la versión SemVer); el tag/release manual solo hace falta si el workflow no está activo.
Pasos
- Precondiciones. Verifica que el árbol esté limpio (
git status) y que estés en la rama correcta segúnCONTRIBUTING.md: con Git Flow el release sale dedevelophaciamain, salvo un hotfix, que se corta en la propiahotfix/*(ver abajo); sindevelop, desdemain. Si hay cambios sin commit, detente y avisa. - Leer lo pendiente. Toma las entradas de la sección
## [Unreleased]deCHANGELOG.md. Si está vacía, no hay nada que publicar: dilo y detente. - Proponer la versión. Lee la última versión publicada (tag
v*o CHANGELOG) y propone el bump SemVer según el contenido: cambios incompatibles → major; soloAdded/Changed→ minor; soloFixed/Security→ patch. Deja que la persona confirme o corrija con AskUserQuestion. - Actualizar el CHANGELOG. Mueve las entradas de
Unreleaseda una nueva sección## [X.Y.Z] - YYYY-MM-DD(fecha de hoy), dejaUnreleasedcon sus categorías vacías y actualiza los enlaces de comparación del pie del archivo. - Sincronizar la versión del manifiesto. Si el stack tiene un archivo que declara
versión, súbela a
X.Y.Zen el mismo commit — si no, el proyecto publicav0.4.0con el manifiesto diciendo0.1.0. Busca el que aplique y actualiza también su lockfile si el gestor lo regenera:package.json(+package-lock.json/pnpm-lock.yaml) ·*.gemspecolib/**/version.rb·Cargo.toml(+Cargo.lock) ·pyproject.toml·composer.json·pubspec.yaml·build.gradle·VERSION.- Si no hay ninguno (proyecto sin manifiesto versionado), dilo y sigue: el CHANGELOG es la única fuente de la versión.
- Commit, sin tag. Crea el commit
chore(release): vX.Y.Z(con la coautoría de IA dedocs/conventions/ai-agents.md) en una ramachore/corte-vX.Y.Z— recuerda quegit-guardrails.shno deja commitear directo endevelop. NO crees ni publiques el tag aquí.release.ymlsolo publica si la versión no tiene tag: si lo creas tú, el workflow la da por publicada, no crea el release de GitHub, y encima el tag apunta al commit de la rama en vez de al merge enmain. - Llevarlo a producción. PR de la rama de corte →
develop, y después PRdevelop→main. Al fusionar enmain,release.ymlcrea el tagvX.Y.Zsobre el merge y publica el release con las notas de esa sección del CHANGELOG. - Solo si el workflow no está activo (proyecto sin Actions, o
release.ymlborrado): entonces sí, tag anotado a mano ygh release create vX.Y.Z --title "vX.Y.Z" --notes "<sección del CHANGELOG>".
El corte es lo último antes de fusionar a main
El job release de quality.yml (.github/scripts/check-release.sh) bloquea los PRs
hacia main si la versión de arriba del CHANGELOG ya está publicada, si quedaron
entradas sueltas en ## [Unreleased], o si esa versión es heredada de la plantilla
(un CHANGELOG sin resetear deja arriba la última versión del repositorio origen). Es la misma regla dicha al revés: nada llega a
producción sin versión. Si el PR a main falla por eso, no lo esquives — corta la
versión.
Hotfix (release desde main)
Un hotfix/* no pasa por develop, pero también publica versión (siempre un
patch). El orden es:
- En la rama
hotfix/*(nacida demain): el fix, su entrada en## [Unreleased]y el corte con esta skill — pasos 3 a 6, con el bumppatch. - PR
hotfix/*→main. El jobreleaselo valida y, al fusionar,release.ymlpublica el tag y el release. - Sincroniza a
developcon un PRmain→develop(lo exigeCONTRIBUTING.md): si te lo saltas,developno tiene ni el fix ni la sección de versión del CHANGELOG, y el próximo corte la pisa.
Ejemplo: "corta la versión" → propone v1.3.0 → CHANGELOG actualizado + commit en
chore/corte-v1.3.0; el tag y el release los pone release.yml al llegar a main.
NO crees el tag a mano cuando release.yml esté activo (le robas el release), NO hagas
push ni publiques sin confirmación explícita, NO inventes entradas de changelog que no
estén en Unreleased, y NO saltes una versión SemVer.