Skip to content

Instantly share code, notes, and snippets.

@yumikokh
Created May 16, 2026 08:15
Show Gist options
  • Select an option

  • Save yumikokh/20437dfff4a680042c52516146de2e2d to your computer and use it in GitHub Desktop.

Select an option

Save yumikokh/20437dfff4a680042c52516146de2e2d to your computer and use it in GitHub Desktop.
git-br-name: 現在の差分から1秒でブランチ名を予測し checkout までするシェルスクリプト (Anthropic Haiku API)
#!/usr/bin/env bash
# git-br-name — 現在の差分からブランチ名を予測する
#
# Usage:
# git br-name 予測した名前で git checkout -b する(デフォルト)
# git br-name -n 名前を出力するだけ、checkout はしない(dry-run)
# git br-name -h ヘルプ
#
# 仕組み:
# ANTHROPIC_API_KEY があれば curl で API を直叩き(高速、~1-2秒)。
# 無ければ claude CLI 経由にフォールバック(~10秒、OAuth 認証)。
set -euo pipefail
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "error: not a git repository" >&2
exit 1
fi
CHECKOUT=1
case "${1:-}" in
-n|--dry-run) CHECKOUT=0 ;;
-h|--help)
sed -n '2,11p' "$0" | sed 's/^# \{0,1\}//'
exit 0 ;;
esac
STATUS=$(git status --short 2>/dev/null || true)
DIFFSTAT=$(git diff --stat HEAD 2>/dev/null | tail -60 || true)
if [[ -z "$STATUS" && -z "$DIFFSTAT" ]]; then
echo "error: no changes detected (staged, unstaged, or untracked)" >&2
exit 1
fi
PROMPT="以下は git リポジトリの現在の差分です。この作業内容を表すブランチ名を1つだけ出力してください。
ルール:
- プレフィックスは feat/ fix/ chore/ refactor/ docs/ test/ から選ぶ
- kebab-case の英語、30文字以内
- ブランチ名のみ出力。説明・引用符・コードフェンス・空行は禁止
- 出力例: feat/notion-highlight-api
# git status --short
$STATUS
# git diff --stat
$DIFFSTAT"
if [[ -n "${ANTHROPIC_API_KEY:-}" ]] && command -v jq >/dev/null 2>&1; then
# Fast path: direct API call via curl
REQ=$(jq -nc \
--arg prompt "$PROMPT" \
'{
model: "claude-haiku-4-5-20251001",
max_tokens: 64,
messages: [{role: "user", content: $prompt}]
}')
RAW=$(curl -sS --max-time 20 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 // empty')
elif command -v claude >/dev/null 2>&1; then
# Fallback: claude CLI (slower, uses OAuth)
RAW=$(printf '%s' "$PROMPT" | claude -p --model haiku --tools "" --no-session-persistence 2>/dev/null)
else
echo "error: neither ANTHROPIC_API_KEY+jq nor claude CLI is available" >&2
exit 127
fi
NAME=$(printf '%s' "$RAW" \
| tr -d '\r' \
| grep -Eo '(feat|fix|chore|refactor|docs|test)/[a-z0-9][a-z0-9-]*' \
| head -1)
if [[ -z "$NAME" ]]; then
echo "error: failed to generate branch name" >&2
echo "raw response: $RAW" >&2
exit 1
fi
if [[ $CHECKOUT -eq 1 ]]; then
git checkout -b "$NAME"
else
echo "$NAME"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment