让 GitHub Issue 成为 DSH 的任务入口,让 PR 成为代码交付入口。
32.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yintaocheng/dsh-github-harness该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-github-harness(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 21:03:20
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 40 处,展示前 30 条)
- 读取本地文件src/desktop-tool.mjs:28
const config = args.config || (existsSync(join(cwd, 'harness.local.json')) ? 'harness.local.json' : 'harness.config.json'); - 读取本地文件src/state.mjs:5
export function load(path) { return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : null; } - 读取本地文件src/state.mjs:5
export function load(path) { return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : null; } - 写入本地文件src/state.mjs:18
mkdirSync(dirname(path), { recursive: true }); - 写入本地文件src/state.mjs:20
writeFileSync(temp, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 }); - 写入本地文件src/state.mjs:24
mkdirSync(root, { recursive: true }); - 删除本地文件src/state.mjs:31
return { child(pid) { value.childPid = pid ?? null; save(path, value); }, release() { unlinkSync(path); } }; - 删除本地文件src/state.mjs:40
unlinkSync(path); - 读取本地文件src/runner.mjs:38
try { parsed = JSON.parse(readFileSync(resolve(cwd, configPath), 'utf8')); } - 读取密钥环境变量src/runner.mjs:51
const token = getToken ? await getToken({ expectedLogin: config.agent.expectedLogin, signal }) : process.env.GH_TOKEN || process.env.GITHUB_TOKEN; - 写入本地文件src/runner.mjs:58
mkdirSync(root, { recursive: true }); - 读取本地文件src/runner.mjs:76
const result = await github.request(`${github.root}/issues${action === 'comment' ? `/${issue}/comments` : ''}`, { method: 'POST', body: { ...(action = - 发起网络请求src/runner.mjs:76
const result = await github.request(`${github.root}/issues${action === 'comment' ? `/${issue}/comments` : ''}`, { method: 'POST', body: { ...(action = - 读取密钥环境变量src/github.mjs:4
constructor(config, { token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN, fetchImpl = fetch, signal } = {}) { - 请求外部主机api.github.comsrc/github.mjs:13
response = await this.fetch(`https://api.github.com${path}`, { - 发起网络请求src/github.mjs:13
response = await this.fetch(`https://api.github.com${path}`, { - 发起网络请求src/github.mjs:27
const data = await this.request(`${path}${path.includes('?') ? '&' : '?'}per_page=100&page=${page}`); - 发起网络请求src/github.mjs:36
const user = await this.request('/user'); - 发起网络请求src/github.mjs:71
try { repository = await this.request(this.root, { method: 'GET' }); } - 发起网络请求src/github.mjs:86
const data = await this.request(path, { method: 'GET' }); - 发起网络请求src/github.mjs:96
const branch = await this.request(report.base.path, { method: 'GET' }); - 写入本地文件src/dsh.mjs:35
writeFileSync(patch, '- insert:\n - id: github-harness-session-link\n name: ' + JSON.stringify(plugin) + '\n config: ' + JSON.stringify(l - 写入本地文件src/dsh.mjs:37
writeFileSync(input, prompt, { mode: 0o600 }); - 读取本地文件src/identity.mjs:106
for (const name of existsSync(root) ? readdirSync(root) : []) { - 读取本地文件src/identity.mjs:106
for (const name of existsSync(root) ? readdirSync(root) : []) { - 执行外部命令固定命令src/process.mjs:9
const killer = spawn('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true }); - 执行外部命令来自配置/变量src/process.mjs:18
const child = spawn(exe, args, { cwd, env, stdio, windowsHide: true, windowsVerbatimArguments, detached: grouped }); - 写入本地文件src/process.mjs:57
mkdirSync(logDir, { recursive: true }); - 读取本地文件src/process.mjs:65
return { code, stdout: readFileSync(out, 'utf8'), stderr: readFileSync(err, 'utf8'), out: discardLogs ? undefined : out, err: discardLogs ? undefined - 删除本地文件src/process.mjs:68
if (discardLogs) for (const path of created) { try { unlinkSync(path); } catch (error) { if (error.code !== 'ENOENT') throw error; } }
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.github.com
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/dsh-sandbox@deepseek-ai/dsh-sandbox-policy@deepseek-ai/dsh-user-approval给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- Issue作为任务入口
- PR作为交付入口
DeepSeek Harness 最小单智能体 GitHub 任务循环
README
由 DeepSeek 最新模型翻译生成dsh-github-harness
让 GitHub Issue 成为 DSH 的任务入口,让 PR 成为代码交付入口。
在 Issue 中写下需求,DSH 负责修改代码;harness 运行你指定的验收命令,成功后提交 PR。把修改意见留在 Issue 或 PR,再次运行即可继续原任务,无需重新整理上下文。
Issue → DSH 实现 → 独立验收 → Pull Request ↑ │ └────── 修改意见 / CI 反馈 ──────┘
功能
- 按任务管理上下文:每个 Issue 使用自己的分支、DSH 会话和 PR。
- 持续处理反馈:读取 Issue 评论、PR 审查和 CI 结果,续跑同一任务。
- 先验证,再发布:验收失败不推送;没有代码变更时不创建空 PR。
- 支持多个项目:插件只需安装一次,调用时选择目标仓库;同一 checkout 中的任务串行执行。
- 保留人工审查:稳定版不自动批准或合并 PR。
安装
推荐 DeepSeek Harness 0.2.1-rc.2,同时支持 0.2.0-rc.2;需要 Node.js 22+ 和 Git。
展开完整文档(README 剩余 1 节)
dsh-github-harness
让 GitHub Issue 成为 DSH 的任务入口,让 PR 成为代码交付入口。
在 Issue 中写下需求,DSH 负责修改代码;harness 运行你指定的验收命令,成功后提交 PR。把修改意见留在 Issue 或 PR,再次运行即可继续原任务,无需重新整理上下文。
Issue → DSH 实现 → 独立验收 → Pull Request ↑ │ └────── 修改意见 / CI 反馈 ──────┘
功能
- 按任务管理上下文:每个 Issue 使用自己的分支、DSH 会话和 PR。
- 持续处理反馈:读取 Issue 评论、PR 审查和 CI 结果,续跑同一任务。
- 先验证,再发布:验收失败不推送;没有代码变更时不创建空 PR。
- 支持多个项目:插件只需安装一次,调用时选择目标仓库;同一 checkout 中的任务串行执行。
- 保留人工审查:稳定版不自动批准或合并 PR。
安装
推荐 DeepSeek Harness 0.2.1-rc.2,同时支持 0.2.0-rc.2;需要 Node.js 22+ 和 Git。支持版本与安全升级 →
在 DSH 的 Plugins → Add plugin 中输入已发布的 npm 固定版本:
dsh-github-harness@0.3.1
也可使用 GitHub 固定来源 github:yintaocheng/dsh-github-harness#v0.3.1。安装后启用插件,按宿主提示完成重启。工具名称为 github_harness。安装步骤 → · CLI 与分发来源 →
快速开始
1. 准备目标项目
打开一个已有基线提交的 Git 仓库,确保 HTTPS origin 指向你有写权限的 GitHub 仓库。插件源码不需要放进这个项目。
Windows 可通过 Git Credential Manager 登录:
git credential-manager github login --browser
其他凭据方式见认证配置。同时确认 DSH 的 headless 模型可用。
2. 配置验收
在目标仓库根目录新建 harness.local.json:
{
"owner": "YOUR_ACCOUNT_OR_ORG",
"repo": "YOUR_PROJECT",
"base": "main",
"agent": { "id": "solo", "expectedLogin": "YOUR_GITHUB_LOGIN" },
"dsh": { "command": ["dsh", "headless"] },
"verify": [["node", "--test"]]
}
替换仓库、登录账户和验收命令。Windows 若无法从 PATH 找到 dsh,将命令首项替换为桌面自带 dsh.cmd 的绝对路径。完整配置说明 →
将以下条目加入目标项目的忽略规则,不要提交凭据或本地运行状态:
harness.local.json
.harness/
.reference/
3. 运行一个 Issue
先在 GitHub 创建 Issue,写清需求、范围和验收条件。然后在 DSH 中说:
用 github_harness 检查 my-project 的配置,然后处理该仓库的 Issue #42。
也可以直接调用工具:
{"action":"doctor","workdir":"my-project"}
{"action":"run","issue":42,"workdir":"my-project"}
{"action":"status","issue":42,"workdir":"my-project"}
workdir 可以是绝对路径,也可以相对当前 DSH 会话工作区。PR 创建后,在 Issue 或 PR 留下反馈,再次对同一目录和 Issue 执行 run。
使用须知
- doctor 检查身份、仓库读取能力,以及实际 DSH 版本和兼容性;它不验证模型凭据或所有写权限。
- GitHub 配置必须匹配目标 checkout;不要通过复制任务缓存切换仓库或账户。
- 工具需要宿主授权的文件、进程和网络访问。仅用于可信仓库:agent、测试和 Git hooks 都可能执行本地代码。
文档与示例
- 安装、模型与凭据配置
- 命令、反馈续跑与中断恢复
- 独立演示项目
- 开发接口 · 项目与任务模型
License
MIT
本项目是 DeepSeek Harness 社区插件。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yintaocheng/dsh-github-harness
让 GitHub Issue 成为 DSH 的任务入口,让 PR 成为代码交付入口。
相关插件 · 市场 / 管理
插件精选列表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
这是你的仓库?认领条目