diff --git a/.skills/project-overview/SKILL.md b/.skills/project-overview/SKILL.md index 0ceade61a6..6df668bf2e 100644 --- a/.skills/project-overview/SKILL.md +++ b/.skills/project-overview/SKILL.md @@ -62,10 +62,31 @@ Meshtastic-Android is a Kotlin Multiplatform (KMP) application for off-grid, dec datadogClientToken=dummy_token ``` -## 5. Troubleshooting +## 5. Workspace Bootstrap (MUST run before any build) +Agents **MUST** perform these steps automatically at the start of every session before running any Gradle task. Do not wait for the user to tell you. + +1. **Android SDK:** `ANDROID_HOME` may not be set in agent workspaces. Detect and export it: + ```bash + # Check common macOS/Linux locations in order of preference + if [ -z "$ANDROID_HOME" ]; then + for dir in "$HOME/Library/Android/sdk" "$HOME/Android/Sdk" "/opt/android-sdk"; do + if [ -d "$dir" ]; then export ANDROID_HOME="$dir"; break; fi + done + fi + ``` + All `./gradlew` invocations must include `ANDROID_HOME` in the environment. If the SDK cannot be found, ask the user for the path. + +2. **Proto submodule:** `core/proto/src/main/proto` is a Git submodule containing Protobuf definitions. It must be initialized or builds will fail with proto generation errors: + ```bash + git submodule update --init + ``` + +## 6. Troubleshooting - **Build Failures:** Check `gradle/libs.versions.toml` for dependency conflicts. - **Missing Secrets:** Check `local.properties` (see Environment Setup above). - **JDK Version:** JDK 21 is required. +- **SDK location not found:** See Workspace Bootstrap step 1 above. +- **Proto generation failures:** See Workspace Bootstrap step 2 above. - **Configuration Cache:** Add `--no-configuration-cache` flag if cache-related issues persist. - **Koin Injection Failures:** Verify the KMP component is included in `app` root module wiring (`AppKoinModule`). diff --git a/AGENTS.md b/AGENTS.md index 92009df61a..73d29f2b90 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,6 +22,9 @@ You are an expert Android and Kotlin Multiplatform (KMP) engineer working on Mes +- **Workspace Bootstrap (MUST run first):** Before executing any Gradle task in a new workspace, agents MUST automatically: + 1. **Find the Android SDK** — `ANDROID_HOME` is often unset in agent worktrees. Probe `~/Library/Android/sdk`, `~/Android/Sdk`, and `/opt/android-sdk`. Export the first one found. If none exist, ask the user. + 2. **Init the proto submodule** — Run `git submodule update --init`. The `core/proto/src/main/proto` submodule contains Protobuf definitions required for builds. - **Think First:** Reason through the problem before writing code. For complex KMP tasks involving multiple modules or source sets, outline your approach step-by-step before executing. - **Plan Before Execution:** Use the git-ignored `.agent_plans/` directory to write markdown implementation plans (`plan.md`) and Mermaid diagrams (`.mmd`) for complex refactors before modifying code. - **Atomic Execution:** Follow your plan step-by-step. Do not jump ahead. Use TDD where feasible (write `commonTest` fakes first). diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1c8ed4c39a..2005e93207 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -243,6 +243,7 @@ dependencies { implementation(libs.jetbrains.compose.material3.adaptive.layout) implementation(libs.jetbrains.compose.material3.adaptive.navigation) implementation(libs.material) + implementation(libs.compose.multiplatform.animation) implementation(libs.compose.multiplatform.material3) implementation(libs.compose.multiplatform.ui.tooling.preview) implementation(libs.compose.multiplatform.ui) diff --git a/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt index 4fef5c6f4a..6af52cd502 100644 --- a/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt @@ -42,6 +42,7 @@ class KmpFeatureConventionPlugin : Plugin { extensions.configure { sourceSets.getByName("commonMain").dependencies { // Compose Multiplatform UI + implementation(libs.library("compose-multiplatform-animation")) implementation(libs.library("compose-multiplatform-material3")) // Lifecycle & ViewModel (JetBrains KMP forks — safe in commonMain) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 76475e0964..99221edf15 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -42,6 +42,7 @@ kotlin { implementation(projects.core.resources) implementation(projects.core.service) + implementation(libs.compose.multiplatform.animation) implementation(libs.compose.multiplatform.material3) implementation(libs.compose.multiplatform.ui) implementation(libs.compose.multiplatform.foundation) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 404b9f80e0..c62bda1804 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -125,6 +125,7 @@ androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4 androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version = "1.11.0-rc01" } # Compose Multiplatform +compose-multiplatform-animation = { module = "org.jetbrains.compose.animation:animation", version.ref = "compose-multiplatform" } compose-multiplatform-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "compose-multiplatform" } compose-multiplatform-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "compose-multiplatform" } compose-multiplatform-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "compose-multiplatform" }