본문으로 건너뛰기
O

dsh-git-forge

omsociety/dsh-git-forge

DeepSeek Harness의 프로젝트별 Git 인증 정보입니다. GitHub, Gitea, GitLab, Bitbucket 또는 사용자 지정 호스트 계정을 우측 사이드바 Git Forge에 등록하고 프로젝트별로 권한을 부여합니다. token은 대화에 노출되지 않고 HTTPS credential helper로 Agent에 전달되며, 허용되지 않은 호스트로의 push는 거부됩니다.

설치

dsh plugin --profile web add github:omsociety/dsh-git-forge

README

简体中文 | English

DSH Git Forge

DSH Git Forge

DeepSeek Harness 的 Git 凭据与推送权限管理器:哪个项目能用哪个账号、允许推到哪些 host,一处说清。

账号库与 token 只落在宿主侧。按项目授权决定 agent 用哪个账号,push 拦截决定这个项目允许推到哪。

Version DSH License Stars Issues

这是什么 • 核心特性 • 安装方式 • 侧栏 • 模型工具 • 数据放在哪 • 安全 • 环境要求 • 开发 • 支持与致谢 • 许可证与作者

这是什么

DSH Git Forge 是 DeepSeek Harness 的社区插件,在 DSH 官方右侧栏里给你一个 Forge 账号库 + 按项目授权 + 推送策略 的管理面。

它管两件事:

  • agent 用哪份凭据:在侧栏给项目授权账号之后,agent shell 里的 HTTPS git fetch / git push 由本插件的 credential helper 自动取用对应 token,token 只在宿主侧读,不进模型上下文。
  • 这个项目允许推到哪:未授权 host 会被 push 拦截器在工具层直接拒绝;裸 git push 与 git push origin 会先解析 remote URL 再判定。

SSH 远程与系统 gh auth 不受影响,仍走本机 SSH / gh;本插件只补 DSH agent shell 下的 HTTPS 这一段。

核心特性

特性说明
账号库账号按 gitHost 归集,界面给出 github.com / gitee.com / gitlab.com / bitbucket.org 常用选项,自建 Forge 直接填自己的域名;侧栏内可增删改并探测 API token
按项目授权授权 key 是 DSH 会话工作区(projectPathKey,agent shell 里即 DSH_GIT_FORGE_PROJECT),不是子仓路径
push 拦截命令里的 URL、裸 git push、git remote add / set-url 都在 Host tools.guard 里按授权判定
agent HTTPS git同一 host 恰好 1 个已授权 token 账号时(R1)helper 才自动注入;多账号时不猜号,宁可不注入
token 落盘$DSH_HOME/git-forge/secrets.json(0600);API 与工具结果一律不回传 token
模型工具 GitForge四个只读动作:看账号库、看某项目授权、看策略、校验某个 remote 是否被允许
UI 对齐与同门的 dsh-ssh-tunnel 共用一套侧栏交互

安装方式

从 npm 安装

# 先停掉正在运行的 DSH(运行中的服务会锁住依赖,装完再起)
dsh plugin --profile <profile> add "dsh-git-forge"

提示:装好后刷新一下浏览器页面,「Git 凭据」从右侧栏的引导页打开——只重启宿主不够,客户端产物是页面加载时取的。

装完怎么用

  1. 打开右侧栏「Git 凭据」→ 账号库 加一个账号(token 只在侧栏里填,不进对话)
  2. 点探测确认这个 token 有效
  3. 切到 项目授权 → 勾上该账号并保存,当前工作区就拿到了推送凭据
  4. 让 agent 在项目里跑 HTTPS 的 git fetch / git push,凭据由 helper 自动注入,模型看不到 token
  5. 反过来试一个未授权的 host:让 agent 推过去,应当被 push 拦截器直接拒绝

侧栏

侧栏只有一个 Tab,内部三页:

页面作用
项目授权当前项目可用的账号,以及是否 enforcePush
账号库账号增删改、探测 API token、查看绑定的 gitHost
策略状态当前允许的 gitHost,以及未绑定项目的默认策略

模型工具

