[BUG] Cowork (Windows): a typed plugin slash command only executes when the picker resolves it into the blue chip; identical text submitted unselected is sent to the model as plain text
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet (closest: #78274, closed stale, macOS; #89628, open, Windows chip styling; #58102, closed not planned)
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code (Cowork's app-managed CLI; control test on 2.1.270)
What's Wrong?
In Claude Cowork on Windows, a plugin command is executed only if it was resolved by the / picker into the blue chip token. The same command typed in full, character for character, but submitted without selecting the picker entry is rejected by the Cowork client itself with a toast "Unknown skill: sofia." and the message is never sent.
Concretely, with our organisation plugin (sofia, a top-level commands/sofia.md entrypoint, plugin displayed as "Sofia plugin"):
- Type
/sofia. The picker opens and listssofia,sofia-skills,sofia-backend,sofia-playbooks, … with the "Sofia plugin" tooltip. Select thesofiaentry. The token turns blue. Submit. The command file runs. ✅ - Type
/sofiain full, do not select anything, submit. The text stays black. Cowork shows the toastUnknown skill: sofia.in the bottom-right corner, the composer keeps the text, nothing is sent to the model. ❌
The two inputs are byte-identical in the composer. The only difference is whether the picker was clicked or confirmed. The picker had just listed sofia as the first entry, so the registry knows the name; the submit-time resolver does not. Our reading is that the chip stores the plugin-qualified reference (sofia:sofia) while the typed text is resolved as the bare short name, and the bare-name fallback documented for the CLI ("the bare /fancy also invokes the skill unless another command already uses that name", skills docs) is not applied in Cowork's composer.
This affects every employee who types faster than the picker, which in practice is most of them, and it lands on non-technical staff who have no way of knowing the colour is load-bearing.
What Should Happen?
A message whose first token is /<command> should be dispatched to that command whether or not the picker was used, exactly as the CLI and the Agent SDK do. The Agent SDK docs state: "Send a command by including it in your prompt string, the same way you send regular text." Cowork's submit-time resolver should accept whatever the picker just offered, including the bare short name of a plugin command, or at minimum resolve the typed text against the registry on submit rather than only on picker selection.
Selecting from the picker should be a convenience, not a requirement.
Error Messages/Logs
Unknown skill: sofia.
(Cowork toast, bottom-right, shown on submit of the unselected /sofia; the message stays in the composer.)
Control experiment on the plain CLI (2.1.270, Linux), same command-file mechanism, no picker involved. Typed text at position 0 dispatches correctly, so the engine is fine and the loss is in Cowork's composer:
$ claude -p "/ping" --max-turns 1 → PONG-COMMAND-FIRED
$ claude -p "/ping please" --max-turns 1 → PONG-COMMAND-FIRED
$ claude -p "/pin" --max-turns 1 → Unknown command: /pin. Did you mean /ping?
$ claude -p "hello /ping" --max-turns 1 → (passed to the model as text)
(.claude/commands/ping.md contains "Reply with exactly the text PONG-COMMAND-FIRED and nothing else.")
Steps to Reproduce
- On Windows, install any plugin that ships a top-level command, e.g.
commands/hello.mdcontainingReply with exactly HELLO-FIRED and nothing else.(Our production case is thesofiaplugin from a private org marketplace, v1.2.0, but any plugin command should reproduce it.) - Open a Cowork task.
- Type
/hello, press the entry in the dropdown so it renders as a blue chip, submit. ObserveHELLO-FIRED. - New task. Type
/helloin full. Do not touch the dropdown. Submit while the text is still black. - Observe the toast
Unknown skill: hello.and the message left unsent. - Repeat step 4 with arguments (
/hello world). Same result.
Reproduced by multiple employees across separate Windows machines on Claude Desktop 1.49585.0.0 (Microsoft Store), Windows 11 build 26200.9168. Screenshots in the comments below.
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
Unknown. #89628 reports the chip rendering changing after the 2026-08-25 Windows Desktop update, which may be related.
Claude Code Version
Cowork's app-managed CLI (Claude Desktop 1.49585.0.0, Windows, Microsoft Store build). Control run: 2.1.270 (Claude Code) on Linux.
Platform
Anthropic API (claude.ai organisation, Cowork)
Operating System
Windows
Terminal/Shell
Other (Claude Desktop / Cowork composer, no terminal)
Additional Information
- Related, none of them holding this case:
- #78274 (Cowork, macOS): pre-filled
/skilltext → "Unknown skill" until the picker is triggered and the entry "turns blue". Closed as stale. Same defect, different entry path. - #89628 (Windows Desktop, open): chip styling gone after the 2026-08-25 update, picker only on first character.
- #58102 (Cowork, Windows, closed not planned): plugin commands → "Unknown skill", including the built-in
/feedback. - #36031 (Desktop, closed not planned): skill in picker but treated as text.
- Why it matters for plugin authors: we cannot work around this from inside a plugin. The rejection happens in the client before anything reaches the model, so no skill description or hook can catch it (Cowork also drops plugin-scoped hooks, #27398, #47993). A deterministic submit-time resolution is the correct fix.
- Happy to test a build or provide the plugin for reproduction.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Environment details from an affected machine, as promised:
1.49585.0.026200.9168(winver)Behaviour on this build is exactly as described above:
/sofiaselected from the picker renders as the blue chip and executes;/sofiatyped in full and submitted without selecting stays black and is delivered to the model as plain text.Correction to the mechanism, with screenshots from the affected Windows machine (Claude Desktop 1.49585.0.0). I have updated the issue body to match.
The unselected
/sofiais not delivered to the model as plain text, as I first wrote. Cowork's own client rejects it on submit with a toast and keeps the message in the composer. Three screenshots, in order:/sofia, the dropdown listssofia(first entry),sofia-skills,sofia-backend,sofia-playbooks,scope-report,birkman-presentation,social-composer, with a "Sofia plugin" tooltip on the first. The registry clearly knows the name./sofiarendered in blue (the chip). Submitting this runs the command./sofiain black. On submit, a toast appears bottom-right: "Unknown skill: sofia." The text remains in the composer; nothing is sent.So the picker's registry and the submit-time resolver disagree on the same name. My working hypothesis is that the chip carries the plugin-qualified reference (
sofia:sofia) while the typed text is looked up as the baresofia, and the bare-name fallback the CLI applies for plugin commands is missing from the composer path. If that is right,/feedbackfailing in #58102 ("Unknown skill: feedback.") is the same resolver, not a rename edge case.The three PNGs are in the next comment below.
Screenshots from the affected Windows machine (Claude Desktop 1.49585.0.0), in the order described in my previous comment: (1) picker open, (2) selected, blue chip, (3) typed in full and not selected, black, with the Unknown skill toast on submit.
<img width="549" height="289" alt="Image" src="https://github.com/user-attachments/assets/9621f3d8-d309-4ac6-ad6d-b23303c066d8" />
<img width="599" height="248" alt="Image" src="https://github.com/user-attachments/assets/59aa5fa4-4312-405b-830d-c69a4ff88f8e" />
<img width="795" height="510" alt="Image" src="https://github.com/user-attachments/assets/ef0ac1ea-cf99-486d-89af-3791c5e22c15" />