A-TAK.COM

Claude Codeの並列開発で工夫している事

※Amazonのアソシエイトとして、A-TAK.COMは適格販売により収入を得ています
※本サイトではその他アフィリエイトも利用しております。

広告
シェア

はじめに

今回はClaude Codeで並列開発するため環境構築で私が工夫している事について書いていこうかなと思います(私自身の記録の為にも)。

そもそも並列開発とは?なぜ必要なのか?

Claude Codeは指示の仕方次第ではありますが「こういう機能つくって」とか「このバグ直して」とか指示すると、計画を立てて調査していろんなツールを駆使してタスクを完遂してくれます。

ただ、1つの依頼を完了するまで結構待ち時間が長いんですよね。そうすると有効に時間を使うために複数の修正を走らせたくなり、複数Claude Code立ち上げて開発したくなるわけです。

git worktreeは必須

当たり前なんですが、複数のClaude Codeが同じフォルダのソースを触ると破綻します。同じファイルを同時に編集しちゃうかもしれないし、いざコミットしようとすると2つの修正が混在してまともに管理できなくなる。

そこでGit worktreeを使って並行に動かすAI毎に専用のフォルダをつくってあげます。

で、ここが今回の記事の本題ですが、そもそも修正する度にgit worktreeを実行するのが面倒なんですね。さらに、git worktreeはまったく新しいフォルダを作るので、様々な初期設定もその度にやり直す必要があります。

このあたりを自動化して楽してしまおうというのが今回の記事です。

やってることの全体の流れ

ざっくり説明するとこんな流れの事を自動でやるようにしてみました。

  1. GitHubにIssue登録(ここは人力)

  2. Claude Codeでスキル実行

    1. Issue情報の取得

    2. ブランチ名自動決定

    3. ワークツリー作成

    4. 環境整備

    5. 新しいワークツリーで新しくターミナル起動してClaude Code起動

  3. 新しいターミナルのClaude CodeでIssue情報取得

  4. 計画立案提示

Issue番号を渡すだけで、別ターミナルでClaude Codeが立ち上がって、計画まで出てくるという感じですね。


起点はGitHub Issue

開発の起点はGitHub Issueにしています。

  1. GitHubで新規Issue作成

  2. タイトルと詳細を音声入力で喋る

  3. Issueを登録

私はAqua Voiceという音声認識ソフトを使っているんですけど、これが非常に精度が高いので、GitHubで新しいイシュー作成のボタンを押して対応する内容を喋って入力しています。

音声入力の内容は整形も整理もしてません。人間が後から見たときに分かりやすさは諦めて、ただしゃべった内容をそのままイシューにぶち込んでいます。

以前の記事でも書きましたが、AIに指示するならこれで十分です。

関連記事: 音声入力にはまってます


ワークツリー作成`cr-worktree`スキルの動き

ワークツリー作成する`cr-wortree`スキルを作りました。
一応、`SKILL.md`とそこから呼び出すシェルスクリプトを置いておきますが、参考程度にみてください。汎用的に使える所まで完成度あげてないので。

SKILL.md

スクリプト

/cr-worktree 571

こんな感じでIssue番号を指定してつかうようにしています。

1. Issue情報の取得

`gh`コマンド(GitHubの操作をCLIコマンドで操作するもの)でIssueの内容を取得します。タイトルや説明文を読み取ります。

2. ブランチ名の自動決定

ルールとしては、先頭にIssue番号を付けて、その後ろにIssueを示す英語でブランチ名を決めてブランチを作成するような形にしています。

例:`571-add-restore-feature`

先頭にIssue番号を入れるのがポイントで、これは後で使います。

3. ワークツリー作成

Gitワークツリーを作成します。私はここで内部的に`gtr`というgit worktreeを簡単に操作するコマンドをインストールして使ってますが、普通のgitコマンドで良いと思います。

4. 環境整備(自動)

ワークツリー作成後、自動でいろんな初期設定が走りますが、これはスクリプトの方でやってます。あくまで私がAndroidアプリ開発でやってる事の例だと思って見てください。

  • mainブランチを最新化:Pull忘れ防止

  • Gitサブモジュール初期化:外部ライブラリの取得

  • local.properties コピー:Android SDK パス設定

  • google-services.json コピー:Firebase 設定(リポジトリ外管理)

  • (MCP設定追加):Serena などプロジェクト固有設定(※今回は省略)

外部ライブラリをサブモジュールとして使ってるのでその初期化だったり、local.propertiesとかgoogle-services.jsonとか、その環境特有のものや認証情報的なものはmainのワークツリーにおいてあるものを新しいワークツリーにコピーして持ってくるみたいなことをしています。

