claude-code-action の実装を読んでみる
claude-code-actionがリリースされ賑わっていますが、単純にcalude codeを使用するよりもclaude-code-actionで作成した成果物のほうが品質が良いので、内部でどのような処理が実行されているか読んでみました。
Stepの構成
Github Actionツールのエントリーポイントはaction.ymlファイルです。action.ymlを見ると以下のStepで構成されていることがわかります。
- Bun(TypeScriptランタイム環境)のインストール
- 依存ライブラリのインストール
-
src/entrypoints/prepare.ts
の実行 - claude-code-base-actionの呼び出し
-
src/entrypoints/update-comment-link.ts
の実行 - レポートの表示
- トークンの削除
src/entrypoints/prepare.ts
の内容
prepare.tsの内容を読んでいきます。
- Step1 ~ Step3
Github Tokenの取得または生成し、使用できるか検証しているようです。ここで取得したGithub Tokenを用いてcommitやissue、PRのコメントを投稿します。また、ここで取得したtokenはStep7「トークンの削除」で削除されます。 - Step 4
Actionを実行すべきかどうかを判定します。以下の場合はTrueが返ってくるようです。- directPromptが設定されている
- IssueにASSIGNEE_TRIGGERで指定したユーザー(デフォルトだと@claude)がアサインされている
- Issue、PRのコメントにTRIGGER_PHRASE(デフォルトだと@claude)が含まれる
- Step 5
トリガー(Issue、PRのコメント)を実行したのが人間であるか確認します。Botなどがコメントをした場合はここでErrorがスローされるようです。 - Step 6
初回コメントの作成(Claude Code is working…と表示されClaudeのアイコンが点滅しているあのコメント)。また、ここで作成されたコメントIDはclaude_comment_idというGithub変数に保存されます。 - Step 7
Issue、PRのデータ(タイトルやAuthorなど)、コメントの情報、レビューコメント、添付ファイルの情報を収集しているようです。この時、データの収集にはAIエージェントやMCPは使用せず、GitHub GraphQL API を用いてデータを収集しています。 - Step 8
ブランチのセットアップ。場合によって対応が異なります。- PRの場合: PRのブランチをチェックアウト
- Issueの場合: 新しいブランチを作成
- 閉じた/マージされたPRの場合: 新しいブランチを作成
ここでもAIエージェントやMCPは使用せず、GitコマンドをTypescriptから実行しているようです。
- Step 9
Step 6で作成したコメントを更新します。Github Actionのジョブとブランチへのリンクを追記しているようです。 - Step 10
claude-prompts/claude-prompt.txt
というファイルを作成し、ここにプロンプトを書き込みます。claude-prompts/claude-prompt.txt
は「 claude-code-base-actionの呼び出し」のインプットとなります。 - Step 11
MCPの設定をmcp_configに保存します。デフォルトでは以下のMCPサーバーが設定されているようです。- github_file_opsサーバー
ファイルのコミット、削除、コメントの更新などの操作を提供 - GitHubの公式MCPサーバー
- github_file_opsサーバー
Step 10 claude-prompt.txtの内容
ここで作成されるプロンプトがclaude-code-base-actionに渡されるので、このプロンプトの品質が成果物の品質を左右しているといえるでしょう。
プロンプト自体はindex.tsのgeneratePromptメソッドの中を見ればいいので、自分なりの概略を記載します。
- 基本情報
Step 7で収集したIssue、PRのデータ(タイトルやAuthorなど)、コメントの情報、添付ファイルの情報。コメントの履歴も全て含まれるようです。変更のあったファイル一覧も含まれていました(変更内容まではふくまれてない模様) - mcp__github_file_ops__update_claude_comment ツールの使い方
- タスクの実行順序の指示。以下の順序でタスクをこなすよう指示されています。
- TODOリストの作成
タスクが終わるたびにmcp__github_file_ops__update_claude_commentを使ってチェックをつけるように、と指示が出されてます。 - コンテキストの収集
Use the Read tool to look at relevant files for better context.
ここでReadツールを使うよう指示されてます。 - 要求内容の理解
- 要求の実行
Todoリストを更新する必要があったら適宜更新するよう指示されています。- 質問やレビュー回答への指示
- 簡単なファイル変更に関する指示(主にGit操作に関する指示)
- 複雑な要求に関する指示
- Githubコメント更新
- TODOリストの作成
- 重要な注意事項
- AIができることとできないこと
- 実行できないアクションを求められたときの行動
- 要求の分析
読んでみるとGithub ActionのためのGit操作や応答に関することが主で、成果物の品質に関わりそうな部分は「コンテキストの収集」「要求内容の理解」「複雑な要求に関する指示」「要求の分析」に集約されているように感じました。このあたりをClaude Code実行時にも取り入れると成果物に品質が上がりそうです。
src/entrypoints/update-comment-link.ts
の内容
Actionの実行結果、ジョブリンク、ブランチ情報などをGitHubコメントに反映しています。
感想
コンテキストの収集や、最後のコメントの更新など意外にもAIエージェントを使用していない処理が多いと感じました。必ず実施する処理や、ユーザーへ最終状況を提示するような各自な処理が必要な部分は従来のプログラミングベースの処理が適しているようです。
また、品質向上を求めてプロンプトの内容を見てみましたが、成果物に関わりそうな指示はあまり多くありませんでした。内部で呼び出しているClaude Caudeのリクエストも1回だけだったのは驚きです。タスクやサブタスクに分解させることが品質向上の鍵かもしれないので、Claude Codeの指示に追加して品質が向上するか観察してみたいと思います。
Discussion