بنقرة واحدة
android
Architecture, Jetpack Compose, Navigation3 KMP, and Koin DI rules for Android apps.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Architecture, Jetpack Compose, Navigation3 KMP, and Koin DI rules for Android apps.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Git Worktree: parallel working trees for isolated branch-level execution, debugging, and safe experimentation.
Durable project-memory rules for `.agent-memory/` plus session-memory boundaries.
Review routing, independent post-implementation review gates, multi-model escalation, and targeted optimization follow-up.
Planning-track selection, epic/feature decomposition, readiness gates, and plan-delta rules.
Practical rules for designing, evolving, and integrating APIs safely.
Concise code-quality rules for implementation and review across the stack.
| name | android |
| description | Architecture, Jetpack Compose, Navigation3 KMP, and Koin DI rules for Android apps. |
| user-invocable | false |
Use this skill for Android work built with Kotlin, Compose, and related modern app architecture patterns.
ViewState (Data Class) from the ViewModel. Do not expose multiple independent state flows unless strictly isolated.<Name>Screen: Handles DI, Navigation3 KMP routing, and connects the ViewModel to the UI.<Name>View(state, onEvent): A completely pure, stateless Composable.remember for business logic. Business logic belongs in the ViewModel.remember.modifier: Modifier = Modifier.@Preview Composables MUST be private or restricted visibility.public unless intended as an external design system component.If using Navigation3 KMP for architecture:
Unit.private.StateFlow.<Name>Screen wrapper, NOT inside the pure <Name>View.@Serializable annotations to your destination keys so they serialize correctly across non-JVM platforms (iOS/Web).If using Koin:
single and factory instead of bind with generic provider/singleton blocks for clearer syntax and safety.Prefer a clear 3-layer layout and keep boundaries strict:
data/: implementations (local DB, remote APIs, repository impls)domain/: pure business logic (models, repository interfaces, use cases)ui/: Compose screens, reusable components, themedi/: DI wiring only (no business logic)Rule: UI depends on domain, domain depends on nothing, data depends on domain (interfaces).
MutableStateFlow internally and expose StateFlow via asStateFlow().update { it.copy(...) } to keep changes atomic.Example (micro):
private val _state = MutableStateFlow(ViewState())
val state: StateFlow<ViewState> = _state.asStateFlow()
_state.update { it.copy(isLoading = true) }
flowOn(Dispatchers.IO) for data layer work.CoroutineDispatcher for testability.For operations that can be loading/success/error, prefer a sealed result type over nullable juggling.
Rule: keep it small (Loading, Success(data), Error(exception)), and map/transform explicitly.
Recommended stack (when it fits the repo):
kotlinx-coroutines-test for deterministic coroutine testsMockK for mockingTurbine for testing Flow/StateFlow emissionsRules:
Example (micro):
@Test fun emitsLoadingThenData() = runTest {
// collect state/flow and assert emissions (use Turbine if available)
}