🐙

GitHub CLI拡張「gh dash」でターミナルからPRとIssueを爆速管理しよう!

に公開

「いちいちGitHub開くのめんどくせえ」「レビュー依頼されてたIssue、ブラウザのタブの海に埋もれてしまった…」

そんな経験、ありませんか?

毎日GitHubと睨めっこしているエンジニアの皆さん、ブラウザとターミナルを行ったり来たりするの、そろそろ終わりにしませんか?今回は、ターミナル上でGitHubのPull Request(PR)やIssueを爆速で管理できる最強のTUI(Terminal UI)ツール、gh dash をご紹介します!

公式サイトには次のように書かれています。

A rich terminal UI for GitHub that doesn't break your flow.
(フローを妨げない、GitHubのためのリッチなターミナルUI)

まさにその通りで、Vimライクなキーバインディングでサクサク操作でき、一度使ったらもうブラウザのGitHub UIには戻れなくなるかもしれません。

日本語のまとまった解説記事が少なかったので、公式ドキュメントをもとに、インストールから設定、便利な使い方まで、コマンドや設定項目の一覧も含めてガッツリ解説していきます!


gh dashとは?

gh dash は、GitHub CLI(gh)の拡張機能として動作するターミナルダッシュボードです。作者はDolev Hadar(@dlvhdr)氏で、GitHubスター数は11,000超えの人気プロジェクトです。

公式GitHubリポジトリでは、以下の主要機能が紹介されています。

  • User-defined, per-repo, PRs & issues sections(ユーザー定義のリポジトリ別PR・Issueセクション)
  • Overridable vim-style keyboard hotkeys(オーバーライド可能なVimスタイルのキーバインディング)
  • Custom actions to perform your specific workflow needs(ワークフローに合わせたカスタムアクション)
  • Everything you can do on GitHub - diff, comment, checkout, push, update etc.(diff確認、コメント、チェックアウト、プッシュ、更新など、GitHubでできることすべて)
  • Control every setting with a YAML config file(YAMLファイルですべての設定を制御)

内部的には、Charmが開発するGoのTUIフレームワーク Bubbletea や、スタイリングライブラリ Lipgloss などを使って作られています。


インストール方法

公式のインストールガイドに沿って進めましょう。

1. GitHub CLIのインストール(まだの場合)

gh dash はGitHub CLIの拡張機能なので、まずは gh コマンドが必要です。macOSの場合はHomebrewで簡単にインストールできます。

brew install gh # macOSの場合

他のOSへのインストール方法はGitHub CLI公式ドキュメントを参照してください。インストール後、GitHubへの認証を済ませておきましょう。

gh auth login

2. gh dashのインストール

次に、gh extension install コマンドを使って gh dash をインストールします。

gh extension install dlvhdr/gh-dash

3. Nerd Fontのインストール(推奨)

gh dash はUIにアイコンを多用するため、アイコンが正しく表示されるように Nerd Font のインストールが強く推奨されています。

# macOSの場合(Fira Code Nerd Fontの例)
brew install --cask font-fira-code-nerd-font

インストール後、お使いのターミナルエミュレータ(iTerm2, Alacritty, WezTermなど)のフォント設定を、インストールしたNerd Fontに変更してください。

4. アップデート方法

gh dash を最新版にアップデートするには、以下のコマンドを実行します。

gh extension upgrade dlvhdr/gh-dash

起動と基本的な使い方

インストールが完了したら、ターミナルで以下のコマンドを叩くだけで起動します。

gh dash

これだけで、デフォルト設定のダッシュボードが立ち上がります!

コマンドラインフラグ

gh dash --help で確認できるフラグは以下の通りです。

フラグ 短縮形 説明
--config <path> -c 使用する設定ファイルのパスを指定する
--debug デバッグログを debug.log に書き出す
--help -h ヘルプを表示する
--version -v バージョン情報を表示する

