dsh-git-branch:在 DSH 对话输入区查看与切换 Git 分支

前言

在 DeepSeek Harness(DSH)里做智能体或终端协作时,会话往往绑定一个工作目录。分支名通常要切到终端里 git branch 或看 IDE 状态栏,和 Composer 里正在写的提示词不在同一视线里。Agent 或本地 shell 改了分支,Web 界面也不会自动跟上,容易在错误分支上继续对话。

下面介绍的 dsh-git-branch 是 MYiYang 维护的 DSH Web 客户端插件(npm 包名 dsh-git-branch-plugin,插件内 id 为 dsh-git-branch)。它把当前 Git 分支放进消息输入区左侧的紧凑控件行(模型选择器左边),点开可浏览本地与远程分支、切换本地分支,并打开只读的提交图。仅当会话工作目录位于 Git 仓库内时显示该控件;非仓库时 chip 隐藏。

这是什么

一句话:在 Harness 对话 Composer 上展示会话目录的当前分支,提供四列分支表与只读 commit graph,本地分支可 checkout。

  • 维护者:MYiYang
  • 分类:客户端(Web profile)
  • 源码与说明:GitHub MYiYang/dsh-git-branch
  • 社区目录页:skillhub.cn/plugins/MYiYang/dsh-git-branch(独立社区站点,与 DeepSeek / 幻方无官方从属关系)
  • 许可证:MIT(见仓库 LICENSE)
  • 当前 npm 版本(资料来源 package.json):0.2.1;Node 引擎要求 >=22.16.0

浏览器侧不能执行 git,插件由 Host 半挂载受信围栏的 POST /git-branch/api/{status,checkout,graph},工作目录来自会话的 workingDirectory(回退到会话头里的 cwd),不接受请求体里的任意路径;checkout 前会校验分支名是否在仓库 refs/heads 列表中。

核心功能

Composer 上的分支 chip

  • 显示当前分支名;若处于 detached HEAD,显示 HEAD@<short commit>。
  • 位置:conversation.input.left,即输入区左侧控件行。

分支表(点击 chip 打开)

四列表格,本地行在前、远程行在后:

列 本地分支 远程分支
Branch 名称(当前检出带勾) 名称(地球图标)
Upstream 跟踪 ref,如 origin/main 空
Ahead·Behind 相对上游 ↑2 ↓1,同步时为 = 空
Last commit 短 hash(tooltip 含 subject/日期) 短 hash

分支超过 8 个时出现搜索框,同时过滤本地与远程两组。仅本地分支提供切换(等价于在该目录执行 git checkout <branch>);点远程行不会 detach HEAD,也不会自动建本地分支。脏树冲突等失败信息在菜单内展示。

只读提交图

菜单头部的按钮打开只读图表面板(空间足够时在 chip 上方,否则在下方)。绘制各 ref 可达历史(最多 200 条 commit)的 lane 与节点,含分支、remote、tag 标记,以及 subject、短 hash、作者、日期。按 Esc、关闭按钮或点击外部可关闭;打开时读取,可在面板头部刷新。

刷新策略

页面可见时每 15 秒重读状态;窗口获焦、页面变为可见、以及切换分支后立即刷新,以便 Agent 或终端改分支后界面跟上。提交图在打开面板时读取。

实现要点(便于排查)

文件 作用
index.js Host:挂载 API 路由,解析会话工作目录
git.js argv 方式调用 git,分支列表、切换、图数据、detached/非仓库检测
graph.js 纯解析与 lane 布局(无 DOM),单测覆盖
client.js chip、分支表、提交图、轮询与 locale
cordis.patch.yml 注入 Host 行 git-branch

路由经 ctx.webServer 注册,并用 ctx.connection.requestRejection 围栏,仅已认证的 Harness 页面可 POST 调用。

安装与启用

插件是 DSH bundle(自带 cordis.patch.yml),添加后会安装依赖并激活 Host 行。还需在 Web profile 的 dsh.profile.bundles 中列出该包(~/.dsh/profiles/web/package.json);仅有安装条目而未写入 bundles 时,bundle 不会 layered。

官方安装命令(来自 README):

# 从 npm 安装
dsh plugin --profile web add dsh-git-branch-plugin

本地开发目录可用 dsh plugin --profile web add ./dsh-git-branch(需自行持有源码目录,本文不展开 clone 步骤)。

安装或修改包后:重启 DSH 以加载 Host 路由;刷新 Harness 页面 以加载最新 client.js(已打开的标签页可能仍缓存旧客户端模块)。

典型用法

  1. 确认会话工作目录在某个 Git 仓库内;输入区左侧应出现当前分支 chip。
  2. 点击 chip,在表中查看 upstream、ahead/behind、最近提交;需要时在本地行上执行切换。
  3. 在菜单头打开提交图,浏览合并历史;只读,不替代 git log 的全部分支策略。
  4. 若 Agent 在终端改了分支,等待轮询或切回窗口焦点即可更新;也可切换一次分支触发立即刷新。

Host API 形状(Client 调用,供对接理解):

  • status → { isRepo, root?, branch?, detached?, commit?, branches },分支项含 name, kind, current?, upstream?, ahead?, behind?, lastCommit? 等。
  • checkout → 本地分支名,成功后返回与 status 相同结构。
  • graph → { root, rows },每行含 hash、lane 几何、refs、links 等。

适用场景与注意

适合谁: 经常在 DSH Web 里写提示、又让 Agent 或终端动 Git 的开发者;希望在 Composer 旁一眼确认分支、偶尔切换本地分支、快速看近期提交拓扑,而不必每步开终端。

限制(README Notes):

  • 只切换本地分支;远程仅展示。
  • 提交图只读,且最多 200 条 commit(跨所有 ref 的可达历史);不对请求传入 path 或 revision 做 git log。
  • 使用 git checkout 而非 git switch,以兼容部分 Windows 主机自带的 Git 2.18。
  • 启动时会探测可执行的 git(先 subprocess 执行环境,再 PATH);找不到可执行 git 时 chip 保持隐藏。
  • 每次请求重新解析工作目录,会话进入 linked worktree 时会显示该 worktree 的分支。

安全与权限: 插件以当前 DSH 进程权限在会话工作目录执行 git。安装前请阅读 源码 与 MIT 许可证,确认行为符合你的环境策略;社区目录页仅作索引,不替代源码审查。

结尾

dsh-git-branch 把「当前在哪个分支、本地/远程差多少、最近提交长什么样」收进 Harness 输入区,并限制在会话自己的仓库目录内操作,适合 Web 侧协作开发时的轻量 Git 上下文。更多信息见 社区目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye