Claude CodeのfooterLinksRegexesで課題IDをリンクバッジにする設定
footerLinksRegexesは、会話に出た課題IDやPR番号を入力欄下のリンクバッジにする設定です。書き方、URL・ラベル・個数の制限、正規表現の注意点を解説します。
Claude CodeのfooterLinksRegexesは、ターンの出力に正規表現が当たったとき、入力欄の下にクリックできるバッジを出す設定です。PROJ-1234のような課題キーやレビューツールのIDを、スクリプトなしでブラウザへ飛べるリンクに変えられます。この記事では、設定の書き方、URLとラベルに掛かる制限、正規表現で踏みやすい落とし穴、statuslineとの使い分けを順に説明します。
footerLinksRegexesで何が起きるか
設定すると、ツール結果(読み込んだファイルの中身や取得したページを含む)とClaudeの返答の中から、patternに当たった文字列をバッジにしてフッターに並べます。用途として想定されているのは、プロジェクトのCLIが出力するレビューや課題管理のIDを、セッションからたどれるリンクにすることです。
設定の形は次のとおりです。
| 項目 | 内容 |
|---|---|
| 配置 | 内容settings.jsonのトップレベルのキー |
| 型 | 内容オブジェクトの配列 |
| 各要素 | 内容type("regex"固定)、pattern、url、任意のlabel |
| 置換 | 内容urlとlabelの{name}を、patternの名前付きキャプチャで埋める |
| 既定 | 内容未設定。バッジは出ない |
| 設定できるスコープ | 内容ユーザー設定または管理設定 |
スコープに注目してください。設定リファレンスの一覧では、このキーを置ける場所は「User or managed」です。プロジェクトの.claude/settings.jsonやsettings.local.jsonは対象に挙がっていません。リポジトリにコミットしてチーム全員へ配る形は取れず、個人は~/.claude/settings.json、組織は管理設定で配ることになります。組織配布の考え方はClaude Code組織管理ガイドにまとめています。
機能はv2.1.176で加わりました(リリースノートの記載は「正規表現で照合したリンクのバッジをフッター行に出す」設定)。当時の変更点の全体はClaude Code v2.1.176のリリースノートで扱っています。
課題IDをバッジにする最小の設定
最小の例は、課題キーを拾って課題管理システムのURLに組み立てる1件です。
{
"footerLinksRegexes": [
{
"type": "regex",
"pattern": "\\b(?<key>PROJ-\\d+)\\b",
"url": "https://issues.example.com/browse/{key}",
"label": "{key}"
}
]
}ここで押さえる点は3つです。
- JSONの文字列なので、正規表現のバックスラッシュは二重にします(
\bは\\b、\dは\\d) (?<key>...)が名前付きキャプチャで、{key}の中身になるlabelを省くと、当たった文字列がそのままラベルになる
この設定のもとでPROJ-1234がツール結果かClaudeの返答に出ると、PROJ-1234というバッジが現れ、https://issues.example.com/browse/PROJ-1234へのリンクになります。
設定が正しいJSONかを先に確かめる
バッジが出ないとき、原因の多くは設定ファイルの書式崩れです。二重バックスラッシュの書き忘れも含め、まずjqでJSONとして読めるかを確認します。
jq '.footerLinksRegexes' ~/.claude/settings.json配列がそのまま表示されれば、JSONとしては成立しています。設定が効かないときの一般的な切り分けはClaude Code設定が反映されない原因の探し方にあります。
当たり外れを手元で試す
patternがどの文字列に当たるかは、Claude Codeに投げる前に試せます。設定リファレンスはどの正規表現エンジンかを明記していませんが、(?<key>...)という書き方はJavaScriptの名前付きキャプチャと同じ形です。Nodeでの確認は、あくまで当たり外れの目安として使います。
node -e 'console.log("PROJ-1234 と XPROJ-99 と PROJ-5".match(/\b(?<key>PROJ-\d+)\b/g))'\bが効いていればXPROJ-99は拾われず、PROJ-1234とPROJ-5だけが出ます。設定後の実機確認は、Claudeに「PROJ-1234と返答して」と頼むのが手早い方法です。返答の文面に当たれば、フッターにバッジが出るはずです。
複数のツールを並べる設定例
要素は配列なので、課題管理とコードレビューなど、複数のIDを同時に扱えます。次の例は、課題キーとプルリクエストのURLの2件です。
{
"footerLinksRegexes": [
{
"type": "regex",
"pattern": "\\b(?<key>PROJ-\\d+)\\b",
"url": "https://issues.example.com/browse/{key}",
"label": "{key}"
},
{
"type": "regex",
"pattern": "\\bPR#(?<num>\\d+)\\b",
"url": "https://github.com/acme/web/pull/{num}",
"label": "PR #{num}"
}
]
}2件目は、会話やCLIの出力にPR#482の形で出てくる番号を、固定リポジトリのプルリクエストへ飛ばす例です。acme/webは例示用の名前で、自分のリポジトリに読み替えます。IDの書式がチームごとに違う場合は、実際にClaudeの出力やCLIの出力に現れる表記を見てからpatternを決めてください。
パターンの書き方で当たる範囲が変わる
広すぎる
\\d+だけのpatternにすると、バージョン番号や行番号など関係のない数字まで拾う可能性があります。
接頭辞と境界で絞る
\\bPROJ-\\d+\\bのように接頭辞と単語境界を付けると、課題キーの形に当たる文字列だけに限られます。
URLとバッジに掛かる5つの制限
組み立てたURLとバッジには、設定リファレンスが挙げる制限があります。表の挙動はそのまま守る必要があります。
| 制限 | 挙動 |
|---|---|
| URLのオリジン | 挙動キャプチャ値はURLエンコードされ、組み立てたURLはテンプレートに書いたオリジンと同じでなければならない |
| URLの長さ | 挙動2048文字を超えるURLは捨てられる |
| スキーム | 挙動https、http、または対応するエディタ・ワークスペースのディープリンクだけ |
| ラベル | 挙動既定は当たった文字列。表示幅28桁で切られる |
| 個数 | 挙動最大5個。新しい一致が出ると古いバッジから押し出され、/clearで消える |
オリジンが固定される意味
キャプチャしたIDは、パスの1区間かクエリの値にしか入れられません。ツール結果の中に紛れた文字列が、リンク先のホストを書き換えることはできない設計です。URLテンプレートのホスト部分はこちらで書き切っておき、キャプチャは{key}や{num}のようにパスの末尾に入れる形で使います。
ファイルの中身や取得したWebページも照合の対象です。第三者が書いた文字列がバッジの材料になりうるため、リンク先の固定は意味のある防御になります。
許可されるスキーム
httpsとhttpのほかに、次のディープリンクのスキームが使えます。
vscode、vscode-insiders、cursor、windsurf、zed、jetbrains、idea、slack、linear、notion、figma
課題管理にLinear、設計にFigmaを使っているチームは、ブラウザを経由せずアプリを開く形のリンクも組めます。各アプリのURL形式は、それぞれのサービスの仕様に従って決めます。許可リストにないスキーム(fileなど)は使えません。
5個の枠は取り合いになる
バッジは最大5個で、新しい一致が古いバッジを押し出します。ファイル検索の結果などに大量の課題キーが並ぶと、直前に見たいと思っていたバッジが押し出されるかもしれません。この点は設定リファレンスの「古いものから置き換わる」という記述からの読み取りです。要素を増やすより、patternを実際に使うIDの形に絞るほうが、バッジの顔ぶれが安定します。
正規表現で固まるのを避ける
設定リファレンスが挙げる危険な形は、(a+)+$のような入れ子の量指定子です。特定の入力に対して指数関数的に時間が伸び、セッションが固まる可能性があります。
守るべき方針は次のとおりです。
- 各
patternは線形に走る形にする +や*の入れ子を避ける- 当たる範囲を接頭辞と単語境界で絞る
先ほどの\b(?<key>PROJ-\d+)\bは、量指定子が1つだけで入れ子がありません。桁数が決まっているIDなら\\d{1,6}のように上限を付ける書き方もありますが、これは筆者の設計上の提案で、公式の要件ではありません。
バッジが出ないときの切り分け
設定したのにバッジが出ないときは、次の順に確かめると原因を絞れます。
バッジが出ない原因を上から確かめる
- Q`jq`で`footerLinksRegexes`の配列が読めるか?答えがいいえ答えがはい
JSONの書式崩れです。カンマの抜け、バックスラッシュが1本のままの
\\dなどを直します。 - Q設定を`~/.claude/settings.json`か管理設定に置いたか?答えがいいえ答えがはい
プロジェクトの
.claude/settings.jsonは、このキーの設定場所に挙がっていません。ユーザー設定へ移します。 - Q`pattern`が、出力に現れる表記そのものに当たるか?答えがいいえ答えがはい
全角ハイフンや大文字小文字の違いで外れることがあります。実際の出力をコピーして、Nodeなどで当たり外れを試します。
- Q組み立てたURLが2048文字以内で、スキームが許可リストにあるか?答えがいいえ答えがはい
2048文字を超えるURLと、許可リスト外のスキームのURLは、バッジとして描画されません。
それでも出ないとき
直前に/clearしていないか、新しい一致で5個の枠から押し出されていないかを見ます。
ラベルが途中で切れて見えるのは故障ではなく、表示幅28桁の上限によるものです。長いキーを使う場合は、labelを短い固定の語にして{key}を含めない設計にすると、どのバッジか判別しやすくなります。
statuslineとの使い分け
フッターのバッジは、カスタムstatuslineを設定していても共存します。どちらかがどちらかを置き換えることはありません。
| やりたいこと | 使うもの |
|---|---|
| 会話に出たIDを、スクリプトなしでリンクにする | 使うものfooterLinksRegexes |
| セッションデータから自分で組み立てた行を常時出す | 使うものstatusLine |
statuslineの側でもOSC 8のエスケープシーケンスを使えばリンクを作れますが、こちらはスクリプトが出力した文字列をクリック可能にする別の仕組みです。ターミナルがハイパーリンクに対応している必要があり、公式の例でもTerminal.appは非対応と書かれています。footerLinksRegexesは会話の中身に反応してバッジを出し、statuslineはスクリプトの出力を毎回描画します。両方を併用する場合の設定はClaude Code statuslineの設定と表示項目の選び方で説明しています。
設定を入れる前の確認項目
導入前に、次の点をチェックしてください。
- 置き場所はユーザー設定か管理設定になっているか(プロジェクト設定には置けない)
- JSONの文字列として、バックスラッシュを二重にしているか
urlのオリジンが、リンクさせたい先のホストと一致しているかpatternが入れ子の量指定子を含んでいないか- 要素の数が、5個のバッジ枠に見合っているか
settings.json全体の構成や他のキーとの関係は、Claude Code settings.json完全ガイドが参考になります。
まとめ
footerLinksRegexesは、課題IDやPR番号を1行の設定でリンクバッジに変える仕組みです。URLのオリジンはテンプレートで固定され、ラベルは28桁、バッジは最大5個という上限があります。得られるものは小さな近道ですが、ターンごとに走る正規表現が固まる原因にならないよう、線形に書く点だけは外せません。