設定ファイルのパスは、以下の優先順位で決定されます。

  1. $GH_DASH_CONFIG 環境変数が設定されている場合、そのパスを使用
  2. gitリポジトリ内にいる場合、リポジトリルートの .gh-dash.yml または .gh-dash.yaml を使用
  3. $XDG_CONFIG_HOME/gh-dash/config.yml(未設定の場合は ~/.config/gh-dash/config.yml

キーバインディング完全ガイド

gh dash の操作はすべてキーボードで完結します。まず ? を押すとヘルプメニューが表示されるので、迷ったらそれを見るのが一番です。

グローバル(どのビューでも使える)

公式ドキュメントより。

キー 説明
? ヘルプメニューの表示/非表示
/ 検索バーにフォーカスを移動(クエリを編集してEnterで反映)
r 現在のセクションを更新
R 全セクションを更新
s PRビューとIssueビューを切り替え
q 終了

ナビゲーション

公式ドキュメントより。

キー 説明
j / 下に移動(次のアイテムへ)
k / 上に移動(前のアイテムへ)
h / 前のセクション(タブ)へ移動
l / 次のセクション(タブ)へ移動
g / Home 先頭のアイテムへ移動
G / End 末尾のアイテムへ移動

プレビューペイン操作

公式ドキュメントより。

キー 説明
p プレビューペインの表示/非表示を切り替え
Ctrl+d プレビューペインを1ページ下にスクロール
Ctrl+u プレビューペインを1ページ上にスクロール
[ 次のプレビュータブへ移動
] 前のプレビュータブへ移動

選択中のアイテム共通(PR・Issue両方)

公式ドキュメントより。

キー 説明
o 選択中のアイテムをブラウザで開く
y アイテムの番号(# なし)をクリップボードにコピー
Y アイテムのURLをクリップボードにコピー

PR専用のキーバインディング

公式ドキュメントより。これが gh dash の真骨頂です。ブラウザを開かずにPRに対するほぼすべての操作が完結します。

キー 説明
d PRのDiff(差分)をターミナルで表示する
C PRのブランチをローカルにチェックアウトする(repoPaths 設定が必要)
v PRをApprove(承認)する
m PRをマージする
u PRのブランチをベースブランチで更新する
w PRのCIチェックを監視する(完了時にデスクトップ通知)
W PRをDraftからReady for Reviewに変更する
c PRにコメントを追加する
a PRにユーザーをアサインする
A PRからユーザーのアサインを外す
e PRの説明文を全文表示する(デフォルトは5行まで)
x PRをクローズする
X PRを再オープンする

Issue専用のキーバインディング

公式ドキュメントより。

キー 説明
c Issueにコメントを追加する
a Issueにユーザーをアサインする
A Issueからユーザーのアサインを外す
x Issueをクローズする
X Issueを再オープンする

設定ファイルを極める

gh dash の設定はすべてYAMLファイルで行います。デフォルトの設定ファイルは ~/.config/gh-dash/config.yml に作成されます。

設定ファイルの全体構造

# PRのセクション定義
prSections:
  - title: "My Pull Requests"
    filters: "is:open author:@me"

# Issueのセクション定義
issuesSections:
  - title: "My Issues"
    filters: "is:open author:@me"

# 通知のセクション定義
notificationsSections:
  - title: "All"
    filters: ""

# ローカルリポジトリのパスマッピング
repoPaths:
  your-org/*: ~/code/your-org/*

# デフォルト設定
defaults:
  view: prs
  refetchIntervalMinutes: 30
  prsLimit: 20
  issuesLimit: 20
  preview:
    open: true
    width: 0.45

# ページャー設定
pager:
  diff: less

# テーマ設定
theme:
  ui:
    sectionsShowCount: true
  table:
    showSeparators: true
    compact: false
  colors:
    text:
      primary: "#ffffff"
      # ...

# カスタムキーバインディング
keybindings:
  universal: []
  prs: []
  issues: []

# スマートフィルタリングの設定
smartFilteringAtLaunch: true

デフォルト設定(defaults)の詳細

公式ドキュメントより。

設定キー デフォルト値 説明
view String "prs" 起動時に表示するビュー("prs" または "issues"
prsLimit Integer 20 各PRセクションで取得するPRの最大件数(最小値: 1)
issuesLimit Integer 20 各Issueセクションで取得するIssueの最大件数(最小値: 1)
notificationsLimit Integer 20 通知セクションで取得する通知の最大件数(最小値: 1)
refetchIntervalMinutes Integer 30 自動再取得の間隔(分)。0 で無効化(最小値: 0)
preview.open Boolean true 起動時にプレビューペインを開くか
preview.width Number 0.45 プレビューペインの幅(ターミナル幅に対する割合、最小値: 0)
dateFormat String "relative" 日付の表示形式("relative" または Goの時刻フォーマット)
prApproveComment String "LGTM" PR承認時のデフォルトコメント(空文字列で無効化)
confirmQuit Boolean false 終了時に確認プロンプトを表示するか
includeReadNotifications Boolean true 既読通知を通知ビューに含めるか

セクション(フィルタ)のカスタマイズ

一番よくいじるのがこの設定です。GitHubの検索クエリ構文がそのまま使えます。

prSections:
  - title: "My Pull Requests"
    filters: "is:open author:@me"
  - title: "Needs My Review"
    filters: "is:open review-requested:@me"
  - title: "Involved"
    filters: "is:open involves:@me -author:@me"
  - title: "Team"
    # フィルタを複数行で書くと読みやすい(>- はYAMLの折りたたみブロックスカラー)
    filters: >-
      is:open
      org:your-org
      -author:@me

nowModify テンプレート関数

公式ドキュメントより。gh dash 独自のテンプレート関数 nowModify を使うと、相対的な日時指定が可能です。

  - title: "Recently Updated"
    filters: >-
      is:open
      -author:@me
      updated:>={{ nowModify "-2w" }}

使用できる時間単位は以下の通りです。

単位 意味
ns, us, ms, s, m, h ナノ秒〜時間(Goの標準)
d / D
w / W
M / mo
y / Y

リポジトリパスのマッピング(repoPaths

C(チェックアウト)やカスタムコマンドでローカルのリポジトリを操作する場合に必要な設定です。GitHub上のリポジトリ名とローカルのディレクトリパスを紐付けます。

repoPaths:
  # ワイルドカードで組織全体を指定できる
  your-org/*: ~/code/your-org/*
  # 個別のリポジトリも指定可能
  your-username/dotfiles: ~/dotfiles

カスタムキーバインディング

公式ドキュメントより。既存のキーバインディングを上書きしたり、新しいコマンドを追加できます。コマンドはシェルで実行されるため、任意のコマンドを組み合わせることができます。

keybindings:
  # どのビューでも使えるキーバインディング
  universal:
    - key: g
      name: lazygit
      command: >
        cd {{.RepoPath}} && lazygit

  # PRビュー専用
  prs:
    # 既存のbuiltinコマンドを別のキーに割り当てる
    - key: O
      builtin: checkout
    # カスタムコマンド(tmux + neovim + Octo.nvimの連携例)
    - key: C
      name: code review
      command: >
        tmux new-window -c {{.RepoPath}} '
        nvim -c ":silent Octo pr edit {{.PrNumber}}"
        '

  # Issueビュー専用
  issues:
    - key: P
      name: pin issue
      command: >
        gh issue pin {{.IssueNumber}} --repo {{.RepoName}}

PRコマンドで使えるテンプレート変数

変数 説明
{{.RepoName}} リポジトリのフルネーム(例: dlvhdr/gh-dash
{{.RepoPath}} ローカルのリポジトリパス(repoPaths の設定に基づく)
{{.PrNumber}} PRの番号
{{.HeadRefName}} PRのheadブランチ名
{{.BaseRefName}} PRのbaseブランチ名
{{.Author}} PRの作成者のユーザー名

Issueコマンドで使えるテンプレート変数

変数 説明
{{.RepoName}} リポジトリのフルネーム
{{.RepoPath}} ローカルのリポジトリパス
{{.IssueNumber}} Issueの番号
{{.Author}} Issueの作成者のユーザー名

ビルトインコマンド一覧

builtin キーで既存のビルトインコマンドを別のキーに割り当てることもできます。

ユニバーサル(共通)

コマンド名 説明
up / down 行の移動
firstLine / lastLine 先頭/末尾への移動
nextSection / prevSection セクション移動
togglePreview プレビューペインの表示切り替え
openGithub ブラウザで開く
refresh / refreshAll 更新
search 検索バーにフォーカス
copyurl / copyNumber URL/番号のコピー
togglesearch スマートフィルタリングのトグル
help ヘルプメニュー
quit 終了

PR専用

コマンド名 説明
approve PRを承認
assign / unassign アサインの追加/削除
comment コメントを追加
diff Diffを表示
checkout チェックアウト
close / reopen クローズ/再オープン
merge マージ
update ブランチを更新
watchChecks CIチェックを監視
ready Ready for Reviewに変更
expandDescription 説明文を全文表示

テーマのカスタマイズ

公式ドキュメントより。UIの色合いを細かく設定できます。

theme:
  ui:
    sectionsShowCount: true  # セクション名の横に件数を表示するか
  table:
    showSeparators: true  # テーブルの行間に区切り線を表示するか
    compact: false        # コンパクト表示にするか
  colors:
    text:
      primary: "#E2E1ED"    # メインのテキスト色
      secondary: "#666CA6"  # サブのテキスト色
      inverted: "#242347"   # 反転テキスト色(ラベルなど)
      faint: "#B0B3BF"      # 薄いテキスト色(クローズ済みアイテムなど)
      warning: "#E0AF68"    # 警告色(CIが失敗している場合など)
      success: "#3DF294"    # 成功色(CIが通過している場合など)
      actor: "#c6c6c6"      # 通知のアクター名の色
    background:
      selected: "#1B1B33"   # 選択中のアイテムの背景色
    border:
      primary: "#383B5B"    # メインのボーダー色
      secondary: "#39386B"  # サブのボーダー色
      faint: "#2B2B40"      # 薄いボーダー色(テーブルの行間)

スマートフィルタリング

gh dash には、スマートフィルタリングという便利な機能があります。

gitリポジトリのディレクトリ内から gh dash を起動すると、そのリポジトリのPR/Issueだけを表示するように自動的にフィルタリングされます。repo: フィルタを明示的に指定していないセクションに対して、自動的に repo:<リポジトリ名> が追加される仕組みです。

この機能を無効にしたい場合は、設定ファイルに以下を追加します。

smartFilteringAtLaunch: false

また、ダッシュボード上で t キーを押すことで、現在のセクションのスマートフィルタリングをトグルすることもできます。


実践的な設定例

公式のExamplesページを参考に、実践的な設定例を紹介します。

prSections:
  - title: "My Pull Requests"
    filters: "is:open author:@me"
  - title: "Needs My Review"
    filters: "is:open review-requested:@me"
  - title: "Involved"
    filters: "is:open involves:@me -author:@me"

issuesSections:
  - title: "My Issues"
    filters: "is:open author:@me"
  - title: "Assigned"
    filters: "is:open assignee:@me"

repoPaths:
  your-org/*: ~/code/your-org/*

defaults:
  view: prs
  refetchIntervalMinutes: 5
  prsLimit: 20
  issuesLimit: 20
  preview:
    open: true
    width: 0.45

pager:
  diff: less

keybindings:
  universal:
    - key: g
      name: lazygit
      command: >
        cd {{.RepoPath}} && lazygit
  prs:
    - key: O
      builtin: checkout

まとめ

gh dash は、ターミナル中心で開発を行うエンジニアにとって、GitHub体験を劇的に向上させるツールです。

  • ブラウザを開く回数が減る
  • レビュー待ちのPRを見落とさなくなる
  • キーボード操作だけで完結するのでフロー状態を維持できる
  • カスタムコマンドで自分のワークフローを自動化できる

最初はキーバインディングを覚えるのに少し戸惑うかもしれませんが、数日使えば手放せなくなること間違いなしです。ぜひインストールして、自分好みのダッシュボードを作り上げてみてください!


参考リンク

VeriCerts Tech Blog

Discussion