Custom slash commands in Claude Code: how they work now that commands are skills Anthropic has merged custom slash commands into skills in Claude Code, making commands a subset of the skills system. The change means commands like `/fix-issue` now support argument expansion, tool grants that last only one turn, and shell command substitution via `!` syntax. A developer explains the new behavior, including precedence rules where skills override commands, and practical tips for using `$ARGUMENTS`, indexed access, and `allowed-tools`. You type /fix-issue 123 and Claude Code expands it into a full prompt with your team's standards attached. Custom slash commands are the cheapest automation in Claude Code — one markdown file, zero config — and they changed in a way that's easy to miss: custom commands have been merged into skills. Your .claude/commands/ files keep working, but the merged model explains several things that look like bugs arguments not expanding, tool grants vanishing mid-task and adds features commands never had. Here is the current behavior, verified against the official docs as of late July 2026. Drop a markdown file into your project: php < -- .claude/commands/fix-issue.md -- --- description: "Fix a GitHub issue by number" --- Fix GitHub issue $ARGUMENTS following our coding standards. Read the issue with gh issue view , locate the relevant code, implement the fix, and add a regression test. Typing /fix-issue 123 sends that content with $ARGUMENTS replaced by 123 . The merge means this file and a skill at .claude/skills/fix-issue/SKILL.md both create /fix-issue and behave the same way. What a skill adds on top: If a command and a skill share a name, the skill takes precedence. My practical rule: throwaway personal shortcuts can stay in commands/ ; anything you will grow or share belongs in skills/ . How to write a description that actually triggers is its own topic — I covered it in the SKILL.md guide https://dev.to/rulestack/skillmd-how-to-write-a-claude-code-skill-that-actually-triggers-format-template-27cp . $ARGUMENTS , $0 , and the quoting rules Three expansion rules cover almost every confusion I see: 1. $ARGUMENTS is the whole string as typed. /fix-issue 123 high-priority → $ARGUMENTS becomes 123 high-priority . 2. Indexed access is zero-based and shell-quoted. $ARGUMENTS 0 or the shorthand $0 is the first argument. Quoting groups words: php /migrate-component "search bar" React Vue → $0 = search bar, $1 = React, $2 = Vue 3. Missing values behave differently by placeholder type. An indexed placeholder with no matching argument $2 when you passed one arg stays in the text unchanged . A named placeholder declared in frontmatter expands to an empty string . If you need a literal dollar-digit in prose $1.00 , escape it: \$1.00 . One more safety net: if you pass arguments but the file contains no $ARGUMENTS at all, Claude Code appends ARGUMENTS: