From 2782324870a1a57d1d4e7b79b0099a7e9dbc3a4f Mon Sep 17 00:00:00 2001 From: thinceller Date: Sat, 22 Aug 2026 14:37:53 +0000 Subject: [PATCH 1/2] =?UTF-8?q?feat(gh):=20gh=20pr-graph=20=E3=82=92?= =?UTF-8?q?=E5=B0=8E=E5=85=A5=E3=81=97=20herdr=20=E3=81=AE=20gh=20dash=20k?= =?UTF-8?q?eybind=20=E3=82=92=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh pr-graph (orangain/gh-pr-graph) は自分が author / assignee / reviewer の PR を横断で集め、base/head ブランチを再帰的にたどって stacked PR の依存関係を グラフとして描く gh 拡張。フラットな PR 一覧では見えないレビュー順や下流の 作業が一目で分かるので、herdr の `prefix+ctrl+p` を gh dash から置き換える。 - nixpkgs 未収録なので nvfetcher + buildGoModule で自前ビルドする (tcmux と同形)。 go.mod に require が無いため vendorHash = null。 - home-manager の programs.gh.extensions は pname をそのまま ~/.local/share/gh/extensions/ に link farm するため、 pname と $out/bin のバイナリ名を "gh-pr-graph" に揃えている。 - gh pr-graph は TUI ではなく 127.0.0.1 にサーバを立ててブラウザを開き、 Ctrl-C まで居座る。popup は session-modal でブラウザ閲覧中ずっと herdr を ブロックしてしまうため、keybind の type は popup ではなく pane にした。 - gh dash 自体は CLI から使えるよう extensions には残す。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01QYmZcVLWwWwJ1MvuTSy2xs --- _sources/generated.nix | 11 +++++++++++ configs/.config/herdr/config.toml | 14 ++++++++------ home-manager/programs/gh/default.nix | 14 +++++++++----- home-manager/programs/gh/gh-pr-graph.nix | 14 ++++++++++++++ nvfetcher.toml | 4 ++++ 5 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 home-manager/programs/gh/gh-pr-graph.nix diff --git a/_sources/generated.nix b/_sources/generated.nix index 44376e15..d896266e 100644 --- a/_sources/generated.nix +++ b/_sources/generated.nix @@ -30,6 +30,17 @@ }; date = "2021-07-16"; }; + gh-pr-graph = { + pname = "gh-pr-graph"; + version = "v0.14.5"; + src = fetchFromGitHub { + owner = "orangain"; + repo = "gh-pr-graph"; + rev = "v0.14.5"; + fetchSubmodules = false; + sha256 = "sha256-kSbtyDA52fYvcT0hd6SZ/1E6lA6j+wbsXEGzLhUy5gg="; + }; + }; hydro = { pname = "hydro"; version = "f130b55ee3eaf099eccf588e2a62e5447068d120"; diff --git a/configs/.config/herdr/config.toml b/configs/.config/herdr/config.toml index e185aab6..aa0847eb 100644 --- a/configs/.config/herdr/config.toml +++ b/configs/.config/herdr/config.toml @@ -58,14 +58,16 @@ description = "open bottom (resource monitor) in popup" width = "90%" height = "90%" -# gh dash — PR / issue の一覧を差し込みで開く。 +# gh pr-graph — 自分が author / assignee / reviewer の PR を、base/head ブランチを +# たどった依存グラフとしてブラウザで開く。ローカル (127.0.0.1) にサーバを立てて +# ブラウザを起動し、Ctrl-C まで前面に居座るタイプなので popup ではなく pane で開く。 +# popup は session-modal でブラウザを見ている間ずっと herdr 側がブロックされるが、 +# pane なら他のペインを触りながらサーバを生かしておける (コマンド終了で pane も閉じる)。 [[keys.command]] key = "prefix+ctrl+p" -type = "popup" -command = "gh dash" -description = "open gh dash in popup" -width = "90%" -height = "90%" +type = "pane" +command = "gh pr-graph" +description = "open gh pr-graph (PR dependency graph) in a temporary pane" # scratch fish shell — 今のペインを汚さず 1 発コマンドを叩く用。 # exit で popup が閉じる。 diff --git a/home-manager/programs/gh/default.nix b/home-manager/programs/gh/default.nix index 30cb3577..41a70b68 100644 --- a/home-manager/programs/gh/default.nix +++ b/home-manager/programs/gh/default.nix @@ -1,13 +1,17 @@ -{ pkgs, ... }: +{ pkgs, sources, ... }: +let + gh-pr-graph = import ./gh-pr-graph.nix { inherit pkgs sources; }; +in { programs.gh-prism.enable = true; programs.gh = { enable = true; - extensions = with pkgs; [ - gh-dash - gh-poi - gh-stack + extensions = [ + pkgs.gh-dash + pkgs.gh-poi + pkgs.gh-stack + gh-pr-graph ]; settings = { git_protocol = "ssh"; diff --git a/home-manager/programs/gh/gh-pr-graph.nix b/home-manager/programs/gh/gh-pr-graph.nix new file mode 100644 index 00000000..3ba4d3f0 --- /dev/null +++ b/home-manager/programs/gh/gh-pr-graph.nix @@ -0,0 +1,14 @@ +# gh pr-graph — 自分が関わる PR を base/head ブランチ単位のグラフで一覧する gh 拡張。 +# nixpkgs 未収録なので nvfetcher + buildGoModule で自前ビルドする (tcmux と同じ形)。 +# home-manager の programs.gh.extensions は pname をそのまま +# ~/.local/share/gh/extensions/ に link farm するため、 +# pname と $out/bin のバイナリ名を両方 "gh-pr-graph" に揃える必要がある。 +{ pkgs, sources }: +pkgs.buildGoModule { + pname = "gh-pr-graph"; + inherit (sources.gh-pr-graph) version src; + # go.mod に require が無い (依存ゼロ) ため vendoring 不要。 + vendorHash = null; + subPackages = [ "cmd/gh-pr-graph" ]; + ldflags = [ "-X main.version=${sources.gh-pr-graph.version}" ]; +} diff --git a/nvfetcher.toml b/nvfetcher.toml index ee0261f1..d8e24040 100644 --- a/nvfetcher.toml +++ b/nvfetcher.toml @@ -25,3 +25,7 @@ fetch.github = "k1LoW/tcmux" src.git = "https://github.com/mattpocock/skills" src.branch = "main" fetch.github = "mattpocock/skills" + +[gh-pr-graph] +src.github = "orangain/gh-pr-graph" +fetch.github = "orangain/gh-pr-graph" From 543069670af1bafdaebc7ea00b81096c4417562e Mon Sep 17 00:00:00 2001 From: thinceller Date: Sun, 23 Aug 2026 21:57:38 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix(gh):=20gh=20=E3=83=A2=E3=82=B8=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=82=92=20common/default/server=20=E3=81=AB?= =?UTF-8?q?=E5=88=86=E5=89=B2=E3=81=97=20oberon=20=E3=81=AE=E3=83=93?= =?UTF-8?q?=E3=83=AB=E3=83=89=E3=82=92=E7=9B=B4=E3=81=99=20(#54)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit oberon (nixpkgs-stable / nixos-25.11) の `build-nixos` が `attribute 'gh-stack' missing` で落ちていた。gh-stack は nixpkgs unstable に しか無く、unstable を使う darwin 2 host では通るが stable の oberon では 評価に失敗する。master から続く既存の問題。 claude-code / fish / git / opencode と同じ common.nix / server.nix の慣習に 合わせて gh モジュールを分割する。 - gh/common.nix: stable にも存在する gh-dash / gh-poi + settings + gh-prism - gh/default.nix: common.nix を import し、darwin 用に gh-stack と gh-pr-graph を追加 (extensions は list なのでマージされる) - gh/server.nix: oberon 用。common.nix だけ - hosts/oberon/home.nix: import 先を gh/server.nix に変更 副次効果として、ローカルサーバを立ててブラウザを開く gh-pr-graph が ヘッドレスな oberon に載らなくなる。これも意図した挙動。 Claude-Session: https://claude.ai/code/session_01QYmZcVLWwWwJ1MvuTSy2xs Co-authored-by: Claude Opus 5 --- home-manager/programs/gh/common.nix | 22 ++++++++++++++++++++++ home-manager/programs/gh/default.nix | 28 +++++++++++----------------- home-manager/programs/gh/server.nix | 5 +++++ hosts/oberon/home.nix | 2 +- 4 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 home-manager/programs/gh/common.nix create mode 100644 home-manager/programs/gh/server.nix diff --git a/home-manager/programs/gh/common.nix b/home-manager/programs/gh/common.nix new file mode 100644 index 00000000..39776534 --- /dev/null +++ b/home-manager/programs/gh/common.nix @@ -0,0 +1,22 @@ +# 全ホスト共通の gh 設定。 +# oberon は nixpkgs-stable (nixos-25.11) を使うため、ここには stable にも +# 存在するものだけを置く。unstable 限定の拡張は default.nix 側で足す。 +{ pkgs, ... }: +{ + programs.gh-prism.enable = true; + + programs.gh = { + enable = true; + extensions = [ + pkgs.gh-dash + pkgs.gh-poi + ]; + settings = { + git_protocol = "ssh"; + prompt = "enabled"; + aliases = { + co = ''!id="$(gh pr list -L100 | fzf | cut -f1)"; [ -n "$id" ] && gh pr checkout "$id"''; + }; + }; + }; +} diff --git a/home-manager/programs/gh/default.nix b/home-manager/programs/gh/default.nix index 41a70b68..fc0db472 100644 --- a/home-manager/programs/gh/default.nix +++ b/home-manager/programs/gh/default.nix @@ -1,24 +1,18 @@ +# darwin (nixpkgs unstable) 用の gh 設定。 { pkgs, sources, ... }: let gh-pr-graph = import ./gh-pr-graph.nix { inherit pkgs sources; }; in { - programs.gh-prism.enable = true; + imports = [ ./common.nix ]; - programs.gh = { - enable = true; - extensions = [ - pkgs.gh-dash - pkgs.gh-poi - pkgs.gh-stack - gh-pr-graph - ]; - settings = { - git_protocol = "ssh"; - prompt = "enabled"; - aliases = { - co = ''!id="$(gh pr list -L100 | fzf | cut -f1)"; [ -n "$id" ] && gh pr checkout "$id"''; - }; - }; - }; + # ここに置く拡張が oberon に載らないのは意図的: + # - gh-stack は nixpkgs unstable にしか無い (nixos-25.11 には未収録)。 + # - gh-pr-graph はローカルサーバを立ててブラウザを開くツールなので、 + # ヘッドレスな oberon では使えない。 + # programs.gh.extensions は list なので common.nix の定義とマージされる。 + programs.gh.extensions = [ + pkgs.gh-stack + gh-pr-graph + ]; } diff --git a/home-manager/programs/gh/server.nix b/home-manager/programs/gh/server.nix new file mode 100644 index 00000000..fa2681a9 --- /dev/null +++ b/home-manager/programs/gh/server.nix @@ -0,0 +1,5 @@ +# oberon (サーバー) 用の gh 設定。common.nix だけで完結する。 +{ ... }: +{ + imports = [ ./common.nix ]; +} diff --git a/hosts/oberon/home.nix b/hosts/oberon/home.nix index 9ca9ac07..97de2b4c 100644 --- a/hosts/oberon/home.nix +++ b/hosts/oberon/home.nix @@ -21,7 +21,7 @@ in ../../home-manager/programs/direnv ../../home-manager/programs/fish/server.nix ../../home-manager/programs/fzf - ../../home-manager/programs/gh + ../../home-manager/programs/gh/server.nix ../../home-manager/programs/git/server.nix ../../home-manager/programs/htop ../../home-manager/programs/hunk