Dewey skills can run in four "surfaces" — the different ways a user invokes Claude. Each surface exposes a different toolset, so a skill that works in one may break in another.
| Surface | Where | Tools available |
|---|---|---|
claude-code |
Claude Code CLI | Full: Bash, Read, Edit, Write, Glob, Grep, MCP |
cowork |
Claude desktop app (Cowork tab) | Most of Claude Code's tools, with user-approval gates on Bash |
codex |
OpenAI Codex CLI | SKILL.md format only — no Anthropic-specific tooling |
chat |
claude.ai | No filesystem, no Bash, no local processes |
Every plugin's plugin.json declares which surfaces its skills are designed for:
{
"name": "competitive-intelligence",
"surfaces": ["claude-code", "cowork", "codex", "chat"]
}If surfaces is omitted, Dewey treats it as ["claude-code"] — the safest default, since Claude Code is the original target.
- Pure text-generation skills (drafting, analyzing, summarizing) usually support all four surfaces.
- Skills that use
Bashinallowed-toolsmust dropchatfromsurfaces— Chat has no shell. - Skills that read or write local files must drop
chat— Chat has no filesystem. - Skills that depend on a specific MCP server should test it works in each declared surface; MCP support varies.
tests/run.sh enforces one rule today: a SKILL.md whose plugin claims chat support must not declare Bash(...) in its allowed-tools frontmatter. Mismatch fails the test.
More rules will be added as we learn the failure modes.
When you run /dewey recommend or /dewey install, the Guide:
- Detects which surface it's running in (env var
DEWEY_SURFACE, falling back to asking) - Filters the marketplace to plugins whose
surfacesincludes the current surface - Hides incompatible skills from your recommendations
So a Cowork user never gets a chat-only skill suggested; a Chat user never gets a Bash-heavy one.
Skills are bundled into plugins, and a plugin is the unit of install. Mixed-compatibility plugins force the user to reason about each skill individually. The trade-off: if one skill in a plugin needs Bash, the whole plugin drops chat. Fine — split the plugin.