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 |
バージョン情報を表示する |
設定ファイルのパスは、以下の優先順位で決定されます。
-
$GH_DASH_CONFIG環境変数が設定されている場合、そのパスを使用 - gitリポジトリ内にいる場合、リポジトリルートの
.gh-dash.ymlまたは.gh-dash.yamlを使用 -
$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を見落とさなくなる
- キーボード操作だけで完結するのでフロー状態を維持できる
- カスタムコマンドで自分のワークフローを自動化できる
最初はキーバインディングを覚えるのに少し戸惑うかもしれませんが、数日使えば手放せなくなること間違いなしです。ぜひインストールして、自分好みのダッシュボードを作り上げてみてください!
Discussion