搬家只搬對得上的字段
換到 Codex 的第一週,最怕去年攢的 hook、MCP 和插件還在不在。檢測會列出一份清單。導入只收下能映射的那一部分。
- 按字串選擇 Cla 或 Cur,對不上就落到 Claude Codemigration_source.rs L59
- 先掃用戶級配置,倉庫範圍不跑插件檢測detect/mod.rs L330
- 會話按 30 天和 50 條過濾,太舊的丟掉sessions/common.rs L43
- memory 要源支持,還要單獨打開特性開關detect/mod.rs L59
- hook 只留同步 command,prompt 整條跳過hooks_cla.rs L135
- MCP 命令裏出現 ${,整台 server 不要mcp.rs L208
- 市場來源只收 git 家族和本地目錄,npm 丟掉source_cla.rs L270
- 説明檔案改名,產品名按詞邊界改寫成 Codexrewrite.rs L39
- 同步 import 對 Sessions 直接返回成功service.rs L437
- 後台再寫 thread,遠程插件後裝;開關關則拒絕 memoryprocessor.rs L184
有人告訴你會自動從 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、本地目錄。file、url、npm、settings 直接丟掉。
出處: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 行
導入器的通用形狀是白名單加三條出口。對不上的字段丟掉,不要改寫成近似物。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 行
可執行內容的安裝權威必須落在用戶級。面向任意 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 · 插件市場的發現與信任
哪些字段會進清單
桌上有四條 Claude Code 資產:PreToolUse 的 type: command hook、同事件的 type: prompt hook、一台 command 含 ${API_KEY} 的 MCP、一條 40 天前的會話。對照上面的白名單,列出檢測清單裏應出現和不應出現的條目。
再補一問:調用方何時收到 import_id,這條會話何時變成 thread。開關關着的 memory 若被送去導入,會在哪一扇門被擋回來。