[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F0CSMTPRSPQ4BADYTGEV9A":3,"skill-same:01M6F0CSMTPRSPQ4BADYTGEV9A":135},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":6,"ownerHtmlUrl":72,"ownerBlogUrl":6,"ownerDescription":73,"updatedAt":74,"install":75,"resources":88},"01M6F0CSMTPRSPQ4BADYTGEV9A","android-native-dev",null,"Android native application development and UI design guide. Covers Material Design 3, Kotlin\u002FCompose development, project configuration, accessibility, and build troubleshooting. Read this before Android native application development.","luokai0\u002Fai-agent-skills-by-luo-kai","luokai0","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F266954973?v=4","01M6E16VNT42JB8B3X3254QWJ7","luo kai","01M6E16VTFVP6S5XJF1V1MPV90",14,"MIT","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002FSKILL.md",[18,23,26,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"android native dev","android","native","dev","read","material","project","build","mobile","compose","material design 3","guide","design","kotlin","WCAG","developer","ui","play","guidelines","google","2026-11-10 10:12:30",false,"---\nname: android-native-dev\ndescription: Android native application development and UI design guide. Covers Material Design 3, Kotlin\u002FCompose development, project configuration, accessibility, and build troubleshooting. Read this before Android native application development.\nlicense: MIT\nmetadata:\n  version: \"1.0.0\"\n  category: mobile\n  sources:\n    - Material Design 3 Guidelines (material.io)\n    - Android Developer Documentation (developer.android.com)\n    - Google Play Quality Guidelines\n    - WCAG Accessibility Guidelines\n---\n\n## 1. Project Scenario Assessment\n\nBefore starting development, assess the current project state:\n\n| Scenario | Characteristics | Approach |\n|----------|-----------------|----------|\n| **Empty Directory** | No files present | Full initialization required, including Gradle Wrapper |\n| **Has Gradle Wrapper** | `gradlew` and `gradle\u002Fwrapper\u002F` exist | Use `.\u002Fgradlew` directly for builds |\n| **Android Studio Project** | Complete project structure, may lack wrapper | Check wrapper, run `gradle wrapper` if needed |\n| **Incomplete Project** | Partial files present | Check missing files, complete configuration |\n\n**Key Principles**:\n- Before writing business logic, ensure `.\u002Fgradlew assembleDebug` succeeds\n- If `gradle.properties` is missing, create it first and configure AndroidX\n\n### 1.1 Required Files Checklist\n\n```\nMyApp\u002F\n├── gradle.properties          # Configure AndroidX and other settings\n├── settings.gradle.kts\n├── build.gradle.kts           # Root level\n├── gradle\u002Fwrapper\u002F\n│   └── gradle-wrapper.properties\n├── app\u002F\n│   ├── build.gradle.kts       # Module level\n│   └── src\u002Fmain\u002F\n│       ├── AndroidManifest.xml\n│       ├── java\u002Fcom\u002Fexample\u002Fmyapp\u002F\n│       │   └── MainActivity.kt\n│       └── res\u002F\n│           ├── values\u002F\n│           │   ├── strings.xml\n│           │   ├── colors.xml\n│           │   └── themes.xml\n│           └── mipmap-*\u002F       # App icons\n```\n\n---\n\n## 2. Project Configuration\n\n### 2.1 gradle.properties\n\n```properties\n# Required configuration\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\n# Build optimization\norg.gradle.parallel=true\nkotlin.code.style=official\n\n# JVM memory settings (adjust based on project size)\n# Small projects: 2048m, Medium: 4096m, Large: 8192m+\n# org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n```\n\n> **Note**: If you encounter `OutOfMemoryError` during build, increase `-Xmx` value. Large projects with many dependencies may require 8GB or more.\n\n### 2.2 Dependency Declaration Standards\n\n```kotlin\ndependencies {\n    \u002F\u002F Use BOM to manage Compose versions\n    implementation(platform(\"androidx.compose:compose-bom:2024.02.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.material3:material3\")\n    \n    \u002F\u002F Activity & ViewModel\n    implementation(\"androidx.activity:activity-compose:1.8.2\")\n    implementation(\"androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0\")\n}\n```\n\n### 2.3 Build Variants & Product Flavors\n\nProduct Flavors allow you to create different versions of your app (e.g., free\u002Fpaid, dev\u002Fstaging\u002Fprod).\n\n**Configuration in app\u002Fbuild.gradle.kts**:\n\n```kotlin\nandroid {\n    \u002F\u002F Define flavor dimensions\n    flavorDimensions += \"environment\"\n    \n    productFlavors {\n        create(\"dev\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".dev\"\n            versionNameSuffix = \"-dev\"\n            \n            \u002F\u002F Different config values per flavor\n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fdev-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            \n            \u002F\u002F Different resources\n            resValue(\"string\", \"app_name\", \"MyApp Dev\")\n        }\n        \n        create(\"staging\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".staging\"\n            versionNameSuffix = \"-staging\"\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fstaging-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            resValue(\"string\", \"app_name\", \"MyApp Staging\")\n        }\n        \n        create(\"prod\") {\n            dimension = \"environment\"\n            \u002F\u002F No suffix for production\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fapi.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"false\")\n            resValue(\"string\", \"app_name\", \"MyApp\")\n        }\n    }\n    \n    buildTypes {\n        debug {\n            isDebuggable = true\n            isMinifyEnabled = false\n        }\n        release {\n            isDebuggable = false\n            isMinifyEnabled = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\")\n        }\n    }\n}\n```\n\n**Build Variant Naming**: `{flavor}{BuildType}` → e.g., `devDebug`, `prodRelease`\n\n**Gradle Build Commands**:\n\n```bash\n# List all available build variants\n.\u002Fgradlew tasks --group=\"build\"\n\n# Build specific variant (flavor + buildType)\n.\u002Fgradlew assembleDevDebug        # Dev flavor, Debug build\n.\u002Fgradlew assembleStagingDebug    # Staging flavor, Debug build\n.\u002Fgradlew assembleProdRelease     # Prod flavor, Release build\n\n# Build all variants of a specific flavor\n.\u002Fgradlew assembleDev             # All Dev variants (debug + release)\n.\u002Fgradlew assembleProd            # All Prod variants\n\n# Build all variants of a specific build type\n.\u002Fgradlew assembleDebug           # All flavors, Debug build\n.\u002Fgradlew assembleRelease         # All flavors, Release build\n\n# Install specific variant to device\n.\u002Fgradlew installDevDebug\n.\u002Fgradlew installProdRelease\n\n# Build and install in one command\n.\u002Fgradlew installDevDebug && adb shell am start -n com.example.myapp.dev\u002F.MainActivity\n```\n\n**Access BuildConfig in Code**:\n\n> **Note**: Starting from AGP 8.0, `BuildConfig` is no longer generated by default. You must explicitly enable it in your `build.gradle.kts`:\n> ```kotlin\n> android {\n>     buildFeatures {\n>         buildConfig = true\n>     }\n> }\n> ```\n\n```kotlin\n\u002F\u002F Use build config values in your code\nval apiUrl = BuildConfig.API_BASE_URL\nval isLoggingEnabled = BuildConfig.ENABLE_LOGGING\n\nif (BuildConfig.DEBUG) {\n    \u002F\u002F Debug-only code\n}\n```\n\n**Flavor-Specific Source Sets**:\n\n```\napp\u002Fsrc\u002F\n├── main\u002F           # Shared code for all flavors\n├── dev\u002F            # Dev-only code and resources\n│   ├── java\u002F\n│   └── res\u002F\n├── staging\u002F        # Staging-only code and resources\n├── prod\u002F           # Prod-only code and resources\n├── debug\u002F          # Debug build type code\n└── release\u002F        # Release build type code\n```\n\n**Multiple Flavor Dimensions** (e.g., environment + tier):\n\n```kotlin\nandroid {\n    flavorDimensions += listOf(\"environment\", \"tier\")\n    \n    productFlavors {\n        create(\"dev\") { dimension = \"environment\" }\n        create(\"prod\") { dimension = \"environment\" }\n        \n        create(\"free\") { dimension = \"tier\" }\n        create(\"paid\") { dimension = \"tier\" }\n    }\n}\n\u002F\u002F Results in: devFreeDebug, devPaidDebug, prodFreeRelease, etc.\n```\n\n---\n\n## 3. Kotlin Development Standards\n\n### 3.1 Naming Conventions\n\n| Type | Convention | Example |\n|------|------------|---------|\n| Class\u002FInterface | PascalCase | `UserRepository`, `MainActivity` |\n| Function\u002FVariable | camelCase | `getUserName()`, `isLoading` |\n| Constant | SCREAMING_SNAKE | `MAX_RETRY_COUNT` |\n| Package | lowercase | `com.example.myapp` |\n| Composable | PascalCase | `@Composable fun UserCard()` |\n\n### 3.2 Code Standards (Important)\n\n**Null Safety**:\n```kotlin\n\u002F\u002F ❌ Avoid: Non-null assertion !! (may crash)\nval name = user!!.name\n\n\u002F\u002F ✅ Recommended: Safe call + default value\nval name = user?.name ?: \"Unknown\"\n\n\u002F\u002F ✅ Recommended: let handling\nuser?.let { processUser(it) }\n```\n\n**Exception Handling**:\n```kotlin\n\u002F\u002F ❌ Avoid: Random try-catch in business layer swallowing exceptions\nfun loadData() {\n    try {\n        val data = api.fetch()\n    } catch (e: Exception) {\n        \u002F\u002F Swallowing exception, hard to debug\n    }\n}\n\n\u002F\u002F ✅ Recommended: Let exceptions propagate, handle at appropriate layer\nsuspend fun loadData(): Result\u003CData> {\n    return try {\n        Result.success(api.fetch())\n    } catch (e: Exception) {\n        Result.failure(e)  \u002F\u002F Wrap and return, let caller decide handling\n    }\n}\n\n\u002F\u002F ✅ Recommended: Unified handling in ViewModel\nviewModelScope.launch {\n    runCatching { repository.loadData() }\n        .onSuccess { _uiState.value = UiState.Success(it) }\n        .onFailure { _uiState.value = UiState.Error(it.message) }\n}\n```\n\n### 3.3 Threading & Coroutines (Critical)\n\n**Thread Selection Principles**:\n\n| Operation Type | Thread | Description |\n|----------------|--------|-------------|\n| UI Updates | `Dispatchers.Main` | Update View, State, LiveData |\n| Network Requests | `Dispatchers.IO` | HTTP calls, API requests |\n| File I\u002FO | `Dispatchers.IO` | Local storage, database operations |\n| Compute Intensive | `Dispatchers.Default` | JSON parsing, sorting, encryption |\n\n**Correct Usage**:\n```kotlin\n\u002F\u002F In ViewModel\nviewModelScope.launch {\n    \u002F\u002F Default Main thread, can update UI State\n    _uiState.value = UiState.Loading\n    \n    \u002F\u002F Switch to IO thread for network request\n    val result = withContext(Dispatchers.IO) {\n        repository.fetchData()\n    }\n    \n    \u002F\u002F Automatically returns to Main thread, update UI\n    _uiState.value = UiState.Success(result)\n}\n\n\u002F\u002F In Repository (suspend functions should be main-safe)\nsuspend fun fetchData(): Data = withContext(Dispatchers.IO) {\n    api.getData()\n}\n```\n\n**Common Mistakes**:\n```kotlin\n\u002F\u002F ❌ Wrong: Updating UI on IO thread\nviewModelScope.launch(Dispatchers.IO) {\n    val data = api.fetch()\n    _uiState.value = data  \u002F\u002F Crash or warning!\n}\n\n\u002F\u002F ❌ Wrong: Executing time-consuming operation on Main thread\nviewModelScope.launch {\n    val data = api.fetch()  \u002F\u002F Blocking main thread! ANR\n}\n\n\u002F\u002F ✅ Correct: Fetch on IO, update on Main\nviewModelScope.launch {\n    val data = withContext(Dispatchers.IO) { api.fetch() }\n    _uiState.value = data\n}\n```\n\n### 3.4 Visibility Rules\n\n```kotlin\n\u002F\u002F Default is public, declare explicitly when needed\nclass UserRepository {           \u002F\u002F public\n    private val cache = mutableMapOf\u003CString, User>()  \u002F\u002F Visible only within class\n    internal fun clearCache() {} \u002F\u002F Visible only within module\n}\n\n\u002F\u002F data class properties are public by default, be careful when used across modules\ndata class User(\n    val id: String,       \u002F\u002F public\n    val name: String\n)\n```\n\n### 3.5 Common Syntax Pitfalls\n\n```kotlin\n\u002F\u002F ❌ Wrong: Accessing uninitialized lateinit\nclass MyViewModel : ViewModel() {\n    lateinit var data: String\n    fun process() = data.length  \u002F\u002F May crash\n}\n\n\u002F\u002F ✅ Correct: Use nullable or default value\nclass MyViewModel : ViewModel() {\n    var data: String? = null\n    fun process() = data?.length ?: 0\n}\n\n\u002F\u002F ❌ Wrong: Using return in lambda\nlist.forEach { item ->\n    if (item.isEmpty()) return  \u002F\u002F Returns from outer function!\n}\n\n\u002F\u002F ✅ Correct: Use return@forEach\nlist.forEach { item ->\n    if (item.isEmpty()) return@forEach\n}\n```\n\n### 3.6 Server Response Data Class Fields Must Be Nullable\n\n```kotlin\n\u002F\u002F ❌ Wrong: Fields declared as non-null (server may not return them)\ndata class UserResponse(\n    val id: String = \"\",\n    val name: String = \"\",\n    val avatar: String = \"\"\n)\n\n\u002F\u002F ✅ Correct: All fields declared as nullable\ndata class UserResponse(\n    @SerializedName(\"id\")\n    val id: String? = null,\n    @SerializedName(\"name\")\n    val name: String? = null,\n    @SerializedName(\"avatar\")\n    val avatar: String? = null\n)\n```\n\n### 3.7 Lifecycle Resource Management\n\n```kotlin\n\u002F\u002F ❌ Wrong: Only adding Observer, not removing\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n    \u002F\u002F Memory leak!\n}\n\n\u002F\u002F ✅ Correct: Paired add and remove\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n\n    override fun onDetachedFromWindow() {\n        activity?.lifecycle?.removeObserver(this)\n        super.onDetachedFromWindow()\n    }\n}\n```\n\n### 3.8 Logging Level Usage\n\n```kotlin\nimport android.util.Log\n\n\u002F\u002F Info: Key checkpoints in normal flow\nLog.i(TAG, \"loadData: started, userId = $userId\")\n\n\u002F\u002F Warning: Abnormal but recoverable situations\nLog.w(TAG, \"loadData: cache miss, fallback to network\")\n\n\u002F\u002F Error: Failure\u002Ferror situations\nLog.e(TAG, \"loadData failed: ${error.message}\")\n```\n\n| Level | Use Case |\n|-------|----------|\n| `i` (Info) | Normal flow, method entry, key parameters |\n| `w` (Warning) | Recoverable exceptions, fallback handling, null returns |\n| `e` (Error) | Request failures, caught exceptions, unrecoverable errors |\n\n---\n\n## 4. Jetpack Compose Standards\n\n### 4.1 @Composable Context Rules\n\n```kotlin\n\u002F\u002F ❌ Wrong: Calling Composable from non-Composable function\nfun showError(message: String) {\n    Text(message)  \u002F\u002F Compile error!\n}\n\n\u002F\u002F ✅ Correct: Mark as @Composable\n@Composable\nfun ErrorMessage(message: String) {\n    Text(message)\n}\n\n\u002F\u002F ❌ Wrong: Using suspend outside LaunchedEffect\n@Composable\nfun MyScreen() {\n    val data = fetchData()  \u002F\u002F Error!\n}\n\n\u002F\u002F ✅ Correct: Use LaunchedEffect\n@Composable\nfun MyScreen() {\n    var data by remember { mutableStateOf\u003CData?>(null) }\n    LaunchedEffect(Unit) {\n        data = fetchData()\n    }\n}\n```\n\n### 4.2 State Management\n\n```kotlin\n\u002F\u002F Basic State\nvar count by remember { mutableStateOf(0) }\n\n\u002F\u002F Derived State (avoid redundant computation)\nval isEven by remember { derivedStateOf { count % 2 == 0 } }\n\n\u002F\u002F Persist across recomposition (e.g., scroll position)\nval scrollState = rememberScrollState()\n\n\u002F\u002F State in ViewModel\nclass MyViewModel : ViewModel() {\n    private val _uiState = MutableStateFlow(UiState())\n    val uiState: StateFlow\u003CUiState> = _uiState.asStateFlow()\n}\n```\n\n### 4.3 Common Compose Mistakes\n\n```kotlin\n\u002F\u002F ❌ Wrong: Creating objects in Composable (created on every recomposition)\n@Composable\nfun MyScreen() {\n    val viewModel = MyViewModel()  \u002F\u002F Wrong!\n}\n\n\u002F\u002F ✅ Correct: Use viewModel() or remember\n@Composable\nfun MyScreen(viewModel: MyViewModel = viewModel()) {\n    \u002F\u002F ...\n}\n```\n\n---\n\n## 5. Resources & Icons\n\n### 5.1 App Icon Requirements\n\nMust provide multi-resolution icons:\n\n| Directory | Size | Purpose |\n|-----------|------|---------|\n| mipmap-mdpi | 48x48 | Baseline |\n| mipmap-hdpi | 72x72 | 1.5x |\n| mipmap-xhdpi | 96x96 | 2x |\n| mipmap-xxhdpi | 144x144 | 3x |\n| mipmap-xxxhdpi | 192x192 | 4x |\n\nRecommended: Use Adaptive Icon (Android 8+):\n\n```xml\n\u003C!-- res\u002Fmipmap-anydpi-v26\u002Fic_launcher.xml -->\n\u003Cadaptive-icon>\n    \u003Cbackground android:drawable=\"@color\u002Fic_launcher_background\"\u002F>\n    \u003Cforeground android:drawable=\"@mipmap\u002Fic_launcher_foreground\"\u002F>\n\u003C\u002Fadaptive-icon>\n```\n\n### 5.2 Resource Naming Conventions\n\n| Type | Prefix | Example |\n|------|--------|---------|\n| Layout | layout_ | `layout_main.xml` |\n| Image | ic_, img_, bg_ | `ic_user.png` |\n| Color | color_ | `color_primary` |\n| String | - | `app_name`, `btn_submit` |\n\n### 5.3 Avoid Android Reserved Names (Important)\n\nVariable names, resource IDs, colors, icons, and XML elements **must not** use Android reserved words or system resource names. Using reserved names causes build errors or resource conflicts.\n\n**Common Reserved Names to Avoid**:\n\n| Category | Reserved Names (Do NOT Use) |\n|----------|----------------------------|\n| Colors | `background`, `foreground`, `transparent`, `white`, `black` |\n| Icons\u002FDrawables | `icon`, `logo`, `image`, `drawable` |\n| Views | `view`, `text`, `button`, `layout`, `container` |\n| Attributes | `id`, `name`, `type`, `style`, `theme`, `color` |\n| System | `app`, `android`, `content`, `data`, `action` |\n\n**Examples**:\n\n```xml\n\u003C!-- ❌ Wrong: Using reserved names -->\n\u003Ccolor name=\"background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon\">#000000\u003C\u002Fcolor>\n\n\u003C!-- ✅ Correct: Add prefix or specific naming -->\n\u003Ccolor name=\"app_background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon_primary\">#000000\u003C\u002Fcolor>\n```\n\n```kotlin\n\u002F\u002F ❌ Wrong: Variable names conflict with system\nval icon = R.drawable.my_icon\nval background = Color.White\n\n\u002F\u002F ✅ Correct: Use descriptive names\nval appIcon = R.drawable.my_icon\nval screenBackground = Color.White\n```\n\n```xml\n\u003C!-- ❌ Wrong: Drawable name conflicts -->\n\u003CImageView android:src=\"@drawable\u002Ficon\" \u002F>\n\n\u003C!-- ✅ Correct: Add prefix -->\n\u003CImageView android:src=\"@drawable\u002Fic_home\" \u002F>\n```\n\n---\n\n## 6. Build Error Diagnosis & Fixes\n\n### 6.1 Common Error Quick Reference\n\n| Error Keyword | Cause | Fix |\n|---------------|-------|-----|\n| `Unresolved reference` | Missing import or undefined | Check imports, verify dependencies |\n| `Type mismatch` | Type incompatibility | Check parameter types, add conversion |\n| `Cannot access` | Visibility issue | Check public\u002Fprivate\u002Finternal |\n| `@Composable invocations` | Composable context error | Ensure caller is also @Composable |\n| `Duplicate class` | Dependency conflict | Use `.\u002Fgradlew dependencies` to investigate |\n| `AAPT: error` | Resource file error | Check XML syntax and resource references |\n\n### 6.2 Fix Best Practices\n\n1. **Read the complete error message first**: Locate file and line number\n2. **Check recent changes**: Problems usually in latest modifications\n3. **Clean Build**: `.\u002Fgradlew clean assembleDebug`\n4. **Check dependency versions**: Version conflicts are common causes\n5. **Refresh dependencies if needed**: Clear cache and rebuild\n\n### 6.3 Debugging Commands\n\n```bash\n# Clean and build\n.\u002Fgradlew clean assembleDebug\n\n# View dependency tree (investigate conflicts)\n.\u002Fgradlew :app:dependencies\n\n# View detailed errors\n.\u002Fgradlew assembleDebug --stacktrace\n\n# Refresh dependencies\n.\u002Fgradlew --refresh-dependencies\n```\n\n---\n\n## 7. Material Design 3 Guidelines\n\nReview Android UI files for compliance with Material Design 3 Guidelines and Android best practices.\n\n### Design Philosophy\n\n#### M3 Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Personal** | Dynamic color based on user preferences and wallpaper |\n| **Adaptive** | Responsive across all screen sizes and form factors |\n| **Expressive** | Bold colors and typography with personality |\n| **Accessible** | Inclusive design for all users |\n\n#### M3 Expressive (Latest)\n\nThe latest evolution adds emotion-driven UX through:\n- Vibrant, dynamic colors\n- Intuitive motion physics\n- Adaptive components\n- Flexible typography\n- Contrasting shapes (35 new shape options)\n\n### App Style Selection\n\n**Critical Decision**: Match visual style to app category and target audience.\n\n| App Category | Visual Style | Key Characteristics |\n|--------------|--------------|---------------------|\n| Utility\u002FTool | Minimalist | Clean, efficient, neutral colors |\n| Finance\u002FBanking | Professional Trust | Conservative colors, security-focused |\n| Health\u002FWellness | Calm & Natural | Soft colors, organic shapes |\n| Kids (3-5) | Playful Simple | Bright colors, large targets (56dp+) |\n| Kids (6-12) | Fun & Engaging | Vibrant, gamified feedback |\n| Social\u002FEntertainment | Expressive | Brand-driven, gesture-rich |\n| Productivity | Clean & Focused | Minimal, high contrast |\n| E-commerce | Conversion-focused | Clear CTAs, scannable |\n\nSee [Design Style Guide](references\u002Fdesign-style-guide.md) for detailed style profiles.\n\n### Quick Reference: Key Specifications\n\n#### Color Contrast Requirements\n\n| Element | Minimum Ratio |\n|---------|---------------|\n| Body text | **4.5:1** |\n| Large text (18sp+) | **3:1** |\n| UI components | **3:1** |\n\n#### Touch Targets\n\n| Type | Size |\n|------|------|\n| Minimum | 48 × 48dp |\n| Recommended (primary actions) | 56 × 56dp |\n| Kids apps | 56dp+ |\n| Spacing between targets | 8dp minimum |\n\n#### 8dp Grid System\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| xs | 4dp | Icon padding |\n| sm | 8dp | Tight spacing |\n| md | 16dp | Default padding |\n| lg | 24dp | Section spacing |\n| xl | 32dp | Large gaps |\n| xxl | 48dp | Screen margins |\n\n#### Typography Scale (Summary)\n\n| Category | Sizes |\n|----------|-------|\n| Display | 57sp, 45sp, 36sp |\n| Headline | 32sp, 28sp, 24sp |\n| Title | 22sp, 16sp, 14sp |\n| Body | 16sp, 14sp, 12sp |\n| Label | 14sp, 12sp, 11sp |\n\n#### Animation Duration\n\n| Type | Duration |\n|------|----------|\n| Micro (ripples) | 50-100ms |\n| Short (simple) | 100-200ms |\n| Medium (expand\u002Fcollapse) | 200-300ms |\n| Long (complex) | 300-500ms |\n\n#### Component Dimensions\n\n| Component | Height | Min Width |\n|-----------|--------|-----------|\n| Button | 40dp | 64dp |\n| FAB | 56dp | 56dp |\n| Text Field | 56dp | 280dp |\n| App Bar | 64dp | - |\n| Bottom Nav | 80dp | - |\n\n### Anti-Patterns (Must Avoid)\n\n#### UI Anti-Patterns\n- More than 5 bottom navigation items\n- Multiple FABs on same screen\n- Touch targets smaller than 48dp\n- Inconsistent spacing (non-8dp multiples)\n- Missing dark theme support\n- Text on colored backgrounds without contrast check\n\n#### Performance Anti-Patterns\n- Startup time > 2 seconds without progress indicator\n- Frame rate \u003C 60 FPS (> 16ms per frame)\n- Crash rate > 1.09% (Google Play threshold)\n- ANR rate > 0.47% (Google Play threshold)\n\n#### Accessibility Anti-Patterns\n- Missing contentDescription on interactive elements\n- Element type in labels (e.g., \"Save button\" instead of \"Save\")\n- Complex gestures in kids apps\n- Text-only buttons for non-readers\n\n### Review Checklist\n\n- [ ] 8dp spacing grid compliance\n- [ ] 48dp minimum touch targets\n- [ ] Proper typography scale usage\n- [ ] Color contrast compliance (4.5:1+ for text)\n- [ ] Dark theme support\n- [ ] contentDescription on all interactive elements\n- [ ] Startup \u003C 2 seconds or shows progress\n- [ ] Visual style matches app category\n\n### Design References\n\n| Topic | Reference |\n|-------|-----------|\n| Colors, Typography, Spacing, Shapes | [Visual Design](references\u002Fvisual-design.md) |\n| Animation & Transitions | [Motion System](references\u002Fmotion-system.md) |\n| Accessibility Guidelines | [Accessibility](references\u002Faccessibility.md) |\n| Large Screens & Foldables | [Adaptive Screens](references\u002Fadaptive-screens.md) |\n| Android Vitals & Performance | [Performance & Stability](references\u002Fperformance-stability.md) |\n| Privacy & Security | [Privacy & Security](references\u002Fprivacy-security.md) |\n| Audio, Video, Notifications | [Functional Requirements](references\u002Ffunctional-requirements.md) |\n| App Style by Category | [Design Style Guide](references\u002Fdesign-style-guide.md) |\n\n---\n\n## 8. Testing\n\n> **Note**: Only add test dependencies when the user explicitly asks for testing.\n\nA well-tested Android app uses layered testing: fast local unit tests for logic, instrumentation tests for UI and integration, and Gradle Managed Devices to run emulators reproducibly on any machine — including CI.\n\n### 8.1 Test Dependencies\n\nBefore adding test dependencies, inspect the project's existing versions to avoid conflicts:\n\n1. Check `gradle\u002Flibs.versions.toml` — if present, add test deps using the project's version catalog style\n2. Check existing `build.gradle.kts` for already-pinned dependency versions\n3. Match version families using the table below\n\n**Version Alignment Rules**:\n\n| Test Dependency                              | Must Align With                                  | How to Check                                                          |\n|----------------------------------------------|--------------------------------------------------|-----------------------------------------------------------------------|\n| `kotlinx-coroutines-test`                    | Project's `kotlinx-coroutines-core` version      | Search for `kotlinx-coroutines` in build files or version catalog     |\n| `compose-ui-test-junit4`                     | Project's Compose BOM or `compose-compiler`      | Search for `compose-bom` or `compose.compiler` in build files         |\n| `espresso-*`                                 | All Espresso artifacts must use the same version  | Search for `espresso` in build files                                  |\n| `androidx.test:runner`, `rules`, `ext:junit` | Should use compatible AndroidX Test versions      | Search for `androidx.test` in build files                             |\n| `mockk`                                      | Must support the project's Kotlin version         | Check `kotlin` version in root `build.gradle.kts` or version catalog |\n\n**Dependencies Reference** — add only the groups you need:\n\n```kotlin\ndependencies {\n    \u002F\u002F --- Local unit tests (src\u002Ftest\u002F) ---\n    testImplementation(\"junit:junit:\u003Cversion>\")                          \u002F\u002F 4.13.2+\n    testImplementation(\"org.robolectric:robolectric:\u003Cversion>\")          \u002F\u002F 4.16.1+\n    testImplementation(\"io.mockk:mockk:\u003Cversion>\")                      \u002F\u002F match Kotlin version\n    testImplementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-test:\u003Cversion>\")  \u002F\u002F match coroutines-core\n    testImplementation(\"androidx.arch.core:core-testing:\u003Cversion>\")      \u002F\u002F InstantTaskExecutorRule for LiveData\n    testImplementation(\"app.cash.turbine:turbine:\u003Cversion>\")             \u002F\u002F Flow\u002FStateFlow testing\n\n    \u002F\u002F --- Instrumentation tests (src\u002FandroidTest\u002F) ---\n    androidTestImplementation(\"androidx.test.ext:junit:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:runner:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:rules:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-core:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-contrib:\u003Cversion>\")   \u002F\u002F RecyclerView, Drawer\n    androidTestImplementation(\"androidx.test.espresso:espresso-intents:\u003Cversion>\")   \u002F\u002F Intent verification\n    androidTestImplementation(\"androidx.test.espresso:espresso-idling-resource:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.uiautomator:uiautomator:\u003Cversion>\")\n\n    \u002F\u002F --- Compose UI tests (only if project uses Compose) ---\n    androidTestImplementation(\"androidx.compose.ui:ui-test-junit4\")      \u002F\u002F version from Compose BOM\n    debugImplementation(\"androidx.compose.ui:ui-test-manifest\")          \u002F\u002F required for createComposeRule\n}\n```\n\n> **Note**: If the project uses a Compose BOM, `ui-test-junit4` and `ui-test-manifest` don't need explicit versions — the BOM manages them.\n\nEnable Robolectric resource support in the `android` block:\n\n```kotlin\nandroid {\n    testOptions {\n        unitTests.isIncludeAndroidResources = true  \u002F\u002F required for Robolectric\n    }\n}\n```\n\n### 8.2 Testing by Layer\n\n| Layer              | Location           | Runs On                 | Speed                | Use For                                          |\n|--------------------|--------------------|-------------------------|----------------------|--------------------------------------------------|\n| Unit (JUnit)       | `src\u002Ftest\u002F`        | JVM                     | ~ms                  | ViewModels, repos, mappers, validators           |\n| Unit + Robolectric | `src\u002Ftest\u002F`        | JVM + simulated Android | ~100ms               | Code needing Context, resources, SharedPrefs     |\n| Compose UI (local) | `src\u002Ftest\u002F`        | JVM + Robolectric       | ~100ms               | Composable rendering & interaction               |\n| Espresso           | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | View-based UI flows, Intents, DB integration     |\n| Compose UI (device)| `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | Full Compose UI flows with real rendering        |\n| UI Automator       | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | System dialogs, notifications, multi-app         |\n| Managed Device     | `src\u002FandroidTest\u002F` | Gradle-managed AVD      | ~minutes (first run) | CI, matrix testing across API levels             |\n\nSee [Testing](references\u002Ftesting.md) for detailed examples, code patterns, and Gradle Managed Device configuration.\n\n### 8.3 Testing Commands\n\n```bash\n# Local unit tests (fast, no emulator)\n.\u002Fgradlew test                          # all modules\n.\u002Fgradlew :app:testDebugUnitTest        # app module, debug variant\n\n# Single test class\n.\u002Fgradlew :app:testDebugUnitTest --tests \"com.example.myapp.CounterViewModelTest\"\n\n# Instrumentation tests (requires device or managed device)\n.\u002Fgradlew connectedDebugAndroidTest     # on connected device\n.\u002Fgradlew pixel6Api34DebugAndroidTest   # on managed device\n\n# Both together\n.\u002Fgradlew test connectedDebugAndroidTest\n\n# Test with coverage report (JaCoCo)\n.\u002Fgradlew testDebugUnitTest jacocoTestReport\n```\n","## 1. Project Scenario Assessment\n\nBefore starting development, assess the current project state:\n\n| Scenario | Characteristics | Approach |\n|----------|-----------------|----------|\n| **Empty Directory** | No files present | Full initialization required, including Gradle Wrapper |\n| **Has Gradle Wrapper** | `gradlew` and `gradle\u002Fwrapper\u002F` exist | Use `.\u002Fgradlew` directly for builds |\n| **Android Studio Project** | Complete project structure, may lack wrapper | Check wrapper, run `gradle wrapper` if needed |\n| **Incomplete Project** | Partial files present | Check missing files, complete configuration |\n\n**Key Principles**:\n- Before writing business logic, ensure `.\u002Fgradlew assembleDebug` succeeds\n- If `gradle.properties` is missing, create it first and configure AndroidX\n\n### 1.1 Required Files Checklist\n\n```\nMyApp\u002F\n├── gradle.properties          # Configure AndroidX and other settings\n├── settings.gradle.kts\n├── build.gradle.kts           # Root level\n├── gradle\u002Fwrapper\u002F\n│   └── gradle-wrapper.properties\n├── app\u002F\n│   ├── build.gradle.kts       # Module level\n│   └── src\u002Fmain\u002F\n│       ├── AndroidManifest.xml\n│       ├── java\u002Fcom\u002Fexample\u002Fmyapp\u002F\n│       │   └── MainActivity.kt\n│       └── res\u002F\n│           ├── values\u002F\n│           │   ├── strings.xml\n│           │   ├── colors.xml\n│           │   └── themes.xml\n│           └── mipmap-*\u002F       # App icons\n```\n\n---\n\n## 2. Project Configuration\n\n### 2.1 gradle.properties\n\n```properties\n# Required configuration\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\n# Build optimization\norg.gradle.parallel=true\nkotlin.code.style=official\n\n# JVM memory settings (adjust based on project size)\n# Small projects: 2048m, Medium: 4096m, Large: 8192m+\n# org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n```\n\n> **Note**: If you encounter `OutOfMemoryError` during build, increase `-Xmx` value. Large projects with many dependencies may require 8GB or more.\n\n### 2.2 Dependency Declaration Standards\n\n```kotlin\ndependencies {\n    \u002F\u002F Use BOM to manage Compose versions\n    implementation(platform(\"androidx.compose:compose-bom:2024.02.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.material3:material3\")\n    \n    \u002F\u002F Activity & ViewModel\n    implementation(\"androidx.activity:activity-compose:1.8.2\")\n    implementation(\"androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0\")\n}\n```\n\n### 2.3 Build Variants & Product Flavors\n\nProduct Flavors allow you to create different versions of your app (e.g., free\u002Fpaid, dev\u002Fstaging\u002Fprod).\n\n**Configuration in app\u002Fbuild.gradle.kts**:\n\n```kotlin\nandroid {\n    \u002F\u002F Define flavor dimensions\n    flavorDimensions += \"environment\"\n    \n    productFlavors {\n        create(\"dev\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".dev\"\n            versionNameSuffix = \"-dev\"\n            \n            \u002F\u002F Different config values per flavor\n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fdev-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            \n            \u002F\u002F Different resources\n            resValue(\"string\", \"app_name\", \"MyApp Dev\")\n        }\n        \n        create(\"staging\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".staging\"\n            versionNameSuffix = \"-staging\"\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fstaging-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            resValue(\"string\", \"app_name\", \"MyApp Staging\")\n        }\n        \n        create(\"prod\") {\n            dimension = \"environment\"\n            \u002F\u002F No suffix for production\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fapi.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"false\")\n            resValue(\"string\", \"app_name\", \"MyApp\")\n        }\n    }\n    \n    buildTypes {\n        debug {\n            isDebuggable = true\n            isMinifyEnabled = false\n        }\n        release {\n            isDebuggable = false\n            isMinifyEnabled = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\")\n        }\n    }\n}\n```\n\n**Build Variant Naming**: `{flavor}{BuildType}` → e.g., `devDebug`, `prodRelease`\n\n**Gradle Build Commands**:\n\n```bash\n# List all available build variants\n.\u002Fgradlew tasks --group=\"build\"\n\n# Build specific variant (flavor + buildType)\n.\u002Fgradlew assembleDevDebug        # Dev flavor, Debug build\n.\u002Fgradlew assembleStagingDebug    # Staging flavor, Debug build\n.\u002Fgradlew assembleProdRelease     # Prod flavor, Release build\n\n# Build all variants of a specific flavor\n.\u002Fgradlew assembleDev             # All Dev variants (debug + release)\n.\u002Fgradlew assembleProd            # All Prod variants\n\n# Build all variants of a specific build type\n.\u002Fgradlew assembleDebug           # All flavors, Debug build\n.\u002Fgradlew assembleRelease         # All flavors, Release build\n\n# Install specific variant to device\n.\u002Fgradlew installDevDebug\n.\u002Fgradlew installProdRelease\n\n# Build and install in one command\n.\u002Fgradlew installDevDebug && adb shell am start -n com.example.myapp.dev\u002F.MainActivity\n```\n\n**Access BuildConfig in Code**:\n\n> **Note**: Starting from AGP 8.0, `BuildConfig` is no longer generated by default. You must explicitly enable it in your `build.gradle.kts`:\n> ```kotlin\n> android {\n>     buildFeatures {\n>         buildConfig = true\n>     }\n> }\n> ```\n\n```kotlin\n\u002F\u002F Use build config values in your code\nval apiUrl = BuildConfig.API_BASE_URL\nval isLoggingEnabled = BuildConfig.ENABLE_LOGGING\n\nif (BuildConfig.DEBUG) {\n    \u002F\u002F Debug-only code\n}\n```\n\n**Flavor-Specific Source Sets**:\n\n```\napp\u002Fsrc\u002F\n├── main\u002F           # Shared code for all flavors\n├── dev\u002F            # Dev-only code and resources\n│   ├── java\u002F\n│   └── res\u002F\n├── staging\u002F        # Staging-only code and resources\n├── prod\u002F           # Prod-only code and resources\n├── debug\u002F          # Debug build type code\n└── release\u002F        # Release build type code\n```\n\n**Multiple Flavor Dimensions** (e.g., environment + tier):\n\n```kotlin\nandroid {\n    flavorDimensions += listOf(\"environment\", \"tier\")\n    \n    productFlavors {\n        create(\"dev\") { dimension = \"environment\" }\n        create(\"prod\") { dimension = \"environment\" }\n        \n        create(\"free\") { dimension = \"tier\" }\n        create(\"paid\") { dimension = \"tier\" }\n    }\n}\n\u002F\u002F Results in: devFreeDebug, devPaidDebug, prodFreeRelease, etc.\n```\n\n---\n\n## 3. Kotlin Development Standards\n\n### 3.1 Naming Conventions\n\n| Type | Convention | Example |\n|------|------------|---------|\n| Class\u002FInterface | PascalCase | `UserRepository`, `MainActivity` |\n| Function\u002FVariable | camelCase | `getUserName()`, `isLoading` |\n| Constant | SCREAMING_SNAKE | `MAX_RETRY_COUNT` |\n| Package | lowercase | `com.example.myapp` |\n| Composable | PascalCase | `@Composable fun UserCard()` |\n\n### 3.2 Code Standards (Important)\n\n**Null Safety**:\n```kotlin\n\u002F\u002F ❌ Avoid: Non-null assertion !! (may crash)\nval name = user!!.name\n\n\u002F\u002F ✅ Recommended: Safe call + default value\nval name = user?.name ?: \"Unknown\"\n\n\u002F\u002F ✅ Recommended: let handling\nuser?.let { processUser(it) }\n```\n\n**Exception Handling**:\n```kotlin\n\u002F\u002F ❌ Avoid: Random try-catch in business layer swallowing exceptions\nfun loadData() {\n    try {\n        val data = api.fetch()\n    } catch (e: Exception) {\n        \u002F\u002F Swallowing exception, hard to debug\n    }\n}\n\n\u002F\u002F ✅ Recommended: Let exceptions propagate, handle at appropriate layer\nsuspend fun loadData(): Result\u003CData> {\n    return try {\n        Result.success(api.fetch())\n    } catch (e: Exception) {\n        Result.failure(e)  \u002F\u002F Wrap and return, let caller decide handling\n    }\n}\n\n\u002F\u002F ✅ Recommended: Unified handling in ViewModel\nviewModelScope.launch {\n    runCatching { repository.loadData() }\n        .onSuccess { _uiState.value = UiState.Success(it) }\n        .onFailure { _uiState.value = UiState.Error(it.message) }\n}\n```\n\n### 3.3 Threading & Coroutines (Critical)\n\n**Thread Selection Principles**:\n\n| Operation Type | Thread | Description |\n|----------------|--------|-------------|\n| UI Updates | `Dispatchers.Main` | Update View, State, LiveData |\n| Network Requests | `Dispatchers.IO` | HTTP calls, API requests |\n| File I\u002FO | `Dispatchers.IO` | Local storage, database operations |\n| Compute Intensive | `Dispatchers.Default` | JSON parsing, sorting, encryption |\n\n**Correct Usage**:\n```kotlin\n\u002F\u002F In ViewModel\nviewModelScope.launch {\n    \u002F\u002F Default Main thread, can update UI State\n    _uiState.value = UiState.Loading\n    \n    \u002F\u002F Switch to IO thread for network request\n    val result = withContext(Dispatchers.IO) {\n        repository.fetchData()\n    }\n    \n    \u002F\u002F Automatically returns to Main thread, update UI\n    _uiState.value = UiState.Success(result)\n}\n\n\u002F\u002F In Repository (suspend functions should be main-safe)\nsuspend fun fetchData(): Data = withContext(Dispatchers.IO) {\n    api.getData()\n}\n```\n\n**Common Mistakes**:\n```kotlin\n\u002F\u002F ❌ Wrong: Updating UI on IO thread\nviewModelScope.launch(Dispatchers.IO) {\n    val data = api.fetch()\n    _uiState.value = data  \u002F\u002F Crash or warning!\n}\n\n\u002F\u002F ❌ Wrong: Executing time-consuming operation on Main thread\nviewModelScope.launch {\n    val data = api.fetch()  \u002F\u002F Blocking main thread! ANR\n}\n\n\u002F\u002F ✅ Correct: Fetch on IO, update on Main\nviewModelScope.launch {\n    val data = withContext(Dispatchers.IO) { api.fetch() }\n    _uiState.value = data\n}\n```\n\n### 3.4 Visibility Rules\n\n```kotlin\n\u002F\u002F Default is public, declare explicitly when needed\nclass UserRepository {           \u002F\u002F public\n    private val cache = mutableMapOf\u003CString, User>()  \u002F\u002F Visible only within class\n    internal fun clearCache() {} \u002F\u002F Visible only within module\n}\n\n\u002F\u002F data class properties are public by default, be careful when used across modules\ndata class User(\n    val id: String,       \u002F\u002F public\n    val name: String\n)\n```\n\n### 3.5 Common Syntax Pitfalls\n\n```kotlin\n\u002F\u002F ❌ Wrong: Accessing uninitialized lateinit\nclass MyViewModel : ViewModel() {\n    lateinit var data: String\n    fun process() = data.length  \u002F\u002F May crash\n}\n\n\u002F\u002F ✅ Correct: Use nullable or default value\nclass MyViewModel : ViewModel() {\n    var data: String? = null\n    fun process() = data?.length ?: 0\n}\n\n\u002F\u002F ❌ Wrong: Using return in lambda\nlist.forEach { item ->\n    if (item.isEmpty()) return  \u002F\u002F Returns from outer function!\n}\n\n\u002F\u002F ✅ Correct: Use return@forEach\nlist.forEach { item ->\n    if (item.isEmpty()) return@forEach\n}\n```\n\n### 3.6 Server Response Data Class Fields Must Be Nullable\n\n```kotlin\n\u002F\u002F ❌ Wrong: Fields declared as non-null (server may not return them)\ndata class UserResponse(\n    val id: String = \"\",\n    val name: String = \"\",\n    val avatar: String = \"\"\n)\n\n\u002F\u002F ✅ Correct: All fields declared as nullable\ndata class UserResponse(\n    @SerializedName(\"id\")\n    val id: String? = null,\n    @SerializedName(\"name\")\n    val name: String? = null,\n    @SerializedName(\"avatar\")\n    val avatar: String? = null\n)\n```\n\n### 3.7 Lifecycle Resource Management\n\n```kotlin\n\u002F\u002F ❌ Wrong: Only adding Observer, not removing\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n    \u002F\u002F Memory leak!\n}\n\n\u002F\u002F ✅ Correct: Paired add and remove\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n\n    override fun onDetachedFromWindow() {\n        activity?.lifecycle?.removeObserver(this)\n        super.onDetachedFromWindow()\n    }\n}\n```\n\n### 3.8 Logging Level Usage\n\n```kotlin\nimport android.util.Log\n\n\u002F\u002F Info: Key checkpoints in normal flow\nLog.i(TAG, \"loadData: started, userId = $userId\")\n\n\u002F\u002F Warning: Abnormal but recoverable situations\nLog.w(TAG, \"loadData: cache miss, fallback to network\")\n\n\u002F\u002F Error: Failure\u002Ferror situations\nLog.e(TAG, \"loadData failed: ${error.message}\")\n```\n\n| Level | Use Case |\n|-------|----------|\n| `i` (Info) | Normal flow, method entry, key parameters |\n| `w` (Warning) | Recoverable exceptions, fallback handling, null returns |\n| `e` (Error) | Request failures, caught exceptions, unrecoverable errors |\n\n---\n\n## 4. Jetpack Compose Standards\n\n### 4.1 @Composable Context Rules\n\n```kotlin\n\u002F\u002F ❌ Wrong: Calling Composable from non-Composable function\nfun showError(message: String) {\n    Text(message)  \u002F\u002F Compile error!\n}\n\n\u002F\u002F ✅ Correct: Mark as @Composable\n@Composable\nfun ErrorMessage(message: String) {\n    Text(message)\n}\n\n\u002F\u002F ❌ Wrong: Using suspend outside LaunchedEffect\n@Composable\nfun MyScreen() {\n    val data = fetchData()  \u002F\u002F Error!\n}\n\n\u002F\u002F ✅ Correct: Use LaunchedEffect\n@Composable\nfun MyScreen() {\n    var data by remember { mutableStateOf\u003CData?>(null) }\n    LaunchedEffect(Unit) {\n        data = fetchData()\n    }\n}\n```\n\n### 4.2 State Management\n\n```kotlin\n\u002F\u002F Basic State\nvar count by remember { mutableStateOf(0) }\n\n\u002F\u002F Derived State (avoid redundant computation)\nval isEven by remember { derivedStateOf { count % 2 == 0 } }\n\n\u002F\u002F Persist across recomposition (e.g., scroll position)\nval scrollState = rememberScrollState()\n\n\u002F\u002F State in ViewModel\nclass MyViewModel : ViewModel() {\n    private val _uiState = MutableStateFlow(UiState())\n    val uiState: StateFlow\u003CUiState> = _uiState.asStateFlow()\n}\n```\n\n### 4.3 Common Compose Mistakes\n\n```kotlin\n\u002F\u002F ❌ Wrong: Creating objects in Composable (created on every recomposition)\n@Composable\nfun MyScreen() {\n    val viewModel = MyViewModel()  \u002F\u002F Wrong!\n}\n\n\u002F\u002F ✅ Correct: Use viewModel() or remember\n@Composable\nfun MyScreen(viewModel: MyViewModel = viewModel()) {\n    \u002F\u002F ...\n}\n```\n\n---\n\n## 5. Resources & Icons\n\n### 5.1 App Icon Requirements\n\nMust provide multi-resolution icons:\n\n| Directory | Size | Purpose |\n|-----------|------|---------|\n| mipmap-mdpi | 48x48 | Baseline |\n| mipmap-hdpi | 72x72 | 1.5x |\n| mipmap-xhdpi | 96x96 | 2x |\n| mipmap-xxhdpi | 144x144 | 3x |\n| mipmap-xxxhdpi | 192x192 | 4x |\n\nRecommended: Use Adaptive Icon (Android 8+):\n\n```xml\n\u003C!-- res\u002Fmipmap-anydpi-v26\u002Fic_launcher.xml -->\n\u003Cadaptive-icon>\n    \u003Cbackground android:drawable=\"@color\u002Fic_launcher_background\"\u002F>\n    \u003Cforeground android:drawable=\"@mipmap\u002Fic_launcher_foreground\"\u002F>\n\u003C\u002Fadaptive-icon>\n```\n\n### 5.2 Resource Naming Conventions\n\n| Type | Prefix | Example |\n|------|--------|---------|\n| Layout | layout_ | `layout_main.xml` |\n| Image | ic_, img_, bg_ | `ic_user.png` |\n| Color | color_ | `color_primary` |\n| String | - | `app_name`, `btn_submit` |\n\n### 5.3 Avoid Android Reserved Names (Important)\n\nVariable names, resource IDs, colors, icons, and XML elements **must not** use Android reserved words or system resource names. Using reserved names causes build errors or resource conflicts.\n\n**Common Reserved Names to Avoid**:\n\n| Category | Reserved Names (Do NOT Use) |\n|----------|----------------------------|\n| Colors | `background`, `foreground`, `transparent`, `white`, `black` |\n| Icons\u002FDrawables | `icon`, `logo`, `image`, `drawable` |\n| Views | `view`, `text`, `button`, `layout`, `container` |\n| Attributes | `id`, `name`, `type`, `style`, `theme`, `color` |\n| System | `app`, `android`, `content`, `data`, `action` |\n\n**Examples**:\n\n```xml\n\u003C!-- ❌ Wrong: Using reserved names -->\n\u003Ccolor name=\"background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon\">#000000\u003C\u002Fcolor>\n\n\u003C!-- ✅ Correct: Add prefix or specific naming -->\n\u003Ccolor name=\"app_background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon_primary\">#000000\u003C\u002Fcolor>\n```\n\n```kotlin\n\u002F\u002F ❌ Wrong: Variable names conflict with system\nval icon = R.drawable.my_icon\nval background = Color.White\n\n\u002F\u002F ✅ Correct: Use descriptive names\nval appIcon = R.drawable.my_icon\nval screenBackground = Color.White\n```\n\n```xml\n\u003C!-- ❌ Wrong: Drawable name conflicts -->\n\u003CImageView android:src=\"@drawable\u002Ficon\" \u002F>\n\n\u003C!-- ✅ Correct: Add prefix -->\n\u003CImageView android:src=\"@drawable\u002Fic_home\" \u002F>\n```\n\n---\n\n## 6. Build Error Diagnosis & Fixes\n\n### 6.1 Common Error Quick Reference\n\n| Error Keyword | Cause | Fix |\n|---------------|-------|-----|\n| `Unresolved reference` | Missing import or undefined | Check imports, verify dependencies |\n| `Type mismatch` | Type incompatibility | Check parameter types, add conversion |\n| `Cannot access` | Visibility issue | Check public\u002Fprivate\u002Finternal |\n| `@Composable invocations` | Composable context error | Ensure caller is also @Composable |\n| `Duplicate class` | Dependency conflict | Use `.\u002Fgradlew dependencies` to investigate |\n| `AAPT: error` | Resource file error | Check XML syntax and resource references |\n\n### 6.2 Fix Best Practices\n\n1. **Read the complete error message first**: Locate file and line number\n2. **Check recent changes**: Problems usually in latest modifications\n3. **Clean Build**: `.\u002Fgradlew clean assembleDebug`\n4. **Check dependency versions**: Version conflicts are common causes\n5. **Refresh dependencies if needed**: Clear cache and rebuild\n\n### 6.3 Debugging Commands\n\n```bash\n# Clean and build\n.\u002Fgradlew clean assembleDebug\n\n# View dependency tree (investigate conflicts)\n.\u002Fgradlew :app:dependencies\n\n# View detailed errors\n.\u002Fgradlew assembleDebug --stacktrace\n\n# Refresh dependencies\n.\u002Fgradlew --refresh-dependencies\n```\n\n---\n\n## 7. Material Design 3 Guidelines\n\nReview Android UI files for compliance with Material Design 3 Guidelines and Android best practices.\n\n### Design Philosophy\n\n#### M3 Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Personal** | Dynamic color based on user preferences and wallpaper |\n| **Adaptive** | Responsive across all screen sizes and form factors |\n| **Expressive** | Bold colors and typography with personality |\n| **Accessible** | Inclusive design for all users |\n\n#### M3 Expressive (Latest)\n\nThe latest evolution adds emotion-driven UX through:\n- Vibrant, dynamic colors\n- Intuitive motion physics\n- Adaptive components\n- Flexible typography\n- Contrasting shapes (35 new shape options)\n\n### App Style Selection\n\n**Critical Decision**: Match visual style to app category and target audience.\n\n| App Category | Visual Style | Key Characteristics |\n|--------------|--------------|---------------------|\n| Utility\u002FTool | Minimalist | Clean, efficient, neutral colors |\n| Finance\u002FBanking | Professional Trust | Conservative colors, security-focused |\n| Health\u002FWellness | Calm & Natural | Soft colors, organic shapes |\n| Kids (3-5) | Playful Simple | Bright colors, large targets (56dp+) |\n| Kids (6-12) | Fun & Engaging | Vibrant, gamified feedback |\n| Social\u002FEntertainment | Expressive | Brand-driven, gesture-rich |\n| Productivity | Clean & Focused | Minimal, high contrast |\n| E-commerce | Conversion-focused | Clear CTAs, scannable |\n\nSee [Design Style Guide](references\u002Fdesign-style-guide.md) for detailed style profiles.\n\n### Quick Reference: Key Specifications\n\n#### Color Contrast Requirements\n\n| Element | Minimum Ratio |\n|---------|---------------|\n| Body text | **4.5:1** |\n| Large text (18sp+) | **3:1** |\n| UI components | **3:1** |\n\n#### Touch Targets\n\n| Type | Size |\n|------|------|\n| Minimum | 48 × 48dp |\n| Recommended (primary actions) | 56 × 56dp |\n| Kids apps | 56dp+ |\n| Spacing between targets | 8dp minimum |\n\n#### 8dp Grid System\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| xs | 4dp | Icon padding |\n| sm | 8dp | Tight spacing |\n| md | 16dp | Default padding |\n| lg | 24dp | Section spacing |\n| xl | 32dp | Large gaps |\n| xxl | 48dp | Screen margins |\n\n#### Typography Scale (Summary)\n\n| Category | Sizes |\n|----------|-------|\n| Display | 57sp, 45sp, 36sp |\n| Headline | 32sp, 28sp, 24sp |\n| Title | 22sp, 16sp, 14sp |\n| Body | 16sp, 14sp, 12sp |\n| Label | 14sp, 12sp, 11sp |\n\n#### Animation Duration\n\n| Type | Duration |\n|------|----------|\n| Micro (ripples) | 50-100ms |\n| Short (simple) | 100-200ms |\n| Medium (expand\u002Fcollapse) | 200-300ms |\n| Long (complex) | 300-500ms |\n\n#### Component Dimensions\n\n| Component | Height | Min Width |\n|-----------|--------|-----------|\n| Button | 40dp | 64dp |\n| FAB | 56dp | 56dp |\n| Text Field | 56dp | 280dp |\n| App Bar | 64dp | - |\n| Bottom Nav | 80dp | - |\n\n### Anti-Patterns (Must Avoid)\n\n#### UI Anti-Patterns\n- More than 5 bottom navigation items\n- Multiple FABs on same screen\n- Touch targets smaller than 48dp\n- Inconsistent spacing (non-8dp multiples)\n- Missing dark theme support\n- Text on colored backgrounds without contrast check\n\n#### Performance Anti-Patterns\n- Startup time > 2 seconds without progress indicator\n- Frame rate \u003C 60 FPS (> 16ms per frame)\n- Crash rate > 1.09% (Google Play threshold)\n- ANR rate > 0.47% (Google Play threshold)\n\n#### Accessibility Anti-Patterns\n- Missing contentDescription on interactive elements\n- Element type in labels (e.g., \"Save button\" instead of \"Save\")\n- Complex gestures in kids apps\n- Text-only buttons for non-readers\n\n### Review Checklist\n\n- [ ] 8dp spacing grid compliance\n- [ ] 48dp minimum touch targets\n- [ ] Proper typography scale usage\n- [ ] Color contrast compliance (4.5:1+ for text)\n- [ ] Dark theme support\n- [ ] contentDescription on all interactive elements\n- [ ] Startup \u003C 2 seconds or shows progress\n- [ ] Visual style matches app category\n\n### Design References\n\n| Topic | Reference |\n|-------|-----------|\n| Colors, Typography, Spacing, Shapes | [Visual Design](references\u002Fvisual-design.md) |\n| Animation & Transitions | [Motion System](references\u002Fmotion-system.md) |\n| Accessibility Guidelines | [Accessibility](references\u002Faccessibility.md) |\n| Large Screens & Foldables | [Adaptive Screens](references\u002Fadaptive-screens.md) |\n| Android Vitals & Performance | [Performance & Stability](references\u002Fperformance-stability.md) |\n| Privacy & Security | [Privacy & Security](references\u002Fprivacy-security.md) |\n| Audio, Video, Notifications | [Functional Requirements](references\u002Ffunctional-requirements.md) |\n| App Style by Category | [Design Style Guide](references\u002Fdesign-style-guide.md) |\n\n---\n\n## 8. Testing\n\n> **Note**: Only add test dependencies when the user explicitly asks for testing.\n\nA well-tested Android app uses layered testing: fast local unit tests for logic, instrumentation tests for UI and integration, and Gradle Managed Devices to run emulators reproducibly on any machine — including CI.\n\n### 8.1 Test Dependencies\n\nBefore adding test dependencies, inspect the project's existing versions to avoid conflicts:\n\n1. Check `gradle\u002Flibs.versions.toml` — if present, add test deps using the project's version catalog style\n2. Check existing `build.gradle.kts` for already-pinned dependency versions\n3. Match version families using the table below\n\n**Version Alignment Rules**:\n\n| Test Dependency                              | Must Align With                                  | How to Check                                                          |\n|----------------------------------------------|--------------------------------------------------|-----------------------------------------------------------------------|\n| `kotlinx-coroutines-test`                    | Project's `kotlinx-coroutines-core` version      | Search for `kotlinx-coroutines` in build files or version catalog     |\n| `compose-ui-test-junit4`                     | Project's Compose BOM or `compose-compiler`      | Search for `compose-bom` or `compose.compiler` in build files         |\n| `espresso-*`                                 | All Espresso artifacts must use the same version  | Search for `espresso` in build files                                  |\n| `androidx.test:runner`, `rules`, `ext:junit` | Should use compatible AndroidX Test versions      | Search for `androidx.test` in build files                             |\n| `mockk`                                      | Must support the project's Kotlin version         | Check `kotlin` version in root `build.gradle.kts` or version catalog |\n\n**Dependencies Reference** — add only the groups you need:\n\n```kotlin\ndependencies {\n    \u002F\u002F --- Local unit tests (src\u002Ftest\u002F) ---\n    testImplementation(\"junit:junit:\u003Cversion>\")                          \u002F\u002F 4.13.2+\n    testImplementation(\"org.robolectric:robolectric:\u003Cversion>\")          \u002F\u002F 4.16.1+\n    testImplementation(\"io.mockk:mockk:\u003Cversion>\")                      \u002F\u002F match Kotlin version\n    testImplementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-test:\u003Cversion>\")  \u002F\u002F match coroutines-core\n    testImplementation(\"androidx.arch.core:core-testing:\u003Cversion>\")      \u002F\u002F InstantTaskExecutorRule for LiveData\n    testImplementation(\"app.cash.turbine:turbine:\u003Cversion>\")             \u002F\u002F Flow\u002FStateFlow testing\n\n    \u002F\u002F --- Instrumentation tests (src\u002FandroidTest\u002F) ---\n    androidTestImplementation(\"androidx.test.ext:junit:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:runner:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:rules:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-core:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-contrib:\u003Cversion>\")   \u002F\u002F RecyclerView, Drawer\n    androidTestImplementation(\"androidx.test.espresso:espresso-intents:\u003Cversion>\")   \u002F\u002F Intent verification\n    androidTestImplementation(\"androidx.test.espresso:espresso-idling-resource:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.uiautomator:uiautomator:\u003Cversion>\")\n\n    \u002F\u002F --- Compose UI tests (only if project uses Compose) ---\n    androidTestImplementation(\"androidx.compose.ui:ui-test-junit4\")      \u002F\u002F version from Compose BOM\n    debugImplementation(\"androidx.compose.ui:ui-test-manifest\")          \u002F\u002F required for createComposeRule\n}\n```\n\n> **Note**: If the project uses a Compose BOM, `ui-test-junit4` and `ui-test-manifest` don't need explicit versions — the BOM manages them.\n\nEnable Robolectric resource support in the `android` block:\n\n```kotlin\nandroid {\n    testOptions {\n        unitTests.isIncludeAndroidResources = true  \u002F\u002F required for Robolectric\n    }\n}\n```\n\n### 8.2 Testing by Layer\n\n| Layer              | Location           | Runs On                 | Speed                | Use For                                          |\n|--------------------|--------------------|-------------------------|----------------------|--------------------------------------------------|\n| Unit (JUnit)       | `src\u002Ftest\u002F`        | JVM                     | ~ms                  | ViewModels, repos, mappers, validators           |\n| Unit + Robolectric | `src\u002Ftest\u002F`        | JVM + simulated Android | ~100ms               | Code needing Context, resources, SharedPrefs     |\n| Compose UI (local) | `src\u002Ftest\u002F`        | JVM + Robolectric       | ~100ms               | Composable rendering & interaction               |\n| Espresso           | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | View-based UI flows, Intents, DB integration     |\n| Compose UI (device)| `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | Full Compose UI flows with real rendering        |\n| UI Automator       | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | System dialogs, notifications, multi-app         |\n| Managed Device     | `src\u002FandroidTest\u002F` | Gradle-managed AVD      | ~minutes (first run) | CI, matrix testing across API levels             |\n\nSee [Testing](references\u002Ftesting.md) for detailed examples, code patterns, and Gradle Managed Device configuration.\n\n### 8.3 Testing Commands\n\n```bash\n# Local unit tests (fast, no emulator)\n.\u002Fgradlew test                          # all modules\n.\u002Fgradlew :app:testDebugUnitTest        # app module, debug variant\n\n# Single test class\n.\u002Fgradlew :app:testDebugUnitTest --tests \"com.example.myapp.CounterViewModelTest\"\n\n# Instrumentation tests (requires device or managed device)\n.\u002Fgradlew connectedDebugAndroidTest     # on connected device\n.\u002Fgradlew pixel6Api34DebugAndroidTest   # on managed device\n\n# Both together\n.\u002Fgradlew test connectedDebugAndroidTest\n\n# Test with coverage report (JaCoCo)\n.\u002Fgradlew testDebugUnitTest jacocoTestReport\n```\n",{"name":5,"license":15,"metadata":60,"description":7},{"sources":61,"version":66,"category":43},[62,63,64,65],"Material Design 3 Guidelines (material.io)","Android Developer Documentation (developer.android.com)","Google Play Quality Guidelines","WCAG Accessibility Guidelines","1.0.0","main","4d2fb89cdfb75f3f6fd3c6c5ec9ad90ea129eb3c","ai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak",1,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai","https:\u002F\u002Fgithub.com\u002Fluokai0","a solo builder.","2026-05-06 04:29:04",{"source":8,"skillName":5,"commands":76,"prompt":86,"zipAvailable":87},[77,80,83],{"tool":78,"command":79},"npx","npx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill android-native-dev",{"tool":81,"command":82},"bunx","bunx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill android-native-dev",{"tool":84,"command":85},"pnpm","pnpm dlx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill android-native-dev","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002FSKILL.md",true,[89,95,99,103,107,111,115,119,123,127,131],{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"_meta.json","REFERENCE","参考文档",141,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002F_meta.json",{"path":96,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":97,"sourceHtmlUrl":98},".clawhub\u002Forigin.json",154,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002F.clawhub\u002Forigin.json",{"path":100,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Faccessibility.md",5732,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Faccessibility.md",{"path":104,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fadaptive-screens.md",6098,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fadaptive-screens.md",{"path":108,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fdesign-style-guide.md",10126,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fdesign-style-guide.md",{"path":112,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Ffunctional-requirements.md",6175,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Ffunctional-requirements.md",{"path":116,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Fmotion-system.md",5443,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fmotion-system.md",{"path":120,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Fperformance-stability.md",6334,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fperformance-stability.md",{"path":124,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fprivacy-security.md",6667,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fprivacy-security.md",{"path":128,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":129,"sourceHtmlUrl":130},"references\u002Ftesting.md",17568,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Ftesting.md",{"path":132,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":133,"sourceHtmlUrl":134},"references\u002Fvisual-design.md",7523,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fandroid-native-dev-bak\u002Freferences\u002Fvisual-design.md",[136,163,180,205,238,269],{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":55},"01M6F2SKTE208174C7S7JJCZC7","write-contracts","Generates secure Aptos Move V2 smart contracts with Object model, Digital Asset integration, security patterns, and storage type guidance. Includes comprehensive storage decision framework for optimal data structure selection. Triggers on: 'write contract', 'create NFT collection', 'build marketplace', 'implement minting', 'generate Move module', 'create token contract', 'build DAO', 'implement staking'. Ask storage questions when: 'store', 'track', 'registry', 'mapping', 'list', 'collection'.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fwrite-contracts\u002FSKILL.md",[],[143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],"write","contracts","write contracts","storage","secure","create","generate","collection","model","decision","ask","smart-contracts","selection","objects","structure","nft","token","aptos","critical","move",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":55},"01M6F2RFXJ6T9MKW0A7N7GM45B","web-search","通用网络搜索技能，支持多引擎搜索（百度、必应、DuckDuckGo），无需API密钥即可获取实时信息","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fweb-search-ex-skill\u002FSKILL.md",[],[170,171,172,173,174,175,176,177,178,179],"web","search","web search","搜索","baidu","bing","duckduckgo","百度","多引擎","internet",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":189,"publishedAt":55},"01M6F2K968G1FZEZFPW2E6B222","solo-build","Execute implementation plan tasks with TDD workflow, auto-commit, and phase gates. Use when user says \"build it\", \"start building\", \"execute plan\", \"implement tasks\", \"ship it\", or references a track ID. Do NOT use for planning (use \u002Fplan) or scaffolding (use \u002Fscaffold).","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fsolo-build\u002FSKILL.md",[186],{"categoryNo":187,"categoryName":188,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[42,190,191,192,193,194,195,196,171,197,198,39,143,199,200,201,202,203,204,41],"solo","solo build","MCP","workflow","commit","tasks","code","Bash","plan","auto","references","context7","query","scaffolding","ship it",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":217,"publishedAt":55},"01M6F2GKN39SGHSPWYB3662YC8","react-email","Use when building HTML email templates with React components, adding a visual email editor to an application using the React Email visual editor, rendering emails to HTML, or sending emails with Resend. Covers welcome emails, password resets, notifications, order confirmations, newsletters, transactional emails, and the embeddable email editor component.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Freact-email-skills\u002FSKILL.md",[211,214],{"categoryNo":212,"categoryName":213,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":215,"categoryName":216,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237],"react","email","react email","github","editor","components","react components","component","welcome","https","notifications","password","node","use","html","resend","visual","emails","rendering","with",{"skillNo":239,"name":240,"nameZh":6,"description":241,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":242,"categories":243,"keywords":250,"publishedAt":55},"01M6F2FBVGVDFSG8SSFJGXA40C","APITester Agent-Driven API Testing","Test API endpoints and document responses. Define tests in plain English, run them, get formatted results. Agent-driven Postman alternative.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fopenclaw-api-tester\u002FSKILL.md",[244,245,248,249],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":246,"categoryName":247,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":187,"categoryName":188,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268],"testing","api","api testing","driven","APITester Agent Driven API Testing","test","run","postman","results","plain english","tester","endpoints","document","get","define","tests","english","api-tester",{"skillNo":270,"name":271,"nameZh":6,"description":272,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":273,"categories":274,"keywords":275,"publishedAt":55},"01M6F273Y3NGAPVJZ608BC0G9G","hubspot-implementation-plan","Generate a phased implementation plan from a HubSpot audit report. Creates prioritized, sequenced cleanup processes with effort estimates, dependencies, and automation feasibility. Use after running \u002Fhubspot-audit.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fhubspot-implementation-plan\u002FSKILL.md",[],[198,276,277,278,279,280,281,149,282,283,284,285,286,231,287,288,237,289],"implementation","hubspot","hubspot implementation plan","automation","feasibility","cleanup","planning","report","audit","audit report","phased implementation","dependencies","processes","hubspot audit"]