Claude Media
Claude CodeのprUrlTemplate設定でPRリンク先を変える

Claude CodeのprUrlTemplate設定でPRリンク先を変える

settings.jsonのprUrlTemplateで、フッターバッジとツール結果に出るPRリンクの飛び先をgithub.com以外へ差し替えられます。展開例、書き換わらないリンク、バッジが出ない原因の切り分けまで扱います。

社内レビューツールへのリンクに差し替えるには

prUrlTemplateは、Claude Codeがフッターバッジとツール実行結果の要約に表示するPRリンクの飛び先を、URLテンプレートで書き換える設定です。型は文字列、既定値は未設定で、スコープは「どのファイルにも書ける」(Any file)です。

向いているのは、PRの実体はGitHub形式のURLで持ちつつ、レビューは別のコードレビューツール上で行っている環境です。クリックした先がgithub.comではなくレビューツールになるので、開発者が毎回URLを手で付け替える手間がなくなります。

手順

テンプレートを入れて確かめる流れ

  1. 1

    元のPR URLの形を見る

    元のURLが/pull/<number>の形をしているかを確かめます。この形でないURLは書き換えられず、そのまま表示されます。

  2. 2

    テンプレートを書く

    {host} {owner} {repo} {number} {url}のうち必要なものだけを使い、飛ばしたい先のURLを組み立てます。

  3. 3

    書き込むスコープを選ぶ

    自分だけで試すなら.claude/settings.local.json、チームで揃えるなら.claude/settings.jsonです。違いは後半の表にあります。

  4. 4

    バッジをクリックして飛び先を見る

    PRのあるブランチでフッターのPR #446のようなバッジをCmd+click(macOS)またはCtrl+click(Windows/Linux)すると、ブラウザーで開きます。

5つのプレースホルダーに入る値

Claude Codeは元のPR URLから値を取り出し、テンプレートに埋め込みます。元のURLがhttps://ghe.example.com/acme/web/pull/446だった場合の展開結果は次のとおりです(ホスト名とリポジトリ名は説明用の架空の値です)。

プレースホルダー中身上の例での値
{host}中身Gitホストのドメイン上の例での値ghe.example.com
{owner}中身オーナー(組織 / ユーザー)上の例での値acme
{repo}中身リポジトリ名上の例での値web
{number}中身PR番号上の例での値446
{url}中身元のPR URLそのもの上の例での値https://ghe.example.com/acme/web/pull/446

内部のレビューツールへ向けるなら、.claude/settings.jsonに次のように書きます。

.claude/settings.json
{
  "prUrlTemplate": "https://reviews.example.com/{owner}/{repo}/pull/{number}"
}

{owner}や{repo}は、PRごとの値に置き換わります。この設定だと、上の例のPRはhttps://reviews.example.com/acme/web/pull/446として表示されます。5つを全部使う必要はありません。リポジトリを1つしか運用していないなら、短いテンプレートでも成立します。たとえば{number}だけを使ったhttps://reviews.example.com/review/{number}です。

{host}は、複数のGitホストを使い分けている環境で役に立ちます。ホストごとにレビューツールのURLを分けず、https://{host}/review/{owner}/{repo}/{number}のようにホスト名を引き継ぎ、パスだけを変える書き方ができます。ホストが1つに決まっているなら、{host}を使わず固定のホスト名を書いても同じ結果です。

{url}は、元のURLを丸ごと別のURLのクエリに渡したいときに使います。たとえばリダイレクト用のゲートウェイを経由させる構成なら、ゲートウェイのURLの後ろに{url}を置く書き方になります。元のURLがエンコードされて渡るかどうかは、実際に出たリンクで確かめます。

差し替え先のURLに/pull/<number>の形は要りません。この形が求められるのは書き換え対象を見分けるための元のURLだけで、テンプレート側のパス構造は自由です。

書き換わるリンクと書き換わらないリンク

テンプレートを書いたのに飛び先が変わらないとき、最初に疑うのは「そのリンクをClaude Codeが描画しているのか」です。チャットの文章の中のPR番号は、Claudeが書いた文字列がそのまま残ります。

