Skip to content

原文(日本語に翻訳)

--worktree セッションで実行中の場合に、ステータスラインフックコマンドに名前・パス・ブランチ・オリジナルリポジトリディレクトリを含む worktree フィールドを追加

原文(英語)

Added worktree field to status line hook commands with name, path, branch, and original repo directory when running in a --worktree session

概要

ワークツリーセッション(--worktree フラグで起動)でフックが発火する際、イベントデータに worktree フィールドが追加されるようになりました。このフィールドにはワークツリーの名前・パス・ブランチ名・元リポジトリのディレクトリが含まれており、ワークツリーを意識したフック処理が実現できます。

worktreeフィールドの構造

json
{
  "worktree": {
    "name": "feature-auth",
    "path": "/home/user/project/.claude/worktrees/feature-auth",
    "branch": "worktree-feature-auth",
    "originalRepoDir": "/home/user/project"
  }
}

基本的な使い方

フックスクリプトでワークツリー情報を取得:

python
#!/usr/bin/env python3
import json
import sys

event = json.load(sys.stdin)
worktree = event.get("worktree")

if worktree:
    print(f"ワークツリー: {worktree['name']}")
    print(f"ブランチ: {worktree['branch']}")
    print(f"パス: {worktree['path']}")
else:
    print("メインリポジトリで実行中")

実践例

ワークツリー別にセッションを追跡する

python
#!/usr/bin/env python3
# hooks/track-worktree-session.py
import json
import sys
from pathlib import Path
from datetime import datetime

event = json.load(sys.stdin)
worktree = event.get("worktree")

log_dir = Path.home() / ".claude" / "worktree-sessions"
log_dir.mkdir(parents=True, exist_ok=True)

if worktree:
    session_file = log_dir / f"{worktree['name']}.log"
    with open(session_file, "a") as f:
        f.write(f"[{datetime.now().isoformat()}] branch={worktree['branch']}\n")

ワークツリー名をターミナルタイトルに設定

bash
#!/bin/bash
# hooks/set-terminal-title.sh
EVENT=$(cat)
WORKTREE_NAME=$(echo "$EVENT" | jq -r '.worktree.name // empty')

if [ -n "$WORKTREE_NAME" ]; then
  # ターミナルタイトルをワークツリー名に設定
  printf "\033]0;Claude [worktree: %s]\007" "$WORKTREE_NAME"
fi

ワークツリーのPR作成を自動化

python
#!/usr/bin/env python3
# hooks/auto-pr-on-worktree-stop.py
import json
import sys
import subprocess

event = json.load(sys.stdin)
worktree = event.get("worktree")

# ワークツリーセッション終了時にPR作成を提案
if worktree and event.get("event") == "Stop":
    branch = worktree["branch"]
    name = worktree["name"]
    repo_dir = worktree["originalRepoDir"]

    # PRが未作成の場合のみ
    result = subprocess.run(
        ["gh", "pr", "list", "--head", branch, "--json", "number"],
        cwd=repo_dir, capture_output=True, text=True
    )
    prs = json.loads(result.stdout)
    if not prs:
        print(f"ワークツリー '{name}' のPRがまだ作成されていません。")
        print(f"ブランチ: {branch}")

注意点

  • worktree フィールドはワークツリーセッション(claude --worktree <name> で起動した場合)でのみ存在します
  • メインリポジトリで実行している場合は worktree フィールドは null または存在しません
  • originalRepoDir は元のリポジトリのルートディレクトリへの絶対パスです

関連情報