🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Git 可视化面板 LingQi-07-std/dsh-client-ui-git

DeepSeek Harness
LingQi-07-std1 天前有提交已提供中文文档扫描:含敏感能力

在侧边栏查看分支图谱与提交历史,安全回退改动

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add LingQi-07-std/dsh-client-ui-git
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/06·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 1 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 33 处,展示前 25 条)
  • 读取本地文件
    lib/index.js:145
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    lib/index.js:156
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:157
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
  • 执行外部命令固定命令
    lib/index.js:445
    const child = spawn("explorer.exe", [target], { detached: true, stdio: "ignore" });
  • 执行外部命令固定命令
    lib/git-core.mjs:61
    const child = spawn("git", ["-C", dir, "-c", "core.quotepath=false", "--no-pager", ...args], {
  • 读取本地文件
    lib/git-core.mjs:100
    if (!existsSync(path) || !statSync(path).isDirectory()) throw new Error(`不是目录: ${path}`);
  • 读取本地文件
    lib/git-core.mjs:100
    if (!existsSync(path) || !statSync(path).isDirectory()) throw new Error(`不是目录: ${path}`);
  • 读取本地文件
    lib/git-core.mjs:644
    const file = await readFile(gitPath.stdout.trim(), "utf8").catch(() => null);
  • 读取本地文件
    lib/git-core.mjs:888
    const info = await stat(gitDir);
  • 读取本地文件
    lib/git-core.mjs:890
    const text = await readFile(gitDir, "utf8");
  • 读取本地文件
    lib/git-core.mjs:902
    for (const name of await readdir(heads, { recursive: true })) {
  • 写入本地文件
    lib/git-core.mjs:1455
    await mkdir(join(dir, ".git", "info"), { recursive: true });
  • 写入本地文件
    lib/git-core.mjs:1456
    await writeFile(backup, previous, "utf8");
  • 写入本地文件
    lib/git-core.mjs:1460
    await writeFile(file, text, "utf8");
  • 写入本地文件
    lib/git-core.mjs:1475
    await writeFile(file, previous, "utf8");
  • 执行外部命令固定命令
    lib/github-auth.mjs:31
    child = spawn("git", ["credential-manager", ...args], {
  • 执行外部命令固定命令
    lib/github-auth.mjs:105
    child = spawn("git", ["credential-manager", "github", "login", "--browser", "--no-ui"], {
  • 执行外部命令固定命令
    lib/github-auth.mjs:221
    child = spawn("git", ["credential", "fill"], { stdio: ["pipe", "pipe", "pipe"] });
  • 执行外部命令来自配置/变量
    lib/github-auth.mjs:256
    child = spawn(process.execPath, ["--use-system-ca", "--no-warnings", script], {
  • 读取本地文件
    lib/state.mjs:25
    const text = await readFile(stateFile(), "utf8");
  • 写入本地文件
    lib/state.mjs:35
    await mkdir(dataDir(), { recursive: true });
  • 写入本地文件
    lib/state.mjs:37
    await writeFile(temp, `${JSON.stringify(data, null, "\t")}\n`, "utf8");
  • 写入本地文件
    lib/state.mjs:38
    await rename(temp, stateFile());
  • 读取本地文件
    lib/github-api-child.mjs:13
    const raw = readFileSync(0, "utf8");
  • 发起网络请求
    lib/github-api-child.mjs:21
    const res = await fetch(input.url, {
扫描于 2026/11/6(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-client-ui-git — DSH Git 可视化插件 在 DeepSeek Harness Web GUI 侧边栏底部放一个 Git 按钮(显示当前分支名 + 未提交改动徽标),点击打开右侧抽屉:当前会话工作区的仓库概览、工作区状态、提交历史图,以及单提交的 diff 浏览与安全回退操作。 - 语言/框架:纯 JS(无构建步骤),host 半 ESM(cordis 插件),client 半 __ModuleLoader__ bundle - 依赖:host 半只依赖 @deepseek-ai/dsh-typert-protocol(运行时);client 半无外部依赖(内联 mini-zod) - 只读方式:浏览类方法都是只读 git 命令;写入分「安全写」(init/commit/checkout/revert/merge)与「危险写」(restore/reset)两档,危险写只出现在 UI 里,必须经确认弹窗 结构 | 文件 | 职责 | | lib/index.js | host 半:GitGateway(git Remote 服务),用 child_process.spawn 跑 git 命令 | | lib/git-core.mjs | 纯函数层:命令封装、porcelain 解析、读写实现 |
展开完整文档(README 剩余 1 节)
dsh-client-ui-git — DSH Git 可视化插件

在 DeepSeek Harness Web GUI 侧边栏底部放一个 Git 按钮(显示当前分支名 + 未提交改动徽标),点击打开右侧抽屉:当前会话工作区的仓库概览、工作区状态、提交历史图,以及单提交的 diff 浏览与安全回退操作。

- 语言/框架:纯 JS(无构建步骤),host 半 ESM(cordis 插件),client 半 __ModuleLoader__ bundle
- 依赖:host 半只依赖 @deepseek-ai/dsh-typert-protocol(运行时);client 半无外部依赖(内联 mini-zod)
- 只读方式:浏览类方法都是只读 git 命令;写入分「安全写」(init/commit/checkout/revert/merge)与「危险写」(restore/reset)两档,危险写只出现在 UI 里,必须经确认弹窗

结构

| 文件 | 职责 |
| lib/index.js | host 半:GitGateway(git Remote 服务),用 child_process.spawn 跑 git 命令 |
| lib/git-core.mjs | 纯函数层:命令封装、porcelain 解析、读写实现 |
| lib/typert.host.js | host 半 TYPERT manifest(exports["./typert"]),由 dsh-typert-loader 自动注册 |
| lib/client.js | client 半:内联 mini-zod + 侧边栏入口 + 抽屉面板 |
| packages/dsh-client-git-remote/ | client 半的 git namespace 挂载插件(ctx.remote.$mount) |
| locale/{zh,en}.json | 插件页显示名称与描述 |

Remote 服务(namespace git,共 14 个方法)

| 分组 | 方法 | 请求 | 返回 |
| 读 | snapshot | {path} | {repo, path, root?, branch?, head?, clean?, changes?, ahead?, behind?} |
| 读 | log | {path, limit?} | {commits: [{hash, short, parents[], refs[], author, email, date, subject}]} |
| 读 | status | {path} | {clean, entries: [{x, y, path}]}(porcelain 语义) |
| 读 | diff | {path, commit} | {commit, files: [{path, added, removed, binary}], patch, truncated} |
| 读 | branch | {path} | {branches: string[]} |
| 读 | isRepo | {path} | {repo, error?} |
| 安全写 | init | {path, userName?, userEmail?} | {ok, message} / {ok:false, error} |
| 安全写 | commit | {path, message} | {ok, message, id?}(自动 add -A) |
| 安全写 | createBranch | {path, name, from?} | {ok, message} |
| 安全写 | checkout | {path, target} | {ok, message}(非本地分支则游离 HEAD) |
| 安全写 | revert | {path, commit} | {ok, message}(生成反向提交) |
| 安全写 | merge | {path, target} | {ok, message} / {ok:false, error, conflicts?} |
| 危险写 | restore | {path, paths?} | {ok, message}(丢弃未提交改动) |
| 危险写 | reset | {path, commit} | {ok, message}(--hard,仅本地未推送) |

调用示例(浏览器,返回 {ok, value}):

const result = await ctx.remote.git.snapshot({ path: "G:/repo" });
if (result.ok) console.log(result.value.branch);

MCP 工具(mcp/server.mjs,本地能力,不含联网)

源在仓库 mcp/server.mjs,运行副本 $DSH_HOME/mcp-git/server.mjs(用 node scripts/sync-mcp.mjs 部署,改完重启 DSH)。

| 分组 | 工具 |
| 只读 | snapshot、log(可按 paths/author/since/grep 过滤)、status、diff(提交 / 工作区 / 暂存区,可限定 paths 或只看 stat)、show_file、branch、is_repo、blame、reflog |
| 安全写 | init、commit(stagedOnly 可选)、add、unstage、create_branch、branch_admin(rename/delete)、checkout、revert、merge、reset_soft(撤销提交保留改动)、abort(merge/revert/cherry-pick)、stash(push/pop/apply/drop/list/show)、tag(list/create/delete) |
| 危险(默认关闭) | restore(丢弃改动)、reset(硬回退) |

危险工具默认不注册,开启方式(后续设置页就是写这个配置):

// $DSH_HOME/mcp-git/config.json
{ "allowDangerousTools": true }

或临时用环境变量 DSH_GIT_ALLOW_DANGEROUS=1。

UI

- 挂载点:sidebar.footer.action(侧边栏底部,与设置、用量统计同排)
- 撑开模式:分支图标 + 分支名 + 未提交数徽标;收起模式:图标 + 徽标
- 工作区由 useSessions(当前会话的 cwd)决定,切换会话自动刷新;无会话时退到最近工作区
- 抽屉(宽 min(440px, 100vw-32px)):
- 头部:仓库名、干净/改动徽标、分支徽标、刷新、关闭
- 操作行:提交存档 / 新建分支 / 切换分支 / 合并分支 / 丢弃改动(全部二次确认)
- 工作区状态:按目录分组、可折叠,状态字母着色
- 提交时间线:第一父链 + merge 标记 + refs 标签
- 选中提交后切到 40/60 详情:该提交的文件 numstat + patch(截断提示)+ 回退/还原/硬回退
- 样式全部走 DSH alias-token CSS 变量(--dsw-alias-),light/dark 与阿罗娜主题自动适配

安装与部署

本机链路(file: 依赖 + 复制安装):

1. 工作区 → G:\DSHDesktopPluginRemove\_stage\pkgs\dsh-client-ui-git
2. _stage → %DSH_PROFILE_DIR%\node_modules\@dsh-external\dsh-client-ui-git
3. 重启 DSH(host 半/manifest 改动必须重启;仅 client 改动可先刷新页面试)

profile 的 package.json 需要两行:

{
"dependencies": { "@dsh-external/dsh-client-ui-git": "file:G:/DSHDesktopPluginRemove/_stage/pkgs/dsh-client-ui-git" },
"dsh": { "profile": { "bundles": ["@dsh-external/dsh-client-git-remote", "@dsh-external/dsh-client-ui-git"] } }
}

cordis.patch.yml 里插入两行(git-remote 必须先于 ui-git,前者负责挂载 remote.git):

- insert:
- id: git-remote
name: '@dsh-external/dsh-client-git-remote'
- insert:
- id: ui-git
name: '@dsh-external/dsh-client-ui-git'

开发/验证

node test-gitcore.mjs # git-core 读写全流程(临时仓库)
node test-host.mjs # GitGateway 端到端
node test-contract.mjs # TYPERT schema 与 client mini-zod 双端契约
node test-install.mjs # 安装校验 + 部署漂移(DSH_PROFILE_DIR,逐文件 SHA256)
node test-client-offline.mjs # 真 bundle 离线渲染:入口 / 抽屉 / 提交 diff
node test-live.mjs [dir] # 打真实 GUI 的 /api/git/(DSH_WEB_URL,可带 ?token=)
node test-manual-rpc.mjs [dir] # 真实 GUI 上的 init/commit 流程

工作区没有真实依赖树:node_modules/@deepseek-ai、node_modules/zod 是指向 harness / desktop profile 的 junction(已在 .gitignore)。

注意:
- host 半不能用原生 decorator 语法(@Remote),strict 路径由 manifest 提供,类方法普通实现即可
- client 半不要 inject "remote.git" 之外的挂载逻辑($mount 在 git-remote 的 apply 内),此处只声明注入
- client 半 schema 会被 api-gateway 真实 parse()(参数与结果都校验),mini-zod 必须返回真值
- 分支规矩:任何改动先开分支,老师验收通过后再合并 main
预览分享卡片长什么样 ↓LingQi-07-std/dsh-client-ui-git
分享 · DeepSeek Harness Hub
LingQi-07-std/dsh-client-ui-git

在侧边栏查看分支图谱与提交历史,安全回退改动

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部