仓库,
就在会话里。
一个可移植插件就能给 DSH 宿主带来完整的 Git 界面:右侧边栏中的状态、差异、历史和分支操作。同一个包可以运行在 web profile 和 Rivetdeck 中——后者已经预装。
- 右侧边栏中的 Changes、Diff 与 Graph 标签页
- Git 通过 ctx.subprocess 启动——从不经过 shell
- 不注册任何模型工具,不注入提示词

功能
完整的审阅闭环,不用离开窗口。
三种标签类型通过标准注册接入上游右侧边栏——Changes 与 Graph 是页面型标签,每个文件比较都是一个 dsh-resource 差异页。
Changes
状态、暂存与提交,集中在一个标签页
porcelain v2 状态按已暂存、未暂存和未跟踪分区列出,每一行都带有字母徽标。加号或减号切换暂存区;撤销操作需要先经过一次指名路径的二次确认。
- 分段提交按钮:Commit、Amend、Commit & Push、Commit & Sync
- 提交信息输入框自动生长,旁边是 Generate 生成按钮
- 刷新和在文件管理器中显示等操作位于 Git 界面内部

差异
一个文件、一侧对比、一个可寻址的标签页
每次比较都是一个 dsh-resource://git/diff 地址,因此同一个文件的暂存区差异与工作区差异可以并排打开。请求一个已存在的地址只会唤出对应标签页,并按 revision 计数器刷新。
- 渲染交给官方 DSH DiffBlock——复制、折叠和按行换行由宿主提供
- 二进制、仅元数据、空文件和被截断的输出都有各自的区分,而不是一律抹平
- 地址即标签身份,差异视图随布局一并恢复
同一个文件的两个地址
dsh-resource://git/diff/src%2Fcart.tsx/staged暂存区对比
dsh-resource://git/diff/src%2Fcart.tsx/worktree工作区对比
Graph
会自己翻页的车道图
提交历史以 Canvas 绘制的车道图呈现,整条曲线在同一坐标系中连续延伸,轨道与合并边不会在行边界处断开。滚动哨兵按需追加更早的提交,而不是一次加载全部历史。
- Auto、All 与 First-parent 三种范围,旁边是刷新按钮
- 每行带有按类型着色的 HEAD、分支、远端与标签芯片
- 悬停卡片给出完整标题、哈希、作者与日期
- HEAD → main
Merge pull request #14: status panel UI
cherrchen · 2 小时前
- status-panel-ui
fix(client): restore graph node hover emphasis
cherrchen · 5 小时前
- origin/main
fix(compat): support DSH 0.1.5-rc.3 and 0.2.1-alpha.1
cherrchen · 1 天前
- v0.2.5
feat(client): staged diff opens beside the worktree one
cherrchen · 1 天前
输入框
先看到分支和改动数,再开始输入
分支选择器和变更文件指示器位于输入区左侧,点击即可打开 Changes 标签页。创建分支走同一个对话框;在 git init 尚无提交时,菜单会说明必须先有第一个提交。
- 宿主发布了工作目录投影时,选择器跟随该会话的有效目录
- 链接检出会显示 worktree 标签;“Use in this session” 通过宿主目录服务进入该检出
- 每个会话保有各自的仓库状态——两个会话绝不共享一份快照
描述你想构建的内容…
提交信息
只给建议,从不替你提交
当宿主暴露 LLM 运行时时,Generate 会把暂存区差异——上限为 commitMessage.maxDiffBytes——发给会话模型,或发给插件配置里固定的一组 provider/model。流式草稿落在可编辑的输入框里。
- 生成从不暂存、提交或推送任何内容
- 系统提示词默认是 Conventional Commits 指令,可在插件配置中修改
- 没有可解析的模型时,控件如实报告不可用,而不是猜测
plugins: - entry: @dsh-electron/dsh-plugin-git config: commitMessage: mode: custom provider: anthropic model: claude-haiku-4-5设计边界
Git 还是 Git,什么都没被重造。
插件把调用交给机器上的 Git,并把每一处有风险的边缘都写得明明白白——包括它拒绝去做的那几件事。
- 01
从不经过 shell
ctx.subprocess 以可执行文件加独立 argv 参数启动 Git。每个来自调用方的路径、分支和提交信息始终是一个 argv——没有插值,也没有引号陷阱。
- 02
破坏性操作要点两次
撤销通过明确的 index、worktree 和 clean 步骤恢复一个已暂存、未暂存或未跟踪的改动——并且始终先经过一次指名路径的二次确认。
- 03
凭据留在 Git 一侧
push 和 sync 以 argv 形式调用 git push 与 git pull --rebase。缺少 origin 或鉴权被拒时呈现的是 Git 自己的错误;插件没有凭据界面可供误信。
- 04
桌面增强是可选的
子 fiber ctx.inject(['desktop']) 在提供者存在时增加“在文件夹中显示”和“打开路径”。仓库、状态、差异、暂存、提交和分支操作没有它照常工作。
- 05
输出有上限
单条命令的每路输出默认封顶 8 MiB;超过后收集器保留尾部。这是经过校验的配置项,而不是隐藏常量。
- 06
不接触模型
插件不注册任何模型工具、提示词段落或请求上下文。提交信息生成是独立的宿主 LLM 请求,不占用会话 token。
快速开始
web profile 上两条命令。
插件通过 DSH 插件管理器安装,共四种来源——在 Rivetdeck 中它已经预装,无需任何操作。
- 1
安装插件包
在受支持的 DSH 运行时中执行。Electron 桌面版请替换 profile。
推荐。安装预构建产物;安装时不会有包内代码在你的机器上运行。
install · npm $ dsh plugin --profile web add @dsh-electron/dsh-plugin-git$ dsh --profile web预构建离线包;同一个 tgz 也附带在 GitHub Release 上。
install · tarball $ pnpm pack @dsh-electron/dsh-plugin-git$ dsh plugin --profile web add ./dsh-electron-dsh-plugin-git-0.2.5.tgz拉取源码并经 prepare 构建。allowBuilds 必须写 pnpm 打印出的 git+ 键——光写包名是匹配不上的。
install · github $ dsh plugin --profile web add github:cherrchen/dsh-plugin-git#v0.2.5链接本地 checkout,适合开发;先 pnpm build 产出安装所需的 lib/。
install · local $ git clone https://github.com/cherrchen/dsh-plugin-git.git$ cd dsh-plugin-git$ pnpm install$ pnpm build$ dsh plugin --profile web add "$PWD" - 2
批准 GitHub 来源的构建步骤
只有
github:安装会在你的机器上构建——也就是包自己的prepare。pnpm 10+ 会以ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED拒绝,直到把它打印出的键写进该 profile 的pnpm-workspace.yaml;建议锁定标签,使之后的推送不会改变实际运行的内容。pnpm-workspace.yaml allowBuilds: '@dsh-electron/dsh-plugin-git@git+https://github.com/cherrchen/dsh-plugin-git#v0.2.5': true - 3
在仓库里打开一个会话
会话目录是仓库时,分支芯片和变更文件指示器就会出现在输入框里。
所有受支持版本都自带该插件注册所需的右侧边栏——不需要额外的宿主插件。
说明
- Rivetdeck 预装了 Git;预装版本可能落后于 npm 最新版。如需新版,请安装到对应 profile。
- 以上命令以 web profile 为例。Electron 桌面版把
--profile web换成--profile desktop。 - 从源码检出运行 DSH?请用
pnpm dsh代替dsh。
兼容性
一份确切的清单,而不是一个范围。
客户端要注册进侧边栏和设置插槽,而这些插槽的形态在尚未稳定的版本之间会变,所以支持范围就是 CI 实际跑过的确切清单。标注为仅限开发分支的行已在 main 上验证,但不在已发布的 v0.2.5 包中。
| DSH 版本 | 状态 | 加入于 | 说明 |
|---|---|---|---|
| 0.1.5-rc.2 | 已验证 | v0.2.0 | 基线:最早提供本插件所需右侧边栏的版本。 |
| 0.1.5-rc.3 | 仅限开发 | 开发分支 | 仅含 manifest 修订的重发版本;已在开发分支上验证。 |
| 0.1.6-alpha.1 | 已验证 | v0.2.2 | 插件配置位于“设置 → 插件 → 插件配置”。 |
| 0.1.6-alpha.2 | 已验证 | v0.2.2 | 配置移到组合包详情页;会话查找探测新的列表形态。 |
| 0.1.7-alpha.1 | 已验证 | v0.2.2 | configForms 取代 settingsScope;图标改为字重命名。 |
| 0.1.7-alpha.2 | 已验证 | v0.2.2 | 对本插件而言接口形态与 0.1.7-alpha.1 相同。 |
| 0.1.7-rc.1 | 已验证 | v0.2.2 | 从该版本起安装时强制要求精确的 peerDependencies。 |
| 0.1.7-rc.2 | 已验证 | v0.2.3 | 接口形态与 0.1.7-rc.1 相同。 |
| 0.2.0-rc.1 | 已验证 | v0.2.4 | DSH 0.2 候选版本。 |
| 0.2.0-rc.2 | 已验证 | v0.2.4 | 开发 pin;Rivetdeck 0.2.0-beta.3 内置的运行时。 |
| 0.2.1-alpha.1 | 仅限开发 | 开发分支 | 已在开发分支上验证;不在已发布的包中。 |
| 0.2.1-alpha.2 | 已验证 | v0.2.5 | 有效会话工作目录与链接检出切换。 |
| 其他任何版本 | 不支持 | — | 未验证。在 0.1.7-rc.1 及以后的宿主上,安装时的 peer 范围会拒绝;更早的宿主或许能装上,但未经过测试。 |
平台
- macOS已验证
web 与桌面端共用同一份可移植构建;有桌面提供者时提供文件管理器操作
- Linux已验证
同一份可移植构建;无平台专属代码路径
- Windows已验证
同一份可移植构建;push 与 sync 的 Git 错误原样呈现
状态按版本逐项声明,绝不按版本号顺序推断。从 DSH 0.1.7-rc.1 起,插件管理器会在安装时强制要求精确的 peer 版本。各版本的适配说明见兼容性参考(在新标签页打开)。
在改动发生的地方审阅它。
受支持的宿主上一条命令即可——在 Rivetdeck 中则已就位。卸载后窗口与上游一模一样。
