diff --git a/AGENTS.md b/AGENTS.md index 4565729..2576327 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,3 +25,11 @@ Skills del proyecto en `skills/`: Seguir OpenSpec workflow: propose -> apply -> archive Usar skills cuando aplique al contexto Mantener código siguiendo arquitectura limpia + +## Release Android +- Antes de publicar una APK, ejecutar `npm run test:run`, `npm run test:e2e`, `npm exec vue-tsc -- --noEmit` y `npm run build`. +- Ejecutar `npx cap sync android` y `./gradlew assembleDebug` usando el builder Android del repositorio cuando el host no tenga Java. +- Verificar el APK con `scripts/verify-apk.sh ` antes de adjuntarlo a Gitea. +- El script debe confirmar `applicationId`, `versionName`, `versionCode`, bundle JavaScript, fuentes MDI y textos críticos de la versión. +- Incrementar `versionCode` para cada APK publicable; mantener la misma firma y publicar versiones beta como prerelease. +- Después de subir un asset, comparar su SHA256 con el APK verificado localmente y comprobar el asset de la release mediante la API de Gitea. diff --git a/apps/toldo-app/package-lock.json b/apps/toldo-app/package-lock.json index 0233cc2..238ee79 100644 --- a/apps/toldo-app/package-lock.json +++ b/apps/toldo-app/package-lock.json @@ -1,12 +1,12 @@ { "name": "toldo-app", - "version": "0.0.4", + "version": "0.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "toldo-app", - "version": "0.0.4", + "version": "0.0.5", "dependencies": { "@capacitor/android": "^6.2.1", "@capacitor/core": "^6.2.1", diff --git a/apps/toldo-app/package.json b/apps/toldo-app/package.json index 41643f7..5541097 100644 --- a/apps/toldo-app/package.json +++ b/apps/toldo-app/package.json @@ -1,7 +1,7 @@ { "name": "toldo-app", "private": true, - "version": "0.0.4", + "version": "0.0.5", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/toldo-app/src/__tests__/critical-flow.test.ts b/apps/toldo-app/src/__tests__/critical-flow.test.ts index 59a4a31..c59bfd7 100644 --- a/apps/toldo-app/src/__tests__/critical-flow.test.ts +++ b/apps/toldo-app/src/__tests__/critical-flow.test.ts @@ -19,7 +19,7 @@ describe('contratos de operación y respaldo', () => { it('expone la versión actual en las exportaciones', () => { const result = new ExportImportService().exportAll({ productores: [], productos: [], movimientosInventario: [], ventas: [], ventaLineas: [], gastos: [], ajustes: [], cuadres: [] }); - expect(result.appVersion).toBe('0.0.4'); + expect(result.appVersion).toBe('0.0.5'); }); it('exporta jornadas junto con los datos operativos', () => { diff --git a/apps/toldo-app/tests/e2e/navigation.spec.ts b/apps/toldo-app/tests/e2e/navigation.spec.ts index d3653ef..3603287 100644 --- a/apps/toldo-app/tests/e2e/navigation.spec.ts +++ b/apps/toldo-app/tests/e2e/navigation.spec.ts @@ -29,3 +29,18 @@ test('permite volver a inicio desde Jornada e Inventario', async ({ page }) => { await page.getByTestId('back-button').click(); await expect(page.getByText('Panel de control')).toBeVisible(); }); + +test('muestra los flujos compactos en móvil', async ({ page }) => { + test.skip(test.info().project.name !== 'mobile', 'Este escenario se ejecuta en el proyecto móvil.'); + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/inventario'); + await expect(page.getByRole('tab', { name: 'Catálogo' })).toBeVisible(); + await expect(page.getByRole('tab', { name: 'Ingresos' })).toBeVisible(); + await expect(page.getByRole('tab', { name: 'Ajustes' })).toBeVisible(); + await expect(page.getByText('Migas de pan')).toHaveCount(0); + await page.goto('/ventas'); + await expect(page.getByRole('button', { name: 'Buscar productos' })).toBeVisible(); + await page.goto('/jornada'); + await expect(page.getByLabel('Efectivo contado (obligatorio)')).toBeVisible(); + await expect(page.getByLabel('Dinero en banco por QR (opcional)')).toBeVisible(); +}); diff --git a/apps/toldo-app/version.properties b/apps/toldo-app/version.properties index ad91f6a..486d8f1 100644 --- a/apps/toldo-app/version.properties +++ b/apps/toldo-app/version.properties @@ -1,2 +1,2 @@ -versionName=0.0.4 -versionCode=4 +versionName=0.0.5 +versionCode=5 diff --git a/openspec/changes/standardize-app-version/proposal.md b/openspec/changes/standardize-app-version/proposal.md index a0f6715..4f48af0 100644 --- a/openspec/changes/standardize-app-version/proposal.md +++ b/openspec/changes/standardize-app-version/proposal.md @@ -8,7 +8,7 @@ La aplicación usa versiones distintas o hardcodeadas entre npm, Android y las e - Definir `versionName` y `versionCode` en un archivo versionado compartido. - Usar esos valores en Gradle, npm y exportaciones JSON. -- Publicar la siguiente versión como `0.0.4` con `versionCode 4`. +- Publicar la siguiente versión como `0.0.5` con `versionCode 5`. - Validar el `applicationId` y la versión en el APK generado. ## Capabilities diff --git a/openspec/changes/standardize-app-version/specs/app-versioning/spec.md b/openspec/changes/standardize-app-version/specs/app-versioning/spec.md index ba950ad..50a6b1c 100644 --- a/openspec/changes/standardize-app-version/specs/app-versioning/spec.md +++ b/openspec/changes/standardize-app-version/specs/app-versioning/spec.md @@ -9,10 +9,10 @@ Asegura que cada actualización de ToldoConjunto pueda identificarse y actualiza ### Requirement: Versionado consistente The system SHALL expose the same semantic version in npm metadata, exported data, and Android versionName. -#### Scenario: Version 0.0.4 +#### Scenario: Version 0.0.5 - **WHEN** the app is built -- **THEN** npm and exported data report `0.0.4` -- **AND** Android reports versionName `0.0.4` and versionCode `4` +- **THEN** npm and exported data report `0.0.5` +- **AND** Android reports versionName `0.0.5` and versionCode `5` ### Requirement: Identidad Android estable The system SHALL preserve the application id `com.ilusion.toldoconjunto` across releases. diff --git a/openspec/changes/standardize-app-version/tasks.md b/openspec/changes/standardize-app-version/tasks.md index f797308..803bca5 100644 --- a/openspec/changes/standardize-app-version/tasks.md +++ b/openspec/changes/standardize-app-version/tasks.md @@ -2,7 +2,7 @@ ## 1. Versionado -- [x] 1.1 Crear la fuente compartida con `versionName=0.0.4` y `versionCode=4`, y actualizar npm/exportaciones +- [x] 1.1 Crear la fuente compartida con `versionName=0.0.5` y `versionCode=5`, y actualizar npm/exportaciones - [x] 1.2 Configurar Gradle para leer la fuente compartida y conservar el applicationId - [x] 1.3 Añadir test que compruebe versionado y compatibilidad de exportación diff --git a/packages/services/src/export-import/ExportImportService.ts b/packages/services/src/export-import/ExportImportService.ts index 7bb70e2..141e763 100644 --- a/packages/services/src/export-import/ExportImportService.ts +++ b/packages/services/src/export-import/ExportImportService.ts @@ -19,7 +19,7 @@ export interface ExportData { } export const CURRENT_SCHEMA_VERSION = 1; -export const APP_VERSION = '0.0.4'; +export const APP_VERSION = '0.0.5'; export class ExportImportService { exportAll(data: ExportData['data']): ExportData { diff --git a/scripts/verify-apk.sh b/scripts/verify-apk.sh new file mode 100755 index 0000000..e711284 --- /dev/null +++ b/scripts/verify-apk.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +apk="${1:?Uso: verify-apk.sh }" +version_name="${2:?Falta versionName}" +version_code="${3:?Falta versionCode}" +aapt_bin="${AAPT:-aapt2}" +tmp_dir="$(mktemp -d)" +trap 'rm -rf "$tmp_dir"' EXIT + +badging="$($aapt_bin dump badging "$apk")" +printf '%s\n' "$badging" | grep -F "package: name='com.ilusion.toldoconjunto' versionCode='$version_code' versionName='$version_name'" >/dev/null + +unzip -q "$apk" -d "$tmp_dir" +find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Buscar productos' >/dev/null +find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Dinero en banco por QR' >/dev/null +find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Cerrar caja y jornada' >/dev/null +find "$tmp_dir/assets/public/assets" -type f -name '*.woff2' | grep materialdesignicons >/dev/null + +printf 'APK verificada: applicationId=com.ilusion.toldoconjunto versionName=%s versionCode=%s\n' "$version_name" "$version_code"