动作作用参数
GitForge action=list_accounts列出账号库(不含 token)无
GitForge action=list_project_accounts列出某项目已授权的账号project_path
GitForge action=get_policy看该项目策略:授权账号、是否 enforcePush、未绑定项目默认project_path
GitForge action=check_remote校验某个 remote URL 是否被允许推送(不推送)url(必填)

Agent HTTPS 与项目路径

  • 授权 key = DSH 会话工作区(agent shell 里注入 DSH_GIT_FORGE_PROJECT),不是子仓路径;工作区路径按磁盘实态归一(realpath),Windows 8.3 短名与符号链接折叠到同一 key
  • helper 找项目:env → cwd 精确匹配 → 向父目录 walk(cwd 在 /workspace 下时上界为 /workspace,否则走到根)
  • R1:同一 host 仅当恰好 1 个已授权 token 账号时才自动注入凭据
  • agent shell 的 GIT_CONFIG_GLOBAL 指向 $DSH_HOME/git-forge/gitconfig;文件第一行 include 回接你的用户级 gitconfig(user.name / user.email / http.proxy 等照常生效),随后一条空 credential.helper 清掉系统级 helper,再挂本插件 helper——系统凭据管理器的弹窗不会卡住无头 shell,用户自己配的 helper 也会被同样清掉

数据放在哪

$DSH_HOME/git-forge/(目录 0700;0600/0700 权限仅在 POSIX(Linux/macOS)生效,Windows 无等效收紧):

文件内容
accounts.json账号元数据(不含 token)
secrets.jsontoken(0600)
grants.jsonprojectPathKey → accountIds[] 与 enforce / unbound 策略
gitconfig注入给 agent shell 的 credential helper 配置(不含凭据)

注意:accounts.json / secrets.json / grants.json 若解析失败,坏文件会被改名保留为 <原名>.corrupt-<时间戳> 并回退默认值,不会覆盖丢失现场。

安全

  • token 不出现在 API 结果、工具结果与模型上下文里
  • push 策略在 Host tools.guard 中硬拦截,不依赖模型自觉
  • 未给项目配置任何授权时,push 拦截器默认不拦截(便于渐进启用),helper 也不会凭空给出凭据
  • token 只落在宿主侧数据目录 secrets.json;helper 是由 git 拉起的独立进程,按需读取;token 不进模型上下文。secrets.json 疑似泄露请立即轮换 token
  • 侧栏 API 做同源校验:Sec-Fetch-Site: cross-site 一律拒绝;请求缺该头时校验 Origin 与 Host 是否一致,不一致拒绝;两者皆缺的非浏览器客户端放行(宽松策略)
  • push 检测基于命令文本启发式,已知绕过面(env 变量改名 git、git alias、路径经变量拼接、非 bash/sh 包装器、time/nice 等未覆盖前缀);这一边界是明示的检测口径,不是放行依据
  • 配置了授权的项目里,裸 git push 的 remote 解析失败会重试一次,仍失败即拒绝(fail-closed)

环境要求

  • DSH profile(desktop 与服务器自建均可),DSH 版本 >=0.2.0-rc.2 <0.3.0-0
  • Node.js >= 20

开发

npm test                      # 21 项离线自检(scripts/smoke-test.mjs)
npm run check                 # 语法 + 自检
DSH_PROFILE=desktop bash scripts/sync-to-dsh.sh   # 以 link: 方式把本仓库接入 DSH profile(开发用)

目录与「改东西去哪」:

lib/index.js            宿主入口:工具注册、/dsh-git-forge/api 路由、push 拦截、credential helper 配置
lib/client.js           客户端 bundle(已入库;dsh plugin add 不做构建)
lib/shared/             宿主与客户端共用纯函数:path / git-policy / remote-resolve / credential-select / account-summary
scripts/                install.sh · install.ps1 · sync-to-dsh.sh · smoke-test.mjs · git-credential helper
cordis.patch.yml        包内 bundle patch,CLI 据此写入 dsh.profile.bundles

支持与致谢

许可证与作者

MIT。上游项目与代码作者 @thirsty5034;本仓库的维护与新增部分 © 2026 @OMSociety。

관련 플러그인