ADR-0010: Plugin-Aware Studio UI¶
Status: Accepted Date: 2026-05-20 Extends: ADR-0003 (marketplace), ADR-0007 (auto-discovery), ADR-0009 (SQLite state layer)
Context¶
Lion Studio currently presents skills, agents, and playbooks as flat lists scanned from ~/.lionagi/{skills,agents,playbooks}/. This ignores the plugin structure established in ADR-0003: four marketplace plugins at marketplace/ already group skills and agents by capability domain (devx, show, orchestrate, etc.).
The Skills page (62 skills) has no grouping — users see commit, fmt, ci next to flow-it, reprompt, write-playbook with no indication they belong to different plugins. Agent and playbook definitions are versioned through the definitions API (ADR-0016) but not associated with their parent plugin.
Claude Code's plugin format provides a standard packaging unit: plugin.json manifest + skills/, agents/, hooks/, .mcp.json, output-styles/, monitors/, themes/, bin/, settings.json. Studio should present this structure faithfully — it becomes the visual management layer for what CC loads.
Decision¶
1. Plugin discovery backend (services/plugins.py)¶
A new service scans two locations for plugins:
| Source | Path | Writeable |
|---|---|---|
| Marketplace | {LIONAGI_HOME}/../marketplace/ (repo-relative) | Yes |
| Third-party | ~/.claude/plugins/cache/*/*/ | No (read-only) |
For each plugin directory, the service:
- Reads
.claude-plugin/plugin.jsonfor metadata (name, version, description) - Falls back to directory name if no manifest exists
- Enumerates
skills/*/SKILL.md,agents/*.md,hooks/hooks.json,.mcp.json - Returns component counts and lists per plugin
The marketplace manifest (.claude-plugin/marketplace.json) provides the canonical list for repo plugins. Third-party plugins are discovered by directory scan.
2. API surface¶
GET /api/plugins/ → list all plugins with component counts
GET /api/plugins/{name} → plugin detail: metadata + component lists
GET /api/plugins/{name}/skills/{skill} → skill content (read-only)
GET /api/plugins/{name}/agents/{agent} → agent content (read-only view; editing via Agents page)
The existing /api/skills/, /api/agents/, and /api/definitions/ endpoints remain — the plugins API is the grouping/browsing layer, not an editing surface.
3. Frontend: Plugins replaces Skills in nav¶
Navigation changes from Playbooks | Agents | Skills | Runs | Shows to Playbooks | Agents | Plugins | Shows | Runs.
Plugin list page: cards showing name, description, source badge (marketplace name or Lion Marketplace), component counts (N skills, M agents).
Plugin detail page: tabbed layout:
- Skills tab: two-pane list+detail, read-only SKILL.md viewer
- Agents tab: agent names/descriptions with
Open in Agents →cross-links - Hooks tab:
hooks.jsonviewer (read-only) - MCP tab:
.mcp.jsonviewer (read-only) - README tab: rendered markdown (proportional font for prose)
Editability matrix¶
| Component | Source | Editable in Studio? | Where? |
|---|---|---|---|
| Marketplace agent definition | marketplace/*/agents/*.md | Yes | Agents page (definitions API) |
| Marketplace playbook | marketplace/*/playbooks/*.yaml | Yes | Playbooks page (definitions API) |
| Marketplace skill | marketplace/*/skills/*/SKILL.md | No | Read-only in Plugins; edit in text editor |
| Third-party plugin (any component) | ~/.claude/plugins/cache/ | No | Read-only everywhere |
| Hooks, MCP config | Plugin dirs | No | Read-only; managed by Claude Code |
Skills are not editable through the definitions API. They are Claude Code skill instructions, not lionagi definitions. The Plugins page is a read-only browser with cross-links to editable surfaces (Agents, Playbooks).
4. Third-party plugins are read-only¶
Plugins from ~/.claude/plugins/cache/ are displayed but not editable. The cache is managed by Claude Code's plugin add/remove commands. Studio surfaces them for visibility, not management.
5. Cross-links and source badges (added post-review)¶
Plugin components need explicit navigation to their editable counterparts and clear source/editability indicators:
Cross-links from plugin detail tabs:
- Agent tab:
Open in Agents →link per agent (routes to/agents/{name}) - Skill tab:
View sourcelink,Copy pathaction - All tabs:
Open rawfor filesystem path
Source badges on plugin list and detail:
| Badge | Meaning |
|---|---|
Lion Marketplace | From marketplace/, writable |
{marketplace name} | From third-party cache, title-cased directory name (e.g., Anthropic Official, khive). Read-only |
Versioned | Definition tracked in definitions API (agents, playbooks) |
Read-only | Filesystem artifact, not version-tracked |
Empty plugin stubs (0 skills, 0 agents) are de-emphasized — muted row treatment, grouped under "Scaffolded" section — but not hidden, since hiding them complicates plugin discovery debugging.
Skill search: Add a filter input inside the selected plugin's Skills tab, not just the plugin-level filter.
Markdown rendering: README and skill docs render prose in proportional font with code fences in monospace, not the current all-monospace treatment.
6. Deferred: CLI sync, monitors, themes, LSP¶
These are not part of this ADR:
li plugin syncCLI (marketplace → CC plugin install) — separate feature- Monitors, themes, LSP components — surface in Studio when usage warrants
- Model-agnostic abstraction — current format is CC-native; abstract later
Consequences¶
Positive
- Skills and agents gain context: users see which plugin provides each capability.
- Editing flows through existing definitions versioning — no new persistence layer.
- Third-party plugin visibility without management complexity.
- Direct alignment with CC's plugin model — what you see in Studio is what CC loads.
Negative
- Plugin discovery adds startup scan cost (~22ms for 4 plugins, negligible).
- Two navigation paths to the same skill (Plugins → devx → commit vs. direct URL).
plugin.jsonmay not exist for all marketplace plugins yet — fallback to dir name.
Alternatives Considered¶
| Alternative | Why Rejected |
|---|---|
| Keep Skills as top-level, add plugin grouping filter | Doesn't surface the plugin concept; users still think in flat lists |
| Replace both Skills and Agents nav with Plugins | Agents page has profile editing that doesn't map cleanly to plugin context; keep separate |
| Add plugin management (install/remove/update) | Scope creep — CC handles lifecycle; Studio is the viewer/editor |
Implementation¶
Two parallel agents:
- Backend:
services/plugins.py+routers/plugins.py— plugin scanner, API endpoints - Frontend:
/pluginspage (list + detail with tabs), Shell nav update, API client types
Both build on existing patterns: services/skills.py for scanning, app/agents/page.tsx for two-pane layout, lib/api.ts for type-safe fetch wrappers.