[BUG] Desktop: enabling any plugin that ships an output style empties the session "Output style" submenu (built-ins included)
Title: Desktop: enabling any plugin that ships an output style empties the session "Output style" submenu (built-ins included)
Environment
- Claude desktop (macOS arm64): 1.49585.0, bundled Claude Code 2.1.260
- macOS: Darwin 25.3.0
What happens
With a plugin enabled that contains an output-styles/*.md file, the per-session menu ⋮ → Output style shows only "New style…". Default, Proactive, Concise, Explanatory, Learning and all custom user styles disappear. Settings → Claude Code → Output style still lists the built-in and user styles correctly (it does not list the plugin's). Disabling the plugin restores the submenu after restart.
Root cause (from main.log and app.asar)
main.log on every session start:
[CCD] output-style list of 8 entries settled as empty: over the 256-entry cap, or at least one entry failed validation
Also, when outputStyle in settings.json is set to the plugin style:
[SettingsResolver] Screened outputStyle from ~/.claude/settings.json — not a valid style name (string, 18 chars)
In app.asar the style-name validator rejects any name containing /, \ or ::
function l0t(e){return typeof e=="string"&&e.length>0&&e.length<=256&&e===e.trim()&&!/[/\\:]|^\.\.?$|^~/.test(e)&& ...}
and captureOutputStyleList is all-or-nothing:
a=Array.isArray(i)&&i.length<=lh&&i.every(t.Dx)?i:[]
Plugin output styles are reported by the CLI as <plugin>:<style>. The colon fails the validator, so one plugin style empties the entire list. The CLI itself accepts outputStyle: "<plugin>:<style>" and activates it, so the CLI and desktop disagree on the name grammar.
Repro
- Install any plugin with
output-styles/<name>.md(e.g. a one-file plugin) and enable it. - Restart the desktop app, open a Code session, ⋮ → Output style.
- Observe only "New style…". Disable the plugin, restart: list returns.
Expected
Plugin styles either listed (namespaced names accepted, or displayed under the plugin) or skipped individually, without discarding the built-in and user entries.
Workaround used
Ship the style file under assets/ and copy it into ~/.claude/output-styles/ with a SessionStart hook, so no namespaced entry is emitted.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