kokh log

yumikokhの開発日記

ブランチ名を予測して切り替えるgitサブコマンドをつくった

背景

ブランチを切るたびに命名で固まる。考えるのが面倒で、結局 tmp とか wip-2 みたいな雑な名前にしてしまうことも多かった。

Claude Code 内の /branch スラッシュコマンドに頼っていたが、呼ぶには Claude Code を立ち上げる必要があり、起動コストが重い。 そのため git status 並みのレイテンシで叩けるサブコマンドをつくった。

つくったもの

git br-name というコマンド。差分から 1 秒でブランチ名を予測し、そのまま git checkout -b まで走るシェルスクリプト。Claude Code は起動せず、curl で Anthropic API を直叩きしている。

$ git br-name
Switched to a new branch 'feat/highlight-api'

今のブランチでちょっとした変更をしたときなどに気軽にブランチを切り替えられて便利。

仕組み

git は PATH 内に git-foo という実行ファイルを見つけると、自動で git foo というサブコマンドとして扱う仕様がある。

~/.local/bin/git-br-name   # ← chmod +x して PATH に

git br-name で呼べる。

中身は、git status --shortgit diff --stat の出力をプロンプトに埋め込んで、LLM にブランチ名を予測させるだけのシェルスクリプト。

段階的に速くしていった

Step 1: claude CLI の --print モード(〜14秒)

最初は素直に claude -p を使った。

echo "$PROMPT" | claude -p --model haiku --tools "" --no-session-persistence
  • -p (--print): 対話セッションを開かず一発実行
  • --tools "": ツール権限チェック不要
  • --model haiku: 一番速いモデル

→ それでも 約14秒。「git status 並み」には程遠い。

Step 2: --bare で起動オーバーヘッドを削る(〜10秒)

claude -p --bare を付けると、CLAUDE.md ロード、プラグイン同期、auto-memory などの初期化を全部スキップする最小モードになる。

ただし --bare は OAuth ログインを 使わず ANTHROPIC_API_KEY 環境変数が必須。

API キーの管理は分離する:

  • ~/.zsh_secretschmod 600、git 管理外)に export ANTHROPIC_API_KEY=... を書く
  • ~/.zshrc から [ -f "$HOME/.zsh_secrets" ] && source "$HOME/.zsh_secrets" で読み込む
  • 私の場合は zshrc が zprezto のリポジトリ管理下にあり、直書きすると git に混入するため

これで 約10秒。改善はしたが、まだ重い。

Step 3: curl で API 直叩き(〜1秒)

curl で Anthropic Messages API を直接叩く形に置き換えたら 約1秒 になった。

REQ=$(jq -nc --arg prompt "$PROMPT" '{
  model: "claude-haiku-4-5-20251001",
  max_tokens: 64,
  messages: [{role: "user", content: $prompt}]
}')

curl -sS https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d "$REQ" | jq -r '.content[0].text'

Node.js のブート時間も SDK 初期化も全部消えて、純粋に HTTPS 往復 + Haiku の推論時間だけになる。

注意: この方式では別途 Anthropic Console で API キーを発行し、クレジットを入金(top-up)しておく必要がある。Claude Code のサブスクリプションの定額枠は使えず、API リクエストごとの従量課金になる点に注意。

とはいえ Haiku は安価で、max_tokens: 64 制約も効くため 1 回あたり 1 円未満に収まる。日常的に叩いても月数百円以内のオーダー。

速度比較

構成 内訳 時間
claude -p(OAuth) Node ブート + CLI 初期化 + OAuth 認証 + プラグイン同期 + API call 〜14秒
claude -p --bare Node ブート + CLI 初期化 + API call 〜10秒
curl 直叩き API call のみ 〜1秒

claude CLI は機能豊富な反面、一発のテキスト生成にはオーバースペックだった。

最終的なスクリプト(抜粋)

~/.local/bin/git-br-name:

#!/usr/bin/env bash
set -euo pipefail

STATUS=$(git status --short)
DIFFSTAT=$(git diff --stat HEAD | tail -60)

PROMPT="以下は git リポジトリの現在の差分です。この作業内容を表すブランチ名を1つだけ出力してください。

ルール:
- プレフィックスは feat/ fix/ chore/ refactor/ docs/ test/ から選ぶ
- kebab-case の英語、30文字以内
- ブランチ名のみ出力。説明・引用符・コードフェンス・空行は禁止

# git status --short
$STATUS

# git diff --stat
$DIFFSTAT"

REQ=$(jq -nc --arg prompt "$PROMPT" '{
  model: "claude-haiku-4-5-20251001",
  max_tokens: 64,
  messages: [{role: "user", content: $prompt}]
}')

RAW=$(curl -sS https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d "$REQ" | jq -r '.content[0].text')

# 出力を正規表現でフィルタして余計な前置きを排除
NAME=$(echo "$RAW" | grep -Eo '(feat|fix|chore|refactor|docs|test)/[a-z0-9][a-z0-9-]*' | head -1)

git checkout -b "$NAME"

全文: https://gist.github.com/yumikokh/20437dfff4a680042c52516146de2e2d