Skip to content

工作台显示 PR 状态和整份 PR 的文件变动 - #185

Merged
zuohaisu merged 3 commits into
mainfrom
agent/feat-pr-change-set
Oct 18, 2026
Merged

zuohaisu merged 3 commits into
mainfrom
agent/feat-pr-change-set

Conversation

@zuohaisu

Copy link
Copy Markdown
Owner

Summary

选中 worktree 时,第二行改成一次只读 gh pr view 的结果:编号、draft/open/merged/closed、checks、review、能否合并、文件数和增删行。没有 PR 写 no pr;gh 没装、没登录或网络失败写 unknown 和原因,不按分支名猜测。

ctrl+b 然后 f(prefix+f,不占用现有 herdr 前缀键)打开 PR 面板,列出 GitHub Files changed 的净差异。回车看该文件的 patch,Esc 返回。重命名显示旧路径到新路径。GitHub 不返回 patch 的文件标成 binary,不补本地 diff。面板不能 Approve、Merge 或评论。

Refs #182

验收标准

  • 同一文件在多个 commit 里改过,列表只有一行,diff 是相对 base 的净结果。假 gh 返回 3 个 commit、同一路径一行,patch 含 +final、不含 +intermediate。
  • 先新增、后删除的文件不在列表里。响应里没有 gone.txt,实现也不从本地 commit 补文件。
  • 重命名显示旧路径到新路径:R old/path.rs → src/new.rs。
  • 工作区干净、PR 上已有多个 commit 时,列表仍然有文件。
  • 未提交的脏文件只出现在现有文件面板,不出现在 PR 列表。
  • 无 PR、gh 缺失、未登录、网络失败都有原因,不猜测。
  • 这条路径上没有 gh 写操作。pr merge / pr comment / pr review 仍被只读白名单拒绝;假 gh 日志里没有这些子命令。
  • 假 gh 锁住 draft、checks 失败、冲突、无 PR、gh 失败,以及上面的文件形状。
  • 本机真实 gh 对一个多 commit PR 对过编号、checks 和文件列表。没有这次走查,保持 pending。

证据(Validation)

$ cargo fmt --all -- --check
(无输出,退出码 0)

$ cargo clippy --all-targets -- -D warnings
Finished `dev` profile,退出码 0

$ cargo test --workspace -- --test-threads=8
viva lib: 365 passed; 0 failed; 1 ignored
其余 crate 与集成测试均为 passed; 0 failed
退出码 0

被忽略的那一项是原来就有的 crates/viva/src/update/tests.rs:「downloads a real public release」,这次没有跑,不算通过。

git diff --check 无输出,退出码 0。

假 gh 覆盖的测试包括 git::pr::tests::gh_misses_stay_distinct_and_do_not_guess_a_pull_request、fake_gh_locks_draft_failing_checks_and_a_merge_conflict、files_are_the_net_github_list_with_rename_and_bounds,以及 server::v15_tests::pr_change_set_uses_github_files_and_does_not_write。

写解析器时用真实 gh pr view 163 和 gh api repos/zuohaisu/viva/pulls/163/files 对过字段名(reviewDecision、changedFiles、statusCheckRollup、previous_filename)。这不是工作台走查,上面的验收项仍然 pending。

风险与安全边界(Risk/Safety Boundaries)

只读 gh。GET repos/{owner}/{repo}/pulls/{n}/files 加入 evidence 白名单;pr merge、pr comment、pr review 以及其他写操作仍然在入口拒绝。gh 调用前放开数据库锁。文件列表按 PR head SHA 缓存,head 变了就重拉。

合并后删除 worktree 仍要当场复查为 merged,不看侧边栏缓存。PR 不改任何版本号,不发版,面板不提供批准或合并。

未验证项(Known Limitations)

本机用真实 gh 打开工作台、对一个多 commit PR 核对编号、checks 和文件列表,还没有做。按 issue,这项由 owner 在合并之后走查。

默认侧边栏宽 26 列,拖到上限 36 列也放不下整行。PR 摘要放在第二行最前面,窄栏里先看到编号、状态和 checks;完整一行在 PR 面板抬头。

按单个 commit 翻 diff、行内评论、从面板合并或批准,都不在这次。

The sidebar reads one gh pr view, and prefix+f opens GitHub's Files changed list so a clean worktree still shows what the pull request changed.

Co-authored-by: Cursor <cursoragent@cursor.com>
The panel header now shows review, merge, and the diff size that the narrow sidebar clips. File pages are read separately so a capture cut at 1 MiB does not turn the whole list into unknown.

Co-authored-by: Cursor <cursoragent@cursor.com>
@zuohaisu

Copy link
Copy Markdown
Owner Author

QA 说得对,两处重要问题和两处次要问题都已按 head 3afc32e 改掉。

侧边栏最宽 36 列,第二行仍然只能看到编号、状态和 checks 的开头。完整的 review、能否合并和增删统计现在画在 PR 面板抬头,窄的时候按 · 折行,不再打开面板就丢掉。

文件列表改成按页读取。一页超过 1 MiB 被裁切时,保留已经读完的文件,以及 patch 被从中切断的那一个,并标成截断、大小未知;不再把整份列表变成 unknown。GitHub 没给 patch 时写成 no patch,不再一律叫 binary。gh pr view 的 commit 数组到 100 就停,抬头在这时写 at least 100 commits。

cargo test --workspace、cargo clippy --all-targets -- -D warnings 和 cargo fmt --all -- --check 在这次提交前通过。真实工作台走查仍然 pending。

下一步:等独立 QA 对当前 head 3afc32e 再审。

Keep prefix+f for the pull request panel together with copy-on-select from main.

Co-authored-by: Cursor <cursoragent@cursor.com>
@zuohaisu
zuohaisu merged commit 7ee2a4d into main Oct 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant