From android
Scaffolds an opinionated single-module Android Compose app with Metro DI, Circuit architecture, Material You theming, Coil images, Ktor networking, kermit logging, and Firebase Crashlytics. Verifies build/test/lint, adds git/CI, and ergonomic Gradle tasks.
npx claudepluginhub himattm/skills --plugin androidThis skill uses the workspace's default tool permissions.
Scaffolds a single-module Android app with a locked-in stack, then verifies it builds, tests, and lints cleanly. The end state is an empty scaffold (no demo screens) ready for the user to write their first Circuit feature.
references/AGENTS.md.tmplreferences/AndroidManifest.xml.tmplreferences/App.kt.tmplreferences/AppGraph.kt.tmplreferences/CircuitConfig.kt.tmplreferences/Color.kt.tmplreferences/ExampleTest.kt.tmplreferences/MainActivity.kt.tmplreferences/RootPresenterTest.kt.tmplreferences/RootScreen.kt.tmplreferences/Theme.kt.tmplreferences/ThemeScreenshotTest.kt.tmplreferences/Type.kt.tmplreferences/app.build.gradle.kts.tmplreferences/build-logic/convention/build.gradle.ktsreferences/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.ktreferences/build-logic/convention/src/main/kotlin/CircuitConventionPlugin.ktreferences/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.ktreferences/build-logic/convention/src/main/kotlin/MetroConventionPlugin.ktreferences/build-logic/convention/src/main/kotlin/QualityConventionPlugin.ktSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Guides code writing, review, and refactoring with Karpathy-inspired rules to avoid overcomplication, ensure simplicity, surgical changes, and verifiable success criteria.
Executes ctx7 CLI to fetch up-to-date library documentation, manage AI coding skills (install/search/generate/remove/suggest), and configure Context7 MCP. Useful for current API refs, skill handling, or agent setup.
Share bugs, ideas, or general feedback.
Scaffolds a single-module Android app with a locked-in stack, then verifies it builds, tests, and lints cleanly. The end state is an empty scaffold (no demo screens) ready for the user to write their first Circuit feature.
<output>/<appNameSnake>/ImageLoader provided through Metro, kermit logger, Ktor clientapp/google-services.json presencerunDebug / runRelease / runDebugAll / runReleaseAll Gradle tasksAGENTS.md (real file) + CLAUDE.md (symlink).github/workflows/ci.yml, detekt + ktlint, Roborazzi screenshot testsInitial scaffold via new-android-app skilldigraph workflow {
inputs [label="Collect inputs" shape=box];
verify [label="Verify environment" shape=box];
base [label="android create\nbase scaffold" shape=box];
apply [label="Apply opinionated stack\n(copy references, substitute)" shape=box];
sym [label="ln -s AGENTS.md CLAUDE.md" shape=box];
smoke [label="assembleDebug + testDebugUnitTest\n+ detekt + lintDebug" shape=box];
ok [label="green?" shape=diamond];
git [label="git init + initial commit" shape=box];
report [label="Print next steps" shape=doublecircle];
fail [label="Surface error\nleave partial scaffold" shape=doublecircle];
inputs -> verify -> base -> apply -> sym -> smoke -> ok;
ok -> git [label="yes"];
ok -> fail [label="no"];
git -> report;
}
Ask the user, one prompt at a time:
Halogen).me.mmckenna.halogen). Validate against ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$. Reject and re-prompt on failure.Derive:
appNameSnake = display name lowercased, non-alphanumerics → _.packagePath = package name with . → /.targetSdk = highest installed platform from android sdk list --installed.Run, in this order, and stop on the first failure with a user-facing message:
which android # android CLI present?
java -version # JDK 21+?
android sdk list --installed # at least one platform + build-tools?
If android is missing, point the user at the android-cli skill's setup notes. If JDK is missing or older, suggest sdkman install java 21-tem or equivalent.
android createPick the simplest Compose-capable template. Run android create --list if unsure. Default template: empty-activity.
android create empty-activity --name="<App Display Name>" --output=<output> --minSdk=<minSdk>
This produces a buildable starting point. The next step heavily overwrites it.
For each entry below, copy the file from references/ to its target path, substituting {{packageName}}, {{packagePath}}, {{appName}}, {{appNameSnake}}, {{minSdk}}, {{targetSdk}}. Files marked verbatim copy without substitution.
Build & tooling:
| Reference | Target |
|---|---|
settings.gradle.kts.tmpl | settings.gradle.kts |
root.build.gradle.kts (verbatim) | build.gradle.kts |
libs.versions.toml (verbatim) | gradle/libs.versions.toml |
app.build.gradle.kts.tmpl | app/build.gradle.kts |
run-tasks.gradle.kts (verbatim) | gradle/run-tasks.gradle.kts |
build-logic/ (whole tree, with placeholder substitution in convention/build.gradle.kts) | build-logic/ |
gitignore (verbatim) | .gitignore |
editorconfig (verbatim) | .editorconfig |
detekt.yml (verbatim) | config/detekt/detekt.yml |
ci.yml (verbatim) | .github/workflows/ci.yml |
google-services.json.example (verbatim) | app/google-services.json.example |
App source (under app/src/main/kotlin/{{packagePath}}/):
| Reference | Target |
|---|---|
App.kt.tmpl | App.kt |
MainActivity.kt.tmpl | MainActivity.kt |
AppGraph.kt.tmpl | di/AppGraph.kt |
CircuitConfig.kt.tmpl | circuit/CircuitConfig.kt |
RootScreen.kt.tmpl | nav/RootScreen.kt |
Color.kt.tmpl | ui/theme/Color.kt |
Type.kt.tmpl | ui/theme/Type.kt |
Theme.kt.tmpl | ui/theme/Theme.kt |
AndroidManifest.xml.tmpl | app/src/main/AndroidManifest.xml |
Tests (under app/src/test/kotlin/{{packagePath}}/):
| Reference | Target |
|---|---|
ExampleTest.kt.tmpl | ExampleTest.kt |
RootPresenterTest.kt.tmpl | nav/RootPresenterTest.kt |
ThemeScreenshotTest.kt.tmpl | ui/theme/ThemeScreenshotTest.kt |
Agent guidance:
| Reference | Target |
|---|---|
AGENTS.md.tmpl | AGENTS.md |
Splash theme: the manifest references @style/Theme.{{appName}}.Splash. Append the following style to app/src/main/res/values/themes.xml (the android create template generates a base themes.xml):
<style name="Theme.{{appName}}.Splash" parent="android:Theme.Material.Light.NoActionBar" />
After all files are written, delete every leftover source the android create template generated. The defaults conflict with the new structure (e.g. com.example.<app>.MainScreenViewModelTest referencing classes that no longer exist). Run:
# Drop default sources outside our package. Use `find` with `! -path` so the new files we just wrote are kept.
find "$APP_DIR/app/src/main/java" -mindepth 1 -delete 2>/dev/null || true
find "$APP_DIR/app/src/main/kotlin" -mindepth 1 ! -path "$APP_DIR/app/src/main/kotlin/$PKG_PATH*" -delete 2>/dev/null || true
find "$APP_DIR/app/src/test/java" -mindepth 1 -delete 2>/dev/null || true
find "$APP_DIR/app/src/test/kotlin" -mindepth 1 ! -path "$APP_DIR/app/src/test/kotlin/$PKG_PATH*" -delete 2>/dev/null || true
find "$APP_DIR/app/src/androidTest/java" -mindepth 1 -delete 2>/dev/null || true
find "$APP_DIR/app/src/androidTest/kotlin" -mindepth 1 ! -path "$APP_DIR/app/src/androidTest/kotlin/$PKG_PATH*" -delete 2>/dev/null || true
cd <output>/<appNameSnake>
ln -s AGENTS.md CLAUDE.md
Verify with ls -la CLAUDE.md showing CLAUDE.md -> AGENTS.md.
Run, in order, with -q --console=plain:
./gradlew -q --console=plain :app:assembleDebug
./gradlew -q --console=plain :app:testDebugUnitTest
./gradlew -q --console=plain :app:detekt :app:lintDebug
If any step fails:
<output>/<appNameSnake> for inspection.cd <output>/<appNameSnake>
git init
git add .
git commit -m "Initial scaffold via new-android-app skill"
If git init fails, warn but do not roll back the scaffold.
Print to the user:
Scaffold complete at
<output>/<appNameSnake>.Next steps:
- Add Crashlytics: Create a Firebase project, download
google-services.json, and drop it inapp/. SeeAGENTS.mdfor details.- Run on a device:
./gradlew runDebug(single device) or./gradlew runDebugAll(all connected).- Add your first feature: Follow the "Adding a feature" recipe in
AGENTS.md. Usecircuit-testfor the presenter.- Use the
android-cliskill for SDK / device / docs operations.- Use the upstream
edge-to-edgeskill from theandroidCLI if you hit inset or system-bar issues when adding real screens.
android-cli — used in steps 2 and 3, surfaced in step 8's next steps.edge-to-edge (from the upstream android CLI) — referenced in AGENTS.md and step 8 as the canonical guide for inset issues.superpowers:test-driven-development — recommended for adding new features (TDD-first via circuit-test).superpowers:verification-before-completion — step 6 is the verification gate.android create fails: surface stderr, suggest android sdk list --installed / android init, stop.git init fails: scaffold is complete; warn and continue.ln -s fails (Windows or restricted FS): create CLAUDE.md as a regular copy of AGENTS.md instead. Document in the user's report that they should re-create the symlink (or maintain copies) on platforms that don't allow user symlinks.