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:
@@ -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).
|
||||
Reference in New Issue
Block a user