MCP設定追加は、私の環境の作り方が良くないのかもしれないですけど、Serenaがプロジェクトごとに個別に設定しないとどうもうまく動いてくれないような気がするので、このワークツリーを作るときに同時に作るようにしています。

このあたり`gtr`コマンドの機能でスクリプト指定するとワークツリー作成時に自動でやってくれる機能もあるので、それでやらせてもよいと思います(私はClaude Codeからシェル実行させてます)。

5. 新しいターミナルで起動

新しいターミナルウィンドウが開いて、そのワークツリーでClaude Codeが起動します。最初に操作していたのとは別のターミナルが立ち上がってくるような形ですね。私はMacではGhosttyというモダンなターミナルを使っていてそっちを起動しています。

あとAppleScriptでキーボード入力をエミュレートして`claude`コマンドを打たせるまでやってます。

なぜわざわざAppleScriptかというと、フォルダ指定でターミナル起動すると`exit`でClaude Codeを抜けたときに確かユーザーホームに戻ってしまってて、Claude Codeを再起動したい時に困るので、わざわざターミナルを立ち上げた後にコマンドを打つ形にしたと思います(うろおぼえ)。

6. `/issue`で計画立案

起動したClaude Codeで、自動的に`/issue`スキルが実行されます。


`issue`スキルの動き

ブランチ名からIssue番号を取得

https://gist.github.com/a-tak/fe48522efd770a32cd41d8fd0bb35282

さっきワークツリーを作るときに先頭にIssue番号を入れるようにしていたので、その番号を元に再度`gh`コマンドでIssue内容を再取得します。

たとえば、ブランチ名`571-add-restore-feature`から`571`を抽出して、Issue内容を取りに行って内容を理解するというのをやらせています。

最初に立ち上げたターミナルでブランチ名を決めるときに一回Issue取得して、また新しいターミナルで再度Issue取りに行くということで、二度手間なことをしているんですけども、これも割り切りです。
やろうと思えば最初に立ち上げたターミナルからテキストで情報引き渡すとかやりようはあると思います。

Issueステータスを自動更新

Issue着手時に自動でステータスを「In Progress」に変更しています。

…これIssueスキルでやってたつもりだったんですが、`CLAUDE.md`の方に指示を入れていたみたいです。サンプルに表せてないけどアイディアの一つとして読んでください(汗)

呼び出しているスクリプトはこれです。

https://gist.github.com/a-tak/7eb2b7bbfa9453118c971d7d2418e8d9

こうすることによってGitHubのプロジェクトのカンバン表示でタスクの状況を掴みやすくしています。

複数ターミナルを立ち上げて作業していると、途中で急に落ちたりとか、日をまたいだりとかすると、何をやってたか忘れたりすることが往々にしてあるんですね。

なので、作業の状況、着手しているかどうかぐらいは、やっぱりどこかで管理したいなということでこういう事をやっています(触ったことないけどGitHubのオーケストレーションツールだとこのあたりやってくれそうですよね)。

ステータスラインにブランチ名設定

複数ターミナル起動すると、どのターミナルでなんの作業やってるか分からなくなるので、せめてブランチ名で判別できるようにClaude Codeの設定でステータスラインを設定しています。

`settings.json`に下記を指定してやってます。

  "statusLine": {
    "type": "command",
    "command": "scripts/statusline.sh",
    "padding": 0
  },

このスクリプトを使って必要情報を取得して設定しています。

https://gist.github.com/a-tak/6bb05298de478d128eb8205fc9c389c2

難易度を自動判定

次にIssueの難易度を5つの軸で判定しています。軸はAIが適当に決めてるもので特に根拠はありません。あくまで例としてご覧ください。

  1. 複数のアプローチが考えられるか

  2. アーキテクチャに影響を与えるか

  3. 既存パターンが見つからない新規機能か

  4. 複数ファイル/システムにまたがるか

  5. 高リスク(データ破壊・セキュリティ影響)があるか

3つ以上で設計エージェントに相談

難易度が3つ以上だと、Opus(Claude Opus 4.5)の設計相談エージェントに相談するようになっています。

さらにCodexにも質問を投げて、複数の視点から設計を検討するようにしています。やっぱりCodexは優秀なんですよね。Claudeよりさらに時間かかるけど。

簡単な修正でOpusやCodexで無駄なトークン消費をしたくないので、難しいと判断したタスクだけこういうステップを入れています。

