dsh-pr-panel:本会话 PR 浮窗 + 右列审阅面板

前言

在 DSH 里用 Agent 调用 github_* 工具集创建 PR 时,需要频繁切到浏览器查看状态、CI 与评审意见,再回到终端继续操作。dsh-pr-panel 把这些信息常驻在界面里:Agent 说「PR 已创建」之后,右下角会留一个入口,点开就是 PR 状态、CI、评审意见与合并按钮。

是什么

dsh-pr-panel 是一个 DSH 插件,为当前会话提供 PR 浮窗和右侧审阅面板。它依赖 Agent 的 github_* 工具集,通过复用宿主机的 gh 登录态(gh auth status 能过就能用)取数,不额外存储 token。插件原名源自 dsh-github-flow 的本地分叉,保留了本会话 PR 通道与 Agent 的 github_* 工具集,裁剪掉了旧版中的仓库面板、同步设置、Issue 工作台等模块。

安装与启用

按以下命令安装并启用插件:

# npm
dsh plugin --profile <profile> add dsh-pr-panel
# 离线 tarball
dsh plugin --profile <profile> add ./dsh-pr-panel-0.1.0.tgz

安装完成后需要完整重启一次 DSH:客户端 bundle 会热重载,但 Host 侧路由不会。重启后右下角才会出现浮窗,右栏才会注册 PR 标签。

核心功能

插件通过三个入口访问 PR 信息。

1. 浮窗(右下角 shell.overlay)

本会话至少建过 1 个 PR 时浮窗才会出现。收起状态显示为 PR #<最新> 药丸,展开后为 12 行卡片。浮窗可拖动(位置存 localStorage,双击把手归位),右键每行提供「在面板里打开 / 复制链接 / 跳转 GitHub」选项。

浮窗顶部分三块视图,一次只渲染一块:

  • 功能:按分支链把同一个功能的 PR 收进一条泳道。泳道头显示完成度(PENDING / DONE / CLOSED),环境在每行的 → 目标分支 上。列表先返回 20 条,滑到底续 20 条。行内右侧显示检查通过数(如 9/9),需要你处理的行会打标记:! 表示 CI 失败或有冲突,待 表示要求修改或等待评审。这些行在泳道内自动排到前面。键盘操作:j/k(或上下箭头)选行,Enter 打开,1/2/3 切视图,Esc 收起。
  • 项目:显示本会话涉及的每个项目当前正在用的 worktree(按 PR 的 head 分支反查),以及该仓库共有多少个 worktree。失效的 worktree 会提示可清理数量与预览命令,但不会代你执行删除。
  • CI/CD:显示本会话 PR 触发的 Actions。分两段:PR 校验(head 分支)与 合并后(base 分支、合并后 30 分钟内)。运行中显示当前步骤与进度(如 3/13),点击整行可打开该次运行详情。

2. 右列面板(右栏 PR 标签)

点浮窗任意一行,或使用 number(可选 repo)参数打开右栏 PR 标签。容器宽度小于 620px 时,卡片会自动叠成单列。

面板分左右两栏,每张卡片独立边框与骨架屏:

  • 左栏:
  • 描述:PR 正文 markdown,默认整段展示,超长时渐变遮罩 +「展开全部」;按行边界截断,未闭合代码围栏自动补齐。
  • 变更:文件清单(详情自带,零额外请求)+ 按需「加载 diff」;逐文件折叠,默认展开第一个;点行号可就地评论。
  • 讨论:最近 3 条评审/评论,提供「显示全部 N 条」;提交默认 6 条;每条可 + 引用进对话框。
  • 待修改意见:只收集需要你动手的内容——非空正文、非 APPROVED 的评审 + 非作者本人的评论;最新在前,每行标记 fix,卡头显示「全部 fix N」。
  • 右栏:
  • 检查:汇总 N 项失败 / 共 M 项;失败项整行红底,提供逐项 fix,卡头显示「修复失败项 N」。
  • 评审:显示评审人与结论徽标(已批准 / 需要修改 / 待评审)。
  • 操作:请求修改、发 PR 评论(自己的 PR 也能发)、合并后删除源分支开关。

面板头部是审批台,提供 批准、合并、自动合并 以及合并方式下拉(按仓库 allow_*_merge 过滤)。合并操作需要两步确认——5 秒内再点一次才会真正合并。

3. 对话里的 PR 链接

在对话中点击任意 github.com/<o>/<r>/pull/<n> 链接,会直接在本地面板打开(读取本地 gh,秒开),不再跳转到没有登录态的内嵌浏览器。Shift / ⌘ + 点击则维持网页版。

