プログラミング
Show HN: Diffle, LSPサポート付きキーボード中心の差分ビューア
Show HN: Diffle, a keyboard-centric diff viewer with LSP support (github.com)
要約
Diffleは、ブラウザ上でGitの差分を確認し、行やブロック、ファイル単位でコメントを付けられるツールです。LSP(Language Server Protocol)をサポートしており、コードの定義ジャンプや型情報表示などの機能も利用できます。GitHubのプルリクエストレビューへの連携や、ローカルでのスタンドアロン実行も可能です。
全文翻訳
Diffle Gitの差分をブラウザでレビューし、行、ブロック、またはファイル全体にコメントを付けられます。その後、コメントをエージェントへのプロンプトとして渡すか、GitHubへの保留中のレビューとして送信します。
インストール
pixi global install diffle # conda-forge
npm install -g @moritzwilksch/diffle # npm
または、Node.jsを必要としないスタンドアロンバイナリを取得します。
Linux (x64, arm64, glibc) および Apple silicon macOS:
curl -fsSL https://diffle.app/install.sh | sh
これは ~/.local/bin にインストールされます。変更するには DIFFLE_INSTALL_DIR を設定するか、リリースを固定するには DIFFLE_VERSION=v0.1.9 を設定します。
Windows (x64, arm64) では、PowerShell から:
irm https://diffle.app/install.ps1 | iex
インストールせずに試すには:
pixi exec diffle working
npx @moritzwilksch/diffle working
nix run github:moritzwilksch/diffle -- working
Nixパッケージはghをバンドルしています。#minimal はそれを削除し、#web、#rust、および #python は言語サーバーをバンドルします。
レビューするものを選択
diffle # HEAD vs worktree、通常の `git diff` のように
diffle working # HEAD vs worktree: ステージ済み、ステージ未済み、追跡されていないファイル
diffle develop # このブランチが develop から分岐してからの変更点
diffle pr 27 # GitHub PR 27、またはそのURL。番号がない場合は、このブランチのPR
diffle show a1b2c3d # 1つのコミット、`git show` のように
diffle main..feat # 任意の git-diff revspec: <rev> | a..b | a...b | a b
diffle main..worktree # "worktree" は両側のコミットされていないツリーを指します
diffle range-diff main..v1 main..v2 # コミットのシリーズがどのように rework されたか、`git range-diff` のように
diffle --help # すべてのコマンドとフラグ
diffle pr は GitHub トークンが必要です。別のリポジトリからのPRは一時的なクローンで開かれます。最後の diffle タブを閉じるとサーバーが停止し、開いているコメントが表示されます。実行を継続するには --keep-alive を渡します。
レビュー操作
j / k: 次または前の行 (10j: 10行下)
J / K: 次または前のファイル
] / [: 次または前のハング
c: コメント
C: ファイル全体にコメント
V: ブロックを選択
R: 解決済み
v: 表示済みとしてマーク
/: 現在のファイルを検索
g/: 変更されたすべてのファイルを検索
gf: ファイルをフィルタリング
F: ファイル全体を開く
Ctrl+o: 戻る
yy: すべてのコメントをコピー
完全なリストを表示するには ? を押してください。
比較では、そのコミットがスレッドの上にリストされます。1つを選択するか、< と > でステップしてそのコミットのみを表示します。All changes は範囲全体に戻ります。フォーカスされたコミットに対するコメントは、diffle show のように、そのコミットに属します。コメントは <git-dir>/diffle/ に保存され、ワークツリーには触れません。コードの変更に伴ってテキストを追跡し、差分から外れると古くなります。
生成されたファイルは、GitHub のようにデフォルトで折りたたまれます。.gitattributes の linguist-generated はそれらをマークし、linguist-generated=false はファイルをオプトアウトします。他のファイルを折りたたむには、設定または diffle config で auto-viewed グロブを追加します。
コメントを GitHub に送信
プルリクエストアイコンは、PR の保留中のレビューに1つのスレッド、またはすべて開いているスレッドを追加します。Diffle はそれを送信しません。あなたは GitHub 上でコメントを編集、破棄、送信します。スレッドを再度追加すると、重複するのではなくコメントが更新されます。
エクスポートは、比較が PR のコミット済み差分と一致する場合に機能します。プッシュされていないコミットやワークツリーの変更はこれを無効にします。古いスレッドはスキップされます。
Diffle は GITHUB_TOKEN、次に GH_TOKEN、次にサインインした gh からトークンを取得します。トークンがない場合でも、GitHub 以外のすべては機能します。GITHUB_API_URL は、Actions の場合のように、Diffle を別の GitHub API にポイントさせます。
定義へのジャンプ
Diffle は、PATH 上で見つかった場合、差分内の各言語に対して言語サーバーを起動します:
gd または Ctrl/Cmd+クリック: 定義
gy: 型定義
gA: 参照
gs / gS: ファイルまたはリポジトリのシンボル
gh: ホバー、JSON、YAML、TOML のスキーマドキュメントを含む
w / b / 0 / $: 行のシンボルをステップスルーします。カーソル下またはポインター下のシンボルは、ファイル内で繰り返される場所に色付けされ、読み取りとは別に書き込みが行われます。
差分の外の結果(標準ライブラリなど)は読み取り専用で開かれます。大規模なリポジトリのインデックス作成には時間がかかる場合があります。
diffle lsp は、各言語がどのサーバーを取得しているか、および他の言語に何をインストールする必要があるかを示します:
python pyrefly lsp
rust not on PATH (tried rust-analyzer)
サーバーをオーバーライドするか、無効にするには:
diffle config set-lsp rust "rust-analyzer" # 永続的
diffle config set-lsp java "" # Java 用に起動しない
diffle config unset-lsp rust # PATH に戻す
diffle working --lsp python="pyrefly lsp" # この実行のみ
diffle working --no-lsp # すべて無効
言語サーバーはリポジトリ内のシェルを通じて実行され、ユーザーがアクセスできるものはすべて読み取ることができます。--no-lsp は何も起動しません。
シェル補完
diffle completion --shell bash > ~/.local/share/bash-completion/completions/diffle
diffle completion --shell zsh > ~/.local/share/zsh/site-functions/_diffle # fpath 上、compinit の前
diffle completion --shell fish > ~/.config/fish/completions/diffle.fish
アップグレード後に再実行して新しいコマンドを取得してください。リビジョンは補完しません。
リバースプロキシの背後
Diffle は、追加の設定なしで、https://proxy.example/diffle/ のようなパスプレフィックスの下で動作します。プロキシにプレフィックス(/diffle/ws での WebSocket アップグレードを含む)を削除させ、そのパブリックオリジンを信頼させます:
diffle working -H 0.0.0.0 --no-open --allowed-origin https://proxy.example
プロキシが Host と Origin を Kubernetes サービス名のようなアップストリームアドレスに書き換える場合は、そのアドレスを信頼します。拒否されたリクエストは、失敗したヘッダーを示す 403 を返します。
開発
npm install
npm run dev -- working
npm test && npm run typecheck && npm run build
クライアントの変更後に npm run dev を再起動します。サーバーは dist/client を提供します。
npm run fixture -- <dir> は、テストがレビューするリポジトリをビルドします。リネーム、バイナリ、CRLFなどをカバーします。
スクリーンショットテストは Docker で実行されるため、CI と一致します:
npm run test:e2e:docker # ブラウザスイート
npm run test:e2e:docker -- -g search # マッチングシナリオ
npm run test:e2e:report # 最後のレポートを開く
npm run test:e2e:docker:update # 新しいスクリーンショットを承認する
AGENTS.md を参照してください。
謝辞
Diffle は difit に触発されています。差分は @pierre/diffs でレンダリングされます。