Claude Codeでの並列開発を快適にする

に公開

はじめに

前回の自分の記事 でも触れましたが、私は普段Claude Codeを使用して開発をしています。
その際、複数の作業を並行して進めることがよくあります。そんな時に便利なツールとして、Claude Squadを導入しました。

この記事ではClaude Squadの課題点と、その課題をどう克服したかを紹介します。

Claude Squadとは?

Claude Squadは、複数の作業を同時に効率的に管理できるツールです。主な特徴は以下の通りです。

  • セッションごとに独立したGitブランチと環境を作成(Git Worktreeを活用)
  • 他のセッションと作業内容が混ざらない
  • セッション単位でのPull Request作成が容易

Claude Squadのおかげで、複数作業を明確に分離でき、作業効率が大幅に向上しました。これを入れる前と入れた後では作業の待ち時間が非常に少なくなった気がします。

Claude Squadが使用する Git Worktreeの仕組み

Git Worktreeは同じリポジトリ内で複数の作業ディレクトリを作成できるGitの機能です。ブランチごとに独立したディレクトリを作ることで、作業環境をきれいに分離できます。

例)

git worktree add ../my-feature feature-branch

これにより、my-featureディレクトリでfeature-branchを安全に編集できます。

Claude Squadを使った時の課題

使っている中でいくつか課題に直面しました。

  • 既存のローカルやリモートブランチから新たなセッションを作成できない
    • Claude Squadは新規ブランチ作成が前提のため、既存ブランチでの作業を分離したいケースに対応できませんでした
  • Git管理外のファイルが自動で複製されない
    • git worktree add を実行した際に作成されるディレクトリには、git管理下にあるファイルのみがコピーされます
    • 一方で、自分は普段の開発に自分用にカスタマイズした Makefile.tomlCLAUDE.local.md を使用しており、これらがないとClaude Codeを満足に動かせない問題があります
    • そのため、セッション開始後に毎回手動でコピーする必要がありました

課題の克服

1. 既存ブランチからセッションを作れるよう改良

Claude Squadをforkし、以下の機能を追加しました。
• Fuzzy Searchによるブランチの選択
• 更新日時順のブランチ表示
• ショートカットキーでローカル(l)・リモート(R)ブランチからのチェックアウト

変更はこちら:

👉 forkしたClaude Code


使い勝手が向上したら、本家にPull Requestを出す予定です。

2. Git Worktree追加後の自動シンボリックリンク作成

Git Worktreeで新しい環境を作る際に、毎回必要な設定ファイルをコピーする手間を省くために、Gitのpost hookを活用しました。

具体的には、Git Worktree作成時に以下のようなシェルスクリプトをpost hookとして実行しています。

例) ./.git/hooks/post-checkout を作成

#!/bin/bash

# post-checkout hook
# This hook is invoked when a git-checkout or git-switch is run after having updated the worktree.
# It receives three parameters:
# $1: the ref of the previous HEAD
# $2: the ref of the new HEAD
# $3: a flag indicating whether the checkout was a branch checkout (1) or a file checkout (0)

previous_head="$1"
new_head="$2"
checkout_flag="$3"

# When git worktree add is executed, the previous HEAD is set to all zeros
# This allows us to detect worktree add operations specifically
if [ "$previous_head" == "0000000000000000000000000000000000000000" ]; then
    echo "🌳 Git worktree add detected!"
    echo "New HEAD: $new_head"
    echo "Worktree path: $(pwd)"
    
    # Add your worktree-specific setup logic here
    # For example:
    # - Install dependencies
    # - Setup environment variables
    # - Create configuration files
    # - Run initial setup scripts
    
    # Create symbolic links for development files
    echo "🔗 Creating symbolic links for development files..."
    
    # Get the main repository path (parent of .git/worktrees)
    main_repo=$(git rev-parse --git-common-dir | sed 's|/.git||')
    
    # List of files/directories to symlink
    symlink_items=(
        # Makefile.toml files
        "Makefile.toml"
        "foo/Makefile.toml"
        "bar/baz/Makefile.toml"
        # Additional files and directories
        ".claude"  # Directory
        "CLAUDE.local.md"  # File
    )
    
    # Create symbolic links
    for item in "${symlink_items[@]}"; do
        source_path="$main_repo/$item"
        
        if [ -e "$source_path" ]; then
            # Create parent directory if needed
            if [[ "$item" == *"/"* ]]; then
                mkdir -p "$(dirname "$item")"
            fi
            
            # Create symbolic link if it doesn't exist
            if [ ! -e "$item" ]; then
                ln -s "$source_path" "$item"
                if [ -d "$source_path" ]; then
                    echo "  ✓ Linked directory: $item"
                else
                    echo "  ✓ Linked file: $item"
                fi
            else
                echo "  - $item already exists, skipping"
            fi
        else
            echo "  ⚠️  Source not found: $source_path"
        fi
    done
    
    # Initialize and update git submodules
    echo "🔧 Initializing git submodules..."
    if git submodule init && git submodule update; then
        echo "  ✓ Submodules initialized successfully"
    else
        echo "  ⚠️  Failed to initialize submodules"
    fi
    
    echo "✅ Worktree setup completed"
else
    echo "Regular checkout operation (previous HEAD: $previous_head, new HEAD: $new_head)"
fi

これにより、新しいWorktreeが作成されるたびに、必要なファイルのシンボリックリンクが自動で作成され(ついでにgit submoduleも初期化しました)、スムーズに作業が開始できるようになりました。

まとめ

Claude Squadはとても便利なツールですが、細かな課題が存在していました。自分で改良を加えることで、より実用的に使えるようになりました。同様の課題を感じている方の参考になれば幸いです。

Progate Tech Blog

Discussion