OpenAI Codex · 插件市场

搬家只搬对得上的字段

换到 Codex 的第一周,最怕去年攒的 hook、MCP 和插件还在不在。检测会列出一份清单。导入只收下能映射的那一部分。

课程目标读完能说清三件事。搬家源只有 Claude Code 和 Cursor。每条字段走原样搬走、改写、丢掉三条出口之一。插件只从用户级装,远程市场和会话要等后台。
先玩一遍 · 逐字段看搬走还是丢掉
一份家当过白名单:原样、改写、搬不了
memory
会话
点卡片可移出家当。切源、开关或会话年龄会重跑。Cursor 不支持 memory,仓库里的插件会被丢掉。
检测 映射 重写 导入
原样 0 改写 0 搬不了 0 后台 0
源字段
Codex 落点
逻辑轨迹 · 动画每一步对应源码里的哪一段
  1. 按字符串选择 Cla 或 Cur,对不上就落到 Claude Codemigration_source.rs L59
  2. 先扫用户级配置,仓库范围不跑插件检测detect/mod.rs L330
  3. 会话按 30 天和 50 条过滤,太旧的丢掉sessions/common.rs L43
  4. memory 要源支持,还要单独打开特性开关detect/mod.rs L59
  5. hook 只留同步 command,prompt 整条跳过hooks_cla.rs L135
  6. MCP 命令里出现 ${,整台 server 不要mcp.rs L208
  7. 市场来源只收 git 家族和本地目录,npm 丢掉source_cla.rs L270
  8. 说明文件改名,产品名按词边界改写成 Codexrewrite.rs L39
  9. 同步 import 对 Sessions 直接返回成功service.rs L437
  10. 后台再写 thread,远程插件后装;开关关则拒绝 memoryprocessor.rs L184
点播放,看每条字段走原样搬走、改写,还是丢掉。
三条出口对得上的字段走拷或改。prompt hook、npm 市场、带占位符的 MCP,不会出现在成功清单里。
插件只从 home 装仓库里的启用名单不能当安装权威。远程市场推进待装队列,不在同步阶段装完。
同步先回执会话可以出现在检测清单里。同步 import 什么都不写,thread 留给后台。
教学示意:家当为课程化样例,hook 与 MCP 只用无害命令。逻辑轨迹右侧行号对应 openai/codex 仓库 commit 4f39251a01。
思路一 · 三条出口:原样、改写、丢掉
它解决什么问题

有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt。少掉的 MCP 命令里写了 ${API_KEY}

再换一个同事。他用的是 Cursor。Codex 能看见他的 skill 和 hook,看不见他的 memory。仓库里的 Cursor 插件配置会被直接丢掉。

思路是什么

搬家 crate 只负责把外部配置读进来。插件怎么跑,在旁边的 core-plugins。源在类型上只有两个变体:Cla 是 Claude Code,Cur 是 Cursor。字符串对不上 cursor,就落到 Claude Code。调用方漏传源,检测会去翻 ~/.claude

出处:codex-rs/external-agent-migration/src/migration_source.rs 第 51 至 67 行

一次检测最多产出十种条目。每种后面的导入必须给一个去处。字段先过白名单。Codex 认 11 个 hook 事件,Claude Code 发出 27 个。名字对不上的组,整组消失。单条 hook 的 type 默认当 command,对不上就跳过。MCP 的 command 或 url 里出现 ${,整台不要。市场来源只收 github、git、本地目录。fileurlnpmsettings 直接丢掉。

出处:codex-rs/external-agent-migration/src/model.rs 第 53 至 64 行 · codex-rs/hooks/src/lib.rs 第 23 至 35 行 · restored-src/src/entrypoints/sdk/coreSchemas.ts 第 355 至 383 行 · codex-rs/external-agent-migration/src/hooks_cla.rs 第 131 至 137 行 · codex-rs/external-agent-migration/src/mcp.rs 第 204 至 210 行 · codex-rs/external-agent-migration/src/source_cla.rs 第 270 至 274 行

然后说明文件要改名。CLAUDE.md 变成 AGENTS.md。产品名按词边界改成 Codex。Cursor 只用大小写敏感的 Cursor,避免把普通英文 cursor 一起改掉。

出处:codex-rs/external-agent-migration/src/rewrite.rs 第 38 至 49 行

源字段 hook / MCP / 市场 白名单 名字、类型、来源 原样搬走 同步 command hook 改写 CLAUDE.md 改名,MCP 改成 TOML 丢掉 prompt hook、npm 市场、${} MCP 输入是一条竞品字段。发生的是白名单判定。输出是拷、改、丢之一。
教学化结构图:搬家不是整目录拷贝,每条字段单独走出口。
为什么长期成立

导入器的通用形状是白名单加三条出口。对不上的字段丢掉,不要改写成近似物。prompt hook 不会被塞进 command。带占位符的 MCP 不会被瞎展开。换个语言重写,这份表还用得上。

思路二 · 插件只从用户级装,慢活进后台
它解决什么问题

Claude Code 允许仓库 settings 带着启用插件名单,同事克隆之后自动有同一批插件。对 Codex 来说,仓库里的启用名单不能当安装权威。装上去会进用户配置。不可信仓库想在你机器上装可执行内容,这条路要先切断。

思路是什么

检测只在 home 扫插件。注释写死了:仓库控制的 settings 不能当安装权威。Cursor 只要看见仓库根,插件检测直接返回空。导入看见非空工作目录,报 repository-scoped plugin migration is not allowed

出处:codex-rs/external-agent-migration/src/detect/mod.rs 第 330 至 332 行 · codex-rs/external-agent-migration/src/migration_source.rs 第 116 至 125 行 · codex-rs/external-agent-migration/src/plugins.rs 第 26 至 36 行

本地插件当场装。远程市场推进待装队列。会话也是两截:检测清单里可以有,同步 import()Sessions 直接返回成功,什么都不写。真正写成 Codex thread 的,是 app-server 里的后台任务。调用方先拿到 import_id

出处:codex-rs/external-agent-migration/src/service.rs 第 437 行 · codex-rs/app-server/src/external_agent_migration/session_importer.rs 第 100 至 111 行

Codex 认市场清单时,按固定相对路径找第一个存在的文件。四条路径里两条是自己的,两条是竞品的。同一套查找同时服务「用户主动加市场」和「从竞品搬市场」。

出处:codex-rs/core-plugins/src/marketplace.rs 第 20 至 25 行

检测 home 加仓库 同步导入 配置、hook、本地插件 import_id 先回一张收据 后台写 thread Sessions 同步是空操作 后台装远程插件 git clone 可能要几十秒 输入是检测清单。发生的是能立刻落盘的先做完。输出是收据加后台任务。
教学化时序图:同步阶段承认「看见了」,慢活留给后台。
为什么长期成立

可执行内容的安装权威必须落在用户级。面向任意 git clone 的产品,home-only 更稳。同步先回执、慢活进后台,是长任务接口的通用形状。

思路三 · 目标非空不覆盖
它解决什么问题

换产品最怕把已经改过的新配置盖掉。目标 hooks.json 里已经有内容,整文件替换会把用户手写的 hook 冲掉。

思路是什么

目标 hook 文件非空,整项取消。已有 config.toml 只补缺失键。MCP 同名 server 保留旧的。第一次搬家像填空。第二次再点迁移,多数条目会因为已经有了而不出现。

出处:codex-rs/external-agent-migration/src/hooks_common.rs 第 13 至 19 行

memory 另有一道门。特性开关默认关,阶段是 UnderDevelopment。检测函数不看这个开关,导入前处理器会查。关着就回 external agent memory import is disabled。导入按字节拷贝,不脱敏。

出处:codex-rs/features/src/lib.rs 第 998 至 1003 行 · codex-rs/app-server/src/external_agent_migration/processor.rs 第 180 至 185 行

对得上的字段走拷或改,对不上的丢掉。
为什么长期成立

导入是填空。用户已经写过的文件,搬家碰不得。memory 默认关,是因为另一家 agent 的项目记忆会按明文进盘。

横向对比 · 同一批扩展,要不要读进来

DeepSeek Harness:不搬家,再装一次

DSH 的插件入口是 thin pnpm forwarder。初始化 profile,在 profile 目录里跑 pnpm,再按安装结果调和清单。插件是 npm 包。没有检测 Claude Code,没有导入 Cursor hook。换产品要自己重装。代价是用户税。好处是不用对一家不断加字段的 settings schema 做永久兼容。

已核对 apps/cli/src/plugin.ts 第 120 至 133 行 · 2026-08-22

Grok:自建市场,不搬竞品

Grok 从市场根加相对路径拷进自己的安装登记,并写下 provenance。相对路径禁止 ..、绝对路径和盘符。没有 plugin.json 但根上有 SKILL.md 时,它会补一份合成清单。市场对象是一份自己的目录加来源记录。它不读用户在另一家里启用过的插件。

已核对 crates/codegen/xai-grok-plugin-marketplace/src/installer.rs 第 36 至 45 行 · 2026-08-22 · Grok · 插件市场的发现与信任
课堂练习
01

哪些字段会进清单

桌上有四条 Claude Code 资产:PreToolUsetype: command hook、同事件的 type: prompt hook、一台 command 含 ${API_KEY} 的 MCP、一条 40 天前的会话。对照上面的白名单,列出检测清单里应出现和不应出现的条目。

再补一问:调用方何时收到 import_id,这条会话何时变成 thread。开关关着的 memory 若被送去导入,会在哪一扇门被挡回来。

Takeaway:搬家是检测加映射加重写。对得上的字段走拷或改,对不上的丢掉。插件只从用户级装,会话和远程市场进后台。目标非空不覆盖。