書き換えの対象は、Claude Codeが自分でレンダリングするリンクだけです。対象と対象外を並べると、次のようになります。

くらべる

prUrlTemplateの効く範囲

Claude Codeが描画

書き換わる

  • フッターのPR #446バッジ
  • ツール実行結果の要約に含まれるPRリンク

どちらも元のURLが/pull/<number>の形のときだけです。

そのまま残る

書き換わらない

  • Claudeがチャットに書いた#123のようなPR参照
  • GitLabのマージリクエストのリンク(バッジも結果の要約も元のGitLab URLのまま)
  • /pull/<number>の形でないURL
  • owner/repo#123のIssue参照リンク

GitLabはgitlab.comでも、セルフホスト(self-managed)のインスタンスでも同じです。フッターの同じ位置にMR !Nという別書式のバッジが出ますが、!NはGitLab独自のマージリクエスト番号の書き方で、テンプレートの差し替え対象ではありません。このバッジを出すにはClaude Code v2.1.234以降、GitLabを指すリモート、glab auth loginで認証済みのglab CLIの3つが要ります。条件の詳細はClaude Code GitLab連携ガイドにあります。

バッジの色とレビュー状態は変わらない

フッターのバッジの下線は、承認済みが緑、レビュー待ちが黄、変更要求ありが赤、draftがグレーです。prUrlTemplateが変えるのはクリックしたときの飛び先だけで、この色の元になる状態の取得は従来どおりです。バッジの色分けや更新のタイミングはClaude Code PRレビューステータスの見方(GitHub/GitLab)で扱っています。

バッジはPRがマージまたはクローズされると消えます。表示の更新は、セッション内でgit pushが成功したとき、またはgh pr createやgh pr mergeのようにPRを変更するgh prコマンドが成功したときに走ります。GitLabならglab mr createやglab mr mergeが同じ役割です。

テンプレートを設定した環境でバッジが出ないときは、テンプレートではなくGitHubトークンの経路を疑います。トークンの探し方はリモートのホストで変わります。

まとめ

GitHubのホスト別トークンの探し方

  • github.com

    GH_TOKENかGITHUB_TOKEN、またはgh auth loginで保存されたトークンを使います。トークンがないときのフッターの案内は、gh CLIが未インストールならinstall gh for PR statusです。インストール済みならgh auth login for PR statusと出ます。

  • GH_HOSTに指定したGitHub Enterprise

    GH_ENTERPRISE_TOKENかGITHUB_ENTERPRISE_TOKEN、またはgh auth login --hostname <host>のトークンです。トークンがないときのフッターの案内はgithub.comと同じです。

  • それ以外のGitHubホスト

    gh auth login --hostname <host>で保存したトークンだけが使われます。トークンがなければ、バッジも案内も出ません。

バッジの出方は、状況ごとに次の順で切り分けると原因に当たりやすくなります。

症状見る場所
リンクの飛び先が変わらない見る場所元のURLが/pull/<number>の形か。GitLabのMRやチャットの#123ではないか
バッジ自体が出ない(GitHub)見る場所上のホスト別のトークン。フッターのgh auth login for PR statusなどの案内
バッジ自体が出ない(GitLab)見る場所v2.1.234以降か、glab auth login済みか(下記)
どのホストでもバッジが出ない見る場所/configのShow PR status footer(キー名prStatusFooterEnabled)と、次に述べる環境変数
リンクがクリックできない見る場所FORCE_HYPERLINK(次の節)

prStatusFooterEnabledは~/.claude.jsonに保存されるキーで、既定値はtrueです。falseにすると、フッターはPR・MRの確認自体を行わず、バッジも出しません。prUrlTemplateとは保存先もスコープも違うので、テンプレートの有無とは無関係に動きます。

GitLabのMRバッジは色の意味がGitHubと違います。緑はGitLabがマージ可能と報告している状態、黄はそれ以外のオープン状態、グレーはdraftで、赤はありません。GITLAB_TOKENのようなglabのトークン環境変数は状態確認では無視されるので、環境変数を設定しただけではバッジは出ません。glabは1セッションにつき1回しか探されないため、インストールやglab auth loginの後はClaude Codeを再起動します。

