Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/publicar-version/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ Las etiquetas (`vX.Y.Z`), las releases y mover la etiqueta móvil `v1` las hace
3. **CHANGELOG.md**: mueve lo de «Sin publicar» a `## [X.Y.Z] - AAAA-MM-DD` con Añadido / Cambiado / Corregido en español y actualiza los enlaces de comparación del final (`[Sin publicar]` → `vX.Y.Z...HEAD` y una línea `[X.Y.Z]`).
4. **Docs**: README (solo lo de usuario), `docs/USO.md`, `docs/DESARROLLO.md`, `AGENTS.md` si cambian reglas, `MEMORY.md` (estado, decisiones con fecha, registro de sesiones) y `PLAN.md`.
5. **Cabecera del README** (solo si cambian los sprites): genera la galería (`go run ./cmd/commitling gallery --out out/site`) y rehaz `docs/img/banner.svg` copiando el grupo `<g class="bob">` de `svg/{seed,sprout,sapling,shrub}-happy.svg` y `svg/ancient-radiant.svg`, cada uno dentro de `<g transform="translate(x y) scale(0.6)">` (la animación va en el grupo interior, nunca en el que lleva `transform`, o la animación CSS lo anula).
6. **Binario precompilado** (activo desde la v1.0.0): el último commit antes de la etiqueta debe incluir `release/checksums.txt` (`GOFLAGS=-p=2 nice -n 19 scripts/build-release.sh out/rel --write`, con la versión de Go de `go.mod`), generado **después** del último cambio de código o de la web (la plantilla va embebida en el binario). El workflow `release.yml` sube los binarios al publicar la release. Si no lo haces, no pasa nada: la Action compila como siempre. Si vuelves a tocar código después, regenéralo o el CI fallará; y tras publicar, el primer PR que cambie código lo borra (`git rm release/checksums.txt`).
6. **Binario precompilado** (activo desde la v1.0.0): el último commit antes de la etiqueta debe incluir `release/checksums.txt` (`GOFLAGS=-p=2 nice -n 19 scripts/build-release.sh out/rel --write`, con la versión de Go de `go.mod`), generado **después** del último cambio de código o de la web (la plantilla va embebida en el binario). El workflow `release.yml` sube los binarios al publicar la release y, desde la 1.2.0, firma una atestación de procedencia de cada uno: compruébala tras «Release» y antes de mover `v1`: `gh release download vX.Y.Z --repo BertMarti/commitling -p 'commitling_*' -D out/att` y, para los 6 binarios, `gh api "repos/BertMarti/commitling/attestations/sha256:$(sha256sum <binario> | cut -d' ' -f1)" -q '.attestations | length'` (debe dar 1 o más; funciona con cualquier `gh`, también el 2.46 de la Raspberry). Verificar la firma necesita `gh` 2.49 o posterior: `gh attestation verify <binario> --repo BertMarti/commitling --signer-workflow BertMarti/commitling/.github/workflows/release.yml` (no instales otro `gh` en la Raspberry: hazlo desde otra máquina o fíate de la comprobación por API). Si no lo haces, no pasa nada: la Action compila como siempre. Si vuelves a tocar código después, regenéralo o el CI fallará; y tras publicar, el primer PR que cambie código lo borra (`git rm release/checksums.txt`).
7. **Comprueba**: `gofmt -l .`, `go vet ./...`, `GOFLAGS=-p=2 go test ./...`, el subagente `guardian-compatibilidad` y, si tocaste la web, la skill `probar-web`.
8. **Notas para Alberto** en el PR: «tras fusionar: release `vX.Y.Z` con las notas del CHANGELOG y, si es compatible, mover `v1` a ella». Lo que solo sea cierto tras publicar (avisos de «aún no publicado», ejemplos `@vX.Y.Z`) va en otra rama que se fusiona después.
20 changes: 20 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ name: Release
# release/checksums.txt committed in that tag: that file is what the Action
# trusts. Without it, nothing is uploaded and the Action keeps compiling with
# go run.
#
# Each binary also gets a signed build provenance attestation (Sigstore, free
# for public repositories), only so that people can check a binary they
# downloaded by hand: gh attestation verify <binary> --repo BertMarti/commitling.
# The Action does not use attestations (they would need a token and gh): it
# still trusts only release/checksums.txt of its own tree.
on:
release:
types: [published]
Expand All @@ -20,8 +26,13 @@ jobs:
binaries:
name: binarios
runs-on: ubuntu-latest
# contents: upload the binaries to the release; id-token: the OIDC token
# that Sigstore turns into the short-lived signing certificate;
# attestations: store the attestation in this repository.
permissions:
contents: write
id-token: write
attestations: write
env:
TAG: ${{ github.event.release.tag_name }}
steps:
Expand Down Expand Up @@ -55,6 +66,14 @@ jobs:
if: steps.check.outputs.upload == 'true'
run: scripts/build-release.sh "$RUNNER_TEMP/dist" --check

