❗️

`!` を使ってClaude Codeのコミット生成を爆速にする

に公開

Claude Code のスキル(Skills)を書いていたのですが、!`<command>` という記法でシェルコマンドの結果を動的に埋め込めることを知りました。これが便利だったので紹介します。

tl;dr

  • スキル内で !`<command>` と書くと、シェルコマンドの実行結果がプロンプトに埋め込まれる
  • Claude が受け取る前に前処理として実行されるので、Claude は展開後の実データを見る
  • Claude が毎回コマンド実行を判断する手間が省け、時間とクォータの節約になる

!`<command>` で動的コンテキストを注入する

スキルファイル内で !`<command>` と書くと、スキル実行時にシェルコマンドの結果が埋め込まれます。

スキルとは?(そもそも Claude Skill を知らない人向けの解説)

Claude Code で / から始まるコマンドを自分で定義できる機能です。例えば、.claude/commands/foo.md または .claude/skills/foo/SKILL.md にマークダウンファイルを置くと /foo として使えるようになります。

ファイルの中身がそのままプロンプトとして Claude に渡されるので、よく使う指示をテンプレート化しておくと便利です。frontmatter で allowed-toolsdescription などの設定もできます。

以前は Slash Command として知られていたものも今は skills に統一されており、ユーザーが明示的に起動することも、Claude が状況に合わせて自律的に実行することもできます。user-invocabledisable-model-invocation のフラグを使って、ユーザーから呼び出せるかどうか、Claude から呼び出せるかどうか(=Claude のコンテキストに入れるか)を制御することもできます。

詳しくは公式ドキュメントを参照してください。

現在のブランチ: !`git branch --show-current`

これを含むスキルを実行すると、Claude が受け取る時点では以下のように展開されています。

現在のブランチ: main

ポイントは、これは Claude が実行するのではなく、Claude Code が前処理として行うという点です。Claude は展開後の実データを受け取ります。

実際の例

私は /git-commit-auto というスキルを作って使っています。ステージングされた変更から自動でコミットメッセージを生成してコミットするものです。(実際に使っているものは長いので簡略版を載せています)

---
allowed-tools: Bash(git status:*), Bash(git diff:*), Bash(git log:*), Bash(git commit:*)
description: Create a new git commit for staged changes
---

## Git Context

### Staged Changes

```diff
!`git diff --staged`
```

### Git Status

```
!`git status`
```

### Recent Commits (for style reference)

```
!`git log --oneline -20`
```

## Behavior

1. Analyze the git context above
2. Generate a commit message following Conventional Commits specification
3. Execute `git commit` with the generated message

/git-commit-auto を実行すると、Claude Code がまず !`<command>` の部分を全て展開します。Claude は実際の diff や status を見た状態でプロンプトを受け取るので、リポジトリの状況に応じた適切なコミットメッセージを生成できます。

この使い方は公式ドキュメントでも紹介されている典型的な !`<command>` の用例です。

なぜ嬉しいか

普通にコミットの手順だけをプロンプトに含めると、Claude が git statusgit diff --staged などのコマンド実行を判断 -> コマンドを実行 -> 実行結果を確認 -> コミットメッセージ生成、という流れになります。レビューのためには必須のためどうせ実行されるコマンドなのに、毎回 Claude が判断して実行するのを待つ往復が発生します。

!`<command>` で先に実行しておけば、Claude は最初から必要な情報が揃った状態でコミットメッセージ生成に入れるので、1〜2 往復分の時間とクォータが節約できます。

Before / After

実際の動作を比較してみましょう。

Before: !`<command>` なし

bang interpolation なし

!`<command>` を使わない場合、Claude が git diff --stagedgit statusgit log を実行してから分析に入ります。

After: !`<command>` あり

bang interpolation あり

Claude は最初から diff や status の情報を持っているので、すぐにコミットメッセージ生成に入れます。

下部のステータスラインに注目してください。経過時間は 22.7s → 14.4s(約 37% 減)、トークン消費は 8705/705 → 5936/472(入力 32% 減、出力 33% 減)となっています。体感にして 8 秒減は結構嬉しいです。

$ARGUMENTS との組み合わせ

!`<command>` と一緒に使うと便利なのが $ARGUMENTS です。スキルに渡した引数を受け取れます。

変数 説明
$ARGUMENTS 渡された全ての引数 /fix-issue 123123
$ARGUMENTS[N] N 番目の引数(0 ベース) $ARGUMENTS[0] は第 1 引数
$0, $1 ... $ARGUMENTS[N] の短縮形

これを組み合わせると、引数に応じて動的にコンテキストを取得できます。

---
description: Review a specific pull request
allowed-tools: Bash(gh *)
argument-hint: [pr-number]
---

## PR #$0 の情報

### 差分

!`gh pr diff $0`

### コメント

!`gh pr view $0 --comments`

上記の PR をレビューしてください。

/review-pr 123 と実行すると、PR #123 の差分やコメントが自動で取得されます。Claude が gh pr diffgh pr view を実行する往復を待たずに済みます。

他に思いつく使い方

  • cli のスキル化: 以下のようにすると、これがヘルプコマンドの出力であることが Claude Code に伝わると同時に、CLI のバージョンが変わった場合などでも、インストールされている CLI バージョンの help を参照させられるのでよさそうです。

    <cli-name> --help: !`<cli-name> --help`
    
  • 環境確認: node -v, python --version などを含めると嬉しい場合もありそうです。

注意点

  • 出力サイズ: 出力が大きすぎるとコンテキストを圧迫します。head--oneline などのオプションで制限するのがおすすめです。
  • エラー時: コマンドが失敗するとスキル自体がエラーになります。引数で渡された値が不正な場合などに注意が必要です。
  • Bash mode との違い: Claude Code には ! npm test のように ! で始める Bash mode もありますが別物です。Bash mode はユーザーが直接実行するもので、!`<command>` はスキル実行前の前処理です。

まとめ

!`<command>` を使うと、スキルに動的なコンテキストを埋め込めます。claude code に commit message を書かせている方も多いと思います。claude が毎回git loggit statusgit diff の実行を判断する時間や、クォータの節約になるのでとってもおすすめです。

Discussion