バッジが出ない原因はもう1つあります。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICを設定すると、PR・MRステータスのチェック自体が止まります。この変数は値が0やfalseでも通信を止める点が一般的な真偽値の環境変数と違うため、「テンプレートを消したらバッジも消えた」と誤診断しやすい設定です。

リンクがクリックできないときは別の設定

SSH越しやtmux内ではターミナルのハイパーリンク対応を検出できないことがあります。ただしフッターのPR・MRバッジは、検出できなくてもハイパーリンクとして描画されます。

バッジをプレーンテキストにしたいときは、環境変数FORCE_HYPERLINKを0にします。FORCE_HYPERLINKは真偽値ではなく数値として読まれるので、falseやoffを入れるとハイパーリンクが有効になる側に倒れます。

Issue参照リンクはホスト名で決まる

Claudeがチャットでowner/repo#123と書くと、ターミナルがハイパーリンクに対応していればクリックできるリンクになります。これはprUrlTemplateとは別の仕組みです。リンク先を決めるのは参照文字列が指すリポジトリではなく、Claude Codeが動いているリポジトリのgitリモートのホストです。

gitリモートのホストowner/repo#123のリンク先
github.com・GitHub Enterprise・下の行に挙げていないホストowner/repo#123のリンク先https://<host>/owner/repo/issues/123
gitlab.comowner/repo#123のリンク先https://gitlab.com/owner/repo/-/issues/123
bitbucket.org・codeberg.org・gitea.comowner/repo#123のリンク先リンク化されずプレーンテキストのまま

ターミナルのハイパーリンク対応を検出できない環境では、FORCE_HYPERLINKを1にするとIssue参照がリンクになり、0にするとプレーンテキストのままになります。PRバッジと違い、Issue参照のリンクは検出に頼るため、SSH越しやtmux内ではこの変数で明示する場面があります。

リンクになるのは2要素のowner/repo#123だけです。#123だけの省略形、group/subgroup/project#123のようなGitLabの入れ子パス、コードスパンやコードブロックの中の参照はプレーンテキストのままです。PRリンクはprUrlTemplateで差し替えられるのに、Issue参照リンクには同じ種類のテンプレート設定がなく、ホストごとに決まったパスで組み立てられます。社内ツールへ導線をそろえたい場合、この非対称が想定外の挙動の原因になります。

どのスコープに書くか

スコープファイル向いているケース
User scopeファイル~/.claude/settings.json向いているケース個人的に社内のミラーツール経由でPRを開きたい
Project scopeファイル.claude/settings.json(git管理)向いているケースリポジトリ全体で内部レビューツールへの統一を徹底したい
Local scopeファイル.claude/settings.local.json(git管理外)向いているケースチームの既定はgithub.comのまま、自分だけ検証用の内部URLを試したい

複数のスコープに書かれていれば、LocalがProjectより、ProjectがUserより優先されます。

v2.1.289のclaude --helpには、設定の読み込みに関する2つのオプションがあります。

--setting-sources <sources>  Comma-separated list of setting sources
                             to load (user, project, local).
--settings <file-or-json>    Path to a settings JSON file or a JSON
                             string to load additional settings from

--setting-sourcesは読み込むスコープをuser・project・localから選び、--settingsは追加の設定をファイルパスかJSON文字列で渡します。チームの共有ファイルを書き換えずに別のテンプレートを試したいときの入口として、この2つがあります。

settings.jsonの構成全体はClaude Code settings.json完全ガイドで扱っています。Claudeが作るコミットやPR本文の署名文言はClaude Code attributionでコミット署名とPR署名を変えるで扱っています。署名文言は別のキーであるattributionの担当なので、prUrlTemplateと組み合わせて使えます。

まとめ

prUrlTemplateが効くのは、Claude Codeが描画するGitHub形式のPRリンクという1点だけです。バッジが出るか、どんな色か、Issue参照がどこへ飛ぶかは、それぞれ別の設定と経路で決まります。

この記事を共有:XはてブLinkedIn