# Only after --check: what gets attested is exactly what
# release/checksums.txt lists (same names and SHA-256).
- name: Atestar la procedencia de los binarios
if: steps.check.outputs.upload == 'true'
uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
with:
subject-checksums: ${{ runner.temp }}/dist/checksums.txt

- name: Subir los binarios a la release
if: steps.check.outputs.upload == 'true'
env:
Expand All @@ -68,4 +87,5 @@ jobs:
echo '```'
cat "$RUNNER_TEMP/dist/checksums.txt"
echo '```'
echo "Cada binario tiene una atestación de procedencia: \`gh attestation verify <binario> --repo $GH_REPO\`."
} >> "$GITHUB_STEP_SUMMARY"
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ Una mascota pixel-art **original** que vive en el README de tu perfil de GitHub.
- **Cuarta especie `pumpkin`** (`internal/creature/pumpkin.go`, «Calabaza»). La OG coloca dos especies por fila (`stagePos` en `internal/og/og.go`).
- Mismo ciclo que la 1.0.0: el último commit del PR lleva `release/checksums.txt`; lo que solo es cierto tras publicar (quitar «la calabaza llega con la 1.1.0», borrar `release/checksums.txt` de `main`) va en la rama `v1.1-tras-publicar`.

## Versión 1.2.0 (02/11/2026)
- **Atestaciones de procedencia**: `release.yml` llama a `actions/attest-build-provenance` (por SHA) con `subject-checksums` sobre el `checksums.txt` recién verificado con `--check`, antes de `gh release upload`; `id-token: write` y `attestations: write` solo en el job `binaries` (`TestReleaseAttestsTheBinaries`). Son para quien verifica a mano (`gh attestation verify <binario> --repo BertMarti/commitling`). **La Action no las usa** ni debe usarlas (pedirían `gh` y token en cada perfil): su única fuente de confianza es `release/checksums.txt` de su árbol; el test prohíbe `attest`/`id-token` en `action.yml`.
- **Filtro de la galería** (`#species-pick` en la plantilla, lógica en `page.js`): bloques `.species-block[data-species]` (galería y compacta) ocultos con `hidden`; sin almacenamiento, sin tocar `location.hash`, valor validado contra las propias radios. Test en Node: `node internal/gallery/testdata/page.test.js internal/gallery/page.js`.
- Mismo ciclo que la 1.1.0: el último commit del PR lleva `release/checksums.txt`; lo que solo es cierto tras publicar (avisos «la 1.2.0 aún no está publicada» en README, `docs/USO.md` y la web; ejemplos `@v1.2.0`; borrar `release/checksums.txt` de `main`) va en la rama `v1.2-tras-publicar`.

## Reglas de contenido
- El personaje es **diseño propio**. Prohibido imitar criaturas de videojuegos, anime o marcas.
- Las reglas de fase y ánimo están documentadas en el README y son deterministas (mismos datos, mismo SVG).
Expand Down
21 changes: 18 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,24 @@ El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y e

## [Sin publicar]

## [1.2.0] - 2026-11-02

Binarios que se pueden verificar y una galería más fácil de recorrer. **La interfaz de `action.yml` no cambia** (mismas entradas, misma salida `path`, mismos archivos) y todas las tarjetas SVG son byte a byte las de la v1.1.0: con `@v1` no hay que hacer nada.

### Añadido

- **Atestaciones de procedencia de los binarios.** Al publicar una release, el workflow «Release» firma con GitHub (Sigstore) una atestación de procedencia para cada uno de los 6 binarios, que dice de qué commit y de qué workflow salió. Quien se baje un binario a mano puede comprobarlo con `gh attestation verify commitling_1.2.0_linux_amd64 --repo BertMarti/commitling` (que lo firmó un workflow de este repositorio) y, para exigir el de «Release», `--signer-workflow BertMarti/commitling/.github/workflows/release.yml` (`gh` 2.49 o posterior). Explicado en el README, en la guía de uso y en la web (sección «Binarios verificables»). La Action no cambia: sigue ejecutando un binario solo si su SHA-256 coincide con el `release/checksums.txt` de su propia etiqueta y, si no, compila con Go.
- **Filtro «Ver en la galería»** en la web: con un clic se ve una sola especie (sus fases, ánimos, accesorios y tarjeta compacta) en vez de las más de 200 tarjetas seguidas; «Todas» vuelve a enseñarlas. Los enlaces «Ir a:» cambian el filtro si la especie estaba oculta. Accesible con teclado y lector de pantalla (anuncia qué se muestra), no guarda nada en el navegador y, sin JavaScript, la galería se ve entera como antes.

### Cambiado

