git-for-dsh:用允许清单在沙箱外执行 Git

前言

在 DeepSeek Harness(DSH)里让模型操作 Git,常见做法是依赖文件沙箱内的 shell 或 bash 工具。实测表明:沙箱内本地读写(如 git init、git add、git commit)往往可以完成,但涉及 TLS 凭证、凭据助手或 MSYS2 自带的 ssh.exe 时,会在进程级限制下失败;Windows 上交互式 bash 与 ACL 沙箱还会叠加 PTY、signal pipe 等问题。结果是「能改工作区,难做 push / fetch」。

git-for-dsh 是维护者 theRMM714 发布的 DSH 客户端插件(GitHub:theRMM714/git-for-dsh)。它不继续把 Git 关在文件沙箱里,而是显式以 sandboxPolicy: { mode: 'danger-full-access' } 调用 ctx.shell 执行一次性 git 命令,安全边界改由用户勾选的子命令允许清单和多道闸门承担。README 开头注明:这是个人测试用项目,使用出现任何问题作者不承担责任;安装前应自行阅读源码与 MIT 许可证。

这是什么

插件由两半组成,装一次即可:

  • Host 半(src/index.js):向模型注册工具 git_exec,并实现允许清单、参数闸门、配置写入闸门、仓库配置审计与执行环境硬化。
  • Client 半(src/client.js):在「设置 → Git 工具」渲染勾选页,用户决定放行哪些 git 子命令;勾选结果持久化到 Profile 的 cordis.patch.yml。

当前 package 版本为 0.0.9(以仓库 package.json 为准)。社区目录页:SkillHub - git-for-dsh(独立站点,与 DeepSeek / 幻方无官方从属关系)。

核心功能

模型工具 git_exec

参数 必填 含义
argv 是 程序名之后的 git 参数,首元素为子命令,例如 ["log", "--oneline", "-n", "20"]
paths 否 涉及的文件或目录;插件拼成 git <子命令> … -- <路径>
description 是 一句话说明用途,显示在界面
workdir 否 工作目录;默认会话工作区
timeoutMs 否 超时毫秒;本地默认 120000,触及远端默认 300000
justification 否 需要审批时的一句话理由

返回字段包括 exitCode、signal、timedOut、operation、command、stdout、stderr。路径应放在 paths,不要塞进 argv,以避免空格、通配符等转义问题。工具描述与系统提示会根据当前允许清单实时生成。

命令经 host 的 shell 解析(Linux/macOS 为 bash,Windows 为 pwsh);参数一律用单引号包裹,插件按平台处理含单引号或逗号的参数。

三道风险档位与 47 个子命令

src/git-catalog.js 为唯一事实来源,操作分三档:

档位 含义 操作数 默认
read 只读仓库、索引、引用与配置 22 开启
write 改动工作区、暂存区或本地分支 16 关闭
remote 克隆、推送,或永久丢弃历史与未跟踪文件 9 关闭

未勾选的子命令在进程启动前拒绝,模型看到的是「该操作未启用」。部分子命令(如 branch、tag、remote)存在「形式上是只读、实际会写状态」的分支,变更形式按写档处理或按规则直接拒绝(例如 remote set-url、config 写入)。

五道闸门(摘要)

  1. 允许清单:仅用户勾选的子命令可启动进程。
  2. 参数闸门:拒绝全局位置的 -c、--git-dir、--exec 等;-u 按子命令区分(如 fetch 上为 --upload-pack 短形式则拒绝)。
  3. 配置不能变成程序:限制 config 写入;通过环境变量钉死 core.fsmonitor、credential.helper 等;diff 类命令强制 --no-ext-diff --no-textconv。
  4. 仓库配置审计:执行前用 git config --local --includes --list --name-only -z 检查危险键;策略可在设置页选择(默认 refuse-repo 等)。
  5. 执行环境硬化:与上述项配合,README 中另有验证脚本说明。

安装与启用

本包自带 dsh.bundle.patch(cordis.patch.yml),安装后并入 profile 的 bundle 层栈,无需手改配置文件。

# 从 npm(发布后)
dsh plugin --profile <profile> add git-for-dsh

# 或直接从 GitHub(lib/ 已入库,无需构建放行)
dsh plugin --profile <profile> add github:theRMM714/git-for-dsh

# 或本地路径(开发:link 为符号链接,改完即生效)
dsh plugin --profile <profile> add /path/to/git-for-dsh

更新:

dsh plugin --profile <profile> update git-for-dsh

从 GitHub 安装或更新时,shell 需能访问 github.com;若需代理,可先设置 HTTPS_PROXY。

安装后重启 Profile:模型获得 git_exec;设置中出现「Git 工具」页。环境变量 DSH_GIT_TOOL_DISABLED=1 时,cordis.patch.yml 中 tool-git 条目不加载,便于快速停用插件而不改文件。

若在 profile 自有 cordis.patch.yml 中重述同一 id: tool-git,用户层按行覆盖。设置页底部有「页面版本」构建指纹;与 lib/client.js 不一致时强制刷新浏览器即可。

典型用法

下面是一条只读查看最近提交的可复现调用形态(子命令须在设置中勾选 log):

模型调用 git_exec,例如:

  • argv: ["log", "--oneline", "-n", "20"]
  • description: 查看最近 20 条单行日志
  • 可选 workdir 指向仓库根目录

写操作、远端操作默认未勾选;启用后部分写档命令会走审批流程(见 README 中「形式风险」与闸门说明)。推送、拉取等需在「Git 工具」中显式开启 remote 档相应子命令,并理解命令以当前 DSH 进程的用户权限在沙箱外执行。

适用场景与注意

适合:需要在 DSH 会话里让模型执行受控 Git 工作流(含远端),且愿意用勾选清单代替「完全沙箱内 git」的开发者。

务必注意:

  • 每次 git_exec 等价于在本机以 dsh 进程权限运行 git,不是文件沙箱内的受限调用。
  • README 免责声明:个人测试项目;安装前检查源码、闸门逻辑与 MIT 许可证。
  • 对不可信仓库,不要随意将仓库配置审计设为 off;默认策略意在阻止 .git/config 与 include 中的危险键间接执行程序。
  • Windows 上插件走 ctx.shell 一次性命令与 danger-full-access,不依赖交互式 PTY;仍应用设置页控制写档与远端档。

结尾

git-for-dsh 把「AI 能用哪些 git 子命令」做成可持久化的允许清单,并把执行放到沙箱外、由多道闸门约束参数与仓库配置,以弥补沙箱内 git 做不了远端与凭证相关操作的问题。目录与源码:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