🤝 Guía de Contribución / Contributing Guide
📖 Descripción / Description
| Español | English |
|---|---|
| Este proyecto sigue estándares estrictos de ingeniería de software para mantener un historial de control de versiones limpio, rastreable y automatizable en todo el monorepo y sus submódulos. | This project follows strict software engineering standards to maintain a clean, traceable, and automatable version control history across the entire monorepo and its submodules. |
🌿 Flujo de ramas / Branch workflow
ES: main es la única rama de larga duración del monorepo. Las ramas de
trabajo son cortas, nacen de main y se integran en main después de revisión.
En cada submódulo se aplica la misma regla dentro de su propio repositorio.
No se debe asumir una rama dev como parte del flujo normativo.
EN: main is the only long-lived branch in the monorepo. Short-lived work
branches start from main and are integrated into main after review. The same
rule applies inside each submodule’s own repository. A dev branch must not be
assumed as part of the normative workflow.
Convención de nombres / Naming convention
Las ramas cortas siguen tipo/fase/modulo, usando minúsculas y kebab-case.
La fase identifica el área del roadmap y el módulo identifica el alcance
concreto. Para cambios transversales se usa repo como módulo.
Short-lived branches follow type/phase/module, using lowercase and
kebab-case. The phase identifies the roadmap area and the module identifies
the concrete scope. Use repo for repository-wide changes.
docs/foundations/readme-template
feat/algorithms/naive-sort
fix/foundations/numbers
chore/repo/submodule-pointer
La misma convención se aplica dentro de un submódulo y en el monorepo. El tipo
de la rama debe coincidir con el tipo del cambio principal (feat, fix,
docs, test, refactor, chore, perf o style). No usar ramas genéricas
como feature, work, changes o nombres sin fase y módulo.
The same convention applies inside a submodule and in the monorepo. The branch
type must match the main change type. Do not use generic branches such as
feature, work, changes, or names without a phase and module.
Ciclos con prefijo propio: los dos ciclos del monorepo tienen, además de los
tipos, un prefijo declarado. El pase de auditoría de un módulo ya cerrado usa
audit/{fase}/{modulo} en el monorepo, y el arreglo de un lenguaje usa
align/{fase}/{modulo} en su submódulo: ver
AUDIT_WORKFLOW.md. Los commits de esas ramas siguen siendo
Conventional Commits —docs en el pase y fix o refactor en el align—, así
que el prefijo nombra el ciclo, no el tipo del cambio.
Cycles with their own prefix: both monorepo cycles have a declared prefix
besides the types. The audit pass of an already closed module uses
audit/{phase}/{module} in the monorepo, and a language’s fix uses
align/{phase}/{module} in its submodule: see
AUDIT_WORKFLOW.md. Commits on those branches stay
Conventional Commits —docs in the pass, fix or refactor in the
align—, so the prefix names the cycle, not the change type.
Tooling (glot): una versión se cierra en chore/repo/glot-vX.Y.Z, y un fix o un
refactor usan fix/repo/glot-vX.Y.Z —una rama que ya lleva el número de la entrega
que cierra: fix/repo/glot-v1.6.1 cierra como 1.6.1—. La rama dice a qué versión se le
hace el fix y el número del parche se nombra, no se deduce. Es una convención
de la herramienta personal del autor, cuya documentación permanece separada.
Tooling (glot): a version is closed on chore/repo/glot-vX.Y.Z, and a fix or a
refactor use fix/repo/glot-vX.Y.Z —a branch that already carries the number of the
release it closes: fix/repo/glot-v1.6.1 closes as 1.6.1—. The branch names the
version the fix is for and the patch number is named, not derived. This is a
convention of the author’s personal tool, whose documentation remains separate.
main -> <type>/<phase>/<module> -> review -> main
No se ejecuta git push ni se crea un commit automáticamente sin instrucción
explícita del autor / Do not run git push or create a commit automatically
without the author’s explicit instruction.
📝 Convención de Commits / Conventional Commits
ES: Usamos Conventional Commits v1.0.0. Cada mensaje de commit debe seguir esta estructura:
EN: We follow Conventional Commits v1.0.0. Every commit message must adhere to this structure:
tipo(alcance): asunto en imperativo, menos de 50 caracteres
Cuerpo del mensaje donde explicas el qué y el por qué del cambio,
no el cómo, ya que eso se ve en el código. Cada línea debe tener
un máximo de 72 caracteres para verse bien en cualquier terminal.
Footer opcional para referenciar incidencias o cambios importantes (BREAKING CHANGE).
🏷️ Tipos permitidos / Allowed Types
| Tipo / Type | Español | English |
|---|---|---|
feat |
Nueva funcionalidad o módulo implementado | New feature or module implemented |
fix |
Corrección de un error en código o pruebas | Bug fix in code or test suites |
docs |
Cambios o adiciones en la documentación (docs/ o READMEs) |
Documentation changes or additions (docs/ or READMEs) |
style |
Formato, espacios, puntos y comas (sin cambios en lógica) | Formatting, whitespace, semi-colons (no logic change) |
refactor |
Reescritura de código sin alterar su comportamiento externo | Code rewrite without altering external behavior |
perf |
Optimización de rendimiento en algoritmos o I/O | Performance optimization in algorithms or I/O |
test |
Incorporación o corrección de suites de pruebas unitarias | Adding or correcting unit test suites |
chore |
Mantenimiento, submódulos, CI/CD, configuración de herramientas | Maintenance, submodules, CI/CD, tooling config |
🎯 Alcances de commits / Commit scopes
ES: El alcance (alcance) es opcional en Conventional Commits, pero en
este repositorio es obligatorio para cambios de módulo y submódulo. Debe usar
el identificador del módulo o la infraestructura afectada:
- Por fase:
foundations,algorithms,text,structures,data,math,ui,web - Por módulo:
hello_world,calculator,numbers,naive_sort,data_structures_basics,data_structures_advanced,transformations, etc. - Por infraestructura:
submodule,ci,docker,docs,glot(herramientas descripts/)
EN: The (scope) is optional in Conventional Commits, but mandatory here
for module and submodule changes. Use the affected module or infrastructure
identifier (glot identifies the monorepo tooling under scripts/).
💡 Ejemplos / Examples
# Documentación / Documentation
git commit -m "docs: update roadmap with Phase 3 structures specs" -m "Add continuous 01-19 numbering and document parallel application tracks."
# Nueva funcionalidad en lenguaje / New feature in a language
git commit -m "feat(numbers): implement recursive and iterative numbers in julia" -m "Add sum, factorial, fibonacci, gcd and lcm with 22 unit tests passing."
# Corrección en submódulo / Fix in submodule
git commit -m "fix(submodule): correct haxe repository URL in gitmodules"
# Refactorización / Refactoring
git commit -m "refactor(calculator): standardize package layout with Project.toml"
🔁 Flujo de Git / Git Workflow
Cambio de código dentro de un submódulo / Code change inside a submodule
Regla obligatoria: el puntero del submódulo se actualiza después de que el
cambio del submódulo se haya integrado en el main de su propio repositorio, y
antes de integrar la rama equivalente del monorepo. El monorepo no contiene el diff
del código del submódulo; solo registra el commit exacto al que apunta.
The submodule pointer is updated after the submodule change has been
integrated into that repository’s main, and before integrating the
equivalent monorepo branch. The monorepo does not contain the submodule code
diff; it records only the exact commit it points to.
Submodule repository:
main -> feat/algorithms/naive-sort -> review -> main (commit A)
Monorepo repository (on the **active branch**: the pointer belongs to the closing
that is underway):
active branch -> checkout submodule at commit A
git add <language>
git commit -m "chore(submodule): update <language> pointer"
review -> main
Flujo operativo:
- Entra en
<language>/, crea una rama contype/phase/module, implementa, prueba y documenta. - Integra ese cambio en el
maindel submódulo y anota el commit resultante. - Vuelve a la raíz, cambia el submódulo al commit integrado y verifica
git submodule status. - Añade el puntero en la rama activa del monorepo y actualiza documentación o
roadmap si corresponde. El paso del puntero lo hace
glot pointer(verifica que el commit está integrado y añade el gitlink, sin abrir ni publicar rama propia) y lo confirmaglot save 9. - Revisa y fusiona primero el cambio del submódulo; después revisa y fusiona
el cambio del puntero en el
maindel monorepo.
No se debe actualizar el puntero para una rama de trabajo del submódulo que aún
no esté integrada en su main.
Cambios solo en el monorepo / Monorepo-only changes
Para especificaciones, documentación o configuración de la raíz, usa una rama
docs/<phase>/<module> o chore/repo/<module> directamente desde el main del
monorepo. Estos cambios no requieren modificar un submódulo.
Las herramientas de scripts/
siguen la misma regla con el módulo glot (ramas chore/repo/glot-v0.X). Cada
versión se cierra copiando glot.sh a scripts/versions/ antes de fusionar la
rama en main, de modo que main siempre contenga una versión terminada. De ahí
la puerta de entrada: no se empieza a implementar una versión nueva sin el
snapshot de la anterior en versions/; si falta, se copia primero y después se
reanuda la implementación.
✅ Cierre de documentación y roadmap / Documentation and roadmap closure
El ciclo completo de un módulo —los pasos, quién los hace y qué evidencia deja cada uno— está en WORKFLOW.md.
The full module cycle —its steps, who performs them and the evidence each one leaves— is in WORKFLOW.md.
Una delegación de documentación no finaliza al generar un README. Debe
verificarse el código, ejecutar los tests disponibles, comprobar el README del
módulo y registrar la evidencia en
ROADMAP_UPDATE_CHECKLIST.md. Solo cuando el
módulo, o todos los módulos requeridos de una fase, están completos se actualiza
ROADMAP.md en el mismo cambio.
A documentation delegation is not complete when a README is generated. Code,
tests, and the module README must be verified, with evidence recorded in
ROADMAP_UPDATE_CHECKLIST.md. Only after the
module, or every required module in a phase, is complete may
ROADMAP.md be updated in the same change.