From media-assistant-ops
First-run setup for the media-assistant-ops plugin. Capture the user's local Music Assistant deployment URL + API key, snapshot the current speaker/player roster for future context, vet the overall setup (providers, connectivity, auth), and summarise the library (track/album/artist counts, active music providers). Use when the plugin is freshly installed, when `config.json` is missing, or when the user wants to re-baseline against a new server.
How this skill is triggered — by the user, by Claude, or both
Slash command
/media-assistant-ops:onboardThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
End-to-end first-run: capture credentials, verify the server responds, snapshot the environment, and produce a context file the other skills can rely on.
End-to-end first-run: capture credentials, verify the server responds, snapshot the environment, and produce a context file the other skills can rely on.
Resolve the data root and ensure directories exist:
DATA_ROOT="${CLAUDE_USER_DATA:-${XDG_DATA_HOME:-$HOME/.local/share}/claude-plugins}/media-assistant-ops"
mkdir -p "$DATA_ROOT/data" "$DATA_ROOT/state"
If $DATA_ROOT/config.json exists, display the current values (redact API key to last 4 chars) and confirm the user wants to overwrite.
Ask the user for:
http://10.0.0.50:8095). Accept an IP alone and assume http:// + default port 8095.Write $DATA_ROOT/config.json with lan_url, wan_url, api_key. chmod 600 the file.
Never echo the full API key back — only the last 4 characters for confirmation.
Run these checks against the LAN URL (fall back to WAN if LAN is unreachable and a WAN URL was provided). Report each as ✓ / ✗ with a short note.
/api/info with the Bearer token. Capture server version, Python version, OS./api/providers. For each provider, report name, type (music / player / metadata / plugin), and available status. Flag any provider in an error state./api/info fails, attempt a raw TCP connect to the port and report whether the service is up vs whether it's an auth problem.Produce a short Setup Vetting Report the user can read at a glance.
GET /api/players and persist the full response to:
$DATA_ROOT/data/players-snapshot.json
Write a human-readable summary to $DATA_ROOT/data/players-snapshot.md with one row per player:
| Name | Player ID | Type | Provider | Default volume | Group membership |
This file is the future-context artefact — other skills can grep it to resolve names → IDs and it gives you (Claude) a cheap way to know what hardware exists without a live call.
If any player is part of a sync group, note the group and which player is the leader.
Hit the library summary endpoints (if the running MA version exposes them) and persist raw JSON to $DATA_ROOT/data/library-snapshot.json:
/api/library/tracks?limit=1 — read total count from pagination meta/api/library/albums?limit=1/api/library/artists?limit=1/api/library/playlists?limit=1/api/library/radios?limit=1If a given endpoint 404s on this MA version, skip it and note "not supported on this server version" in the report — don't fail the whole onboarding.
List active music providers (from Phase 2's provider fetch, filtered to type=music) with track count per provider if the API exposes it.
Write a human-readable $DATA_ROOT/data/library-snapshot.md:
# Music Assistant Library — snapshot <ISO date>
- Tracks: N
- Albums: N
- Artists: N
- Playlists: N
- Radios: N
## Music providers
- spotify (connected) — 12,345 tracks
- plex (connected) — 4,567 tracks
- filesystem (connected) — 890 tracks
Print a single consolidated summary covering:
$DATA_ROOT/data//media-assistant-ops:status, /media-assistant-ops:list-players~/.claude/ or inside the plugin install directory.config.json without explicit user confirmation.npx claudepluginhub danielrosehill/claude-code-plugins --plugin media-assistant-opsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.