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
14 changes: 13 additions & 1 deletion .github/workflows/action-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@ jobs:
species: cactus
out: out/cactus.svg

- name: Action con la especie calabaza (sin red)
id: pumpkin
uses: ./
with:
user: ""
fixture: testdata/events.json
species: pumpkin
out: out/pumpkin.svg

- name: Action con la tarjeta compacta (sin red)
id: compact
uses: ./
Expand Down Expand Up @@ -145,6 +154,7 @@ jobs:
FIXTURE_PATH: ${{ steps.fixture.outputs.path }}
MUSHROOM_PATH: ${{ steps.mushroom.outputs.path }}
CACTUS_PATH: ${{ steps.cactus.outputs.path }}
PUMPKIN_PATH: ${{ steps.pumpkin.outputs.path }}
COMPACT_PATH: ${{ steps.compact.outputs.path }}
BADSIZE_OUTCOME: ${{ steps.badsize.outcome }}
REAL_PATH: ${{ steps.real.outputs.path }}
Expand All @@ -165,7 +175,7 @@ jobs:
test "$NOUSER_OUTCOME" = failure || { echo 'un usuario inexistente debería fallar'; exit 1; }
cmp out/nouser.svg "$FIXTURE_PATH" || { echo 'el SVG previo del usuario inexistente cambió'; exit 1; }
cmp out/keep.svg "$FIXTURE_PATH" || { echo 'el SVG previo cambió'; exit 1; }
for f in "$FIXTURE_PATH" "$MUSHROOM_PATH" "$CACTUS_PATH" "$COMPACT_PATH" "$REAL_PATH"; do
for f in "$FIXTURE_PATH" "$MUSHROOM_PATH" "$CACTUS_PATH" "$PUMPKIN_PATH" "$COMPACT_PATH" "$REAL_PATH"; do
test -s "$f"
head -c 120 "$f"; echo
grep -q '</svg>' "$f"
Expand All @@ -178,6 +188,8 @@ jobs:
if grep -q 'Retoño' "$MUSHROOM_PATH"; then echo 'la especie hongo no se aplicó'; exit 1; fi
grep -q 'Cactus' "$CACTUS_PATH"
if grep -q 'Retoño' "$CACTUS_PATH"; then echo 'la especie cactus no se aplicó'; exit 1; fi
grep -q 'Calabacita' "$PUMPKIN_PATH"
if grep -q 'Retoño' "$PUMPKIN_PATH"; then echo 'la especie calabaza no se aplicó'; exit 1; fi
grep -q "@$OWNER" "$REAL_PATH"
grep -q '#2b2724' "$REAL_PATH"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ jobs:
go build -o "$RUNNER_TEMP/commitling" ./cmd/commitling
mkdir -p out/wf
"$RUNNER_TEMP/commitling" workflow > out/wf/base.yml 2>/dev/null
for sp in moss mushroom cactus; do for th in light dark both; do for sz in full compact; do
for sp in moss mushroom cactus pumpkin; do for th in light dark both; do for sz in full compact; do
"$RUNNER_TEMP/commitling" workflow --user octocat --species "$sp" --theme "$th" --size "$sz" > "out/wf/$sp-$th-$sz.yml" 2>/dev/null
done; done; done
if grep -L 'uses: BertMarti/commitling@v1$' out/wf/*.yml | grep .; then echo "sin @v1"; exit 1; fi
Expand Down
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ Una mascota pixel-art **original** que vive en el README de tu perfil de GitHub.
- Lo que solo es cierto tras publicar (quitar «el cactus aún no está en `@v1`», «desde la versión 1.0.0» de `go run …@latest`, ejemplos `@v1.0.0`) va en la rama `v1-tras-publicar`, que además borra `release/checksums.txt` (cambia la plantilla embebida).
- Semver a partir de aquí: la interfaz de `action.yml` y el formato del SVG solo cambian de forma incompatible en una `v2`; mejoras compatibles → 1.x (menor), arreglos → parche.

## Versión 1.1.0 (31/10/2026)
- **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`.

## 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
18 changes: 15 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,21 @@ El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y e

## [Sin publicar]

## [1.1.0] - 2026-10-31

Una especie nueva y nada más que cambie para quien ya usa commitling: **la interfaz de `action.yml` es la misma** (mismas entradas con los mismos valores por defecto, misma salida `path`, mismos archivos; solo cambia el texto de ayuda de `species` para nombrar la nueva) y las tarjetas del brote de musgo, el hongo y el cactus son byte a byte las de la v1.0.0. Con `@v1` no hay que hacer nada.

### Añadido

- **Cuarta especie: la calabaza** (`species: pumpkin`, también vale `calabaza`), de diseño propio: una calabaza de huerto con ojos que pasa por **Pepita** (una pepita con un brote), **Plántula** (dos hojas redondas con la cáscara de la pepita encima), **Calabacita** (verde y rayada), **Calabaza** (naranja, con gajos, hoja y zarcillo) y **Calabaza gigante**, con las mismas reglas, ánimos y accesorios. Está en la Action, en `--species` de la CLI (`render` y `workflow`), en la galería de la web (claro, oscuro y tarjeta compacta), en los dos generadores de la web y en la imagen de vista previa.

### Cambiado

- Con la v1.0.0 publicada y `v1` apuntando a ella, el README, la guía de uso y la web dejan de avisar de que el cactus y `go run …@latest workflow` necesitan una versión aún sin publicar, y los ejemplos de versión exacta pasan a `@v1.0.0`.
- `release/checksums.txt` sale de `main`: describe los binarios de la v1.0.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.
- La imagen de vista previa (`og.png`) coloca las fases de dos especies por fila para que quepan las cuatro.
- La web describía el cactus como «una semilla» al empezar; su primera fase es la **yema**.
- Con la v1.0.0 publicada y `v1` apuntando a ella, el README, la guía de uso y la web dejaron de avisar de que el cactus y `go run …@latest workflow` necesitaban una versión aún sin publicar, y los ejemplos de versión exacta pasaron a `@v1.0.0`.
- `release/checksums.txt` vuelve con los SHA-256 de los binarios de la 1.1.0 (tras la 1.0.0 había salido de `main`).
- Versión de la CLI: `1.1.0`.

## [1.0.0] - 2026-10-26

Expand Down Expand Up @@ -182,7 +193,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.0.0...HEAD
[Sin publicar]: https://github.com/BertMarti/commitling/compare/v1.1.0...HEAD
[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
[0.6.0]: https://github.com/BertMarti/commitling/compare/v0.5.0...v0.6.0
Expand Down
13 changes: 7 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ go run ./cmd/commitling render --fixture testdata/events.json --out out/commitli
# Con tu usuario real (GITHUB_TOKEN es opcional, sube el límite de peticiones)
go run ./cmd/commitling render --user tu-usuario --out out/commitling.svg

# Otra especie (moss por defecto, mushroom o cactus)
# Otra especie (moss por defecto, mushroom, cactus o pumpkin)
go run ./cmd/commitling render --fixture testdata/events.json --species mushroom --out out/hongo.svg

# Web con todas las fases, ánimos y accesorios (y og.png)
Expand Down Expand Up @@ -87,26 +87,27 @@ Archivos exactos, en este orden:

1. `internal/creature/creature.go`: añade la constante de `Species` **después** de `Mushroom` (así el valor cero sigue siendo el brote de musgo) y una entrada, en el mismo orden, en cada uno de estos cuatro sitios: `AllSpecies`, `speciesNames` (nombre en español), `speciesSlugs` (ASCII: es lo que se escribe en `species:` y en `--species`) y `speciesStageNames` (los nombres en español de sus cinco fases). Si quieres alias, añádelos al `switch` de `SpeciesByName`.
2. Un archivo nuevo en `internal/creature/` (como `mushroom.go`) con su `[...]stageArt` de cinco mapas 16×16 (`body`, `face`, `hat`, `scarf`, `flower`), y engánchalo en `artFor` de `internal/creature/sprites.go` (un `switch`: añade un `case`). La cara (8×4) va sobre un relleno, la fila de la bufanda debe ser un tramo continuo y el gorro y la flor no pueden tapar la cara. Usa solo la paleta de 5 colores y no copies mapas de otra especie ni de ninguna obra ajena.
3. `cmd/commitling/main.go`: el mensaje «especie no válida … (usa moss, mushroom o cactus)» y la ayuda de `--species` (en el comentario del archivo y en `usage`) listan los valores; añade el nuevo. Igual el texto de la entrada `species` de `action.yml`.
3. `cmd/commitling/main.go`: el mensaje «especie no válida … (usa moss, mushroom, cactus o pumpkin)» y la ayuda de `--species` (en el comentario del archivo y en `usage`) listan los valores; añade el nuevo. Igual el texto de la entrada `species` de `action.yml`.
4. La galería (`internal/gallery`), la tarjeta SVG y la imagen Open Graph (`internal/og`) recorren `AllSpecies`, así que la nueva especie sale sin más cambios: genera la web y la imagen y revísalas en claro y oscuro.
5. Actualiza las tablas de especies del `README.md` y de `docs/USO.md` (valores de `species` y nombres de las fases), el `CHANGELOG.md` y `MEMORY.md`.

Tests que deben pasar (y qué tocar en ellos):

- `internal/creature`: `TestSpeciesNamesAndSlugs` (fija `len(AllSpecies) != 3`: sube el número; comprueba nombres, slugs únicos y cinco nombres de fase), `TestSpeciesByName` (añade los alias), `TestAnchorsFitTheBody` (cara sobre relleno, bufanda continua, gorro y flor sin tapar la cara, para todas las especies y fases), `TestDrawUsesPalette` (solo colores de la paleta), `TestSpeciesDrawDifferently` (cada especie se dibuja distinta y de forma determinista, y cada fase distinta de las demás) y un test como `TestCactusMapsAreNotTheOthers` para tu especie (ningún mapa igual a los de las demás).
- `internal/creature`: `TestSpeciesNamesAndSlugs` (fija `len(AllSpecies) != 4`: sube el número; comprueba nombres, slugs únicos y cinco nombres de fase), `TestSpeciesByName` (añade los alias), `TestAnchorsFitTheBody` (cara sobre relleno, bufanda continua, gorro y flor sin tapar la cara, para todas las especies y fases), `TestDrawUsesPalette` (solo colores de la paleta), `TestSpeciesDrawDifferently` (cada especie se dibuja distinta y de forma determinista, y cada fase distinta de las demás) y un test como `TestCactusMapsAreNotTheOthers` para tu especie (ningún mapa igual a los de las demás).
- `internal/render`: la tarjeta es XML válido, determinista y el texto cabe, para todas las especies (`TestMushroomCard` es el modelo).
- `internal/gallery`: `TestBuildShowsBothSpecies`, `TestBuildIsDeterministic`, `TestGalleryAltsAreUnique` y `TestPageHasSkipLinkAndSpeciesNav`.
- `internal/og`: las cinco fases de cada especie aparecen (`TestStageRowsShowAllStages`) y todo cabe en el marco.
- `cmd/commitling`: la especie inválida sigue fallando antes de tocar la red y el mensaje lista los valores.
- `internal/gallery/action_test.go`: `action.yml` y la tabla de entradas del README siguen coincidiendo.
- `.github/workflows/action-test.yml` prueba `species: mushroom` y `species: cactus`; añade un paso para la nueva. También el bucle `for sp in …` de los workflows generados en `ci.yml`, la lista `ALLOWED.species` de `internal/gallery/install.js` y la de `internal/gallery/testdata/install.test.js` (y el número de casos de `TestInstallJSMatchesGo`).
- `internal/og`: si la fila de fases ya no cabe sobre el nombre de la web, ajusta `stageY`, `stageRowH` y `siteY` (con tres especies, 380, 56 y 556).
- `.github/workflows/action-test.yml` prueba `species: mushroom`, `species: cactus` y `species: pumpkin`; el bucle `for sp in …` de `ci.yml`, la lista `ALLOWED.species` de `internal/gallery/install.js` y la de `internal/gallery/testdata/install.test.js` cubren las cuatro especies (96 casos en `TestInstallJSMatchesGo`).
- `internal/og`: la imagen OG coloca dos especies por fila (`stagePos`); con más de cuatro hay que añadir una fila y comprobar que cabe sobre `siteY`.
- `internal/gallery`: el número de archivos de `TestBuild` y los `alt` únicos (`TestGalleryAltsAreUnique`): un nombre de fase no puede repetir el de otra especie con las mismas estadísticas (por eso la primera fase del cactus es «Yema» y no «Semilla»).
- `internal/gallery`: `TestCardsAreByteIdenticalToV100` (huellas de `testdata/golden/v1.0.0-sha256.txt`) y `TestFullCardsAreByteIdenticalToV050` deben seguir pasando sin tocar las listas: las especies que ya estaban no pueden cambiar.
- Comprueba que las especies existentes no cambian ni un byte: genera la galería en `main` y en tu rama y compara con `diff -r` (solo deben aparecer archivos nuevos de tu especie, `index.html`, `og.png` y los scripts).

## Regla de diseño: personaje original

Las criaturas son **diseño propio**: un brote de musgo con ojos, una seta pequeña con ojos y un cactus con ojos en su maceta, dibujados píxel a píxel. Está prohibido imitar criaturas de videojuegos, anime o marcas, y no se aceptan sprites, nombres ni siluetas tomados de otras obras.
Las criaturas son **diseño propio**: un brote de musgo con ojos, una seta pequeña con ojos, un cactus con ojos en su maceta y una calabaza de huerto con ojos, dibujados píxel a píxel. Está prohibido imitar criaturas de videojuegos, anime o marcas, y no se aceptan sprites, nombres ni siluetas tomados de otras obras.

Respeta también el estilo «papel y píxel» de [AGENTS.md](AGENTS.md): paleta de la criatura limitada a 5 colores (`#2b2724`, `#f3efe6`, `#7fb069`, `#e6aa68`, `#ca3c25`), píxeles nítidos, sin degradados ni sombras, animaciones suaves y respetando `prefers-reduced-motion`.

Expand Down
Loading
Loading