In Claude Code, a skill is a modular function-like component that can process requests — like /code-review or /commit. As of version 2.1.1, these skills can be directly invoked through slash commands. So a code-review skill can also be invoked directly as /code-review. I understand why they added this feature. Sometimes it is not clear how exactly a skill will be triggered using natural language. To help, I had already started creating custom commands that did exactly this: simply invoke the skill directly and nothing else.

But today I wanted to combine two skills. Composition is one of the main features of skills. I asked Claude Code to create a custom slash command for direct invocation. This would save me from having to guess a phrasing that triggers both skills at once. (Alternatively, I could have manually created a simple markdown file in commands. However, I suspected Claude Code might have a more sophisticated mechanism in place.)

Interestingly Claude Code did not want to go this way, instead it suggested to me:

In Claude Code, user-invokable commands like /review-code or /commit ARE skills. There's no separate "command" concept - skills are what provide the /command-name interface.

The standard pattern for what you want is exactly a skill that composes other skills/agents.

When I pushed for a custom slash command, Claude Code kept resisting. Below, I interleave its output with some of my comments:

 I would like you to create a custom slash command that invokes those two skills. I do not want a specific skill for this.

Here is its thinking output:

∴ Thinking…

  The user wants a "custom slash command" that invokes two skills, but doesn't want to create a new skill for this.

  Let me think about what options exist in Claude Code:

  1. Skills - These ARE the slash commands. /grade-text is a skill.
  2. Agents - These are invoked via the Task tool, not directly as slash commands.
  3. Hooks - These are shell commands that run in response to events, not user-invokable commands.

Note: it 'thinks' Commands are not an option.

  There's no separate "custom slash command" mechanism outside of skills. Skills ARE the slash commands.

Interesting, Skills ARE the slash commands..

I think the user might be confused about the terminology, or they want something that doesn't exist in the current Claude Code architecture. Let me clarify this.

Actually, wait - maybe they want something in their shell? Like a bash alias or script that invokes Claude Code with specific prompts?

Or perhaps they want me to just explain that what they're asking for doesn't exist as a separate concept - slash commands ARE skills in Claude Code.

Let me be direct about this - there's no "custom slash command" mechanism separate from skills. The only way to create a /something command is to create a skill.

The end of its 'thinking'. Conclusion:


⏺ There's no "custom slash command" mechanism separate from skills in Claude Code. Skills ARE the slash commands - /grade-text exists because there's a grade-text skill.

  Your options:

  1. Create a skill (what I proposed) - This IS how you get a custom /command
  2. Use a shell alias/script - A bash function that invokes Claude with a specific prompt
  3. Just ask me directly each time - "Run til-rules-checker and grade-text on this file"

  There's no middle ground where you get a /review-til command without defining a skill. That's how the architecture works.

First, I thought it had hallucinated, although it sounded pretty convinced. Then I asked Claude Code to list all available skills and it turns out it includes all commands too, even those that do not have a skill associated with it. So it seems to actually be the case that Claude Code sees every custom command as a shortcut to skills.

I checked the docs, but there is no explicit statement of that, but I found : The key difference: Skills are triggered automatically by Claude based on your request, while slash commands require you to type /command explicitly. This can be interpreted as having a much deeper meaning than how I initially read it.

The commands directory, where you define custom commands, still exists and can be used. What you create there will be listed as a skill too, which can be confusing. I do hope they do not remove it entirely because the concept of a command is easier to understand and has a lower-barrier to entry.

In other words, in Claude Code you do not have to build custom commands, you can build skills instead. Direct invocation of the skill? Just call it via an associated slash command.

Are commands capabilities?

At first, not being a language expert, it seemed strange to equate 'capability' and 'command'. But given this definition of capability, it does not sound too far-fetched: "Capability refers to the overall potential or capacity to achieve outcomes, integrating skills, knowledge, tools, behaviors, and resources.". This sounds like what a command can do too.

I am not a fan of being imprecise with naming, but for me, this is good enough. I am stepping over this semantics rabbit hole for now. We are seeing bleeding-edge evolution where features are developed as they are learned from. It is probably logical to see these shifts in naming until they settle. I expect this is not the end of it.

Where this seems to be heading (speculation)

If skills are becoming the primary unit of capability, this is starting to look more like a "composable agentic API". In this model, commands are no longer only instructions but direct entry points into a modular system of capabilities.

This solves the friction point I mentioned: the "discovery problem". Relying on an LLM to automatically trigger the right skill is powerful but unpredictable. By unifying skills and commands, Claude Code allows for a hybrid approach: automatic detection for speed, and direct invocation for precision.

If this pattern holds, the future of "LLM agents" may contain libraries of discrete, callable capabilities that can be orchestrated by both humans and other agents.

How about other agentic coding tools?

Note that making every skill also a command is currently a Claude Code-specific feature. However, I think it would make sense if other CLI agents adopted this approach too. As I mentioned, I was already doing the same thing manually.

Would I recommend only building skills? The main argument against is lock-in into Claude Code. Some tools may follow suit, others not, which would mean you cannot make use of the skills you build. Fortunately, it is relatively low effort to create 'wrapper' commands for skills, create the command markdown and trigger the skill, but it is a little more friction.

I never use Claude Code solely, but I like the fact you can combine skills, so I will probably try out resorting to simple command wrappers for now.

If Claude Code's model unifies commands and skills, and commands are only shortcuts to skills, it pushes LLM agents closer to something like a composable agentic API where every capability can be modular and directly callable.