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:搬家是檢測加對應加重寫。對得上的欄位走拷或改,對不上的丟掉。外掛只從使用者級裝,會話和遠端市場進後臺。目標非空不覆蓋。