门禁与 fix 提示词

门禁逻辑

按钮可用性跟随 PR 状态:禁用理由会写在按钮同一行(如 不能合并:1 项检查未通过 · 评审要求修改)。禁用优先级按“先修什么最划算”排序:草稿 → 冲突 → 检查未过 → 评审要求修改 → 分支保护。DIRTY 状态禁批准与合并,BLOCKED 只禁合并(批准仍有意义)。自动合并始终可用,它本身就是“条件满足再合”的入口。写操作通过 gh pr merge 回读确认(对已合并 PR 的退出码仍是 0),如果状态没真正变则返回 502 并带回 gh 的原始输出。

fix 提示词

检查卡的 fix 是一段可执行工单,而不是一句笼统的“帮我修 CI”。它包含:
- 坐标(owner/repo#编号、目标分支←源分支、当前 HEAD、评审结论)
- 失败项(检查名 + workflow + 详情 URL + 是否评审门禁)
- 步骤(先 gh run view --log-failed 定位 → 最小改动 → 本地等价命令 → 推源分支 → gh pr checks --watch 确认真的重跑 / gh run rerun --failed → 门禁类需重新请求评审)
- 完成标准

评审意见的 fix 按编号批量拼成一条消息,结尾附带“新提交才算处理完 → 重新请求复审 → 对应 thread 回复并 resolve”。提示词通过 inputActions.insertText 进入输入框(拿不到 setDraft,再退剪贴板),只等待你按回车。

取数与缓存

插件采用多种策略平衡性能与实时性:

  • 批量 GraphQL:同仓库的 PR 合并为一次别名查询,12 条约 1.6s,避免 12 次 gh pr view 的 5.8s;GraphQL 不可用时逐条 REST 兜底。
  • core / thread 拆分:先出 core(描述 / 检查 / 操作,约 1.5s),reviews / comments / commits 并行后补并缓存 30s。
  • 按文件补丁:当整份 diff 超过 GitHub 20000 行上限时,改走 /api/github/pr-files 逐文件取 patch。
  • 磁盘快照:成功结果落盘到插件数据目录(session-pr-snapshot.json),重启后首拍直接返回(毫秒级),下一拍换真数据。
  • TTL:列表元数据 30s · 详情 core 8s · 讨论 30s · 文件补丁 60s · 合并方式 300s · 转写重扫 30s;diff 不缓存。
  • 会话血缘:通过解压每个转写的第一行(4–5ms/份)读取 parentSession,BFS 出主会话 + 子代理会话;头按路径永久缓存。
  • 轮询分档:面板 / 卡片展开 8s,只有药丸 30s,窗口后台时停止;每 3 拍穿透一次 host 缓存;连续失败按 ×2…×8 退避。
  • 数据量:合并后最多 12 条进入元数据阶段;元数据缓存 240 条 LRU。

典型用法

  1. 安装并重启 DSH 后,在 DSH 会话中让 Agent 创建 PR。
  2. Agent 提示「PR 已创建」后,右下角会出现浮窗,显示当前会话的 PR 列表。
  3. 点击浮窗中的某一行,右侧会出现 PR 标签,显示该 PR 的描述、变更、讨论、待修改意见、检查、评审与操作。
  4. 在检查卡中点击 fix,输入框会填入可执行的修复步骤;按回车后,Agent 可以按提示继续处理。
  5. 在对话中点击任意 PR 链接,会在本地面板打开该 PR 的信息,无需切换浏览器。

适用场景与注意

适合需要频繁查看 PR 状态、CI 与评审意见,并且希望将 PR 信息常驻在 DSH 界面中的开发者。

注意:
- 插件以当前 DSH 进程的权限运行,安装前建议检查源码与许可证。
- Host 路由需要完整重启 DSH 才会注册 PR 标签。
- 浮窗在当前会话没有 PR 时不会渲染。
- 单文件 diff 最多显示 400 行,查看全量时请点击「在 GitHub 打开」。
- 跨重启后,如果系统缺少 zstd 命令(Node 20 的 zlib 没有 zstd API),可能会表现为“刚提的 PR 可见,重启后历史 PR 消失”,子代理的 PR 也不可见。
- 实现细节参见 docs/session-pr-channel.md。

短结尾

dsh-pr-panel 在 DSH 中把本会话 PR 的状态、CI、评审意见与合并操作常驻在界面里,减少切浏览器,并提供可执行的 fix 工单。更多细节与源码见:

  • 目录页:https://www.skillhub.cn/plugins/zengxiaolou/dsh-pr-panel
  • GitHub:https://github.com/zengxiaolou/dsh-pr-panel
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