Claude CodeのprUrlTemplate設定でPRリンク先を変える
settings.jsonのprUrlTemplateで、フッターバッジとツール結果に出るPRリンクの飛び先をgithub.com以外へ差し替えられます。展開例、書き換わらないリンク、バッジが出ない原因の切り分けまで扱います。
社内レビューツールへのリンクに差し替えるには
prUrlTemplateは、Claude Codeがフッターバッジとツール実行結果の要約に表示するPRリンクの飛び先を、URLテンプレートで書き換える設定です。型は文字列、既定値は未設定で、スコープは「どのファイルにも書ける」(Any file)です。
向いているのは、PRの実体はGitHub形式のURLで持ちつつ、レビューは別のコードレビューツール上で行っている環境です。クリックした先がgithub.comではなくレビューツールになるので、開発者が毎回URLを手で付け替える手間がなくなります。
テンプレートを入れて確かめる流れ
- 1
元のPR URLの形を見る
元のURLが
/pull/<number>の形をしているかを確かめます。この形でないURLは書き換えられず、そのまま表示されます。 - 2
テンプレートを書く
{host}{owner}{repo}{number}{url}のうち必要なものだけを使い、飛ばしたい先のURLを組み立てます。 - 3
書き込むスコープを選ぶ
自分だけで試すなら
.claude/settings.local.json、チームで揃えるなら.claude/settings.jsonです。違いは後半の表にあります。 - 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に次のように書きます。
{
"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の効く範囲
書き換わる
- フッターの
PR #446バッジ - ツール実行結果の要約に含まれるPRリンク
どちらも元のURLが/pull/<number>の形のときだけです。
書き換わらない
- Claudeがチャットに書いた
#123のようなPR参照 - GitLabのマージリクエストのリンク(バッジも結果の要約も元のGitLab URLのまま)
/pull/<number>の形でないURLowner/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で保存されたトークンを使います。トークンがないときのフッターの案内は、ghCLIが未インストールなら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.com | owner/repo#123のリンク先https://gitlab.com/owner/repo/-/issues/123 |
| bitbucket.org・codeberg.org・gitea.com | owner/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参照がどこへ飛ぶかは、それぞれ別の設定と経路で決まります。