前言¶
在 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。
典型用法¶
- 安装并重启 DSH 后,在 DSH 会话中让 Agent 创建 PR。
- Agent 提示「PR 已创建」后,右下角会出现浮窗,显示当前会话的 PR 列表。
- 点击浮窗中的某一行,右侧会出现
PR标签,显示该 PR 的描述、变更、讨论、待修改意见、检查、评审与操作。 - 在检查卡中点击
fix,输入框会填入可执行的修复步骤;按回车后,Agent 可以按提示继续处理。 - 在对话中点击任意 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