diffle README

The project's README from github.com/moritzwilksch/diffle. As one markdown file: README.md.

diffle

CI conda-forge conda-forge-platforms npm website

Review a Git diff in the browser and comment on lines, blocks, or whole files. Then hand the comments to an agent as a prompt, or to GitHub as a pending review.

diffle reviewing a git diff

Install

pixi global install diffle               # conda-forge
npm install -g @moritzwilksch/diffle     # npm

Or grab the standalone binary, which needs no Node.js. On Linux (x64, arm64, glibc) and Apple silicon macOS:

curl -fsSL https://diffle.app/install.sh | sh

It installs to ~/.local/bin. Set DIFFLE_INSTALL_DIR to change that, or DIFFLE_VERSION=v0.1.9 to pin a release. On Windows (x64, arm64), from PowerShell:

irm https://diffle.app/install.ps1 | iex

To try it without installing:

pixi exec diffle working
npx @moritzwilksch/diffle working
nix run github:moritzwilksch/diffle -- working

The Nix package bundles gh; #minimal drops it, and #web, #rust, and #python bundle language servers.

Pick what to review

diffle                  # HEAD vs worktree, like a bare `git diff`
diffle working          # HEAD vs worktree: staged, unstaged, untracked
diffle develop          # what this branch added since it left develop
diffle pr 27            # GitHub PR 27, or its URL; without a number, this branch's PR
diffle show a1b2c3d     # one commit, like `git show`
diffle main..feat       # any git-diff revspec: <rev> | a..b | a...b | a b
diffle main..worktree   # "worktree" names the uncommitted tree on either side
diffle range-diff main..v1 main..v2   # how a series of commits was reworked, like `git range-diff`
diffle --help           # all commands and flags

diffle pr needs a GitHub token. A PR from another repository opens in a temporary clone.

Closing the last diffle tab stops the server and prints your open comments. Pass --keep-alive to keep it running.

Review

Press ? for the full list.

A comparison lists its commits above the threads. Pick one, or step with < and >, to see that commit alone; All changes returns to the whole range. Comments on a focused commit belong to that commit, as in diffle show.

Comments live in <git-dir>/diffle/ and never touch your worktree. They follow their text as the code changes and go stale once it leaves the diff.

Generated files start collapsed, as on GitHub: linguist-generated in .gitattributes marks them, and linguist-generated=false opts a file out. To collapse other files, add auto-viewed globs in settings or with diffle config.

Send comments to GitHub

The pull request icon adds one thread, or all open threads, to a pending review on the PR. diffle never submits it: you edit, drop, and submit the comments on GitHub yourself. Adding a thread again updates its comment instead of duplicating it.

Export works when the comparison matches the PR's committed diff, so unpushed commits and worktree changes rule it out. Stale threads are skipped.

diffle takes the token from GITHUB_TOKEN, then GH_TOKEN, then a signed-in gh. Without one, everything except GitHub still works. GITHUB_API_URL points diffle at another GitHub API, as in Actions.

Jump to definitions

diffle starts a language server for each language in the diff, if it finds one on PATH:

Results outside the diff, such as the standard library, open read-only. Large repositories can take a while to index.

diffle lsp shows which server each language gets and what to install for the rest:

python    pyrefly lsp
rust      not on PATH (tried rust-analyzer)

Override a server or turn one off:

diffle config set-lsp rust "rust-analyzer"       # persistent
diffle config set-lsp java ""                    # never start one for java
diffle config unset-lsp rust                     # back to PATH
diffle working --lsp python="pyrefly lsp"        # this run only
diffle working --no-lsp                          # none at all

Language servers run through a shell inside the repository and can read anything your user can. --no-lsp starts none.

Shell completions

diffle completion --shell bash > ~/.local/share/bash-completion/completions/diffle
diffle completion --shell zsh > ~/.local/share/zsh/site-functions/_diffle   # on fpath, before compinit
diffle completion --shell fish > ~/.config/fish/completions/diffle.fish

Rerun after upgrading to pick up new commands. Revisions don't complete.

Behind a reverse proxy

diffle works under a path prefix such as https://proxy.example/diffle/ with no extra setting. Have the proxy strip the prefix, including for WebSocket upgrades at /diffle/ws, and trust its public origin:

diffle working -H 0.0.0.0 --no-open --allowed-origin https://proxy.example

If the proxy rewrites Host and Origin to its upstream address, such as a Kubernetes service name, trust that address instead. A rejected request gets a 403 naming the header that failed.

Development

npm install
npm run dev -- working
npm test && npm run typecheck && npm run build

Restart npm run dev after client changes; the server serves dist/client. npm run fixture -- <dir> builds the repository the tests review, covering renames, binaries, CRLF, and more. Screenshot tests run in Docker so they match CI:

npm run test:e2e:docker                  # the browser suite
npm run test:e2e:docker -- -g search     # matching scenarios
npm run test:e2e:report                  # open the last report
npm run test:e2e:docker:update           # accept new screenshots

See AGENTS.md for more.

Acknowledgements

diffle is inspired by difit. Diffs are rendered with @pierre/diffs.

diffle (moritzwilksch/diffle)

Searching Database…

163 ·GitHub
这是什么?Diffle 是一个以键盘操作为主的 diff 查看器,它会在浏览器中打开 Git diff,让你对某一行、某个代码块或整个文件发表评论,然后把这些评论作为提示词交给 AI 代理,或者作为待提交的评审推送到 GitHub。
这是一个浏览器应用,还是一个会打开浏览器的命令行工具?它是一个命令行工具:你运行 diffle 命令后,它会启动一个本地服务器,并在浏览器的标签页中打开 diff。关闭最后一个标签页时,服务器也会随之关闭。
我怎么安装 diffle?下载独立的二进制文件即可,不需要 Node.js:Linux(x64/arm64,glibc)和 Apple 芯片的 macOS 有安装脚本,Windows(x64/arm64)有 PowerShell 命令。另外还提供 Nix 软件包,你也可以先试用再安装。
我的评论总是能直接推送到 GitHub 吗?不能,只有当你本地的对比结果与 PR 中已提交的 diff 完全一致时才能导出,所以未推送的提交或工作区的改动都会阻止导出,过期的评论话题则会被跳过。
我的评审评论会被写进项目的文件里吗?不会,评论是单独存储的,绝不会改动你的工作区;它们只是跟随匹配的文本随代码变动,一旦该文本离开 diff,评论就会过期。
它用什么键盘快捷键来导航?Vim 风格的按键:j/k 在行之间移动(10j 表示移动十行),J/K 切换文件,c/C 对某一行或整个文件发表评论,V 选中一个代码块,R 解决一个话题,v 把文件标记为已查看,/ 或 g/ 分别在文件内或跨文件搜索。
评审时能跳转到某个符号的定义吗?可以,diffle 会为它在 PATH 中找到的每种语言启动语言服务器,支持 gd 跳转到定义,gA 查看引用,gs/gS 查找符号,gh 查看悬停信息,其中包括 JSON/YAML/TOML 的 schema 文档。
diffle 的灵感来自哪里,diff 是用什么渲染的?Diffle 的灵感来自工具 'difit',diff 本身则是用 @pierre/diffs 库渲染的。
可以把 diffle 放在反向代理后面运行吗?可以,在路径前缀下无需任何额外配置即可使用,只要代理会剥离该前缀(包括针对 /diffle/ws 的 WebSocket 升级请求),并且信任自己的公网来源即可;来源不匹配的请求会收到 403 而被拒绝。
Size
45.1 MB
Stars
163
Age
1mo
Commits · 90 Days