skills

A set of skills for Kotlin, Jetpack Compose, and Android development.
Install
With the skills CLI:
npx skills add chrisbanes/skills
Or install as a Claude Code plugin:
/plugin marketplace add chrisbanes/skills
/plugin install chrisbanes-skills@chrisbanes-skills
Or install as a Codex plugin:
codex plugin marketplace add chrisbanes/skills --ref main
codex plugin add chrisbanes-skills@chrisbanes-skills
Or install as an OpenCode plugin:
{
"plugin": ["chrisbanes-skills@git+https://github.com/chrisbanes/skills.git"]
}
See .opencode/INSTALL.md for details.
Skills
Start here
- Working on Compose state or effects? Start with
compose-state-and-effects. - Investigating recomposition, stability, or jank? Start with
compose-performance. - Reviewing Flow or coroutine architecture? Start with
kotlin-concurrency-and-flow.
Routing
using-chrisbanes-skills— route Kotlin and Jetpack Compose work to the focused skills; current Claude Code versions also activate it when working with.ktor.ktsfiles.
Jetpack Compose
State and side effects
compose-state-and-effects— decide state ownership and effect lifecycle for local UI state, screen state holders, Flow collection, callbacks, cleanup, navigation, snackbar, analytics, and focus requests.
Performance
compose-performance— diagnose stability, deferred reads, composition contracts, and cross-phase back-writing from concrete runtime evidence.
UI API design and layout
compose-component-design— design caller-placeable Compose APIs whose variable visual regions are caller-provided slots.compose-animations— choose Compose animation APIs for visibility, value targets, coordinated transitions, and content swaps; align with official quick guide and decision tree.compose-focus-navigation— design and test keyboard, TV, D-pad, and focus-first Compose navigation behavior.
Testing
compose-ui-testing-patterns— choose between plain UI tests, semantics assertions, key/focus tests, interaction state tests with MutableInteractionSource, screenshot tests, and integration tests.
Kotlin
kotlin-concurrency-and-flow— review coroutine ownership, cancellation, Flow state/event modeling, sharing, replay, and one-shot delivery.kotlin-control-flow— write and review Kotlin branching with subjectwhen, guard conditions, sealed exhaustiveness, smart casts, nullable branching, and early returns.kotlin-api-design— choose function owners, semantic domain types, and Kotlin Multiplatform platform boundaries.
Workflows
gradle-run— run every agent-initiated Gradle command through a compact-output wrapper; Gradle-centered workflows use one read-only diagnostic owner while parents retain edits.implement-with-subagents— implement supplied tickets or plan tasks sequentially through separate implementation subagents, requiring the installedimplementskill and prohibiting controller fallback.to-plan— create a repository-aware implementation plan from one ready GitHub issue or an in-chat task, with a provider-neutral implementation handoff.run-github-project— set up or repair the repository's GitHub Project binding without running work, reconcile epics, surface resumable human checkpoints, triage unblocked Backlog work, and plan and execute authorized issues through one planning lane and a two-slot-by-default parallel pipeline. Optionally routes authorized Wayfinder decision tickets through that planning lane while preserving their map and HITL gates. Requirestddfor implementation and preserves human Planning and triage approval gates.shepherd— autonomously poll open PRs and MRs, triage review comments, detect and fix CI failures, and keep PRs moving forward.
Migration from pre-cluster skills
This is a breaking taxonomy change. Replace the removed entrypoints as follows:
| Removed skills | Replacement |
|---|---|
compose-state-authoring, compose-state-hoisting, compose-side-effects |
compose-state-and-effects |
compose-recomposition-performance, compose-stability-diagnostics, compose-state-deferred-reads |
compose-performance |
compose-modifier-and-layout-style, compose-slot-api-pattern |
compose-component-design |
kotlin-coroutines-structured-concurrency, kotlin-flow-state-event-modeling |
kotlin-concurrency-and-flow |
kotlin-functions, kotlin-types-value-class, kotlin-multiplatform-expect-actual |
kotlin-api-design |
Contributing
Skills live at skills/<skill-name>/SKILL.md, flat (no language nesting). The name: in the SKILL.md frontmatter must match the directory name.
Frontmatter is validated against skills.schema.json — name and description are required, name must be kebab-case. The router also uses Claude Code's optional paths extension. Clients that do not support this extension must ignore the paths field rather than rejecting the skill.
Releases
Release versions use SemVer-compatible CalVer: YYYY.M.D without zero-padded month or day values, for example 2026.6.17.
Keep .claude-plugin/plugin.json, .codex-plugin/plugin.json, and new Git release tags on the same version. Existing zero-padded tags from before this policy map to the non-padded manifest version, so 2026.06.16 maps to 2026.6.16. Only bump versions when publishing an installable release.
To publish a release, run the Release workflow from GitHub Actions. Leave the version input empty to use today's UTC YYYY.M.D version, or provide a specific non-zero-padded CalVer value. Use the dry-run option to validate without creating a commit, tag, or GitHub release.
Before pushing, lint skills (frontmatter schema + markdown):
npm install
npm run lint
This also runs on CI for all PRs.
For a taxonomy change, also run the durable cluster behavior evaluation. It checks routing, required references, safeguards, exceptions, and finish gates at the public agent-facing seam.
Evaluating Compose skills
The repository contains a Codex-first advisory evaluator for the six Compose skills and their router. It compares a no-plugin baseline, explicit skill invocation, and automatic activation across 38 synthetic and provenance-bearing cases. Deterministic checks run in CI; authenticated model calls and their scores never gate merges or releases.
Latest evaluated scores
The 2026-08-18 certified scorecard produced these per-skill positive-case outcome scores. Automatic score is the headline score: all skills and the router were available, but the prompt did not name a skill. Uplift compares explicit skill invocation with the no-skill baseline.
| Skill | Baseline | Forced | Automatic score | Uplift |
|---|---|---|---|---|
compose-animations |
75.0% | 100.0% | 100.0% | +25.0 pp |
compose-component-design |
86.7% | 100.0% | 100.0% | +13.3 pp |
compose-focus-navigation |
66.7% | 100.0% | 100.0% | +33.3 pp |
compose-performance |
91.7% | 100.0% | 100.0% | +8.3 pp |
compose-state-and-effects |
77.8% | 100.0% | 100.0% | +22.2 pp |
compose-ui-testing-patterns |
55.6% | 100.0% | 100.0% | +44.4 pp |
Every skill scored 100.0% restraint on its forced and automatic no-change controls. These per-skill rows are diagnostic, not independent release gates, and multi-skill routing cases contribute to each relevant row. The suite-wide forced and automatic outcome scores were both 100.0%, with 89.4% reported routing precision and 97.7% reported routing recall.
Provenance: the scorecard retains unaffected conditions from the previous complete benchmark and uses the latest three-repetition result for every condition targeted by the finalized skill edits. The evaluation documentation defines the score, controls, safety evidence, and interpretation caveats.
Validate the harness and preview the full call matrix:
npm run evals:validate
python3 evals/run.py plan \
--model gpt-5.6-terra --reasoning medium \
--judge-model gpt-5.6-sol --judge-reasoning high
See evals/README.md for experiment controls, live execution,
score formulas, resumability, and human auditing.
