- 홈
- 플러그인
- Git 및 코드 리뷰
- dsh-git-forge
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-forgeREADME
简体中文 | English
DSH Git Forge
DeepSeek Harness 的 Git 凭据与推送权限管理器:哪个项目能用哪个账号、允许推到哪些 host,一处说清。
账号库与 token 只落在宿主侧。按项目授权决定 agent 用哪个账号,push 拦截决定这个项目允许推到哪。
这是什么 • 核心特性 • 安装方式 • 侧栏 • 模型工具 • 数据放在哪 • 安全 • 环境要求 • 开发 • 支持与致谢 • 许可证与作者
这是什么
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 凭据」从右侧栏的引导页打开——只重启宿主不够,客户端产物是页面加载时取的。
装完怎么用
- 打开右侧栏「Git 凭据」→ 账号库 加一个账号(token 只在侧栏里填,不进对话)
- 点探测确认这个 token 有效
- 切到 项目授权 → 勾上该账号并保存,当前工作区就拿到了推送凭据
- 让 agent 在项目里跑 HTTPS 的
git fetch/git push,凭据由 helper 自动注入,模型看不到 token - 反过来试一个未授权的 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.json | token(0600) |
grants.json | projectPathKey → 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
支持与致谢
- 如果这个插件对你有帮助,欢迎点亮 Star;有问题或建议请提 Issue 或 Pull Request。
- 变更记录见 CHANGELOG。
- dsh-ssh-tunnel:同门插件,主机库与侧栏交互与本案对齐
- DeepSeek Harness:插件、工具与 agent shell 的宿主
许可证与作者
MIT。上游项目与代码作者 @thirsty5034;本仓库的维护与新增部分 © 2026 @OMSociety。