Install
$ agentstack add skill-maroffo-claude-forge-android-kotlin ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
ABOUTME: Android/Kotlin, Compose, Clean Architecture, testing, performance
ABOUTME: MVVM + DI conventions, state/side-effect patterns, review checklists
Android/Kotlin
Commands
./gradlew assembleDebug|assembleRelease|test|connectedAndroidTest|lint|ktlintFormat
./gradlew :feature:home:build # Module-specific
See: _AST_GREP.md (sg patterns) | _PATTERNS.md | source-control
Version (determine, don't assume)
Never assume Kotlin / AGP / Gradle versions from prior knowledge: they rot fast and you miss CVE fixes. Fetch the truth:
./gradlew --version # Gradle + JVM
grep -E 'kotlin|agp|compose' gradle/libs.versions.toml # version catalog (preferred)
grep -E 'kotlin|android' build.gradle.kts # fallback
cat gradle.properties # AGP / Kotlin flags
curl -s https://api.github.com/repos/JetBrains/kotlin/releases/latest | jq -r .tag_name # latest Kotlin
curl -s https://api.github.com/repos/gradle/gradle/releases/latest | jq -r .tag_name # latest Gradle
For a new project, pin to the latest stable. For an existing one, read gradle/libs.versions.toml / build.gradle.kts / gradle.properties and prefer idioms gated to that version or lower.
Pre-Commit Verification (MANDATORY)
Before every commit, both of these MUST pass:
make check # project-wide gate (lint, detekt, ktlint, unit tests)
make test-e2e # end-to-end tests (connectedAndroidTest or the project's e2e target)
If make check is missing, scaffold it with the project-checks skill. If there is no e2e target, do NOT silently skip: flag it to the user and ask whether to proceed or add one.
Full raw toolchain (what make check should expand to):
./gradlew ktlintCheck # formatting
./gradlew detekt # static analysis
./gradlew lint # Android lint
./gradlew test # unit tests (all variants)
./gradlew connectedAndroidTest # instrumented / e2e (device/emulator)
Architecture
Clean Architecture Structure
feature/
├── data/repository/, datasource/local/, datasource/remote/
├── domain/model/, repository/ (interface), usecase/
└── presentation/screen/, viewmodel/
Use Cases
Single responsibility, orchestration here (NOT in ViewModel).
class SignInUseCase(private val auth: AuthRepository, private val user: UserRepository) {
suspend operator fun invoke(email: String, password: String): Result {
val result = auth.signIn(email, password).getOrElse { return Result.failure(it) }
user.saveUserLocally(result)
return Result.success(result)
}
}
ViewModel Pattern
class FeedViewModel(private val getFeed: GetFeedUseCase) : ViewModel() {
private val _uiState = MutableStateFlow(FeedUiState.Loading)
val uiState = _uiState.asStateFlow()
private val _sideEffects = Channel(Channel.BUFFERED)
val sideEffects = _sideEffects.receiveAsFlow()
fun loadFeed() = viewModelScope.launch {
_uiState.value = FeedUiState.Loading
getFeed().onSuccess { _uiState.value = FeedUiState.Success(it) }
.onFailure { _uiState.value = FeedUiState.Error(it.message) }
}
}
sealed interface FeedUiState { /* Loading, Success, Error */ }
sealed interface FeedSideEffect { /* NavigateToDetail, ShowSnackbar */ }
Dependency Injection
| Aspect | Hilt | Koin | |--------|------|------| | Type | Compile-time | Runtime | | Build time | Slower | Faster | | Error detection | Compile | Runtime | | KMP support | No | Yes | | Best for | Large/enterprise | Small-medium/KMP |
Hilt: @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Inject constructor Koin: module { }, single, factory, viewModelOf, koinViewModel()
See references/compose-patterns.md for setup examples.
Compose Essentials
State hoisting: lift state to the caller, pass callbacks down.
State APIs:
remember { mutableStateOf() }, lost on config changerememberSaveable { mutableStateOf() }, survives config changederivedStateOf, computed state
Side effects: LaunchedEffect(key), DisposableEffect. Collect flows with collectAsStateWithLifecycle() (not collectAsState).
Type-safe navigation: @Serializable routes.
See references/compose-patterns.md for detailed examples.
Code Review Checklists
Architecture
- [ ] VMs don't chain use cases (orchestration in domain)
- [ ] VMs don't call repositories directly
- [ ] Use cases have single responsibility
- [ ] State immutable (use
copy()) - [ ] Side effects use Channel/SharedFlow (not StateFlow)
Compose
- [ ] State hoisted appropriately
- [ ]
remembervsrememberSaveablecorrect - [ ] Side effects use correct APIs
- [ ] Stable types for parameters
- [ ]
keyused in LazyColumn/LazyRow
Red Flags
| Critical | High | |----------|------| | Network/DB on main thread | Use case chaining in VM | | StateFlow for one-time events | Mutable state exposed from VM | | Hardcoded strings in UI | Missing key in LazyColumn | | Missing error handling | collectAsState vs collectAsStateWithLifecycle | | R8 disabled in release | |
Detailed References
references/kotlin-features.md- Kotlin language features and idiomsreferences/compose-patterns.md- State, side effects, navigation, image loadingreferences/data-layer.md- Retrofit, Ktor, Room, DataStorereferences/testing-patterns.md- Compose UI tests, ViewModel tests, snapshot tests (Paparazzi), Turbinereferences/performance.md- R8, Baseline Profiles, Compose optimization
Resources
Official: android.com/kotlin | compose | architecture | type-safe nav | baseline profiles
Libraries: Coil | Koin | Hilt | Retrofit | Ktor | Room
Testing: Compose testing | Paparazzi | Turbine
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: maroffo
- Source: maroffo/claude-forge
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.