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:搬家是檢測加映射加重寫。對得上的字段走拷或改,對不上的丟掉。插件只從用戶級裝,會話和遠程市場進後台。目標非空不覆蓋。