🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Codex 协作桥 AmrMohamad/dsh-codex

DeepSeek Harness
AmrMohamad11 天前有提交已提供中文文档扫描:高危

在 Harness 内调用 Codex 审查代码、挑战设计并接管任务

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add AmrMohamad/dsh-codex
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · dev
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/21) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接发起外部网络请求
查看扫描证据(共 58 处,展示前 44 条)
  • 发起网络请求
    dsh-codex/lib/operations.js:179
    outcome = await approval.request({
  • 执行外部命令来自配置/变量
    dsh-codex/lib/process.js:143
    const child = spawn(input.nodeCommand, [COMPANION_SCRIPT, ...input.argv], {
  • 执行外部命令来自配置/变量
    dsh-codex/lib/resolve.js:74
    const result = spawnSync(command, ["--version"], {
  • 执行外部命令来自配置/变量
    dsh-codex/lib/resolve.js:99
    const result = spawnSync(command, ["--version"], {
  • 执行外部命令来自配置/变量
    probes/probe-appserver.mjs:62
    this.proc = spawn(CODEX_BIN, ["app-server", ...this.args], {
  • 执行外部命令运行时拼接
    probes/probe-appserver.mjs:250
    codexVersion: execSync(`${CODEX_BIN} --version 2>&1 | tail -1`, { encoding: "utf8" }).trim(),
  • 发起网络请求
    probes/probe-appserver.mjs:271
    report.handshake.response = await client.request("initialize", PLUGIN_INITIALIZE);
  • 发起网络请求
    probes/probe-appserver.mjs:277
    const threadStart = await client.request("thread/start", report.pluginRequests.threadStart);
  • 发起网络请求
    probes/probe-appserver.mjs:285
    response: await client.request("thread/name/set", report.pluginRequests.threadNameSet)
  • 发起网络请求
    probes/probe-appserver.mjs:294
    const persistentStart = await client.request("thread/start", persistentStartParams);
  • 发起网络请求
    probes/probe-appserver.mjs:305
    response: await client.request("thread/name/set", { threadId: persistentThreadId, name: persistentName })
  • 发起网络请求
    probes/probe-appserver.mjs:319
    const turnStart = await client.request("turn/start", report.pluginRequests.turnStart);
  • 执行外部命令来自配置/变量
    probes/probe-import.mjs:36
    this.proc = spawn(CODEX_BIN, ["app-server"], { cwd: this.cwd, env: probeEnv(), stdio: ["pipe", "pipe", "pipe"] });
  • 发起网络请求
    probes/probe-import.mjs:155
    report.initialize = await client.request("initialize", {
  • 发起网络请求
    probes/probe-import.mjs:177
    entry.response = await client.request("externalAgentConfig/import", params);
  • 执行外部命令来自配置/变量
    probes/probe-output-schema.mjs:34
    this.proc = spawn(CODEX_BIN, ["app-server"], { cwd: this.cwd, env: probeEnv(), stdio: ["pipe", "pipe", "pipe"] });
  • 发起网络请求
    probes/probe-output-schema.mjs:135
    report.initialize = await client.request("initialize", {
  • 发起网络请求
    probes/probe-output-schema.mjs:149
    report.threadStart = await client.request("thread/start", {
  • 发起网络请求
    probes/probe-output-schema.mjs:171
    const turnStart = await client.request("turn/start", report.turn.request);
  • 执行外部命令来自配置/变量
    probes/probe-review.mjs:41
    const result = spawnSync(cmd, args, { cwd, encoding: "utf8" });
  • 执行外部命令来自配置/变量
    probes/probe-review.mjs:109
    this.proc = spawn(CODEX_BIN, ["app-server"], {
  • 执行外部命令来自配置/变量
    probes/probe-review.mjs:234
    codexVersion: spawnSync(CODEX_BIN, ["--version"], { encoding: "utf8" }).stdout.trim(),
  • 发起网络请求
    probes/probe-review.mjs:264
    report.initialize.response = await client.request("initialize", report.initialize.request);
  • 发起网络请求
    probes/probe-review.mjs:293
    report.validationWithoutModel[label] = { params, response: await client.request("review/start", params) };
  • 发起网络请求
    probes/probe-review.mjs:308
    report.threadStart = { request: threadStartParams, response: await client.request("thread/start", threadStartParams) };
  • 发起网络请求
    probes/probe-review.mjs:319
    report.review.response = await client.request("review/start", reviewParams);
  • 执行外部命令来自配置/变量
    probes/probe-threadlist.mjs:48
    this.proc = spawn(CODEX_BIN, ["app-server"], {
  • 发起网络请求
    probes/probe-threadlist.mjs:193
    report.initialize.response = await client.request("initialize", report.initialize.request);
  • 发起网络请求
    probes/probe-threadlist.mjs:213
    const response = await client.request("thread/start", request);
  • 发起网络请求
    probes/probe-threadlist.mjs:217
    nameSet = await client.request("thread/name/set", { threadId, name });
  • 发起网络请求
    probes/probe-threadlist.mjs:271
    const response = await client.request("thread/list", params);
  • 发起网络请求
    probes/probe-threadlist.mjs:299
    report.persistTurn.response = await client.request("turn/start", report.persistTurn.request);
  • 发起网络请求
    probes/probe-threadlist.mjs:347
    const response = await client.request("thread/list", params);
  • 执行外部命令来自配置/变量
    probes/probe-threadlist.mjs:473
    return spawnSync(CODEX_BIN, ["--version"], { encoding: "utf8" }).stdout.trim();
  • 执行外部命令来自配置/变量
    probes/probe-unix-listen.mjs:242
    const proc = spawn(CODEX_BIN, ["app-server", ...args], {
  • 执行外部命令来自配置/变量
    probes/probe-unix-listen.mjs:281
    codexVersion: spawnSync(CODEX_BIN, ["--version"], { encoding: "utf8" }).stdout.trim(),
  • 发起网络请求
    probes/probe-unix-listen.mjs:304
    clientA.request("initialize", INITIALIZE),
  • 发起网络请求
    probes/probe-unix-listen.mjs:305
    clientB.request("initialize", {
  • 发起网络请求
    probes/probe-unix-listen.mjs:313
    clientA.request("thread/start", THREAD_START_PARAMS),
  • 发起网络请求
    probes/probe-unix-listen.mjs:314
    clientB.request("thread/start", THREAD_START_PARAMS)
  • 执行外部命令来自配置/变量
    probes/probe-unix-listen.mjs:332
    const proxy = spawn(CODEX_BIN, ["app-server", "proxy", "--sock", socketPath], {
  • 发起网络请求
    probes/probe-unix-listen.mjs:378
    report.bareUnixListen.initialize = await client.request("initialize", INITIALIZE);
  • 发起网络请求
    probes/probe-unix-listen.mjs:380
    const started = await client.request("thread/start", THREAD_START_PARAMS);
  • 执行外部命令来自配置/变量
    probes/probe-unix-listen.mjs:394
    const daemonVersion = spawnSync(CODEX_BIN, ["app-server", "daemon", "version"], {
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

OpenAI Codex 原生接入 DeepSeek Harness:代码审查、对抗式设计评审、任务委派、后台任务。67 项测试,写入需审批。

README

由 DeepSeek 最新模型翻译生成
让 Codex 审代码——就在你天天用的 Harness 里。 dsh-codex 把真正的 OpenAI Codex CLI 装进 DeepSeek Harness。 原生工具、真正的后台任务、硬性安全护栏。不用 shell 包装,不用复制粘贴演戏。 为什么做这个 OpenAI 给 Claude Code 做过一个很棒的 Codex 插件。思路是对的:让第二个独立的编程智能体来审你的代码、挑战你的设计,或者替你接下一个任务。 但「别的 harness」不是你的工作场所。 dsh-codex 就是那个思路,为 DeepSeek Harness 重做了一遍。 不是把 Markdown 命令草草移植过来——经过验证的 app-server 运行时被内置并打了补丁,然后围绕 DSH 的原生工具注册表、后台任务模型、审批服务、提示词组装和技能目录重新架构。 与 OpenAI、DeepSeek 均无隶属关系。 这是独立开源项目,只是把你已经信任的两个工具粘在一起。Codex 属于 OpenAI;DeepSeek Harness 属于 DeepSeek。 为什么大家给它点星 - 原生集成,不是外挂。 六个真工具、七个斜杠命令、一个提示词段落、两个内嵌技能——Harness 知道怎么渲染、审批、取消、恢复的,全都在。 - 还是你信任的那个 Codex。
展开完整文档(README 剩余 1 节)
让 Codex 审代码——就在你天天用的 Harness 里。

dsh-codex 把真正的 OpenAI Codex CLI 装进 DeepSeek Harness。
原生工具、真正的后台任务、硬性安全护栏。不用 shell 包装,不用复制粘贴演戏。

为什么做这个

OpenAI 给 Claude Code 做过一个很棒的 Codex 插件。思路是对的:让第二个独立的编程智能体来审你的代码、挑战你的设计,或者替你接下一个任务。

但「别的 harness」不是你的工作场所。

dsh-codex 就是那个思路,为 DeepSeek Harness 重做了一遍。 不是把 Markdown 命令草草移植过来——经过验证的 app-server 运行时被内置并打了补丁,然后围绕 DSH 的原生工具注册表、后台任务模型、审批服务、提示词组装和技能目录重新架构。

与 OpenAI、DeepSeek 均无隶属关系。 这是独立开源项目,只是把你已经信任的两个工具粘在一起。Codex 属于 OpenAI;DeepSeek Harness 属于 DeepSeek。

为什么大家给它点星

- 原生集成,不是外挂。 六个真工具、七个斜杠命令、一个提示词段落、两个内嵌技能——Harness 知道怎么渲染、审批、取消、恢复的,全都在。
- 还是你信任的那个 Codex。 用你本地的 codex 二进制、你的 ~/.codex 认证和 config.toml、你的模型和推理强度默认值、你的 MCP 服务器、你的沙箱策略。不用新账号,不用第二套运行时。
- 后台任务做得对。 每次 Codex 运行都是一等公民的 DSH 任务:流式输出、job_kill、完成唤醒、带 Codex thread id 的持久记录。
- 默认只读。 审查从不改代码。委派的任务保持只读,除非你要求写入——而且模型发起的写入要先过 Harness 审批。
- 扛得住现实。 过期的 broker、崩溃的 app-server、被取消的轮次、重复命令、软链接的凭据、token 刷新的怪毛病:发现、复现、修复、回归测试。
- Codex 亲自审过。 三轮独立评审,外加一次委派审计,在这个插件里找出 10 个 P1 / 26 个 P2 问题。全部已修复。96 个封闭测试守住这些修复。整个过程公开可查。
- 给出智能体能直接动手的答案。 每个委派任务都返回同一份交接报告:状态、带 file:line 的证据、改动或精确 diff、验证了什么、未决问题、下一步。对抗性发现附带严重程度、置信度、失败场景、修复方案和测试。提示词设计。
- 向邻居学习。 针对同类桥接(包括上游 Codex 插件)报过的 bug,逐条对照本仓库代码核查;适用的都已修复并补上回归测试。研究笔记。

60 秒速览

$ /codex-review --background
Codex review (working tree) is running as background job codex-4db8…

$ job_output codex-4db8…
Codex Review
- [P1] Restore addition in the exported add function — math.js:2
add(2, 3) now returns -1 instead of 5. Restore a + b.
[status: completed]

$ codex_rescue --write "fix the off-by-one in paginate()"
× Codex write access was not granted (rejected); the run was not started.

$ codex_rescue resume_last "apply the smallest safe fix"
… continues the same Codex thread, with its original context …

更想用大白话提需求?你的 Harness 智能体早就懂了:

“让 Codex 在后台拿我当前的改动跟 main 对比评审。”

“上线前让 Codex 挑一挑这套缓存设计的毛病。”

“把那个时好时坏的集成测试交给 Codex,只读,跑完回报。”

你能得到什么

| 入口 | 名称 | 做什么 |
| 工具 | codex_review | Codex 的原生评审器,跑在你的工作区或某个基线分支上。只读。 |
| 工具 | codex_adversarial_review | 可引导的挑刺评审:设计、取舍、失败模式、隐藏假设。 |
| 工具 | codex_rescue | 把排查/修复/实现委派给一个持久的 Codex 线程。 |
| 工具 | codex_status / codex_result | 实时与持久化的任务记录,含 Codex 线程 id。 |
| 工具 | codex_setup | Node/Codex/鉴权/app-server 就绪检查,带缓存,快。 |
| 命令 | /codex-review、/codex-adversarial-review、/codex-rescue、/codex-status、/codex-result、/codex-cancel、/codex-setup | 同样的操作,供人直接敲命令。 |
| 技能 | codex-delegation | 什么时候该委派,提示词怎么写 Codex 才执行得好。 |
| 技能 | codex-result-handling | 如实汇报;绝不自动套用评审发现。 |
| 后台 | 原生 DSH 任务 | 流式输出、job_output、job_kill、完成即唤醒、结果持久化。 |

工作原理

DSH Host 插件(零裸导入) ├─ index.js 注册工具 · 命令 · 提示词段落 · 技能 ├─ lib/operations.js review · adversarial · rescue · status · result · cancel · setup ├─ lib/jobs.js 一次 Codex 运行 = 一个原生 DSH 任务 ├─ lib/runtime.js 运行器:缓存 node/codex 解析结果 → 启动 companion └─ lib/… tools · commands · resolve · process · argv · job-store · diagnose └─ runtime/ 内置 codex-companion(Apache-2.0,已打补丁) ├─ codex-companion.mjs 命令行接口 + 持久化任务记录 ├─ app-server-broker.mjs 每个工作区共享一个 codex app-server └─ lib/*.mjs JSON-RPC 客户端 · review 目标 · 提示词 · 状态

一次工具调用会启动一个 DSH 后台任务 → 任务启动 companion → companion 拥有或加入每个工作区的 codex app-server broker → 输出流入任务的环形缓冲区 → 任务以状态、持久化结果和 Codex 线程 id 收尾。取消会杀掉子进程并中断 broker 中的该轮次,即使轮次 id 尚未持久化也一样。

安全不是脚注

- 写入必须获得授权。 模型发起的 write: true 走 ctx.approval.request (会话策略生效,失败即拒绝)。斜杠命令的 --write 是明确的人工同意。
writeApproval: deny | ask | allow 控制默认行为。
- 默认只读。 review 不能编辑。委派任务没有 write 就不能编辑。
- Codex 协议请求会得到真实答复。 审批、引导、用户输入和动态工具请求会收到符合 schema 的拒绝,而不是 -32601 方法不存在。认证 token 刷新和证明请求会得到明确的、非编造的错误。
- review 上下文不会泄露凭据。 未跟踪的符号链接只做描述,绝不跟随。
- 取消是确定性的。 broker 跟踪轮次,中断孤儿会话,并为每次 turn/interrupt 设定上限。
- 插件不继承 shell 沙箱。 它直接启动 Codex,并明确说明这一点;Codex 按你的 config.toml 中自己的沙箱/审批策略运行。
- 没有隐藏写入。 review 输出先呈现,然后智能体必须询问要修复哪些发现。

经过验证,不是凭感觉

| 声明 | 证据 |
| 对 Codex 0.163 可用 | 实机运行:认证、原生 review、对抗性 review、委派任务、恢复、后台 + 取消。 |
| 原生 DSH 集成 | 工具、命令、技能、提示词段落和任务在实机配置档中可见;插件行显示 applied,无警告。 |
| 已加固 | 5 轮 review 共修复 10 个 P1 / 26 个 P2 发现 — docs/REVIEW.md,独立审查者。 |
| 已测试 | npm test → 96/96(伪造的 Harness 上下文/任务/运行器,外加针对伪造 codex app-server 的端到端运行;不调用 Codex)。 |
| 可移植 | Node 和 Codex 自动发现(含 Electron Host),并提供文档化的覆盖方式。 |

安装

环境要求: DeepSeek Harness 桌面版 0.2.1-rc.2+,已安装并登录 codex 命令行(codex login)。Node 由 Harness 运行时提供,无需 npm install。

git clone https://github.com/AmrMohamad/dsh-codex.git

然后用 DeepSeek Harness 的插件管理器安装 bundle:

plugin_manager action: install_bundle
target: /absolute/path/to/dsh-codex/dsh-codex

也可以在 Harness 界面操作:Settings → Plugins → Install bundle,指向同一个目录。bundle 以链接方式安装(@local/dsh-codex),即时生效,首次安装无需重启桌面端。

首次运行:

codex_setup

它会报告 Node、Codex、认证、app-server 的就绪状态,以及下一步该做什么。然后试一次审查:

codex_review # working tree
codex_review { "base": "main" } # branch review
/codex-review --background # human slash command

配置

可选设置写在配置档补丁的插件行上(也可以通过环境变量):

- id: codex
name: '@local/dsh-codex'
config:
codexPath: /opt/homebrew/bin/codex # default: auto-detect PATH + common locations
nodePath: /path/to/node # default: Harness runtime / bundled node / PATH
dataDir: ~/.dsh/codex-plugin-data # default: $DSH_HOME/codex-plugin-data
writeApproval: ask # ask (default) | allow | deny

对应的环境变量:CODEX_PLUGIN_CODEX_PATH、CODEX_PLUGIN_NODE、CODEX_PLUGIN_DATA_DIR。优先级:插件配置 → 文档中列出的环境变量 → 自动探测。~ 会被展开。模型与 effort 的默认值来自你的 Codex config.toml;工具可以在单次运行时覆盖。

常见问题

这会使用单独的 Codex 账号或运行时吗?

不会。用的还是本地同一个命令行、同一份 ~/.codex 认证、同一个 config.toml、同一台机器和同一个工作树,和你自己运行 codex 完全一样。

Harness 智能体会自动修复审查发现的问题吗?

不会。提示词段落和 codex-result-handling 技能要求它先列出发现的问题,征得同意后才能改动任何东西。审查在协议层面是只读的。

为什么我的写入运行被拒绝了?

模型发起的写入需要 Harness 批准。如果你的会话批准策略是 never,这道关卡会直接拒绝。可以预先授权 writeApproval: allow(请谨慎),或者由人运行 /codex-rescue --write。命令里的 --write 视为明确同意。

支持 Windows 吗?

macOS 已端到端验证。Windows 相关的路径处理(tree-kill、管道)已实现并有单元测试,但还没在真实 Windows 主机上跑过。非常欢迎带上 Windows 日志的 PR。

和在终端里直接运行 codex 有什么区别?
终端里的 Codex 不知道你的 Harness 会话。dsh-codex 把 Codex 的工作变成原生工具和任务:智能体可以发起评审、继续干活、在完成时被唤醒、读取持久结果、恢复同一个 Codex 线程,并安全取消。

路线图

- [ ] 用 Codex 原生的 app-server --listen unix:// 替换 broker
- [ ] 可选的逐审批桥接进 DSH(单条 Codex 升级请求)
- [ ] Codex 任务/线程的 Web UI 面板
- [ ] 把 DSH 会话转入 Codex 线程
- [ ] Windows 端到端验证与 CI 矩阵
- [ ] 在 codex_setup 中暴露更多模型/服务商

贡献

欢迎提 issue 和 PR——尤其是 Windows 日志、适配器想法,以及提示词契约的改进。改动尽量小,补一个回归测试,然后运行:

cd dsh-codex && npm test

开发流程和评审预期见 CONTRIBUTING.md,模块地图与不变量见 AGENTS.md(写给人和编码智能体看)。

许可证与署名

Apache-2.0。内置运行时派生自 openai/codex-plugin-cc(Apache-2.0);见 LICENSE、NOTICE 和 dsh-codex/runtime/NOTICE。

这是独立的社区项目,未获 OpenAI 或 DeepSeek 背书,与二者无关联,也不由二者维护。「OpenAI」「Codex」「DeepSeek Harness」仅用于说明兼容性。

如果 dsh-codex 帮你省下一轮评审,点个 ⭐ 能让下一位 Harness 用户找到它。

github.com/AmrMohamad/dsh-codex
预览分享卡片长什么样 ↓AmrMohamad/dsh-codex
分享 · DeepSeek Harness Hub
AmrMohamad/dsh-codex

在 Harness 内调用 Codex 审查代码、挑战设计并接管任务

回到顶部