Gracias por interesarte en mejorar CubicLauncher. Este documento resume cómo colaborar sin romper el build ni el estilo del proyecto.
- Node.js >= 20
- Bun >= 1.x
- Rust >= 1.85 (edition 2024)
- Tauri CLI v2
git clone https://github.com/CubicLauncherDevs/CubicLauncher.git
cd CubicLauncher
bun installSiempre corré estos comandos antes de subir cambios:
# Frontend
bun run lint # ESLint + plugin Svelte
bun run check # svelte-check + TypeScript
bun run format # Prettier en src/
# Backend (Rust)
cd src-tauri
cargo fmt --check
cargo clippy -- -D warnings
cd ..<tipo>(<alcance opcional>): <descripción breve>
[cuerpo opcional con explicación del cambio]
[breaking change / referencia a issue si aplica]
El alcance es opcional y suele ser el componente, módulo o archivo afectado
(por ejemplo sidebar, InstanceItem, src-tauri).
Usá uno de los siguientes tipos, alineados con las labels de PR del proyecto:
| Tipo | Uso |
|---|---|
feat |
Nueva funcionalidad visible para el usuario. |
fix |
Corrección de un bug. |
refactor |
Cambio interno sin alterar comportamiento observable. |
perf |
Mejora de rendimiento. |
style |
Cambios de formato, espacios, punto y coma, CSS puramente visual. |
docs |
Cambios en documentación (README, CONTRIBUTING, comentarios). |
test |
Nuevos o modificados tests. |
chore |
Tareas de mantenimiento, dependencias, CI, scripts. |
i18n |
Nuevas traducciones o claves de idioma. |
core |
Cambios en el backend Rust (commands, servicios, crates). |
- Los mensajes de commit van en español, en infinitivo o imperativo.
- La primera línea no debe superar los 72 caracteres.
- Describí el qué se cambia, no el cómo. El cómo va en el cuerpo si es necesario.
- Hacé un commit por cambio lógico. Evitar mensajes genéricos tipo
Varios arreglosoWIP. - Si el cambio rompe compatibilidad, marcá el breaking change con
!después del tipo/alcance o escribíBREAKING CHANGE:en el cuerpo.
feat(sidebar): agregar indicador lateral para instancias ancladas
fix(launcher): corregir crash al eliminar instancia en ejecución
refactor(InstanceItem): simplificar renderizado de badges
docs(CONTRIBUTING): agregar normativa de commits
chore(deps): actualizar svelte-check a 4.7.3
i18n(es-ES): agregar claves de estado de instancia
core(src-tauri): cambiar serialización de errores para i18n
BREAKING CHANGE: los errores ahora usan el campo `code` en snake_case.
- Usá runes:
$state,$derived,$effect,$props,$bindable. - No uses
$state(...)para envolverSvelteMapniSvelteSet; ya son reactivos por sí solos. - Evitá
any. Para íconos SVG tipá el...restconSVGAttributes<SVGSVGElement>. - Preferí
$derived/$derived.bysobre$state+$effectcuando solo calculás un valor. - Agregá
keya los bloques{#each}. - Para props pasadas pero no usadas en el template, usalas, renombralas a
_nombreo ajustá la interfaz.
- Seguí
cargo fmt. - Resolvé todos los warnings de
cargo clippy. - Los errores deben serializarse como
{"code":"...","params":{...}}para i18n en el frontend.
Las traducciones se manejan en el repositorio
CubicLauncherDevs/Translations,
que publica los idiomas en https://i18n.cubiclauncher.org. El launcher solo
bundlea localmente es-ES y en-US como fallback:
src/lib/i18n/es-ES.jsonsrc/lib/i18n/en-US.json
Si agregás un texto nuevo en la UI, agregá la clave en ambos archivos
bundleados (en-US.json es la referencia de la que se deriva el tipado en
src/lib/i18n/index.ts).
En el repo Translations:
- Editá los archivos
src/locales/*.json(por ejemplofr-FR.json). - Incrementá el campo
versionde cada idioma modificado. - Añadí la entrada correspondiente a
src/changelog.json(tipolocale.updatedolocale.added). - Build y deploy del Worker:
bun run build && bun run deploy.
Para rellenar claves faltantes respecto a
en-US, podés usarbun run sync-localesen el repo de Translations.
Cuando abras un PR, asignale al menos una de estas labels para que el changelog quede organizado:
| Label | Uso |
|---|---|
breaking |
Cambio que rompe compatibilidad con versiones anteriores. |
feature |
Nueva funcionalidad visible para el usuario. |
core |
Cambios en la lógica de backend Rust (servicios, crates, commands). |
ui |
Cambios puramente visuales en Svelte o CSS. |
i18n |
Nuevas traducciones o cambios en archivos de idioma. |
bug / fix / patch |
Corrección de errores o hotfix. |
perf |
Mejoras de rendimiento. |
test |
Nuevos tests o modificaciones de tests. |
docs |
Cambios en documentación. |
chore / refactor / deps / ci |
Tareas de mantenimiento. |
ignore-for-release |
Cambios que no deben aparecer en el changelog. |
CubicLauncher usa un flujo de release en dos etapas:
- Crear el tag: al pushear un tag
v*(p. ej.v31.0.0), el workflowBuild Release Draftcompila la app en todas las plataformas y sube los binarios a un Release Draft de GitHub con notas autogeneradas. - Publicar manualmente: cuando el draft esté listo, ejecutá el workflow
manual
Publish Releasedesde GitHub Actions. Solo en ese momento el release se vuelve público y el updater de Tauri lo empieza a distribuir.
Para prereleases (v*-alpha*, v*-beta*, v*-rc*) el proceso es el mismo,
pero el release se marca como prerelease. Además, cada push a la rama
develop dispara una build de prerelease que deja los binarios como artefactos
de la ejecución, sin crear un release público.
- Abrí un issue primero si el cambio es grande o puede discutirse.
- Trabajá en una rama propia.
- Hacé commits pequeños y descriptivos.
- Actualizá este archivo si cambian las reglas del proyecto.
- Abrí un PR y asegurate de que pasen los checks de CI (
lint,check, tests de Rust, build del frontend, etc.). - Una vez mergeado a
develop, el equipo decide cuándo publicar un nuevo tag y ejecutar el release correspondiente.