이사는 맞는 필드만 옮깁니다
Codex로 옮긴 첫 주, 지난해 모아 둔 hook·MCP·플러그인이 아직 있는지부터 겁이 납니다. 탐지가 목록을 뽑고, 가져오기는 매핑되는 그 조각만 받아요.
- 문자열로 Cla 또는 Cur를 고르고, 안 맞으면 Claude Code로 떨어집니다migration_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
- 설명 파일 이름을 바꾸고, 제품명은 단어 경계에서 Codex로 개서합니다rewrite.rs L39
- 동기 import는 Sessions에 바로 성공을 돌립니다service.rs L437
- 백그라운드가 thread를 나중에 쓰고 원격 플러그인을 나중에 설치하며, 스위치가 꺼져 있으면 memory를 거절합니다processor.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는 hook 이벤트 11개를 알고, 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에 사용 플러그인 목록을 실을 수 있어, 동료가 clone하면 같은 플러그인이 자동으로 생깁니다. 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가 더 안전해요. 동기는 먼저 영수증을 주고 느린 일은 백그라운드로 보내는 것이, 긴 작업 API의 흔한 모양입니다.
제품을 바꿀 때 제일 무서운 일은 이미 고친 새 설정을 덮는 것입니다. 목표 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 플러그인 입구는 얇은 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를 가져오기로 보내면 어느 문에서 막히는지.