0:00 0:00
Article
Claude Codeのカスタムスラッシュコマンドで作業を効率化する方法
Claude Codeのカスタムスラッシュコマンド(Skills)の作り方を実例ベースで整理します。`.claude/commands/`と`.claude/skills/`の関係、frontmatter、引数渡し、bash・@ファイル参照、自動起動制御、配布スコープ、よくある設計ミスまでを扱います。
Claude Codeを毎日使っていると、「またこの依頼文を貼り付けている」「毎回同じ手順をAIに説明している」場面が必ず出てきます。これはCLIに自作の関数を定義するべきタイミングで、Claude Codeではカスタムスラッシュコマンドとして登録できます。本記事では、最新仕様(コマンドはSkillsに統合済み)に沿って、作成方法・引数の渡し方・配布の3点を実例ベースで整理します。
結論:.claude/commands/か.claude/skills/にMarkdownを置くだけ
カスタムスラッシュコマンドは、リポジトリ直下の.claude/commands/<name>.mdまたはユーザー共通の~/.claude/commands/<name>.mdに Markdown ファイルを置くだけで作成できます。中身はそのままAIへの依頼文として扱われ、/<name>で呼び出せます。
公式ドキュメントによると、2026年時点でカスタムコマンドはSkillsに統合されました。.claude/commands/deploy.mdと.claude/skills/deploy/SKILL.mdはどちらも/deployコマンドを作成し、ほぼ同じように動きます。.claude/commands/配下の既存ファイルはそのまま動作しますが、.claude/skills/を使うと「補助ファイルをサブディレクトリにまとめる」「Claudeが自動起動できる」などの機能が追加で使えます。新規作成ならSkills形式が公式の推奨です。
判断は単純です。
- 手動で呼びたいだけ:
.claude/commands/<name>.mdで十分 - 補助スクリプトや参照資料を同梱したい・Claudeに自動起動させたい:
.claude/skills/<name>/SKILL.md
CLAUDE.md自体の書き方は「CLAUDE.mdテンプレート完全版」、CLIコマンド全体は「Claude Codeの基本コマンドと日常的に使う操作まとめ」に任せ、本記事は「自作コマンド」に絞ります。
最小例:30行で動くカスタムコマンド
まずはコマンド形式の最小例を見ます。プロジェクトのリリースノート草案を生成する/release-notesコマンドを作ります。
.claude/
└─ commands/
└─ release-notes.md
.claude/commands/release-notes.mdの中身は次のようにします。
---
description: 直近のコミットからリリースノート草案を作成する
argument-hint: [前回タグ]
allowed-tools: Bash(git log:*) Bash(git diff:*)
---
直近のコミットを確認してリリースノート草案を作成してください。
## 入力
- 比較基準: $ARGUMENTS(前回タグやコミットハッシュ。未指定なら直近20件)
- コミット履歴: !`git log --oneline -n 20`
- 変更ファイル一覧: !`git diff --name-only $ARGUMENTS HEAD 2>/dev/null || git diff --name-only HEAD~20 HEAD`
## 出力ルール
- ユーザーから見える変更だけを Features / Fixes / Internal の3カテゴリでまとめる
- 内部リファクタは Internal に集約する
- 破壊的変更がある場合は冒頭に **BREAKING:** を付ける
- Markdown 箇条書きで返す
これでClaude Code内で/release-notes v1.2.0と打つと、v1.2.0が$ARGUMENTSに展開され、git logの出力もコマンドに埋め込まれた状態でClaudeに渡されます。
frontmatterの主要フィールド
公式仕様で押さえるべきfrontmatterは次のとおりです。
| フィールド | 役割 | 例 |
|---|---|---|
description | コマンドの説明。Claudeが自動起動するかの判断にも使う | 直近のコミットからリリースノートを作る |
argument-hint | 補完UIに表示される引数ヒント | [前回タグ] |
arguments | 名前付き位置引数($issue $branch のように展開できる) | [issue, branch] |
allowed-tools | コマンド実行中だけ権限を許可するツール | Bash(git log:*) Edit |
disable-model-invocation | true にするとClaudeが勝手に起動しなくなる(手動限定) | true |
model | このコマンド中だけ使うモデル | claude-haiku |
effort | このコマンド中だけの推論レベル | low medium high |
context | forkを指定するとサブエージェントで実行 | fork |
agent | context: fork時に使うサブエージェント種別 | Explore |
paths | このコマンドを自動ロードする対象パスを限定するglob | src/**/*.ts |
allowed-toolsは「コマンド実行中だけツール承認を省略する」許可リストです。すべての権限を付与するのではなく、コマンドが本当に必要とするものだけを書きます。たとえばコミット用コマンドなら、Bash(git add *) Bash(git commit *) Bash(git status *)に絞るのが安全です。
disable-model-invocation: trueは副作用のあるコマンドで重要です。/deployや/send-slack-messageのような「Claudeが勝手に判断して呼ぶと困るコマンド」には必ず付けてください。
引数の渡し方:$ARGUMENTSと$0の使い分け
カスタムコマンドの引数は3つの形式で参照できます。
| 表記 | 意味 |
|---|---|
$ARGUMENTS | 入力全体を1つの文字列として取得 |
$ARGUMENTS[0] / $0 | 0始まりの位置引数 |
$issue などの$<name> | frontmatterのargumentsで定義した名前付き引数 |
複数引数を扱うときは、frontmatterにargumentsを宣言しておくと読み手にやさしくなります。
---
description: コンポーネントを別フレームワークへ移行する
arguments: [component, from, to]
argument-hint: [component-name] [from-framework] [to-framework]
---
$component を $from から $to に移行してください。既存のテストと挙動は維持してください。
呼び出しは/migrate-component SearchBar React Vueのように書きます。SearchBar React Vueが空白区切りで$component $from $toに割り当てられます。
複数語を1つの引数として渡したい場合はクオートで囲みます。例:/release-notes "v1.2.0 release"。
動的コンテキスト注入:!と@の違い
カスタムコマンドの強みは、ClaudeにファイルやコマンドOutputを渡す前処理を1か所で書けることです。2つの記法を使い分けます。
!`<command>`:シェルコマンドを実行し、出力をその場に挿入してからClaudeに渡す(前処理)@<path>:ファイルを参照対象として読み込ませる
最小例:
## 状況
- 現在のブランチ: !`git rev-parse --abbrev-ref HEAD`
- 最新のテスト失敗ログ: !`grep -E '(FAIL|ERROR)' test.log | tail -20`
- レビュー対象ファイル: @src/lib/auth.ts
!`...`はClaudeが起動する前に手元のシェルで実行され、結果テキストが本文に埋め込まれます。ClaudeがBashツールを呼ぶわけではない点に注意してください。長文を出すコマンドはコンテキストを圧迫します。grep -E '(FAIL|ERROR)' | tail -20のように、必要部分だけ抜き出してから渡すのがコツです。コンテキスト消費の設計全体は「Claude Codeに必要な情報だけ渡すコンテキスト設計」で扱っています。
複数行のシェルブロックを書きたいときは、フェンス記法も使えます。
## 環境
```!
node --version
npm --version
git status --short
```
配布スコープ:個人・プロジェクト・チーム
カスタムコマンドは保存場所で公開範囲が変わります。
| 場所 | 範囲 |
|---|---|
~/.claude/commands/<name>.md | 自分のすべてのプロジェクト |
.claude/commands/<name>.md | このプロジェクト |
<plugin>/skills/<name>/SKILL.md | プラグインを有効にしたユーザー |
| Managed settings | 組織全体 |
優先順位は Enterprise > Personal > Project、プラグインは別名前空間(plugin-name:skill-name)になります。
チームに配布するときの実務的なポイントは次のとおりです。
.claude/commands/をGit管理し、ワークスペース信頼ダイアログでメンバーに承認させるallowed-toolsは最小限。コミット用ならBash(git add *)のように対象を絞る- 副作用のあるコマンドは必ず
disable-model-invocation: trueを入れて、Claudeの勝手な起動を防ぐ - 個人専用の実験コマンドは
~/.claude/commands/に置き、リポジトリに混入させない
レビュー必須化やチーム運用の枠組み自体は「チームでClaude Codeを導入するときに最初に決めるルール」を参照してください。
実用テンプレ3本
1. /commit:差分要約→コミット
---
description: ステージ済みの差分を確認してConventional Commits形式でコミットする
disable-model-invocation: true
allowed-tools: Bash(git status:*) Bash(git diff:*) Bash(git add:*) Bash(git commit:*)
---
## 現在の状態
- ステータス: !`git status -s`
- ステージ済み差分: !`git diff --cached`
## 手順
1. 差分を要約し Conventional Commits の type を判定する
2. 1コミット=1意図になっているか確認する。混ざっていれば指摘して停止
3. コミットメッセージ案を提示し、ユーザー承認後に `git commit -m` を実行する
2. /pr-summary:PR本文ドラフト
---
description: 現在のブランチのPR本文ドラフトを書く
argument-hint: [base-branch]
allowed-tools: Bash(git log:*) Bash(git diff:*) Bash(gh pr view:*)
---
## 入力
- ベースブランチ: $ARGUMENTS(未指定なら main)
- コミット履歴: !`git log --oneline $ARGUMENTS..HEAD 2>/dev/null || git log --oneline main..HEAD`
- 変更ファイル: !`git diff --name-only $ARGUMENTS...HEAD 2>/dev/null || git diff --name-only main...HEAD`
## 出力
- ## Summary(3〜5行)
- ## Test plan(チェックリスト)
- ## Notes(破壊的変更や注意点があれば)
3. /explore-area:fork実行で並列調査
---
description: 指定ディレクトリの全体像を読み取り専用で調査する
argument-hint: [path]
context: fork
agent: Explore
---
$ARGUMENTS 配下のコード構成を調査してください。
1. Glob と Grep で主要ファイルを特定する
2. 依存関係とエントリポイントを把握する
3. 「触ると怖い箇所」「テストカバレッジが薄い箇所」を指摘する
4. 結論を 200 字以内のサマリにする
context: forkを使うと、サブエージェントで実行されメインの会話履歴を埋めません。大規模な調査依頼で重宝します。サブエージェントの全体像は「Claude Codeのサブエージェントとは?使いどころと注意点」を参照してください。
よくある設計ミス5つ
| ミス | 何が起きる | 対処 |
|---|---|---|
| 1ファイルに全部詰め込む | 200行を超えてAIが読み流す | 補助ドキュメントを別ファイルに切り出し@で参照 |
descriptionが曖昧 | Claudeが自動起動してくれない/されすぎる | 動詞+トリガー語+ユースケースを冒頭に書く |
allowed-toolsに広い権限 | レビューなしに任意Bashが通る | Bash(git status:*)のようにサブコマンド単位で絞る |
disable-model-invocationを付け忘れ | /deployが勝手に走る | 副作用ありコマンドは必ずtrue |
!で巨大ログを流し込む | コンテキストが一発で枯渇 | grep/tailで必要行だけに絞る |
動作確認と更新
カスタムコマンドはセッション中の変更も即時反映されます(公式の Live change detection)。~/.claude/commands/、./.claude/commands/、--add-dirで追加したディレクトリの.claude/commands/はファイル変更が監視されます。ただし最上位の commands ディレクトリ自体を新規作成した場合はClaude Codeの再起動が必要です。
確認には/helpで一覧を見るか、ターミナルで補完を試します。
claude 起動後に/を入力すると自作コマンドが候補に出ます。挙動が変なときは/doctorで診断します。
/doctor 導入チェックリスト
- コマンド名はケバブケースで短く動詞起点にした(例:
release-notespr-summary) -
descriptionにトリガー語とユースケースを書いた - 副作用のあるコマンドには
disable-model-invocation: trueを付けた -
allowed-toolsはサブコマンド単位の最小権限にした -
!で流し込むログはgrep/tailで行数を絞った - 個人専用は
~/.claude/commands/、共有は.claude/commands/に置き分けた - チーム共有はGit管理し、ワークスペース信頼ダイアログを通している
- 200行を超えそうな手順は補助ファイルへ分割し
@で参照した
次に読むおすすめ記事:
- 「Claude Codeの基本コマンドと日常的に使う操作まとめ」:CLIコマンドとスラッシュコマンド全体像
- 「CLAUDE.mdテンプレート完全版」:コマンドと並ぶ「共通ルール」の集約先
- 「Claude Codeにコード規約を守らせるための書き方」:HooksとSkillsの使い分け