Created
May 16, 2026 08:15
-
-
Save yumikokh/20437dfff4a680042c52516146de2e2d to your computer and use it in GitHub Desktop.
git-br-name: 現在の差分から1秒でブランチ名を予測し checkout までするシェルスクリプト (Anthropic Haiku API)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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