让模型直接建仓推代码、提 PR 管 issue
29.2/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:npm 同名包「dsh-github」归属 kaziii/dsh-github-connector,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ChenYiming-aaa/dsh-github该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 68 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意npm 同名包「dsh-github」归属 kaziii/dsh-github-connector,装到的可能不是本插件
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-github @ 0.1.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 01:16:14
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
发起外部网络请求
查看扫描证据(共 59 处,展示前 39 条)
- 发起网络请求lib/tools/auth.js:98
const { data } = await api.request("GET", "/user"); - 发起网络请求lib/tools/auth.js:217
const { data } = await api.request("GET", "/user"); - 发起网络请求lib/tools/repos.js:64
const { data } = await api.request("POST", path, { body }); - 发起网络请求lib/tools/repos.js:80
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}`); - 发起网络请求lib/tools/repos.js:115
const { data } = await api.request("GET", path, { query }); - 发起网络请求lib/tools/repos.js:136
const { data } = await api.request("POST", `/repos/${enc(args.owner)}/${enc(args.repo)}/forks`, { body }); - 发起网络请求lib/tools/repos.js:157
await api.request("DELETE", `/repos/${enc(args.owner)}/${enc(args.repo)}`); - 发起网络请求lib/tools/repos.js:184
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/branches`, { query: { per_page: args.per_page ?? 30 } }); - 发起网络请求lib/tools/issues.js:44
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/issues`, { - 发起网络请求lib/tools/issues.js:85
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/issues/${args.issue_number}`); - 发起网络请求lib/tools/issues.js:124
const { data } = await api.request("POST", `/repos/${enc(owner)}/${enc(args.repo)}/issues`, { body }); - 发起网络请求lib/tools/issues.js:166
const { data } = await api.request("PATCH", `/repos/${enc(owner)}/${enc(args.repo)}/issues/${args.issue_number}`, { body }); - 发起网络请求lib/tools/issues.js:194
const { data } = await api.request("POST", `/repos/${enc(owner)}/${enc(args.repo)}/issues/${args.issue_number}/comments`, { - 发起网络请求lib/tools/pulls.js:43
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/pulls`, { - 发起网络请求lib/tools/pulls.js:82
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/pulls/${args.pull_number}`); - 发起网络请求lib/tools/pulls.js:119
const { text: diff } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/pulls/${args.pull_number}`, { - 发起网络请求lib/tools/pulls.js:170
const { data } = await api.request("POST", `/repos/${enc(owner)}/${enc(args.repo)}/pulls`, { body }); - 发起网络请求lib/tools/pulls.js:210
const { data } = await api.request("PATCH", `/repos/${enc(owner)}/${enc(args.repo)}/pulls/${args.pull_number}`, { body }); - 发起网络请求lib/tools/pulls.js:249
const { data } = await api.request("PUT", `/repos/${enc(owner)}/${enc(args.repo)}/pulls/${args.pull_number}/merge`, { body }); - 发起网络请求lib/tools/commits.js:41
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/commits`, { - 发起网络请求lib/tools/commits.js:74
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/commits/${enc(args.ref)}`); - 发起网络请求lib/tools/search.js:23
const { data } = await api.request("GET", path, { query }); - 发起网络请求lib/tools/releases.js:47
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/releases`, { query: { per_page: args.per_page ?? 30 } }); - 发起网络请求lib/tools/releases.js:74
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/releases/latest`); - 发起网络请求lib/tools/releases.js:101
const { data } = await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}/releases/tags/${enc(args.tag)}`); - 发起网络请求lib/tools/orgs.js:32
const { data } = await api.request("GET", "/user"); - 发起网络请求lib/tools/orgs.js:59
const { data } = await api.request("GET", `/orgs/${enc(args.org)}/teams`, { query: { per_page: args.per_page ?? 30 } }); - 发起网络请求lib/tools/orgs.js:88
const { data } = await api.request("GET", `/orgs/${enc(args.org)}/teams/${enc(args.team_slug)}/members`, { - 发起网络请求lib/tools/workflow.js:61
repo = (await api.request("GET", `/repos/${enc(owner)}/${enc(args.repo)}`)).data; - 发起网络请求lib/tools/workflow.js:65
const { data } = await api.request("GET", "/user"); - 发起网络请求lib/tools/workflow.js:69
repo = (await api.request("POST", createPath, { - 发起网络请求lib/tools/workflow.js:94
pullRequest = (await api.request("POST", `/repos/${enc(owner)}/${enc(args.repo)}/pulls`, { - 发起网络请求lib/tools/common.js:68
const { data } = await runtime.api.request("GET", "/user"); - 发起网络请求lib/push.js:33
const repoInfo = await api.request("GET", `/repos/${enc(owner)}/${enc(repo)}`); - 发起网络请求lib/push.js:47
const ref = await api.request("GET", `/repos/${enc(owner)}/${enc(repo)}/git/ref/heads/${enc(targetBranch)}`); - 发起网络请求lib/push.js:53
const defRef = await api.request("GET", `/repos/${enc(owner)}/${enc(repo)}/git/ref/heads/${enc(defaultBranch)}`); - 发起网络请求lib/push.js:55
const headCommit = await api.request("GET", `/repos/${enc(owner)}/${enc(repo)}/git/commits/${headSha}`); - 发起网络请求lib/push.js:58
await api.request("POST", `/repos/${enc(owner)}/${enc(repo)}/git/refs`, { - 发起网络请求lib/push.js:69
const seedResponse = await api.request("PUT", `/repos/${enc(owner)}/${enc(repo)}/contents/${seed.path.split("/").map(enc).join("/")}`, {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 建仓推送代码
- 提PR管issue
- 搜索代码
README
由 DeepSeek 最新模型翻译生成dsh-github — DeepSeek Harness 的 GitHub 集成插件
对标 opencode 的 GitHub MCP server:一次配置认证,长期可用。模型在对话中直接调用 github_ 工具完成建仓、推送、提 PR、管 issue、搜索代码等 GitHub 事务,不再每次操作都要求临时授权。
- 零依赖(只用 Node 22+ 内置模块),45 个工具,全部走 GitHub REST API v3
- 认证持久化:GITHUB_TOKEN(环境变量 / DSH credentials 服务)或 OAuth Device Flow (浏览器授权一次,token 自动写入 $DSH_HOME/.credentials.yaml,重启 DSH 依然有效)
- 审批策略:读操作 + 常规写操作直接放行;删除仓库/文件/分支、force push、合并 PR、关闭 issue/PR 保留审批门
- DNS 韧性:系统解析(hosts)把 github 域名指向 127.0.0.1(屏蔽/坏条目)时自动改用 DNS 直查绕过,github_ 工具不因 hosts 文件被改坏而失效
- 安全:token 只进 Authorization 请求头,绝不落日志;错误信息与工具输出做防御性脱敏
快速开始
展开完整文档(README 剩余 1 节)
dsh-github — DeepSeek Harness 的 GitHub 集成插件
对标 opencode 的 GitHub MCP server:一次配置认证,长期可用。模型在对话中直接调用 github_ 工具完成建仓、推送、提 PR、管 issue、搜索代码等 GitHub 事务,不再每次操作都要求临时授权。
- 零依赖(只用 Node 22+ 内置模块),45 个工具,全部走 GitHub REST API v3
- 认证持久化:GITHUB_TOKEN(环境变量 / DSH credentials 服务)或 OAuth Device Flow (浏览器授权一次,token 自动写入 $DSH_HOME/.credentials.yaml,重启 DSH 依然有效)
- 审批策略:读操作 + 常规写操作直接放行;删除仓库/文件/分支、force push、合并 PR、关闭 issue/PR 保留审批门
- DNS 韧性:系统解析(hosts)把 github 域名指向 127.0.0.1(屏蔽/坏条目)时自动改用 DNS 直查绕过,github_ 工具不因 hosts 文件被改坏而失效
- 安全:token 只进 Authorization 请求头,绝不落日志;错误信息与工具输出做防御性脱敏
快速开始
1. 安装插件(web + desktop 两个 profile)
powershell -ExecutionPolicy Bypass -File .\install.ps1
只装一个 profile:powershell -ExecutionPolicy Bypass -File .\install.ps1 -Profiles desktop
安装脚本会:
1. 把插件包复制到 %USERPROFILE%\.dsh\profiles\node_modules\dsh-github\
2. 在 web 与 desktop 两个 profile 的 cordis.patch.yml 追加注册条目(幂等)
重启 DSH Desktop(或重载 web profile)后生效。
2. 配置认证(二选一,均持久生效)
方式 A — Personal Access Token(推荐先试这个)
1) 在 GitHub → Settings → Developer settings → Personal access tokens 生成(需要 repo、read:org、user 权限) 2a) 环境变量(最简单) setx GITHUB_TOKEN "ghp_xxx" # 新开的终端/重启 DSH 后生效 2b) 或写入 DSH credentials($DSH_HOME/.credentials.yaml,密码学托管、不落日志) DSH 设置页 → 凭据 → 新增 GITHUB_TOKEN → 粘贴 token
方式 B — OAuth Device Flow(浏览器授权一次)
1. 在 GitHub 创建一个 OAuth App(Settings → Developer settings → OAuth Apps), Authorization callback URL 填任意合法 URL(如 https://github.com)
2. 把 Client ID 填入插件配置(两个 profile 的 cordis.patch.yml):
- insert:
- id: github
name: dsh-github
config:
tokenRef: GITHUB_TOKEN
approvalGate: true
timeoutMs: 30000
oauthClientId: Ov23liXXXXXXXX
oauthClientSecretRef: GITHUB_OAUTH_CLIENT_SECRET # 推荐:凭据引用或直接内联(不推荐明文):oauthClientSecret: xxxx
3. 设置 Client Secret 凭据:DSH 设置页新增 GITHUB_OAUTH_CLIENT_SECRET (或环境变量 GITHUB_OAUTH_CLIENT_SECRET)。GitHub 的 device flow 换取 token 必须携带 client secret。
4. 重启 DSH,新会话中对模型说「用 github_auth_login 登录 GitHub」,浏览器打开返回的网址、输入用户码,授权一次即可;token 自动持久化,之后长期可用。
GitHub device-flow 的 access token 长期有效、没有 refresh token 机制;若失效(表现为 401),调用 github_auth_logout 清除后重新登录即可。
3. 验证
新会话中让模型执行:
- github_get_me —— 应返回当前 GitHub 用户(等价 opencode 的 get_me)
- github_auth_status —— 认证来源与有效性
常用流程示例
一键上传项目(建仓 → 推送 → 开 PR 全流程,常规操作无审批弹窗):
github_upload_project(repo: "my-app", description: "我的应用",
files: [{path: "README.md", content: "# my-app"}, {path: "src/main.js", content: "..."}],
create_pull_request: true)
手把手流程(等价 opencode push 多文件的体验):
1. github_create_repository(name: "my-app", private: true)
2. github_create_branch(owner, repo, branch: "feature/init")
3. github_push_files(owner, repo, branch: "feature/init", message: "init", files: [...])
4. github_create_pull_request(owner, repo, title: "init", head: "feature/init", base: "main")
5. github_merge_pull_request(owner, repo, pull_number: 1, merge_method: "squash") # 🔒 需审批
工具清单
见 TOOLS.md(45 个工具分 9 类,含危险操作清单)。
审批门规则
| 操作 | 工具/参数 | 审批 |
| 删除仓库 | github_delete_repository | 🔒 |
| 删除文件 | github_delete_file | 🔒 |
| 删除分支 | github_delete_branch | 🔒 |
| force push | github_push_files + force: true | 🔒 |
| 合并 PR | github_merge_pull_request | 🔒 |
| 关闭 issue / 关闭 PR | github_update_issue / github_update_pull_request + state: closed | 🔒 |
| 其余读/写 | — | ✅ 直接放行 |
审批通过 tools/pre-execute → ctx.approval 实现(与 DSH 内置 dsh-user-approval 一致):allowed-once 才放行,拒绝/取消/无审批通道一律 fail closed。
config.approvalGate: false 可关闭审批门(不推荐)。
配置项
| 配置 | 默认 | 说明 |
| tokenRef | GITHUB_TOKEN | PAT 凭据引用名(env / credentials 键名) |
| oauthClientId | — | GitHub OAuth App Client ID(Device Flow) |
| oauthClientSecret | — | Client Secret(直接内联,不推荐) |
| oauthClientSecretRef | GITHUB_OAUTH_CLIENT_SECRET | Client Secret 凭据引用(推荐) |
| oauthScope | repo,read:org,user | Device Flow 申请的 scope |
| approvalGate | true | 危险操作审批门开关 |
| timeoutMs | 30000 | GitHub 请求超时 |
开发与测试 powershell
node tests/run-all.mjs # 需要本机安装 DSH Desktop(loader 引用其 dsh-tools)
测试覆盖:
- validate-tools.mjs — 45 个工具经 DSH 真实 dsh-tools 的 schema 编译/校验、render 健壮性
- validate-apply.mjs — apply() 生命周期 + 审批门行为(危险→ask、常规→放行)
- approval-gate.mjs — 危险操作分类单测
- redaction.mjs — 验收:token 不出现在日志/错误/工具输出
- push-upload.mjs — 内存版 GitHub API 上的多文件推送与一键上传流程(建仓→推送→开 PR)
架构
index.js 插件入口:apply() 注册审批门 + systemPrompt 引导 + 45 个工具 lib/client.js GitHub REST 客户端(fetch、错误映射、token 脱敏) lib/auth.js PAT/credentials 解析 + OAuth Device Flow 状态机 lib/approval.js 危险操作分类 + tools/pre-execute 审批门 lib/push.js 共享推送实现(blob→tree→commit→ref) lib/format.js 输出渲染 / presentCall 辅助 lib/tools/*.js 分域工具定义(auth/repos/issues/pulls/commits/search/releases/orgs/workflow)
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ChenYiming-aaa/dsh-github
让模型直接建仓推代码、提 PR 管 issue
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目