- Con la v1.1.0 publicada y `v1` apuntando a ella, el README, la guía de uso y el instalador de la web dejan de avisar de que la calabaza necesita una versión aún sin publicar, y los ejemplos de versión exacta pasan a `@v1.1.0`.
- `release/checksums.txt` sale de `main`: describe los binarios de la v1.1.0 ya publicada (va en su etiqueta) y no los de `main`, que ha cambiado. La próxima versión lo vuelve a generar en su commit.
- Con la v1.1.0 publicada y `v1` apuntando a ella, el README, la guía de uso y el instalador de la web dejaron de avisar de que la calabaza necesitaba una versión aún sin publicar, y los ejemplos de versión exacta pasaron a `@v1.1.0`.
- `release/checksums.txt` vuelve con los SHA-256 de los binarios de la 1.2.0 (tras la 1.1.0 había salido de `main`).
- Versión de la CLI: `1.2.0`.

### Mantenimiento

- Go 1.27.3 sigue siendo el último parche de Go 1.27 (sin cambios en `go.mod`); govulncheck sin vulnerabilidades; 0 alertas y 0 PRs abiertas de Dependabot.

## [1.1.0] - 2026-10-31

Expand Down Expand Up @@ -198,7 +212,8 @@ Primera versión: el MVP.

