Back to home@Nico0713520

dsh-github-cli

Reuse your local GitHub CLI (gh) inside DeepSeek Harness — read-first, per-command allowlist, zero token setup.

Stars
0
Language
TypeScript
Created
Aug 17, 2026
Updated
Aug 17, 2026
GitHub repo

Introduction

dsh-github-cli

把你的 GitHub CLI (gh) 直接接进 DeepSeek Harness —— 零 token 配置,只读优先。

CI License: MIT dsh-plugin

English · 中文

如果你已经用 gh 登录过这台机器,这个插件装完就能用。你的 Agent 可以直接查 PR、看 issue、搜代码、跑 gh api —— 用你已有的账号,不用再配任何 token。

为什么是 gh,而不是 GitHub MCP server?

DeepSeek Harness 支持 MCP,GitHub 也有官方 MCP server。但它们不是一回事:

dsh-github-cli(本插件)GitHub MCP server
登录复用你现有的 gh 登录(含企业版/SSO)需要单独 PAT 或 OAuth 流程
命令面每个 gh 子命令 + gh api只有精选的几个工具
写保护逐命令白名单(默认只读)工具级 scope
配置零配置、零 token装 server + 配 transport + 配 token

一句话:gh 是你已经信任、已经登录的那把钥匙,这里只是把它递给你的 Agent。

特性

  • 零配置 —— 复用 gh 本机登录态,不用生成、粘贴、管理任何新 token
  • 只读优先 —— 默认只放行安全命令(view/list/status/search/checks/diff),写操作需显式开启
  • 凭据永禁 —— auth tokensecretssh-key 等命令即使开了全访问也拒绝,杜绝密钥泄露进对话
  • 无注入 —— execFile + 参数数组(shell: false),不存在 shell 注入
  • 企业友好 —— 已登录的 enterprise / SSO 账号直接可用
  • 18 项单元测试 + 三版本 Node CI —— 每个命令边界都有测试兜底

30 秒上手

# 1. 安装(GitHub 源,立即可用)
dsh plugin --profile web add git+https://github.com/Nico0713520/dsh-github-cli.git

# 2. 重启 dsh web(让插件作为 bundle 层生效)
# 3. 在对话里直接问

安装后,在任意会话里:

你:这个仓库有哪些未关闭的 PR?
Agent:→ 执行 gh pr list --state open -R deepseek-ai/deepseek-harness

你:帮我看看 PR #123 改了什么
Agent:→ 执行 gh pr diff 123

你:gh 在这台机器上登录了没?
Agent:→ 执行 gh_auth_status

工具

工具作用
gh_cli_run以参数数组执行任意 gh 子命令
gh_auth_status检查 gh 是否已安装并登录

安全模型

这是本插件与其他 gh 封装最核心的区别 —— 每个命令都落在三个层级之一:

层级示例行为
🟢 只读白名单repo view/listpr view/list/status/diff/checksissue view/listsearch *gist view/listrelease view/listrun view/listworkflow view/listapi(仅 GET)、auth statusversionhelp默认放行
🟡 写操作pr create/mergeissue closerepo deleterelease createapi --method POST/DELETEapi -f/--field/--input需配置 fullAccess: true 才放行
🔴 永禁auth login/logout/token/refreshsecret *ssh-key *任何情况都拒绝

为什么要这样设计

  • 只读命令不会改动 GitHub 状态,按需执行是安全的。
  • 写命令会改变真实世界fullAccess 是一个明确、写在文档里的主动选择。
  • 凭据类命令无条件拒绝,因为它们的输出可能把密钥泄露进对话、或破坏你的登录。
  • 命令通过 execFile + 参数数组执行(shell: false),不存在参数注入
  • 顺带处理了两个容易踩的坑:gh api -f key=value隐式变成 POST(已识别为写);workflow run list(读)和 workflow run <file>(写)能精确区分。

配置

插件读取 GhCliConfig(在 profile 的插件配置里设置):

interface GhCliConfig {
  ghPath?: string        // gh 路径,默认 PATH 上的 `gh`
  fullAccess?: boolean   // 允许写命令,默认 false
  extraReadOnly?: string[]  // 额外放行的只读前缀,如 ['gist create']
  timeoutMs?: number     // 单次调用超时,默认 60_000
}

cordis patch 示例:

- insert:
    - id: gh-cli
      name: gh-cli
      config:
        fullAccess: false
        timeoutMs: 120000

FAQ

装了之后怎么没生效? —— 一个包只有声明了 dsh.bundle.patch 才会成为激活的 Harness 层(本插件自带 cordis.patch.yml)。装完必须重启 dsh web(或刷新页面)。

会泄露我的 token 吗? —— 不会。gh auth token 这类命令在最高安全层级,任何情况下都拒绝执行;只读命令的输出不含凭据。

为什么默认不是全功能? —— 把 gh 交给一个能读你工作区、跑 shell 的 Agent,最稳妥的做法是"默认只读、按需放开"。安全边界应该是显式的,而不是隐式的。

支持哪些 gh 版本? —— 只要 gh 已登录且版本较新即可;本插件用参数数组调用,不依赖特定版本语法。

开发

git clone https://github.com/Nico0713520/dsh-github-cli.git
cd dsh-github-cli
npm install
npm run typecheck
npm test
npm run build

# 在本地 Harness 检出里调试
dsh plugin --profile web add "link:$(pwd)"

要求

  • Node.js ≥ 20
  • GitHub CLI 已安装并登录(gh auth login
  • DeepSeek Harness(@deepseek-ai/dsh)—— 已在 0.1.0-rc.x 验证

相关链接

License

MIT — 见 LICENSE