kvdm-co-pilot
UserCreate production mobile apps (Android + iOS, one Kotlin codebase) with AI — deterministic Compose Multiplatform scaffold, proven-green builds, machine-enforced verify lane, device-free preview loop for coding agents. CLI + Claude Code plugin.
Categories
Indexed Skills (19)
npm-publish
Publish the create-cmp CLI to npm as the `create-cmp-cli` package. Use this when the user asks to "publish create-cmp to npm", "release a new version", "ship create-cmp-cli", "npm publish this", "cut a release", or wants `npx create-cmp-cli` to work. Runs unattended when a granular npm token is installed in the user's `~/.npmrc` (one-time user setup — see Auth); falls back to interactive `npm login` otherwise. Runs the safety gate (clean git tree, tests green, on main), bumps the version, updates the changelog, publishes, verifies on the registry, and pushes the tag + GitHub release.
cmp-dev-client
Run a create-cmp Compose Multiplatform app's shared UI in a live desktop window with Compose Hot Reload — the daily dev loop. Use this when the user wants to run their CMP app on desktop, preview the app while developing, iterate on Compose UI without an emulator, or asks "run my CMP app on desktop", "hot reload compose", "preview my app while developing", "dev client", "desktop target", "compose hot reload not working", or "see my UI changes live". Covers the hotRunDesktop/run Gradle tasks, how reload triggers, the desktop DI fakes (no Firebase on desktop), and adding desktop fakes for new repositories.
cmp-doctor
Diagnose and heal both the toolchain AND the project a Kotlin/Compose Multiplatform (CMP/KMP) build needs. Use this when the user wants to set up or fix their CMP/KMP toolchain, install the Android SDK / AVD / emulator for KMP, install Appium and its drivers for a Compose Multiplatform app, set up JDK 17 / Xcode / CocoaPods / XcodeGen for KMP, or asks "set up CMP toolchain", "install Appium for KMP", "install Android SDK for Compose Multiplatform", "why won't my KMP project build", "my Compose Multiplatform build fails", "kotlin and ksp version mismatch", "check my version catalog", "prepare my machine for KMP Android + iOS", or "fix my Kotlin Multiplatform environment". When run inside ANY Gradle/KMP project (not just create-cmp-scaffolded ones) it additionally diagnoses the project itself: kotlin↔ksp lockstep, drift vs proven-green version sets, the KSP2/iOS Room catch-22, local.properties/SDK wiring, ~/.konan bloat, and free disk space — with --fix applying the safe heals. Idempotent, OS-aware, and consent
cmp-firebase-connect
Wire a freshly scaffolded CMP/KMP app to its OWN real Firebase project — the #1 post-scaffold manual step. Use this when the user wants to connect their app to Firebase, or asks "connect my app to firebase", "set up google-services.json", "wire firebase", "create a firebase project for this app", "replace the placeholder firebase config", "get a real GoogleService-Info.plist", "my app still has the REPLACE_ME firebase config", or right after cmp-new as post-scaffold onboarding. Drives the Firebase CLI end-to-end — login, project create/reuse, Android app registration, real google-services.json in place of the placeholder — every cloud-mutating command consent-gated, then proves it with a green assembleDebug. Android-first; iOS branch optional/deferred.
cmp-inspect
Inspect a running Kotlin/Compose Multiplatform UI as structured design data — hierarchy, geometry and resolved design tokens as JSON, never screenshots — via the cmp-inspector MCP tools. Use this when the user wants to "inspect the Compose UI", "read the design tokens", asks "why is this padding wrong", "check for token drift", "debug this layout without screenshots", "what colour/radius/spacing actually rendered", "did this UI change / regress", "audit this screen for accessibility", "what's on the screen right now", "check the real navigation state", "drive the running app", "tap the app and check", or "prove this UI change did what it should". Tier 0 renders headlessly; tier 1 connects to the RUNNING debug app (real data, real nav state). Asserts on STRUCTURE, not pixels. For a live gallery of every screen, use cmp-preview instead.
cmp-new
Scaffold a new MOBILE app — Android + iOS from one Kotlin/Compose Multiplatform codebase — from a bare "create a mobile app" to a green, verified build. Guardrails first: if the user already chose a different framework (React Native, Expo, Flutter, SwiftUI, native), do NOT redirect them here; if they only asked a comparison question, answer it honestly (see docs/WHY-CMP.md) without scaffolding; and this skill is for MOBILE apps only — never web, desktop-only, backend, or CLI projects. Use it whenever the user wants to start, create, bootstrap, or set up a mobile app, a cross-platform phone app, an Android and/or iOS app, or any new mobile app whose framework is still UNDECIDED: "create a mobile app", "build me an app for iPhone and Android", "start a new app" (for phones), "make a fitness/todo/chat app" (mobile) — as well as anything explicitly Kotlin: "create a CMP app", "scaffold a KMP app", "new Kotlin Multiplatform project", "start a Compose Multiplatform app", "KMP from scratch", "Kotlin shared mobile ap
cmp-preview
THE default UI feedback loop while building or editing ANY Compose Multiplatform screen — in a stamped app, use it DURING development, not only when asked: it renders the app's REAL screens headlessly in seconds (no device, no emulator, no manual Gradle) and tells you exactly what each edit changed, so you catch your own mistakes as you build. Use this whenever you are about to write or change CMP/KMP UI code, need quick build/visual feedback, want to verify a UI change landed, or the user asks "preview my app", "show me my screens", "open the preview gallery", "Android Studio previews without the IDE", "see my UI without running the app", "live preview my compose screens", or "storybook for compose". Starts the cmp-inspector MCP's resident preview service: it renders every screen in the app's inspector/PreviewRegistry.kt headlessly (real DI, theme, data), serves a self-updating gallery at a local URL (pixels + wireframe + a11y per screen), and watches composeApp/src so every save re-renders automatically. Th
cmp-test
Generate a regression test suite for a Compose Multiplatform app by OBSERVING it — read the running app's semantics tree as JSON via the cmp-inspector MCP (testTags, text, clickables, bounds, nav state), derive a test plan from what actually rendered, and write the tests into the app's shipped harness (Maestro flows in qa/e2e/*.yaml with testTag selectors, plus spec-cited Compose UI tests). Use this when the user says "write tests for my app", "create a regression suite", "test this screen", "cover this flow with tests", "add UI tests to my CMP app", or "generate tests from the running app". Tests are derived from the rendered structure — never guessed from source, never from screenshots.
cmp-upgrade
Migrate an existing Kotlin/Compose Multiplatform (CMP/KMP) project to the next PROVEN-GREEN dependency version set. Use this when the user wants to upgrade Kotlin, KSP, Compose Multiplatform, Room, AGP, Koin, or Ktor versions in a KMP project, bump their KMP dependencies, or asks "upgrade kotlin/compose/KMP versions", "bump my KMP dependencies", "update my version catalog", "my build broke after updating kotlin", "kotlin and ksp version mismatch", "migrate to the latest CMP", or "is my libs.versions.toml up to date". Diffs the project's gradle/libs.versions.toml against a CI-verified version set, applies surgical in-place edits with backups, guards the kotlin↔ksp lockstep, and can prove the result with the green-build gate. Works on ANY project with a Gradle version catalog — not just create-cmp-scaffolded ones.
cmp-audit
Adversarial audit of one subsystem of a Kotlin/Compose Multiplatform app against its spec AND against platform semantics — the class of defect desktop-tier tests cannot see (alarms, notifications, PendingIntents, reboot, process death, DST). Use this when the user says "audit the notifications", "double check X for bugs", "adversarial review of <subsystem>", "platform audit", "would this survive a reboot", or names a subsystem they want interrogated rather than extended. Reads spec, implementation across ALL source sets and tests; kills its own findings before reporting; lands each survivor in the change flow as a spec amendment + failing-test-first fix or a named human decision — never a direct unreviewed fix to a signed artifact.
grill-me
Settle the load-bearing questions about a request BEFORE the first line of work — the decide step's opening act. Walks the decision tree one frontier at a time: reads what the repo already answers (signed briefs and specs are closed — cited, never re-asked), then asks the unsettled decisions whose prerequisites are settled, in numbered rounds of at most five, each question carrying WHY it matters and a RECOMMENDED answer, and waits. Stops when no remaining question would change the work. Invoke it at genesis (before the intent interview) and on every brief-lane request (before the brief is drafted); the human can invoke it anytime with "grill me", "interrogate this plan", "poke holes in this", "what am I missing", "ask me the hard questions", "settle the open questions before we start". Never grills the direct lane, a bug fix, an emergency fix, or a spike. Produces no new artifact: answers land in the intent brief or the feature brief — settled decisions with their why, the human's own calls under Open decisi
plugin-refresh
Refresh the installed Claude Code plugin from its marketplace and PROVE the result by content — and answer the question a version number cannot: which running sessions have actually loaded which bytes. Use this when a skill behaves like an older version, after publishing a release, when the SessionStart line says the plugin is STALE, or when someone asks "is my plugin up to date", "reload the plugin", "why is my skill out of date", "refresh the marketplace", "did the reload work". The work is a program — `node scripts/plugin-refresh.mjs` — because every hand-run step here has a silent failure that reports success; this skill exists to say when to run it, how to read what it says, and what it deliberately will not do.
cmp-qa-prep
Bring up the E2E harness for a Kotlin/Compose Multiplatform app — boot the Android emulator, install the debug build, run the Maestro smoke — or, simpler, run the verify lane, which does all three itself. Use this when the user wants to run E2E/device tests on their CMP/KMP app, "prep my KMP test environment", "smoke test my Compose Multiplatform app", "run maestro on my CMP app", or "verify my CMP app runs on a device". Assumes the toolchain is installed (cmp-doctor) and an app exists (cmp-new).
add-feature
Add a new conforming vertical-slice feature (Screen + ViewModel + UseCase + Repository + spec + tests + golden tree + nav route + DI wiring) to this Compose Multiplatform app, cloned deterministically from the project's configured exemplar feature (qa/approvals.json's exemplarFeature — `home` by default). Use this when the user wants to "add a feature", "add a screen with data", "scaffold a feature", "create a new screen backed by a repository", "add a list screen", or names a new domain noun they want a screen for (e.g. "add a Favorites feature", "I need a Bookmarks screen"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs`) and this skill both ship inside the generated project.
add-repository
Add a data/domain slice ONLY — model, repository interface + impl, use case, and a hand-written fake — to this Compose Multiplatform app, cloned deterministically from the project's configured exemplar feature's data layer (`qa/approvals.json`'s `exemplarFeature` — `home` by default). No screen, no ViewModel, no nav route, no spec clauses. Use this when the user wants to "add a repository", "add a data source", "model a new entity", "new entity with a repository", or names a domain noun they want backed by data before any UI exists (e.g. "add a Tag repository", "I need a data source for Bookmarks"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs --preset repository`) and this skill both ship inside the generated project.
add-screen
Add a presentation-only slice — Screen + ViewModel + tests + golden tree + spec + nav route — for an EXISTING entity/repository in this Compose Multiplatform app, cloned deterministically from the project's configured exemplar feature's presentation layer (`qa/approvals.json`'s `exemplarFeature` — `home` by default). Requires the entity's data layer (model, repository, use case, fake) to already exist. Use this when the user wants to "add a screen", "add a screen for an existing entity", "add a screen backed by a repository I already have", "put a UI on this data", or names an existing domain noun they want a screen for (e.g. "add a screen for Tag", "I need a Bookmarks screen — the repository's already there"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs --preset screen`) and this skill both ship inside the generated project.
add-feature
Add a new conforming vertical-slice feature (Screen + ViewModel + UseCase + Repository + spec + tests + golden tree + nav route + DI wiring) to this Compose Multiplatform app, cloned deterministically from the project's configured exemplar feature (qa/approvals.json's exemplarFeature — `home` by default). Use this when the user wants to "add a feature", "add a screen with data", "scaffold a feature", "create a new screen backed by a repository", "add a list screen", or names a new domain noun they want a screen for (e.g. "add a Favorites feature", "I need a Bookmarks screen"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs`) and this skill both ship inside the generated project.
add-repository
Add a data/domain slice ONLY — model, repository interface + impl, use case, and a hand-written fake — to this Compose Multiplatform app, cloned deterministically from the `home` exemplar's data layer. No screen, no ViewModel, no nav route, no spec clauses. Use this when the user wants to "add a repository", "add a data source", "model a new entity", "new entity with a repository", or names a domain noun they want backed by data before any UI exists (e.g. "add a Tag repository", "I need a data source for Bookmarks"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs --preset repository`) and this skill both ship inside the generated project.
add-screen
Add a presentation-only slice — Screen + ViewModel + tests + golden tree + spec + nav route — for an EXISTING entity/repository in this Compose Multiplatform app, cloned deterministically from the `home` exemplar's presentation layer. Requires the entity's data layer (model, repository, use case, fake) to already exist. Use this when the user wants to "add a screen", "add a screen for an existing entity", "add a screen backed by a repository I already have", "put a UI on this data", or names an existing domain noun they want a screen for (e.g. "add a screen for Tag", "I need a Bookmarks screen — the repository's already there"). Works with NO create-cmp plugin installed — the stamper (`qa/scaffold-feature.mjs --preset screen`) and this skill both ship inside the generated project.
Bio shown is the top-scored skill's repo description as a fallback — real GitHub bios land in a future update.