dsh
Akimiya-z/codex-guard在 DeepSeek Harness 内做提交前的 Pull Request 卫生检查:扫描当前改动中的 TODO 残留、硬编码密钥与非规范提交信息。
专精于 Git 分支与状态处理:Web 右缘 Git 状态浮窗,commit DAG 泳道图、未提交改动与 stash、行内 diff,右键分支/tag 切换、合并、重命名、删除、新建,一键拉取全部远程。
English · 简体中文
独立 Git 状态(Git Graph)插件:DSH Web 右缘 Git 状态浮窗 —— commit DAG 泳道图 + 未提交改动/stash + 行内详情 diff + 分支操作。
🔖 v2.0.0 · 🧩 纯前端自渲染 DOM(greeter 模式,零 React、零构建链)· 🛠 Node half 只读/写路由 · 📜 MIT · 📦 npm @wongzexu/dsh-git-status
首次使用引导提示气泡(仅一次,localStorage 记录)
网格制 SVG 渲染(shadow + 彩色双 path、折角过渡、HEAD 加粗圆点)
(背景加浓 + 金色内描边 + 加粗,悬停提示「当前分支」); 同名本地/远程分支合并为一个 pill:⎇ main [gitee];同一分支有 ≥2 个远程时 折叠为计数子标签 ⎇ main [2](悬停 pill 任意处即显示完整远程引用列表,右键先选远程再操作); 远程 HEAD 符号引用(gitee/HEAD)默认过滤
分类显示未暂存/已暂存处数;点击展开按「更改 / 暂存的更改」分组的详情 (VS Code 语义:部分暂存文件两组各出现一次,未跟踪文件带徽标)
git add -A)、「贮藏未提交改动」、「放弃全部未提交」(git reset --hard HEAD + git clean -fd, 含未跟踪文件,保留被忽略文件;红色确认框二次确认,不可恢复)、 提交已暂存内容或修订上一条提交;普通提交只包含已暂存内容, 多行提交信息使用 Ctrl+Enter(macOS Cmd+Enter)提交
git reflog refs/stash 插入图中(双层圆 + stash@{n} 徽标),展开详情(base 显式两树 diff + untracked 第三父快照追加)
(256KB 截断);详情盒高度自适应内容(≤340px 上限),点开 patch 不引起图跳动
合并提交(默认)(可快进则快进,分叉时生成合并提交)/ NoFF(禁用快进) (--no-ff 始终生成合并提交)/ Squash 合并(压平为一个提交,无合并提交); Squash 提供提交信息输入 +「使用固定文案」勾选(默认勾选,取消后必填), 合并产生冲突后由合并条接管(squash 无 MERGE_HEAD,中止走 reset --hard、继续走 commit 收尾)
本地已有同名分支时弹三选:检出已有分支并快进到远程最新 / 其他名称从远程创建(自动建上游跟踪)/ 取消 (对齐上游 checkoutBranchAction;快进为 git merge --ff-only,分叉/领先时拒绝且分支不动); 折叠计数徽标右键先选远程、再出该远程的操作菜单; 右键 tag 徽标:「在 x 创建分支…」/「推送 tag…」(每远程一项,跳确认框)/ 「删除 tag…」(仅本地 / 全部远程一次删净 / 逐远程定向; 远程无该 tag 视为已删,部分失败不阻断本地删除并给明细); 右键 commit 行「创建 tag…」(轻量/附注 + 多远程推送)/ 「在 x 新建分支并检出…」(以该提交为起点)
/git/history 路由,镜像上游 dataSource 的 rebase/reset/cherry-pick/revert/pull):-x 记录来源 / -n 仅应用到暂存区)、Revert…(合并提交默认主父 1)、 Rebase current branch on this Commit…、Reset current branch to this Commit… (Soft / Mixed / Hard 三选,Hard 为红色确认钮)
rebase 仅非交互 + 红色危险确认(重写历史)
「创建本地分支并检出」;--no-rebase 强制合并语义,模式三选默认/NoFF/Squash, 冲突走现有合并分类由合并条接管)
reset-not-ancestor,客户端弹红色确认框后带 force 重发(同切换守卫旁路模式);分支独有提交仅可从 reflog 找回
rebase-conflicts / cherry-pick-conflicts / revert-conflicts(本期只做失败分类提示,头部徽标显示进行中;abort/continue 放下期与合并条统一)
check-ref-format 权威校验双保险存在已跟踪未提交改动时弹「仍然切换」确认框(确认后带 force 旁路;仅未跟踪文件不拦)
git add 再继续);squash 合并冲突同样由合并条接管(徽标显示「Squash 合并进行中」)
git fetch --all(镜像上游工具栏 Fetch from Remote(s) 形态:无对话框、prune 默认关), 无论成败图都即时刷新(多远程可能部分成功);失败分类提示 (网络/认证错误、远程不存在、远程仓库不存在或不可达)
remote 单选(默认 origin/首个)+ Set Upstream + Push Mode 三选一 (normal / force-with-lease / force);失败保留对话框可改模式重试
右键未提交改动虚拟行「贮藏未提交改动」(说明 + 包含未跟踪文件); 应用冲突(合并冲突 / 本地改动被覆盖)分类提示且 stash 保留
MERGE_HEAD /SQUASH_MSG(squash 合并)等标记)
/git/events 订阅(2s 服务端状态键对比 + 变化推送 + 15s 心跳),其他终端 checkout/提交时图即时刷新;10s 轮询保留作断连兜底
与显示选项(未提交改动、HEAD 徽标、提交作者、提交时间,可独立显隐)
dsh web),且版本满足 @deepseek-ai/dsh >=0.2.0-rc.2 <0.3.0-0(peerDependencies 硬约束;v2 起仅适配 DSH 0.2,不再支持 0.1 / cordis)git 命令行工具(插件通过系统 git 执行所有操作)方式一:npm 安装(推荐,发布版)
dsh plugin --profile web add @wongzexu/dsh-git-status方式二:从 GitHub 安装(源码版)
dsh plugin --profile web add github:Wongzexu/dsh-git-status方式三:本地目录安装(开发/自用)
dsh plugin --profile web add /path/to/dsh-git-status把 /path/to/dsh-git-status 换成插件目录的实际路径(例如本仓库根目录)。
⚠️ 注意:npm 上另有同名(无作用域)包 dsh-git-status(其他作者的 React 实现,与本插件无关);安装请认准 `@wongzexu/dsh-git-status`。@wongzexu/dsh-git-status 已启用(可随时停用/启用)。📖 完整操作指南(中英双语):docs/USAGE.md —— 界面速览、Git 图阅读、分支操作、冲突处理、远程拉取全流程详解。
变基当前分支到 x(红色确认,重写历史)」;远程「创建本地分支 x 并检出 / 拉取并合并 x 到当前分支(默认/NoFF/Squash)」 (本地已有同名分支时弹框三选:检出已有分支并快进 / 其他名称从远程创建 / 取消);
Revert… / 变基当前分支到该提交 / 重置当前分支到该提交(Soft/Mixed/Hard); 重置目标不在当前分支历史时会先被拒绝,弹红色确认框后强制重置;
「合并 x 到当前分支…」先弹确认框:合并提交(默认)/ NoFF(禁用快进)/ Squash 合并(可填提交信息或勾选固定文案);
git fetch --all,prune 默认关),完成后图即时刷新。提示:当前会话工作区不是 git 仓库时,浮窗内会显示提示,切换到 git 仓库所在会话即可。
dsh plugin --profile web remove @wongzexu/dsh-git-statusdsh-git-status/
├── package.json # dsh.bundle.patch + platform: web
├── cordis.patch.yml # 挂载 Node half
├── lib/
│ ├── index.mjs # Node half:git log/show/branch/fetch/push/remote/stash/stage/discard/commit/history/events 路由(末尾导出测试用纯函数)
│ └── client.js # client bundle(构建产物,__ModuleLoader__ 契约)
├── src/client/index.js # client 源码(手写 CJS,单模块)
├── scripts/build-client.js # 零依赖构建脚本(纯 Node)
└── tests/
├── fixtures/repo.mjs # 造仓库辅助(mkdtemp 真实 git 仓库,t.after 自动清理)
├── git-log.test.mjs # 装饰解析/未提交分类/虚拟行组装/stash/show/冲突状态
├── git-branch.test.mjs # 分支名校验/守卫/失败分类/增删改合/写路由(含 CSRF)
├── git-fetch.test.mjs # 远程列表/名称校验/fetch 失败分类/真实拉取(file:// 裸仓库,含 prune)/写路由(含 CSRF)
├── git-push.test.mjs # push 参数校验/失败分类/真实推送(set-upstream、non-fast-forward→force)/写路由(含 CSRF)
├── git-stash.test.mjs # stash selector 校验/apply/pop/drop/branch/两种冲突形态/写路由(含 CSRF)
├── git-stage.test.mjs # git add -A 的新增/修改/删除/路由与 session 隔离
├── git-discard.test.mjs # 放弃全部未提交:已暂存/未暂存/未跟踪/保留忽略文件/unborn/路由与 session 隔离
├── git-commit.test.mjs # staged commit/amend/错误分类/路由与 session 隔离
├── git-remote.test.mjs # tag 名校验/删除远程分支(含降级)/推送与删除 tag(含同步远程)/写路由(含 CSRF)
├── git-history.test.mjs # rebase/reset/cherry-pick/revert/pull:祖先守卫/merge 主父白名单/冲突分类/写路由(含 CSRF)
└── git-events.test.mjs # SSE 订阅:初始推送/变化检测/心跳/断连清理/plugins/dsh-gitstatus/* 路由(webServer),