Standard theme picker for all insight-wave ecosystem plugins. Discovers themes from the standard cogni-workspace themes directory and the user's workspace themes directory, then presents an interactive picker via AskUserQuestion. Returns the absolute path to the selected theme.md file. Use this skill whenever a downstream skill needs a theme — before generating slides, dashboards, web narratives, big pictures, storyboards, HTML reports, or any other themed output. Triggers on phrases like "pick a theme", "choose theme", "which theme", "select a theme", or when any visual output skill needs theme resolution. Also triggers when skills internally need theme selection as a prerequisite step. Also triggers on "apply a theme", "use this theme", or "theme my output". This is the single standard entry point for theme selection across both insight-wave and insight-wave-pro marketplaces.
From cogni-workspacenpx claudepluginhub cogni-work/insight-wave --plugin cogni-workspaceThis skill is limited to using the following tools:
scripts/discover-themes.pyGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Configures VPN and dedicated connections like Direct Connect, ExpressRoute, Interconnect for secure on-premises to AWS, Azure, GCP, OCI hybrid networking.
Standard theme picker for the insight-wave ecosystem. Provides a single, consistent theme selection experience used by all plugins that produce visual output — slides, dashboards, web narratives, big pictures, storyboards, and HTML reports.
Without a centralized picker, every visual skill implements its own theme discovery and selection logic. This leads to inconsistent UX (different skills show different theme lists), missed themes (some skills only scan one directory), and duplicated code. This skill is the one place where theme discovery and selection happens.
The picker scans two directories and merges the results:
| Source | Location | Purpose |
|---|---|---|
| Standard | $CLAUDE_PLUGIN_ROOT/themes/ | Ships with cogni-workspace. Always available. Contains cogni-work and any other bundled themes. |
| Workspace | $COGNI_WORKSPACE_ROOT/themes/ | User-created themes via manage-themes. Project-specific brand themes. |
If both directories contain a theme with the same slug, the workspace version takes priority (the user's customization wins). The _template/ directory is always skipped.
Run the discovery script to get a JSON array of all available themes:
python3 "$CLAUDE_PLUGIN_ROOT/skills/pick-theme/scripts/discover-themes.py"
The script outputs a JSON array sorted by relevance: workspace themes first (newest first), then standard themes. Each entry contains:
{
"slug": "cogni-work",
"name": "Cogni Work",
"description": "A bold, modern theme pairing electric chartreuse with deep black foundations.",
"primary": "#111111",
"accent": "#C8E62E",
"background": "#FAFAF8",
"font": "DM Sans Bold",
"path": "/absolute/path/to/themes/cogni-work/theme.md",
"source": "standard",
"mtime": 1741564800.0
}
The mtime field is the file modification timestamp (Unix epoch). The script pre-sorts results so the first entry is always the best default candidate — no additional sorting needed.
Present discovered themes via AskUserQuestion. Build the options from the discovery output. Each option should show the theme name plus a compact summary (primary color, accent color, font).
Rules for building the picker:
AskUserQuestion structure (must match the tool's exact schema):
{
"questions": [{
"question": "Which theme would you like to use?",
"header": "Theme",
"multiSelect": false,
"options": [
{
"label": "Cogni Work (Recommended)",
"description": "#111111 + #C8E62E · DM Sans Bold · standard"
},
{
"label": "Digital X",
"description": "#0D3B4F + #00BCD4 · Inter Bold · workspace"
}
]
}]
}
Option format: label = theme name, description = {primary} + {accent} · {font} · {source}. Keep a mental map of label → path from the discovery output so you can resolve the user's selection back to the absolute theme path.
path from the discovery outputThe output of this skill is the absolute path to the selected theme.md file. The calling skill uses this path to read theme tokens and apply them to its output.
Store and communicate these three values — they form the return contract that downstream skills depend on:
| Field | Value | Example |
|---|---|---|
| theme_path | Absolute path to theme.md | /Users/.../themes/cogni-work/theme.md |
| theme_name | Human-readable name from the H1 | Cogni Work |
| theme_slug | Directory name (kebab-case) | cogni-work |
Downstream skills receive theme_path and read design tokens directly from the file. For Python-based scripts, pass it as --theme <theme_path>. For skill-to-skill handoffs, include it in the calling context.
Any skill that produces themed output should use pick-theme instead of implementing its own theme resolution. Replace inline theme scanning with a reference to this skill.
Before (each skill doing its own thing):
Scan themes/*/theme.md, present via AskUserQuestion. Otherwise use default.
After (delegating to pick-theme):
Use cogni-workspace:pick-theme to let the user select a theme.
The skill returns the absolute path to the chosen theme.md.
Read the theme.md and extract design tokens for your output.
The picker can be skipped when:
theme_path parameter (explicit theme from upstream)In these cases, just validate the provided path and proceed.
After running the discovery script, if the result is empty and COGNI_WORKSPACE_ROOT is set:
COGNI_WORKSPACE_ROOT directory actually exists on disk/manage-workspace in update mode to regenerate paths."WARNING lines to stderr when it detects this — check stderr outputYou can also pass the workspace root explicitly via CLI to bypass stale env vars:
python3 "$CLAUDE_PLUGIN_ROOT/skills/pick-theme/scripts/discover-themes.py" --workspace-root "$COGNI_WORKSPACE_ROOT"
If no themes are found at all (neither standard nor workspace):
If the discovery script fails (missing python3, permission issues):
path parameter set to the base directory:
*/theme.md, path $CLAUDE_PLUGIN_ROOT/themes*/theme.md, path $COGNI_WORKSPACE_ROOT/themes