feat(kotlin-compose): design system + 33 components + gallery_kt + e2e android emulator + scaffolder fixes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 16:28:50 +02:00
parent 0bdb8454e1
commit cb6d9e61d1
152 changed files with 148262 additions and 25 deletions
@@ -0,0 +1,48 @@
---
id: 0073
title: init_kotlin_app genera gradlew stub no funcional
status: pending
priority: high
created: 2026-05-10
related_pipelines: [init_kotlin_app_bash_pipelines]
related_apps: [counter_kt]
---
## Sintoma
Al scaffoldear app Kotlin con `fn run init_kotlin_app <name>`, el `gradlew` generado es un stub que delega a `gradle/wrapper/gradlew` (no existe) y luego a `gradle` system (no instalado). Resultado: silenciosamente falla.
## Reproducir
```bash
./fn run init_kotlin_app foo_app
cd apps/foo_app
./gradlew :app:assembleDebug
# (no output, exit silente)
```
## Causa
`bash/functions/pipelines/init_kotlin_app.sh` linea ~XXX genera placeholder gradlew. No descarga `gradle-wrapper.jar` real ni invoca `gradle wrapper --gradle-version 8.6`.
## Workaround actual
Copiar wrapper de otra app:
```bash
cp apps/voice_guide/frontend/android/gradle/wrapper/gradle-wrapper.jar <new_app>/gradle/wrapper/
cp apps/voice_guide/frontend/android/gradlew <new_app>/gradlew
chmod +x <new_app>/gradlew
```
## Fix propuesto
Una de:
- Descargar `gradle-wrapper.jar` desde `https://raw.githubusercontent.com/gradle/gradle/v8.6.0/gradle/wrapper/gradle-wrapper.jar` (~60KB) durante scaffold + escribir `gradlew` real (no stub).
- Vendor del wrapper jar en `bash/functions/pipelines/templates/kotlin/gradle-wrapper.jar` y copiar al scaffold.
- Detectar gradle system, invocar `gradle wrapper --gradle-version 8.6` post-mkdir.
Recomendado: vendor (option B) — sin dependencia de red en cada scaffold.
## Validacion
Tras fix, `./fn run init_kotlin_app smoke && cd apps/smoke && ./gradlew --version` debe imprimir Gradle 8.6 sin errores.
@@ -0,0 +1,37 @@
---
id: 0074
title: init_kotlin_app no genera local.properties
status: pending
priority: high
created: 2026-05-10
related_pipelines: [init_kotlin_app_bash_pipelines]
related_apps: [counter_kt]
---
## Sintoma
Tras scaffoldear, gradle aborta con:
```
SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file at '<dir>/local.properties'.
```
## Causa
Scaffolder no genera `local.properties`. Aunque `gradle_run_bash_infra` exporta ANDROID_HOME, IDEs (Android Studio) y devs que usen `gradle` directamente no heredan ese env.
## Fix propuesto
En `init_kotlin_app.sh` tras crear estructura, generar:
```bash
cat > "$abs_dir/local.properties" <<EOF
# Auto-generated by init_kotlin_app. Per-machine, gitignore'd.
sdk.dir=${ANDROID_SDK_DIR:-$HOME/android-sdk}
EOF
```
Y anadir `local.properties` al `.gitignore` del scaffold.
## Validacion
`fn run init_kotlin_app smoke && cd apps/smoke && ./gradlew tasks` debe ejecutar sin error de SDK location.
@@ -0,0 +1,32 @@
---
id: 0075
title: init_kotlin_app genera AndroidManifest con tema AppCompat sin dep
status: pending
priority: medium
created: 2026-05-10
related_pipelines: [init_kotlin_app_bash_pipelines]
related_apps: [counter_kt]
fix_applied: 2026-05-10
---
## Sintoma
```
ERROR: AAPT: error: resource style/Theme.AppCompat.Light.NoActionBar not found
```
## Causa
`init_kotlin_app.sh` template AndroidManifest.xml usaba `@style/Theme.AppCompat.Light.NoActionBar` pero `app/build.gradle.kts` no incluye `androidx.appcompat:appcompat`. Apps Compose no necesitan AppCompat — usan tema Android plataforma.
## Fix aplicado (2026-05-10)
`init_kotlin_app.sh` linea 240: cambiado a `@android:style/Theme.Material.Light.NoActionBar` (built-in, sin dep externa).
## Validacion
Smoke test counter_kt build: ✓ 8.3MB APK generado tras fix.
## Cierre
Mover este archivo a `dev/issues/completed/` cuando se confirme en proxima app scaffolded.
@@ -0,0 +1,46 @@
---
id: 0078
title: kotlin/functions/ui requiere ser modulo Gradle library para composite build
status: pending
priority: high
created: 2026-05-10
fix_applied: 2026-05-10
related_functions:
- fn_colors_kt_ui
- fn_spacing_kt_ui
- fn_radius_kt_ui
- fn_typography_kt_ui
- fn_shadows_kt_ui
- fn_tokens_kt_ui
- fn_theme_kt_ui
related_apps: [counter_kt]
---
## Contexto
Apps Kotlin Compose nuevas (counter_kt y futuras) consumen `kotlin/functions/ui/` via Gradle composite build (`includeBuild` en settings.gradle.kts). Para que funcione, `kotlin/functions/ui/` debe ser un proyecto Gradle valido (com.android.library + Compose).
Inicialmente solo habia `.kt` + `.md` sueltos sin estructura Gradle.
## Fix aplicado (2026-05-10)
Anadidos a `kotlin/functions/ui/`:
- `settings.gradle.kts` (rootProject.name = "fn-compose-ui")
- `build.gradle.kts` (com.android.library + kotlin-android + Compose 2024.02.00)
- `gradle.properties` (jvmargs, useAndroidX)
- `src/main/AndroidManifest.xml` (vacio, package via namespace)
Movidos: 7 `.kt` desde `kotlin/functions/ui/*.kt``kotlin/functions/ui/src/main/kotlin/fn/compose/theme/*.kt`. Estructura Gradle estandar.
Actualizado `file_path` en 7 `.md` apuntando al nuevo path. `.md` se quedan en `kotlin/functions/ui/` (raiz del modulo) — registry los detecta normal.
## Pendientes
1. **Anadir wrapper Gradle propio al modulo** — actualmente depende de que el caller (counter_kt) bootstrap gradle. Sin wrapper propio, no se puede `cd kotlin/functions/ui && ./gradlew tasks` para inspeccionar.
2. **Tests propios del modulo** — anadir `src/test/kotlin/.../FnColorsTest.kt` etc. para validar tokens (ej. assertEquals hex codes Mantine spec).
3. **`.gitignore` propio** — `build/`, `.gradle/`, `local.properties`.
4. **Documentacion `kotlin/functions/ui/README.md`** — como anadir un nuevo componente, convencion package, layout.
## Validacion
`fn run init_kotlin_app smoke && cd apps/smoke && ./gradlew :app:assembleDebug` corre y enlaza correctamente con `fn.compose:ui` del composite build (counter_kt confirmado funcionando 2026-05-10).