Planモードをデフォルト設定に

私はClaude Codeのコンフィグでデフォルトでプランモードで立ち上がるよう設定しています。`issue`スキルでGithub Issueの情報取得して計画を立ててから修正に入る流れにするためです。

計画を確認して実装

あとはPlanモードで作成された計画を確認して承認すると実装がはじまります。

今回の手法だと新しいターミナルが起動してClaude Code起動したときに一回確認が入りますが、それ以外は最初にイシュー番号伝えるだけで計画までできるような形になっていて、だいぶ楽に修正対応できるようになりました。

補足:モデルの使い分け

基本はHaiku

今回のフローはスキルを使って実現していますが、スキルが使用するモデルは`Haiku`にしています。理由は…

  • 速度が速い

  • 使用量消費が少ない

今回のような決まり切った動作をするようなものは `Haiku` でも全然問題なさそうです。

というか、ワークツリー作成の処理はブランチの命名にこだわりがなければ、ぶっちゃけClaude Code使わなくてスクリプトをもう少し頑張って作り込めば実現できそうです…。

AI絡ませるとエラーが出たときにブランチの状況とかも踏まえて良い感じに作業してくれるので、たぶん私は今の役割分担のまま使い続けるとは思います。

難しい問題はOpus

コーディングはSonnet使って、設計アドバイスなどの難しいタスクはOpus使うようにしています。


補足:スキルは全部AIに作らせている

`/cr-worktree`も`/issue`も、Claude Codeに「こういうことをさせたいんだけど」と相談して作らせています。手では書いてないですね。

正直スキルの中身は今まで一回も見てなかったですね。基本的には表向きの挙動でチェックというような形をにしています。特にスキルなんかは、ちょっと動きがおかしくてもリスクは低かろうという判断です。

このあたりは割り切りでここはちゃんと押さえておかないといけない / ここは大体でいいという切り分けをやっていった方が、多分開発スピード上がるんじゃないかなと思います。


補足:ワークツリーの削除

今回のやり方だとイシュー毎にワークツリーが作成されますが、削除は後でまとめてAIにやってもらってます

使用していないものを「まとめて消して」と依頼すれば、まだマージしてないやつを除外するとか、そういったところも一応やってはくれますね。時間はかかりますけど。

削除は危険を伴うのでAI任せにするのは自己責任でどうぞ。


補足: ソースを見たいとき

これは開発始まってからの小ネタですが、たまにソース見たくなったらClaude Codeで「!」 + スペース + エディタのコマンド名 + 「.」(ドット)入れると、今のワークツリーで簡単にエディタ開けます。

! code .
! cursor .
! antigravity .

課題

まとめに入る前に課題を書いておきます。

一つはターミナル複数起動するとどれがどの作業していたか分かりづらい事。

ステータスラインにブランチの名前は入れているので、それでピンと来る場合もあれば何を依頼したか人間側が忘れていてイシュー番号からGitHubを辿って思い出すみたいな事も。

ちょっとしたことですが、並行作業しているとこのあたりの頭の切り替えに疲れを感じる事もあります。Ghosttyがカスタマイズ性高いっぽいので、もっとわかりやすくできたらいいなと思ってます。

ただ、最近Claude CodeがGhostty毎綺麗さっぱり消失してるみたいな事がおきるのでGhosttyを管理する別アプリで用意したがいいのかもしれないですね。今は消失したらGitHub ProjectのIn Progressから該当作業を探して立ち上げ直してます。

Claude Code on the Webとの連携が煩雑なのも少し気になるところです。

今はClaude Code on the Webのブランチ名を`/cr-worktree`に指定してワークツリーを作成し、新しく立ち上がったClaude Codeを一度終了して、WebのCLI連携コマンドをコピーして貼り付けるってことをやってます。

まとめ

最後にまとめです。

やっていること

  1. GitHubにIssue作成(音声入力で)

  2. `/cr-worktreeスキル` で環境構築を全自動

  3. 別ターミナルでClaude Codeが起動、計画まで出てくる

  4. あとは計画を確認して実装開始

    広告

ポイント

  • 1コマンドでワークツリー作成から計画立案まで自動

  • ブランチ名にIssue番号を入れて、後で参照できるように

  • 環境整備(設定ファイルコピーなど)も全部自動

これで気楽にAIエージェントでの並行開発が出来るようになりました。

Anthropicからオーケストレーションツールが発表されるという噂もちらっと見かけたので、そちらにも期待したいですね。

それでは。


シェア

投稿日

カテゴリー:

投稿者:

カテゴリ一覧