Claude Code Skills¶
Sidekick ships two Claude Code skills that automate common tasks when working with the SDK. Copy the skill folder into your project's .claude/skills/ directory (create it if it doesn't exist).
/setup-sidekick — Setup wizard & preferences migration¶
Skill folder: .claude/skills/setup-sidekick/
An interactive wizard that handles the full Sidekick onboarding flow for a consumer app:
- Adds
core:shell/core:noopdependencies with the correct debug/release split. - Prompts you to choose which plugins to enable (Network Monitor, Log Monitor, Preferences, Custom Screens) and adds only the modules you need.
- Wires the
Sidekick(plugins = …)composable into your root composable withremember-wrapped plugin instances, and adds a FAB to toggle visibility. - Migrates an existing hand-written DataStore preferences class to the
@SidekickPreferencesannotation processor: removes boilerplate keys and property getters, replaces them with@Preference-annotated vars, adds the KSP wiring tobuild.gradle.kts, and preserves your existing DataStore file name by settingstoreNameautomatically so no stored values are lost.
How to install¶
How to use¶
In Claude Code, type:
Or describe what you want:
"Add Sidekick to my app with the network monitor and preferences plugins." "Migrate my AppPreferences DataStore class to Sidekick."
The skill will read your build.gradle.kts, ask a few questions, and apply all changes in one pass.
Migrating from an existing DataStore¶
When you run /setup-sidekick (or describe your existing AppSettingsStore to Claude Code), the skill reads your hand-written DataStore class and:
- Inspects how you construct your
DataStore<Preferences>to detect the file name you passed topreferencesDataStore()orPreferenceDataStoreFactory. -
Emits the annotated replacement class with
storeNameset to that exact value: -
Removes the old
AppSettingsStoreclass and updates all its call sites to use the generated accessor.
Because storeName is set explicitly, the generated code opens the same .preferences_pb file your existing store was writing to — no stored values are lost on update.
If the skill cannot detect the DataStore file name (e.g. it is constructed dynamically), it will ask you to confirm or provide it before generating.
What it does not migrate automatically¶
| Pattern | Why | What to do |
|---|---|---|
Composite types (two Long keys → one domain object) |
KSP can't model multi-key types | Keep manually and reconstruct in your ViewModel |
getOrNullFlow / getBlockingOrNull |
KSP always emits a non-null StateFlow |
Keep manually or use a null-safe default + .value |
Enum stored via .value property (not .name) |
KSP uses Enum.valueOf(name) — a custom string key breaks round-trip |
Annotate the enum with .name storage or keep manually |
/create-plugin — Scaffold a new plugin module¶
Skill folder: .claude/skills/create-plugin/
Creates a new plugins/<name>/api module from scratch: build.gradle.kts, the base SidekickPlugin class, and the include line in settings.gradle.kts.
How to use¶
Note
This skill is intended for use inside the Sidekick repository itself (or in a project that includes Sidekick as a composite build).