Claude Codeを使っていると、同じプロンプトを毎回打ち込む場面が出てきます。「このファイルのコードをレビューして」「変更内容を見てコミットメッセージを作って」「テストを生成して」——こうした繰り返しをスラッシュコマンドとして登録しておくと、/reviewや/commitと入力するだけで実行できるようになります。
これを実現するのがカスタムスキル(.claude/skills/)です。Markdownファイルにプロンプトを書いてディレクトリに置くだけで、そのファイルがスラッシュコマンドとして登録されます。チームのgitリポジトリに追加すればメンバー全員が同じコマンドを使えるようになります。
この記事では、カスタムスキルの作り方から引数の使い方、YAMLフロントマターの全フィールド、実践的なスキルテンプレート5種まで解説します。Claude Code全般の基礎はClaude Code完全ガイドを参照してください。
カスタムスキルとは何か
Claude Codeのスキルは「チームや個人が定義したスラッシュコマンド」です。.claude/skills/ディレクトリにMarkdownファイル(SKILL.md)を置くと、そのスキルが/スキル名という形式のコマンドとして登録されます。
| 種類 | ファイルパス | 有効範囲 | 用途 |
|---|---|---|---|
| プロジェクトスキル | .claude/skills/名前/SKILL.md |
そのプロジェクトのみ | チーム共有・プロジェクト固有の作業 |
| 個人スキル | ~/.claude/skills/名前/SKILL.md |
全プロジェクト共通 | 個人のワークフロー・個人の好み |
| レガシーコマンド | .claude/commands/名前.md |
そのプロジェクトのみ | 旧形式(後方互換・引き続き動作) |
旧形式の
.claude/commands/は引き続き動作しますが、新形式の.claude/skills/が推奨されています。同名のスキルとコマンドが存在する場合、スキル(skills/)が優先されます。既存のプロジェクトでcommands/を使っている場合はそのまま使い続けても問題ありません。スキルの基本的な作り方
ディレクトリ構造
.claude/skills/の下にスキル名のディレクトリを作り、その中にSKILL.mdを置きます。シンプルなスキルはSKILL.mdだけで動作します。
.claude/
└── skills/
├── review/
│ └── SKILL.md # /review コマンドになる
├── commit/
│ └── SKILL.md # /commit コマンドになる
└── test-gen/
├── SKILL.md # /test-gen コマンドになる
├── examples/
│ └── sample.md # 期待出力の例(オプション)
└── scripts/
└── helper.sh # 前処理スクリプト(オプション)
最小構成のSKILL.md
YAMLフロントマターとMarkdown本文の2つのパーツで構成されます。フロントマターは必須ではありませんが、descriptionを書くことでClaudeがどのシーンでこのスキルを使うべきか判断できるようになります。
--- name: review description: 指定したファイルまたは現在の変更をコードレビューする argument-hint: [ファイルパス] --- $ARGUMENTSで指定されたファイル(引数なしの場合はgit diffの変更)をコードレビューしてください。 以下の観点でレビューしてください: 1. バグ・潜在的なエラー 2. セキュリティ上の問題(SQLインジェクション、XSS、機密情報の漏洩等) 3. パフォーマンスの問題 4. コードの可読性・命名 5. テストの欠落 問題を発見した場合は、ファイル名と行番号を明記して具体的な修正案を示してください。
これを.claude/skills/review/SKILL.mdとして保存したら、Claude Codeのセッションで/reviewや/review src/auth/login.tsとして呼び出せます。
引数の使い方
スキルに引数を渡すには、SKILL.mdの本文に引数プレースホルダーを書きます。呼び出し時に渡した値が自動的に置換されます。
| プレースホルダー | 意味 | 例 |
|---|---|---|
$ARGUMENTS |
渡されたすべての引数をそのまま展開 | /fix 123 → 123 |
$0(または$ARGUMENTS[0]) |
第1引数 | /migrate Button React Vue → Button |
$1(または$ARGUMENTS[1]) |
第2引数 | 上と同じ呼び出し → React |
$2(または$ARGUMENTS[2]) |
第3引数 | 上と同じ呼び出し → Vue |
--- name: migrate description: コンポーネントを指定フレームワークから別フレームワークへ移行する argument-hint: [コンポーネント名] [移行元] [移行先] --- $0 コンポーネントを $1 から $2 に移行してください。 移行手順: 1. $0 の現在の実装を src/components/$0/ で読み取る 2. $2 の書き方に対応した実装に変換する 3. テストファイル($0.test.ts)も $2 対応に更新する 4. 変更内容を説明するコメントをコードに追加する
# 1つの引数 /fix 123 # 複数の引数 /migrate SearchBar React Vue # 引数なし($ARGUMENTS が空になる) /review
スキル内に
$ARGUMENTSがある場合、引数なしで呼び出すとプレースホルダーが空文字になります。スキル内に$ARGUMENTSがない場合は、渡した引数がARGUMENTS: 値として自動的にスキルの末尾に追加されます。シェル前処理でコンテキストを自動収集する
SKILL.mdでは !`コマンド` 構文を使うと、スキルがClaudeに送られる前にシェルコマンドを実行して結果を埋め込めます。PRの差分・テスト結果・ログなどを自動でコンテキストに含められます。
--- name: pr-review description: 現在のPRの差分とコメントをもとにコードレビューを行う --- 以下の情報をもとに、このPRをレビューしてください。 ## PRの差分 !`gh pr diff` ## PRの説明とコメント !`gh pr view --comments` レビューの観点: 1. PRの説明と実際の変更内容が一致しているか 2. バグ・セキュリティ問題 3. テストの十分さ 4. ドキュメントの更新が必要かどうか
!`gh pr diff`はスキル実行時にGitHub CLIを呼び出してPRの差分を取得し、その出力をプロンプトに埋め込みます。Claudeにプロンプトが届く時点では差分テキストがすでに含まれているため、毎回手動でコピーペーストする必要がありません。
YAMLフロントマター全フィールド
| フィールド | 型 | 説明 |
|---|---|---|
name |
文字列 | コマンド名(英数字・ハイフン・数字のみ、最大64文字)。省略するとディレクトリ名が使われる |
description |
文字列 | スキルの説明。Claudeが自動呼び出しするかどうかの判定に使用。詳しいほどよい |
argument-hint |
文字列 | オートコンプリート表示用のヒント。例: [ファイルパス]、[コンポーネント名] [移行元] [移行先] |
allowed-tools |
文字列(カンマ区切り) | このスキルで使用を許可するツール。例: Read, Grep, Bash |
disable-model-invocation |
boolean | trueにするとClaudeの自動呼び出しを禁止。手動で/名前を入力した場合のみ実行 |
user-invocable |
boolean | falseにすると/メニューから非表示になりClaude専用コマンドとして動作 |
model |
文字列 | このスキルの実行に使うモデルを指定。例: claude-opus-4-6 |
effort |
文字列 | 推論の深さ。low/medium/high/max |
context |
文字列 | forkを指定すると隔離されたサブエージェント環境で実行される |
agent |
文字列 | context: fork使用時のエージェントタイプ。デフォルト: general-purpose |
descriptionはClaudeがこのスキルをいつ自動実行するか判断する根拠になります。「コードをレビューする」より「PRの変更差分やファイルを受け取り、バグ・セキュリティ・可読性の観点でレビューし結果を日本語で返す」のように具体的に書くほうが、意図しない自動実行や呼び出し漏れが減ります。実践スキルテンプレート集
① コミットメッセージ自動生成
--- name: commit description: git diffのステージング済み変更を分析してコミットメッセージを作成しgit commitする --- ステージング済みの変更をレビューしてコミットしてください。 ## 変更内容 !`git diff --staged` ## 指示 1. 変更内容を分析し、適切なコミットメッセージを作成する 2. Conventional Commits形式で書く(feat/fix/refactor/test/docs/chore) 3. 件名は50文字以内の日本語で書く 4. 変更の「何を」「なぜ」が分かる内容にする 5. `git commit -m "件名"` を実行する コミットメッセージの例: - feat: ユーザー認証にOAuth2.0を追加 - fix: セッションタイムアウト時のリダイレクト先を修正 - refactor: UserServiceをRepositoryパターンに分離
② テストコードの自動生成
--- name: test-gen description: 指定したファイルのユニットテストを自動生成する argument-hint: [ファイルパス] allowed-tools: Read, Write, Bash --- $ARGUMENTS のユニットテストを作成してください。 ## 手順 1. $ARGUMENTS を読み込んで実装を把握する 2. 既存テストファイルがあれば読み込んでスタイルを合わせる 3. 以下の観点でテストケースを作成する: - 正常系: 主要な機能が期待通り動作するか - 異常系: エラーケース・境界値・nullチェック - エッジケース: 空配列・最大値・特殊文字等 4. テストファイルをソースファイルと同ディレクトリに配置(.test.tsサフィックス) 5. `npm run test $ARGUMENTS` で実行してグリーンになることを確認する テストフレームワーク: このプロジェクトで使用しているものを自動判定する
③ GitHub Issue → 実装
--- name: fix-issue description: GitHubのIssue番号を受け取り、内容を読んで実装・PRを作成する argument-hint: [Issue番号] --- GitHub Issue #$ARGUMENTS を解決してください。 ## Issueの内容 !`gh issue view $ARGUMENTS` ## 手順 1. Issueの内容を読んで実装方針を決定する 2. 新しいブランチを作成する: `git checkout -b fix/issue-$ARGUMENTS` 3. 実装する(テストも含めて) 4. `git add` して変更をステージングする 5. コミットする(コミットメッセージにIssue番号を含める) 6. PRを作成する: `gh pr create --title "fix: Issue #$ARGUMENTS の修正" --body "Closes #$ARGUMENTS"` 実装前に計画を提示して承認を取ってから進めること。
④ デバッグアシスタント
--- name: debug description: エラーメッセージや症状を受け取ってバグの原因を特定し修正する argument-hint: [エラーメッセージまたは症状の説明] --- 以下のバグを調査して原因を特定し、修正してください。 ## 症状・エラー $ARGUMENTS ## 手順 1. エラーメッセージ・スタックトレースを分析する 2. 関連するソースファイルを読む(エラーが発生している箇所から追う) 3. 原因を特定する(複数ある場合はすべて列挙) 4. 最も可能性が高い原因から修正する 5. 修正後にテストを実行して確認する 注意: 根本原因を修正すること。症状を隠すような修正(try/catchで握りつぶす等)は避ける。
⑤ アーキテクチャレビュー(隔離実行)
--- name: arch-review description: プロジェクト全体のアーキテクチャを分析してレポートを作成する(読み取り専用) allowed-tools: Read, Glob, Grep context: fork effort: high --- このプロジェクトのアーキテクチャを分析してレポートを作成してください。 ## 分析観点 1. レイヤー構造と依存関係(循環依存の有無) 2. 責務の分離(単一責任原則の遵守状況) 3. テスタビリティ(DIの使用・モック可能性) 4. 技術的負債と改善優先度 5. スケール時のボトルネック候補 ## 出力形式 `docs/architecture-review.md` として保存すること。 変更・削除・コマンド実行は行わず、レポート作成のみ行うこと。
このスキルはcontext: forkで隔離されたサブエージェント環境で実行され、allowed-tools: Read, Glob, Grepで読み取り専用に制限されています。大規模なコードベース分析を安全に実行できるパターンです。Subagentsとの組み合わせについてはClaude Code Subagents完全ガイドを参照してください。
チームでスキルを共有する
.claude/skills/をgitリポジトリに追加することで、チーム全員が同じカスタムコマンドを使えるようになります。新しいメンバーがcloneした時点でコマンドが使える状態になります。
# Claude Code の個人設定は共有しない .claude/settings.local.json .claude/MEMORY.md .claude/memory/ # スキルはチームで共有する(除外しない) # .claude/skills/ はgitに追加する
- SKILL.mdの
descriptionを日本語で丁寧に書く(チームメンバーが使い方を把握できるように) argument-hintを設定する(オートコンプリートで引数の使い方が分かる)- READMEやCLAUDE.mdにカスタムスキル一覧を記載する
- 個人の好みに依存するスキルは
~/.claude/skills/に入れてプロジェクトに含めない
CLAUDE.mdでスキルを案内する
CLAUDE.mdにカスタムスキル一覧を書いておくと、Claude Codeがセッション開始時に読み込んでスキルの存在を認識します。また新しいチームメンバーへのオンボーディングにも役立ちます。
## カスタムスキル一覧 このプロジェクトでは以下のカスタムコマンドが使えます: | コマンド | 説明 | 使い方 | |---------|------|-------| | `/review` | コードレビュー | `/review src/auth/login.ts` | | `/commit` | ステージング済み変更をコミット | `/commit` | | `/test-gen` | テストコード自動生成 | `/test-gen src/services/user.ts` | | `/fix-issue` | GitHub Issue を実装 | `/fix-issue 123` | | `/debug` | バグの原因調査と修正 | `/debug "TypeError: Cannot read property..."` | | `/arch-review` | アーキテクチャレビュー | `/arch-review` |
まとめ
カスタムスキルは.claude/skills/スキル名/SKILL.mdにMarkdownを置くだけで作れます。$ARGUMENTS・$0・$1で引数を受け取れ、!`コマンド`でシェル前処理も使えます。
YAMLフロントマターでallowed-toolsによるツール制限・context: forkによる隔離実行・effort: highによる深い推論などきめ細かい制御が可能です。gitに追加してチームで共有すれば、全員が同じコマンドを使って品質を均一化できます。
Hooksと組み合わせると、スキル実行前後に自動でチェックを走らせることも可能です。Claude Code Hooks完全ガイドも参考にしてください。
よくある質問
Q既存の .claude/commands/ はどうすれば良いですか?
A引き続き動作するため、すぐに移行する必要はありません。新しいコマンドを追加するときに.claude/skills/形式を使うというスタイルで段階的に移行するのが現実的です。同名のスキルとコマンドが存在する場合はスキル(skills/)が優先されます。
Qスキルファイルの文字数・行数に制限はありますか?
A公式に明記されている上限はありませんが、SKILL.mdが長すぎるとClaudeのコンテキストを圧迫します。目安として300行以内に収めることを推奨します。長くなる場合はexamples/サブディレクトリに例を切り出すか、スキルを分割することを検討してください。
Q引数にスペースを含む文字列を渡せますか?
Aクォートで囲めばスペースを含む引数を渡せます。例:/fix-issue "ログイン画面でエラーが出る"。$ARGUMENTSは渡された文字列全体を受け取ります。個別の引数として分けたい場合は$0・$1を使います。
Qスキルの中でスキルを呼び出せますか?
A直接の入れ子呼び出しはサポートされていませんが、context: forkを使って独立したサブエージェントとして実行するスキルを組み合わせることで似たような効果が得られます。複雑な連携が必要な場合はSubagentsの使用を検討してください。
QスキルとSubagentsの違いは何ですか?
Aスキルは「プロンプトをスラッシュコマンドとして登録したもの」で、毎回同じClaudeセッション内で実行されます。Subagentsは「特定の役割・ツール・モデルを持つ独立したエージェント」で、並列実行・隔離実行が可能です。繰り返しプロンプトの自動化はスキル、複雑な並列タスクや専門エージェントはSubagentsが向いています。詳細はClaude Code Subagents完全ガイドを参照してください。
Qcontext: fork を使うとセッションのコンテキストは引き継がれますか?
Acontext: forkで実行されるスキルは独立したサブエージェントとして起動されます。CLAUDE.mdは自動で読み込まれますが、現在のセッションの会話履歴は引き継がれません。権限設定(settings.json)は引き継がれます。読み取り専用分析など、「クリーンな状態で深い分析をさせたい」ときに適しています。