- Las acciones de los workflows suben de versión para evitar Node 20 (`checkout@v7`, `setup-go@v7`, `configure-pages@v6`, `upload-pages-artifact@v5` y `deploy-pages@v5`) (PR #2).

[Sin publicar]: https://github.com/BertMarti/commitling/compare/v1.1.0...HEAD
[Sin publicar]: https://github.com/BertMarti/commitling/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/BertMarti/commitling/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/BertMarti/commitling/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/BertMarti/commitling/compare/v0.7.0...v1.0.0
[0.7.0]: https://github.com/BertMarti/commitling/compare/v0.6.0...v0.7.0
Expand Down
13 changes: 12 additions & 1 deletion MEMORY.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# MEMORY.md · commitling
Última actualización: 2026-10-31 por Claude Code (Opus 5.5, jefe de la fase 6, rama `v1.1-2026-10-31`)
Última actualización: 2026-11-02 por Claude Code (Opus 5.5, jefe de la fase 7, rama `v1.2-2026-11-02`)

## Estado actual
**Tras publicar la v1.2.0 (rama `v1.2-tras-publicar`, se fusiona después de la release y de mover `v1`)**: sin los avisos «la 1.2.0 aún no está publicada» (README, `docs/USO.md`, web), ejemplos `@v1.2.0` y sin `release/checksums.txt` en `main` (va en la etiqueta v1.2.0). `@main` compila siempre con Go.

**Versión 1.2.0 (fase 7, 02/11/2026, rama `v1.2-2026-11-02`, PR contra `main`)**: v1.1.0 publicada y `v1` apuntando a ella. Novedades: atestaciones de procedencia de los 6 binarios en `release.yml` (solo para verificar a mano con `gh attestation verify`; la Action sigue confiando solo en `release/checksums.txt`) y filtro «Ver en la galería» en la web. Ninguna tarjeta cambia (huellas v0.5.0 y v1.0.0 en verde). `action.yml` sin cambios. Go 1.27.3 sigue siendo el último parche. El último commit lleva `release/checksums.txt` de la 1.2.0.

**Tras publicar la v1.1.0 (rama `v1.1-tras-publicar`, se fusiona después de la release y de mover `v1`)**: sin el aviso «la calabaza llega con la 1.1.0» (README, `docs/USO.md`, instalador de la web), ejemplos `@v1.1.0` y sin `release/checksums.txt` en `main` (va en la etiqueta v1.1.0). `@main` compila siempre con Go.

**Versión 1.1.0 (fase 6, 31/10/2026, rama `v1.1-2026-10-31`, PR contra `main`)**: v1.0.0 publicada y `v1` apuntando a ella. Cuarta especie **calabaza** (`pumpkin`; fases Pepita, Plántula, Calabacita, Calabaza y Calabaza gigante) en la Action, la CLI, la galería, los dos generadores y la OG (ahora dos especies por fila). Musgo, hongo y cactus byte a byte iguales (galería de `main` contra la rama: 180 SVG y favicon idénticos; 12 combinaciones de la CLI idénticas; huellas de v0.5.0). De `action.yml` solo cambia la `description` de `species`. El último commit lleva `release/checksums.txt` de la 1.1.0. Avisos «la calabaza llega con la 1.1.0» en README, `docs/USO.md` y el instalador de la web: los quita la rama `v1.1-tras-publicar` (que además borra `release/checksums.txt` de `main`), que se fusiona después de publicar y mover `v1`. Pasos exactos para el orquestador en el informe de la fase 6.
Expand Down Expand Up @@ -182,7 +186,13 @@ Pulido de v0.4.0 (rama `agent/builder/v0.4-pulido`, un PR contra `main`, tras la
- **OG con dos especies por fila** (`stagePos`): con cuatro filas de una especie no cabía sobre el nombre de la web; con una quinta especie habría que añadir una fila.
- **`release/checksums.txt` en el último commit del PR** (como en la 1.0.0): antes de publicar, el paso `bin` recibe 404 y compila; tras publicar, usa el binario. La rama `v1.1-tras-publicar` lo borra de `main` junto con los avisos.

### Fase 7 (02/11/2026)
- **Atestaciones con `subject-checksums`** (no `subject-path` con un glob): se atesta exactamente lo que `--check` acaba de comparar con `release/checksums.txt`, con los mismos nombres. Va antes de subir: si la atestación fallara, la release se queda sin binarios (la Action compila con Go) en vez de tener binarios sin atestar.
- **La Action no verifica atestaciones**: necesitaría `gh`, un token con lectura de atestaciones y red a Sigstore en cada perfil; el SHA-256 comprometido en el propio árbol ya es más fuerte para ella (no depende de nada externo). La atestación es una capa para personas.
- **Filtro de la galería en vez de algo en el SVG**: un detalle de temporada en la tarjeta dependería de la fecha (rompe «mismos datos, mismo SVG», haría commits diarios en los perfiles y las huellas). El filtro es solo web, progresivo y sin almacenamiento (origen compartido).

## Siguiente paso
-8. v1.2.0: fusionar el PR de `v1.2-2026-11-02`; publicar la release `v1.2.0` sobre el SHA del merge; esperar a que «Release» suba los 6 binarios, `checksums.txt` y las atestaciones; `gh attestation verify` de uno; mover `v1`; probar el perfil; PR de `v1.2-tras-publicar`. Ver `PLAN.md`.
-7. v1.1.0: fusionar el PR de `v1.1-2026-10-31`; publicar la release `v1.1.0` sobre el SHA del merge; esperar a que «Release» suba los 6 binarios y `checksums.txt`; mover `v1`; probar el perfil; PR de `v1.1-tras-publicar`. Ver `PLAN.md`.
-6. v1.0.0: fusionar el PR de `v1-2026-10-26`; publicar la release `v1.0.0` desde ese commit y mover `v1` (órdenes en el README); comprobar que «Release» sube 6 binarios y `checksums.txt`; abrir y fusionar el PR de `v1-tras-publicar`. Ver `PLAN.md`.
-5. Fase 3: fusionar el PR de `fase3-2026-10-25`; tras el despliegue, abrir la web con la consola (Chromium) y comprobar 0 violaciones de CSP/Trusted Types al usar la demo, el generador y el selector de tema; después, la release `v0.8.0` (notas en `CHANGELOG.md`) y mover `v1`. Opcional: activar el binario precompilado (`docs/DESARROLLO.md`).
Expand Down Expand Up @@ -245,3 +255,4 @@ Pulido de v0.4.0 (rama `agent/builder/v0.4-pulido`, un PR contra `main`, tras la
- 2026-10-26 Claude Code · Opus 5.5 (jefe) con OpenCode (GPT-5.6 Luna) (fase3-2026-10-25): especie cactus (mapas rehechos por Claude), selector de tema (Luna, revisado y corregido por Claude), Trusted Types, acciones por SHA, binario precompilado preparado (paso `bin`, `build-release.sh`, `release.yml`, job `binario`), OG para tres especies, docs.
- 2026-10-26 Claude Code · Opus 5.5 (jefe) con OpenCode (Gemini 3 Flash) (v1-2026-10-26): versión 1.0.0 (CLI, web, docs, CHANGELOG), `release/checksums.txt` de la 1.0.0, jobs `action` y `binario` independientes del estado de la release, docs sin promesas falsas (Marketplace, «`v1` aún no existe»), rama `v1-tras-publicar`; notas de la release redactadas por Gemini y revisadas por Claude.
- 2026-10-31 Claude Code · Opus 5.5 (jefe) con OpenCode (GPT-5.6 Luna) (v1.1-2026-10-31): cuarta especie calabaza (mapas de Claude; cableado, tests y docs de Luna, revisados), OG en dos columnas, versión 1.1.0, `release/checksums.txt` de la 1.1.0 y rama `v1.1-tras-publicar`.
- 2026-11-02 Claude Code · Opus 5.5 (jefe) con OpenCode (GPT-5.6 Luna) (v1.2-2026-11-02): atestaciones de procedencia en `release.yml` (Claude) y docs de verificación, filtro «Ver en la galería» y sección «Binarios verificables» de la web (Luna, revisado por Claude), versión 1.2.0, `release/checksums.txt` de la 1.2.0 y rama `v1.2-tras-publicar`.
Loading
Loading