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

Codex 双向桥接 Walvez/dsh-codex-sync

DeepSeek Harnessv1.6.2
Walvez28 天前有提交已提供中文文档扫描:含敏感能力code

OpenAI Codex 与 DSH 之间的终极双向桥:聊天双向同步、技能实时挂载、MCP 自动镜像。

44.4/100
综合分
26
GitHub 星标
376
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-codex-sync
npm 源 · dsh-codex-sync 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-codex-sync @ 1.6.2
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 04:32:27

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 69 处,展示前 62 条)
  • 读取本地文件
    lib/index.js:138
    entries = readdirSync(join(home, 'skills'))
  • 读取本地文件
    lib/index.js:147
    if (readdirSync(join(home, 'skills', e)).includes('SKILL.md')) return true
  • 读取本地文件
    lib/index.js:159
    return [...parseCodexMcpServers(readFileSync(join(home, 'config.toml'), 'utf8')).keys()]
  • 读取本地文件
    lib/index.js:626
    instructions: { path: existsSync(join(codexHome, 'instructions.md')) ? join(codexHome, 'instructions.md') : join(codexHome, 'AGENTS.md'), file: true }
  • 读取本地文件
    lib/index.js:642
    if (!existsSync(target.path)) {
  • 读取本地文件
    bin/dsh-codex-sync.js:32
    return JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version ?? '0.0.0'
  • 读取本地文件
    bin/dsh-codex-sync.js:106
    content = readFileSync(CODEX_CONFIG, 'utf8')
  • 写入本地文件
    bin/dsh-codex-sync.js:117
    writeFileSync(CODEX_CONFIG, content)
  • 读取本地文件
    bin/dsh-codex-sync.js:123
    if (existsSync(cliPath)) {
  • 执行外部命令固定命令
    bin/dsh-codex-sync.js:128
    execFileSync('git', ['clone', '--depth', '1', REVERSE_REPO, dir], { stdio: 'inherit' })
  • 执行外部命令固定命令
    bin/dsh-codex-sync.js:134
    execFileSync('pnpm', ['install'], { cwd: dir, stdio: 'inherit' })
  • 执行外部命令固定命令
    bin/dsh-codex-sync.js:136
    execFileSync('pnpm', ['build'], { cwd: dir, stdio: 'inherit' })
  • 读取本地文件
    bin/dsh-codex-sync.js:137
    if (!existsSync(cliPath)) {
  • 读取本地文件
    bin/dsh-codex-sync.js:157
    content = readFileSync(CODEX_CONFIG, 'utf8')
  • 写入本地文件
    bin/dsh-codex-sync.js:167
    writeFileSync(CODEX_CONFIG, content.slice(0, start) + content.slice(end + MARKER_END.length))
  • 读取本地文件
    bin/dsh-codex-sync.js:172
    if (existsSync(dir)) {
  • 删除本地文件递归
    bin/dsh-codex-sync.js:173
    rmSync(dir, { recursive: true, force: true })
  • 请求外部主机mcp.cloudflare.com
    bin/dsh-codex-sync.js:182
    const res = await fetch('https://mcp.cloudflare.com/mcp', {
  • 发起网络请求
    bin/dsh-codex-sync.js:182
    const res = await fetch('https://mcp.cloudflare.com/mcp', {
  • 读取本地文件
    lib/bridge.js:49
    const content = readFileSync(join(codexHome, file), 'utf8')
  • 读取本地文件
    lib/bridge.js:62
    content = readFileSync(join(codexHome, 'config.toml'), 'utf8')
  • 读取本地文件
    lib/bridge.js:96
    return readdirSync(join(codexHome, 'skills')).filter((e) => !e.startsWith('.')).length
  • 读取本地文件
    lib/skill-provider.js:37
    entries = readdirSync(join(codexHome, 'skills'))
  • 读取本地文件
    lib/skill-provider.js:52
    readFileSync(file, 'utf8')
  • 读取本地文件
    lib/skill-provider.js:57
    readFileSync(file, 'utf8')
  • 读取本地文件
    lib/skill-provider.js:76
    content = readFileSync(file, 'utf8')
  • 读取本地文件
    lib/skill-provider.js:103
    content = readFileSync(candidate.locator.file, 'utf8')
  • 读取本地文件
    lib/skill-provider.js:127
    entries = readdirSync(PLUGIN_SKILLS_DIR)
  • 读取本地文件
    lib/import-service.js:223
    size = statSync(file).size
  • 读取本地文件
    lib/import-service.js:391
    size = statSync(file).size
  • 读取本地文件
    lib/export-codex.js:264
    if (existsSync(db)) {
  • 执行外部命令固定命令
    lib/export-codex.js:266
    const out = execFileSync('sqlite3', [db, "SELECT DISTINCT cwd FROM threads WHERE cwd IS NOT NULL AND cwd != '';"], { stdio: ['ignore', 'pipe', 'ignore
  • 读取本地文件
    lib/export-codex.js:274
    if (existsSync(sessionsDir)) {
  • 读取本地文件
    lib/export-codex.js:297
    if (!existsSync(root)) continue
  • 读取本地文件
    lib/export-codex.js:364
    if (existsSync(db)) {
  • 执行外部命令固定命令
    lib/export-codex.js:387
    execFileSync('sqlite3', [db, sql], { stdio: 'pipe' })
  • 写入本地文件
    lib/export-codex.js:394
    appendFileSync(join(codexHome, 'session_index.jsonl'), `${JSON.stringify({
  • 写入本地文件
    lib/export-codex.js:624
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/export-codex.js:625
    writeFileSync(path, body)
  • 执行外部命令固定命令
    lib/session-repair.mjs:70
    const raw = execFileSync('zstd', ['-dc', file], { maxBuffer: 1 << 28 }).toString('utf8')
  • 读取本地文件
    lib/session-repair.mjs:301
    if (!existsSync(root)) return out
  • 读取本地文件
    lib/session-repair.mjs:302
    for (const ws of readdirSync(root)) {
  • 读取本地文件
    lib/session-repair.mjs:304
    let st; try { st = statSync(wp) } catch { continue }
  • 读取本地文件
    lib/session-repair.mjs:306
    for (const d of readdirSync(wp)) {
  • 读取本地文件
    lib/session-repair.mjs:308
    let dst; try { dst = statSync(dp) } catch { continue }
  • 读取本地文件
    lib/session-repair.mjs:314
    const versioned = readdirSync(dp).filter((n) => /^session\.v\d+\.jsonl\.zstd$/.test(n)).sort()
  • 写入本地文件
    lib/session-repair.mjs:417
    copyFileSync(file, `${file}.bak`)
  • 写入本地文件
    lib/session-repair.mjs:422
    writeFileSync(targetFile, bytes)
  • 删除本地文件
    lib/session-repair.mjs:423
    if (targetFile !== file) rmSync(file)
  • 写入本地文件
    lib/session-repair.mjs:468
    copyFileSync(f, `${f}.bak`)
  • 写入本地文件
    lib/session-repair.mjs:469
    writeFileSync(f, encodeLog(headerLine, repaired))
  • 读取本地文件
    lib/mcp.js:300
    text = readFileSync(configPath, 'utf8')
  • 读取本地文件
    lib/state.js:24
    return JSON.parse(readFileSync(statePath(), 'utf8'))
  • 写入本地文件
    lib/state.js:35
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/state.js:36
    writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`)
  • 读取本地文件
    lib/codex-reader.mjs:45
    entries = readdirSync(dir, { withFileTypes: true })
  • 读取本地文件
    lib/codex-reader.mjs:155
    for (const rawLine of readFileSync(file, 'utf8').split('\n')) {
  • 执行外部命令固定命令
    lib/zstd-frame.mjs:11
    return execFileSync('zstd', ['--quiet', '--compress', '--stdout', '--check'], {
  • 写入本地文件
    lib/dsh-writer.mjs:93
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    lib/dsh-writer.mjs:94
    writeFileSync(path, Buffer.concat([
  • 读取本地文件
    lib/dsh-writer.mjs:106
    projectDirs = readdirSync(root, { withFileTypes: true })
  • 读取本地文件
    lib/dsh-writer.mjs:113
    if (existsSync(sessionDir)) return sessionDir
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:mcp.cloudflare.com

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-session-format-catalog@deepseek-ai/dsh-session-format-v0-to-v1@deepseek-ai/dsh-session-format-v1-to-v2@deepseek-ai/dsh-session-format-v2-to-v3@deepseek-ai/dsh-session-format-v3-to-v4@deepseek-ai/dsh-mcp-client
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

4 张 · 点击查看大图

功能亮点

  • 聊天双向同步
  • 技能实时挂载
  • MCP自动镜像
v1.6.12026-08-26
· Highlights · Settings modal hint: a subtle bottom-left note in the Codex Sync settings modal now points users to /repair-sessions --fix when imported chats fail with token-meter / replay errors (bilingual, styled with existing design tokens). · Docs: both READMEs gained a new Actions table row and a Troubleshooting section covering symptoms, root cause, and the one-command fix. · 🇨🇳 中文说明 (Chinese Translation) · 主要变化 · 设置面板提醒:Codex 同步设置弹窗左下角新增一条弱化的小提醒——导入的对话若出现 token meter / 重放类报错,可用 /repair-sessions --fix 一键修复(双语文案,沿用现有设计令牌)。 · 文档:中英 README 均新增「操作」表格行与排障章节,覆盖症状、根因与一键修复命令。
v1.6.02026-08-26
· 主要变化 · 导入即可安全重放:转换器现在会在每条 assistant 消息和工具事件前后成对写入 step/start…step/end 标记,导入的会话切换模型后不会再因 token meter 冷重放失败(no matching step/start event)。 · 新增:repair-sessions —— 扫描会话存储中的重放损伤(缺 step 配对、失效的 chunk 引用、改写头加旧游标尾造成的 seq 缺口),原地修复日志,写入前先用 DSH 真实的 token meter 校验。可用命令行(dsh-codex-sync repair-sessions [--fix])和斜杠命令(/repair-sessions [--fix])。每个修复过的日志旁都保留 .bak 备份。 · npm test 现在自动定位 dsh 检出目录,以解析 @deepseek-ai/*(共 40 个测试)。 · 🇨🇳 中文说明(中文翻译) · 主要变化 · 导入即合规:转换器现在为每条 assistant 消息和工具事件补齐配对的 step/start…step/end 标记,导入的会话切换模型后不会再触发 token meter 冷重放报错(no matching step/start event)。 · 新功能:repair-sessions —— 扫描会话存储中的三类重放损伤(缺 step 配对、失效的 chunk 引用、改写头加旧游标尾造成的 seq 缺口)并原地修复;写入前用 DSH 真实的 token meter 校验,每个修复过的日志旁保留 .bak 备份。命令行(dsh-codex-sync repair-sessions [--fix])和斜杠命令(/repair-sessions [--fix])均可使用。 · npm test 现在自动探测 dsh 安装目录,以解析 @deepseek-ai/*(共 40 个测试)。
v1.3.62026-08-26
· 🐛 v1.3.6 修复的问题 · 会话恢复与模型切换兼容性:修复从 Codex 导入的会话缺少 agentPreset 头字段的问题。此前 DSH 恢复会话时会自动挂上默认智能体配置档(opencodex),导致核心工具(如 tool-cordis)重复注册,抛出 duplicate action 运行时错误。 · 自动给导入的会话头打上 agentPreset 标识,恢复会话、切换模型都不再报错。 --- · 🇨🇳 中文说明 · 会话恢复模型兼容修复:修复从 Codex 导入的会话在 DSH 中恢复时,因会话头缺少 agentPreset 字段,DSH 自动补挂默认配置档,导致 tool-cordis 等工具重复注册、抛出 duplicate action 异常的问题。 · 自动给新导入的会话打上 agentPreset 标识,会话恢复、模型切换流畅无报错。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
⚡ dsh-codex-sync Codex 与 DSH 双向桥接:挂载 ~/.codex/skills、带工作区绑定的会话导入、mcp_servers 实时镜像,以及 Codex 端反向 MCP 安装器。 项目会话双向流转 · 技能实时挂载 · MCP 自动镜像 · 原生现代化交互 English • Awesome DSH Plugin 🎛️ 侧边栏原生同步设置 📍 顶部工作区快捷入口 📥 从 Codex 导入项目对话 📤 导出 DSH 对话到 Codex 🤔 为什么要用这个插件? 在使用 OpenAI Codex 时,你可能已经积累了: 1. 大量项目的对话历史(包含完整的代码上下文、架构讨论与调试记录); 2. 丰富的自定义 Skills 库(~/.codex/skills 下各种专有工具与指令); 3. 精心配置的 MCP 服务工具链(数据库、搜索、浏览器自动化等)。
展开完整文档(README 剩余 1 节)
⚡ dsh-codex-sync

Codex 与 DSH 双向桥接:挂载 ~/.codex/skills、带工作区绑定的会话导入、mcp_servers 实时镜像,以及 Codex 端反向 MCP 安装器。 项目会话双向流转 · 技能实时挂载 · MCP 自动镜像 · 原生现代化交互

English •

Awesome DSH Plugin

🎛️ 侧边栏原生同步设置

📍 顶部工作区快捷入口

📥 从 Codex 导入项目对话

📤 导出 DSH 对话到 Codex

🤔 为什么要用这个插件?

在使用 OpenAI Codex 时,你可能已经积累了:
1. 大量项目的对话历史(包含完整的代码上下文、架构讨论与调试记录);
2. 丰富的自定义 Skills 库(~/.codex/skills 下各种专有工具与指令);
3. 精心配置的 MCP 服务工具链(数据库、搜索、浏览器自动化等)。

当你想在 DeepSeek Harness (DSH) 中体验强大的开源模型生态或开展双 Agent 协作时,通常会遇到:
- 历史无法迁移:两边会话格式互不相通,想在 DSH 中接续之前的 Codex 对话极其繁琐;
- 配置割裂与漂移:Skills 和 MCP 必须在两边重复配置维护,改了一边另一边就失效;
- 单向死胡同:市面上的迁移脚本往往只是一次性的、粗暴的单向文件拷贝,在 DSH 续聊后无法安全带回 Codex。

dsh-codex-sync 正是为解决这些痛点而生! 它不是一次性迁移脚本,而是让 Codex 与 DSH 持续互联互通、双向无缝流转 的现代化扩展。

✨ 核心方便之处

1. 💬 项目会话双向安全互导(Codex ⇄ DSH)

- 从 Codex 导入:
- 按项目(Workspace)树状聚合所有历史对话;
- 完整保留用户消息、助手回复、思维链推理(Reasoning)与工具调用轨迹;
- 导入后自动关联对应工作区,在 DSH 中直接断点续聊;
- 支持增量更新:Codex 续聊过的旧对话会标记「有更新」,再次勾选仅增量追加新 Turn,不重复创建会话。
- 导出到 Codex:
- 在 DSH 续聊的内容或新建的原生会话,可一键导出回 Codex;
- 自动校验 Codex 已有项目库,智能锁定未知目录,杜绝孤儿会话;
- 导出生成独立的全新 Codex 会话副本(history_mode: legacy),绝不破坏或覆盖原 Codex 历史;
- 导出完成后重启 Codex 即可在对应项目下查看并继续工作。
- 子代理智能收纳:
- 默认过滤子代理线程,保持列表干净清爽;
- 点击「过滤子代理」可随时展开并嵌套在主会话下方,按需单独导出,不污染父会话。

2. ⚡ Skills 实时一等公民挂载

- 直接将 ~/.codex/skills//SKILL.md 注册为 DSH 原生一等公民技能;
- 支持完整的子目录资源引用与多文件架构;
- 改完即用:在本地修改 SKILL.md,DSH 下次调用即时生效,无需重启 DSH 服务。

3. 🔌 MCP 自动双向镜像

- Codex → DSH:后台自动监听 ~/.codex/config.toml,将 [mcp_servers.] 动态镜像到 DSH,支持热重载,并内置常用服务的静音与冲突排除策略;
- DSH → Codex(反向桥):一行命令配置 [mcp_servers.dsh-plugins],让 Codex Agent 也具备搜索、检查与安装 DSH 插件的能力。

4. 🎨 极度优雅的原生现代化 UI

- 专属入口:自适应融入工作区标题栏(展开时位于工作区标题旁,收起窄栏时整齐排列在搜索图标下方);
- 居中模态卡片:点击呼出高对比度毛玻璃控制面板,快捷操作、状态卡片、功能开关一目了然;
- 原生设计语言:采用 iOS 风格平滑切换滑块与纯 CSS 过渡,自适应 DSH 深浅色主题,零样式残留与无横向溢出。

📦 快速开始

1. 安装到 DSH

通过 DSH 插件市场一键安装(推荐):
dsh plugin --profile web add dsh-codex-sync

或在 profile 的 cordis.patch.yml 中配置:
- insert:
- id: codex-sync
name: dsh-codex-sync
config:
maxSkills: 30
mcpMirrorDeny:
- node_repl
mcpMirrorSilent:
- exa

2. 配置 Codex 反向 MCP 桥(可选)

自动在 ~/.codex/config.toml 挂载 [mcp_servers.dsh-plugins]
npx dsh-codex-sync codex-install

检查双向同步健康状态 dsh-codex-sync doctor

🎛️ 同步控制面板与开关

点击侧边栏工作区的 Codex 图标 即可打开居中设置面板:

| 分组 | 项目 | 对应命令 / 配置键 | 行为说明 |
| 操作 | 从 Codex 导入 | /import-all | 打开项目选择对话框,按项目勾选导入历史对话 |
| | 导出到 Codex | /export-codex | 将 DSH 会话写出为全新 Codex 对话副本 |
| | 会话修复¹ | /repair-sessions [--fix] | 扫描会话存储中的重放损伤并原地修复(见下方排障章节) |
| | 查看镜像状态 | /mcp-status | 弹窗查看每个 MCP 服务器的挂载状态与诊断信息 |
| | 刷新状态 | /codex-settings | 实时重新拉取宿主机所有开关的真实值 |
| 功能开关 | 导入命令 | enableImport | 启用 /import-codex 等 slash 命令族 |
| | 自动导入 | autoImport | 启动首个会话时自动增量导入 Codex 历史 |
| | 指令注入 | enableInstructions | 注入 instructions.md / AGENTS.md 进系统提示词 |
| | 配置摘要 | enableConfig | 注入 config.toml 模型配置摘要进系统提示词 |
| | 技能注册 | enableSkills | 将 ~/.codex/skills 挂载为 DSH 原生技能 |
| | MCP 镜像 | mcpMirror | 自动监听并镜像 [mcp_servers.](开关立即生效) |
| 语言 | 语言切换 | Language | 切换界面简体中文 / English(本地记住) |

¹ 设置面板左下角有一个小提醒,把「导入对话报错」与该命令关联起来。

🩺 排障:导入对话的 token meter / 重放报错

现象 —— 切换模型或压缩某个(导入的)对话时失败:

command.execute failed: internal: token meter: assistant/message at seq N has no matching step/start event
corrupt session log: seq gap in committed region at line L

原因 —— 换模型时 DSH 的 token meter 会对整个事件日志做冷重放校验(旧模型的 usage 锚点失效)。v1.6.0 之前写入的日志缺少配对的 step/start…step/end 标记,混合日志还可能带有失效的 seq 引用——这些损伤只在冷重放时才会暴露。

修复 —— 在任意 DSH 对话中执行(或终端运行 dsh-codex-sync repair-sessions --fix):

/repair-sessions --fix

修复过程会合并接缝、补齐缺失的 step 标记、重映射引用、重编号 seq,并在写入前用真实的 @deepseek-ai/dsh-token-meter 校验,每个修复过的日志旁保留 .bak 备份。v1.6.0+ 的导入天然合规,理论上不会再触发此问题。

🤖 智能体辅助技能 (codex-sync)

本插件随包提供了一个内建的 codex-sync Skill。你可以直接在对话中让 AI Agent 操作同步:

- “帮我预演一下导入 Codex 会话”* → 自动执行 /import-codex --dry-run;
- “查看当前的 MCP 镜像状态” → 自动执行 /mcp-status;
- “开启自动导入功能” → 自动执行 /auto-import on。

📄 开源许可

MIT License © 2026 Walvez
预览分享卡片长什么样 ↓Walvez/dsh-codex-sync
分享 · DeepSeek Harness Hub
Walvez/dsh-codex-sync

OpenAI Codex 与 DSH 之间的终极双向桥:聊天双向同步、技能实时挂载、MCP 自动镜像。

回到顶部