Repository navigation
Releases: TiChuXiXi/dsh-git-vcs
Release list
v0.2.0 · DSH 0.2.1 兼容与 Git 操作加固
兼容性
- 要求 Node.js ≥ 22.12.0、DSH ≥ 0.2.1-alpha.2;实测宿主 0.2.1-alpha.2(官方提交 d743267388641bc76f17c45ce8b4c231aed1d32c)。
- DSH 0.1.7 用户请保留插件 0.1.2,升级前先更新宿主。
改进与修复
- 合并 develop 到 main,完善 README 的安装、升级、兼容性与排障说明。
- 加固 RPC 请求格式、端点校验和取消传播。
- 修复首次提交前取消暂存、通配符文件误操作、符号链接和仓库根边界逃逸。
- 贮藏支持包含未跟踪文件,空操作不再误报新建记录;凭据相关输出脱敏。
- 单文件差异测试改用独立夹具,避免合并提交导致误报。
验证与限制
- npm test:10 组 Node 回归、64 项 host、17 项客户端、6 项 VM/JSON 检查通过。
- Chrome DOM:33 项检查通过;真实 DSH 认证、暂存/取消暂存、Origin 防护、协议与客户端资源集成通过。
- 尚未逐项验证 Windows/Linux 桌面和全部真实菜单;暂不支持按行提交、并排 diff 或冲突编辑器。
获取
GitHub 源码标签:v0.2.0。已发布到 npm:dsh-git-vcs@0.2.0,latest 指向 0.2.0;官方源包校验值与本标签发行文件一致。安装命令:
dsh plugin --profile web add dsh-git-vcs@0.2.0 --registry=https://registry.npmjs.org安装后重启 dsh web 并刷新浏览器。
Full Changelog: v0.1.2...v0.2.0
v0.1.2
dsh-git-vcs 0.1.2 —— 适配 DeepSeek Harness 0.1.7
修复:面板一直显示「(未加载)」
DSH 0.1.7 的会话清单快照 SessionListState 移除了 current 字段(0.1.5 时代用它定位"当前会话"),
旧写法 sessions.byId[sessions.current] 取到 undefined → 默认仓库路径恒为空 → 面板连 repo/snapshot
都不发出去,于是分支胶囊停在「(未加载)」、路径框空白、中间提示手填路径(host 侧通道其实是好的)。
现在改走 session 作用域的标准 prop sessionId:
const sessionCwd = useSessions((state) => sessionCwdOf(state, sessionId))与官方 dsh-client-ui-sidebar-files 在 0.1.7 里的写法一致(useSessions((s) => s.byId[sessionId]?.cwd)),
并保留旧版本 state.current 回退,所以 0.1.5 / 0.1.7 都能自动打开会话工作目录。
变更清单
lib/client.js:新增sessionCwdOf(state, sessionId);引导页入口补上 0.1.7 要求的稳定idpackage.json:dsh.engines.dsh提到>=0.1.7-rc.2(不能写>=0.1.7:semver 下预发布版小于同号正式版)- 探针夹具同步成 0.1.7 真机 props 形态;
render-probe.mjs支持RENDER_PROBE_CLIENT反向对照 - 新增
scripts/live-probe.mjs:隔离 DSH_HOME 起真实例 + headless 浏览器打开带 token 的真实页面(诊断用) - README:兼容性表、更新记录、排障新增「(未加载)」一节
兼容性
| 项目 | 值 |
|---|---|
需要 @deepseek-ai/dsh |
≥ 0.1.7-rc.2 |
| 依赖的官方插件 | @deepseek-ai/dsh-client-ui-sidebar-right(随 web-app 分发) |
| 构建 | 零构建、零运行时依赖 |
自检
verify-host 64/64、render-probe 15/15、dom-probe 33/33、web-rpc-probe 在 0.1.7 下 401 = 路由在;
反向对照(把 cwd 取法还原成旧写法)新夹具立刻报 12 条红,证明断言咬得住这次的问题。
安装 / 升级
dsh plugin --profile web add dsh-git-vcs@0.1.2升级后重启 dsh web(host 半区是进程内代码),浏览器里再 Ctrl+Shift+R。
v0.1.1
主要变化
提交树(issue #1)
- 覆盖所有分支:
git log --exclude=refs/stash --all,不再只有当前分支的祖先链。 - 滚到底续拉:50 条一页、
--skip接着上次窗口取、按 hash 去重(两次调用之间落了新提交也不会重复行),
单次刷新最多渲染 2000 行。刻意不加--date-order/--topo-order:它们要先limit_list()
把整段可达历史读进内存排序,-n就不再流式,正是 issue 里担心的性能问题。 - 多泳道图(对齐
git log --graph/ IDEA 的画法):每条分支一条泳道,泳道记「下一个期待的提交」,
没有泳道期待它就是分支起点、多条泳道同时期待它就在本行汇合;第一个父提交留在原泳道,
其余父提交各开一条斜线。原先的单轨画法会把「基于历史提交拉出来的分支」画成当前分支的延续。 - 修掉两处真机几何错位:① 斜线层
<svg>只给left/top/right/bottom时高度按 viewBox 固有比例
算成 100px(行高只有 29.5px),斜线被放大到下面几行;② 2px 宽的连线以泳道中心为left,
线心比圆心偏右 1px。
未初始化仓库(issue #2)
- 目录不是 git 仓库时,面板只渲染一块居中空态:图标 + 「当前目录不是 Git 仓库」+ 目录路径 +
一个「在当前目录初始化 Git 仓库」按钮,页签 / 工具栏 / 提交树一律不显示。 - 点按钮先展开初始分支名:可自由输入,另有
main/master一键备选(回车即确认),
确认后才执行git init;成功后空态自动消失、面板自己长回完整功能(不必再点 Refresh)。 - host 侧
repo/init的语义边界:目录不是仓库 →git init -b <branch>(git < 2.28 无-b时
退回git init+symbolic-ref HEAD);已经是仓库根 →already: true不重复初始化;
仓库内部子目录 → 拒绝,避免凭空造出嵌套仓库。路径校验复用validateCwd(),
因此同样受repoRoot白名单约束。
自检
| 脚本 | 结果 |
|---|---|
node scripts/verify-host.mjs |
64/64(含"客户端调用的每个端点 host 侧都存在"的结构性反查、repo/init 全部行为分支) |
node scripts/render-probe.mjs |
14/14(迷你 React:泳道拓扑、续拉去重、刷新不缩页) |
node scripts/render-probe.mjs --real |
16/16(与 git log --graph 逐提交比对泳道下标与分叉行) |
node scripts/dom-probe.mjs |
18/18(headless 浏览器量像素:连线与圆点同心、斜线跨度、空态行为与分支名选择) |
node scripts/preview-check.mjs |
全部通过(每个端点的信封都是无损 JSON) |
安装
dsh plugin --profile web add dsh-git-vcs@0.1.1装完重启 dsh web,然后强制刷新页面。
v0.1.0
首个发布版本:DSH Web GUI 的 Git 版本管理插件(右侧栏「版本管理」页,参照 IDEA 的 Version Control 工具窗)。
功能
- 右侧栏 tab:Local Changes / Log / Console / Branches / Remotes / Stash 六页
- 勾选提交(只提交勾选的文件,未跟踪文件同样可选)、暂存 / 取消暂存 / 回滚
- 提交树(每条分支一色、HEAD 实心、分支标签)、提交详情按需拉取单文件 diff、右键菜单
- 分支 / 远程 / 贮藏管理,命令流水(Console)
- 推送链路:直推 → SSL 后端兜底 → 认证表单(凭据存进 git 凭据助手)
安装
dsh plugin --profile web add dsh-git-vcs兼容 @deepseek-ai/dsh >=0.1.5-rc.1,零构建、零运行时依赖。
详见 README。