dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness Git plugin — visual git status, diff, commit & file preview in the DSH web UI
DeepSeek Harness 的 Git 面板插件,为 AI 编程助手提供可视化 Git 操作界面。
git add -A && git commit)node scripts/build.mjs
cd /path/to/deepseek-harness
pnpm dsh plugin --profile web add /path/to/dsh-git
pnpm dsh --profile web --dump-config
pnpm dsh --profile web --port 3080
http://127.0.0.1:3080,会话头部应出现 Git 按钮。dsh plugin --profile web add dsh-git
cd /path/to/dsh-git
pnpm link --global
dsh plugin --profile web add dsh-git
Git 按钮变更标签页:
提交标签页:
git add -A)预览标签页:
聊天里官方的「本轮文件改动」行完全由官方 ui-deliverables 渲染,本插件不再占用
conversation.chat.turnTail(单赢家 chain 槽),也不再渲染自己的回合卡:
+A −R;正文是左右对照的 diff
(左侧旧行、右侧新行,逐行对齐;短的一侧补占位格),hunk 按文件行序排列;⇄ 滚动 / ↵ 折行 按钮切换长行的两种读法(选择在当前页面内保持):
默认折行——长行在自己那一栏折行,两栏永远等于浮窗宽度,左右同时看全;
切到滚动则左右各成一个独立滚动区(参考 VSCode diff):每侧都有自己的横向滚动条且常驻
可见,滚动其中一侧另一侧跟着滚,两侧行号与代码始终列对列对齐;横向拖动时行号与
+/- 列固定不动(sticky 钉在左缘),拖到长行中段也知道是第几行;oldStart/newStart);
定位不到时行号留空,不会拿 hunk 内 1..N 冒充真实行号;min(1180px, 视口 − 32px)),两栏代码各得一半,必要时会盖住右侧栏
—— 比压缩成聊天列宽度更容易看全代码;Esc 立即关闭;数据来自 host 的
dshGit/turnDiff,按sessionId+turn客户端缓存:同一回合的多个文件 只请求一次。回合号取自官方 DOM 的[data-turn-tail](纯工具回合没有该属性时回退到聊天行 的[data-chat-turn]),完整路径取自 chip 的title;会话 id 由插件在会话头部捕获。 host 只统计成功的 write/edit:被拒的 edit(tool/result带isError)不会进入 diff。 实现细节见docs/design.md第 17 节。
dsh.bundle 包,host 与 web client 打包在同一个包内inject 的 webServer 直接注册 /dsh-git 前缀路由(POST 一个 Connection envelope),复用 connection.requestRejection 做 Host/Origin 与浏览器会话鉴权;不占用 /api 拦截器,也不依赖 connection.rpc.handle() 的内部 owner 上下文(该路径在当前 harness 行会抛 cannot get property "webServer" without inject,导致插件整体不激活:每个 dshGit/* 请求都是 405)插件通过 RPC 暴露以下方法:
| 方法 | 说明 | 参数 |
|---|---|---|
dshGit/status | 获取 Git 状态 | sessionId |
dshGit/diff | 获取文件差异 | sessionId, staged?, path? |
dshGit/commit | 提交变更 | sessionId, message |
dshGit/readFile | 读取文件内容 | sessionId, path |
dshGit/recentTurns | 获取最近回合修改 | sessionId, limit? |
dshGit/turnDiff | 回合的文件级 diff(悬停弹窗数据源) | sessionId, turn |
subprocess.spawn 执行 git 命令fs 服务读取文件dsh-git/
├── src/
│ ├── index.js # Host 端插件逻辑
│ └── client.js # Web 客户端 UI 组件
├── scripts/
│ ├── build.mjs # 构建脚本
│ ├── watch.mjs # 开发监听脚本
│ ├── verify-host.mjs # Host 传输/RPC 回归校验(无需 harness)
│ └── verify-client.mjs # 客户端槽位/浮窗回归校验(需 DSH_CHECKOUT)
├── lib/ # 构建产物(自动生成)
├── docs/ # 设计文档
├── cordis.patch.yml # 插件配置
└── package.json
# 构建
pnpm build
# 开发模式(监听 src/ 变化并重建 lib/)
pnpm dev
# Host 传输层回归校验(/dsh-git 路由注册、鉴权、envelope、dispatch;无需 harness)
pnpm verify:host
# 客户端回归校验(官方「本轮文件改动」行不被抢占 + 悬停 diff 弹窗)
DSH_CHECKOUT=/path/to/deepseek-harness pnpm verify:client
# 两者一起跑
pnpm verify
# 打包发布
pnpm pack
Host 端依赖:
@deepseek-ai/dsh-connection - 连接服务@deepseek-ai/dsh-subprocess - 子进程管理@deepseek-ai/dsh-session-query - 会话查询@deepseek-ai/dsh-fs - 文件系统服务@deepseek-ai/dsh-session-persistence - 会话持久化Client 端依赖:
@deepseek-ai/dsh-client-connection - 客户端连接(RPC)@deepseek-ai/dsh-client-ui-conversation - 会话 UI(头部动作槽位 + 聊天 DOM)@deepseek-ai/dsh-client-ui-layout - 布局 UI(shell.overlay)客户端不 import 官方
ui-deliverables:官方「本轮文件改动」行原样渲染,插件只读取它的 DOM 约定([data-produced-files-row] button[title]、[data-turn-tail])来定位悬停目标。
# 构建
node scripts/build.mjs
# 打包
pnpm pack
# 发布(需要 npm 权限)
npm publish
dsh-plugin topicdeepseek-harness-plugins 聚合仓库dsh plugin add 安装详细设计文档位于 docs/ 目录:
design.md - 完整设计文档,包含架构、需求分析和实现细节build.md - 打包方式选型与产物契约release.md - 发布清单与流程说明MIT License