migrate-to-codex skill (openai/skills)

From Public Agent Wiki

What it does. Migrate supported instruction files, skills, agents, and MCP config into Codex project and global files. Part of openai/skills (Skills Catalog for Codex) (openai/skills).

Upstream openai/skills
Skill file skills/.curated/migrate-to-codex/SKILL.md
License Apache-2.0 (skill folder LICENSE.txt)
Author OpenAI
Fetched 2026-09-10

Install

  • Codex: $skill-installer installs from this catalog ($migrate-to-codex invokes it); other agents: npx skills add openai/skills --skill migrate-to-codex.
  • Raw file: curl -sL https://raw.githubusercontent.com/openai/skills/HEAD/skills/.curated/migrate-to-codex/SKILL.md

SKILL.md (verbatim)

name: migrate-to-codex
description: Migrate supported instruction files, skills, agents, and MCP config into Codex project and global files.

Migrate to Codex

Autonomy

Keep going until the selected migration is completely done: run the migrator, inspect the report, fix migrated Codex instructions/skills/agents/MCP config, and re-run checks without stopping to ask for confirmation of the next step. If the user has selected a target, do not ask before creating, editing, replacing, or deleting generated Codex artifacts in that target (AGENTS.md, .codex/, .agents/, or ~/.codex/). Preserve unrelated existing Codex config entries in .codex/config.toml or ~/.codex/config.toml, such as notify, projects, marketplaces, or unrelated MCP servers; do not ask about them unless they fail validation or directly conflict with the migration. Do not edit source Claude Code files (.claude/, ~/.claude/, .mcp.json, or .claude.json), unrelated project code, secrets, or another repository.

Migration Order

Run the migration in this order for each selected global or project source:

  1. Start by using Codex's built-in TODO/task list tool. Do not create MIGRATION_TODOS.md or any TODO file unless the user explicitly asks. The TODO list input has a plan array whose items each have step and status; use statuses pending, in_progress, and completed. Make the TODOs specific to the selected artifacts. Before finishing, update the TODO list so every finished step is marked completed and no step remains in_progress. Use literal source → Codex target labels, for example:

    • Inspect .claude/commands → Codex skills/prompts
    • Inspect .claude/agents.codex/agents
    • Inspect .mcp.json.codex/config.toml MCP servers
    • Inspect .claude/settings.json hooks → .codex/hooks.json
    • Migrate safe selected artifacts → Codex files
    • Validate generated .codex/config.toml
    • Validate generated .codex/agents
    • Report migrated artifacts and manual-review items
  2. Read references/differences.md (and refresh Codex docs if its Docs last checked date is old).

  3. Scan and inspect before writing:

    • --scan-only lists active and inactive source surfaces.
    • --plan prints staged Codex artifact paths and report rows.
    • --doctor summarizes readiness, manual-review work, and validation risks.
  4. Convert surfaces in the same order the CLI uses:

    • instructions: CLAUDE.md / AGENTS.md to AGENTS.md
    • plugins: report Claude plugin trees and marketplaces as manual migration work
    • hooks: rewrite supported Claude hooks into .codex/hooks.json and enable [features].codex_hooks = true
    • skills and commands: write Codex skills under .agents/skills/
    • config: write .codex/config.toml from Claude model/sandbox settings and MCP servers, including personality = "friendly" when config is generated
    • subagents: write Codex custom agents under .codex/agents/
  5. Dry-run, then write the selected target. Use --replace only when orphan generated skills or agents should be deleted.

  6. Inspect the terminal output and .codex/migrate-to-codex-report.txt after real runs.

  7. Review generated artifacts in this order: AGENTS.md, .agents/skills/, .codex/config.toml, .codex/hooks.json, .codex/agents/, then report-only plugin items.

  8. Run --validate-target against each target after edits.

  9. Re-run checks and --dry-run after edits.

  10. Return the final migration report as one markdown table per scope that has rows. The tables cover only the non-native follow-up migration work you performed, such as skills created from slash commands, subagents, MCP servers, hooks, unsupported/local plugin notes, and manual-review caveats. Include programmatic native import rows for config, instructions, skills, or supported plugins only if you personally migrated them in this follow-up run.

    If only one scope has rows, render only the table with no heading. If multiple scopes have rows, render one heading before each table. Use **User Config** for user-scope rows. For project-scope rows, use the actual project folder name as the heading, for example **northstar-support-portal**; do not use Current Project as the heading. Do not add prose before or after the table output.

    Use exactly these columns:

    northstar-support-portal

    Status Item Notes
    Added Slash command pr-review Converted into a Codex skill
    Added Subagent release-lead Added as a Codex subagent
    Check before using Hook PreToolUse Converted, but some Claude hook behavior differs in Codex
    Not Added Hook Notification Codex does not have an equivalent notification hook
    Not Added Plugin team-macros Plugin needs manual setup

    Status must be Added, Check before using, or Not Added. Use Added when a Codex-facing artifact was created or changed and needs no special review. Use Check before using when a Codex-facing artifact was created or changed but the migration changed semantics, inferred behavior, preserved tool rules as guidance, or dropped unsupported behavior. Use Not Added when a source artifact was detected but no Codex-facing artifact was created. Item combines the artifact type and concrete item name in one cell. Artifact type must be singular: Skill, Slash command, Subagent, MCP, Hook, or Plugin. Wrap the artifact type in inline code; write the item name as plain text after it. Notes is always required; never leave it empty. Keep notes short, plain, and literal. Avoid internal implementation terms such as runtime expansion. Prefer phrases like Converted into a Codex skill, Added as a Codex subagent, Added to Codex config, Converted into a Codex hook, Converted, but some Claude hook behavior differs in Codex, Codex does not have an equivalent notification hook, Plugin needs manual setup, or Plugin marketplace needs manual setup.

Self-Healing Loop

Keep looping until the selected migration is complete:

  1. Run --plan or --doctor.
  2. Run the migration with --dry-run.
  3. Run the migration for real.
  4. Fix every generated ## MANUAL MIGRATION REQUIRED block and every manual_fix_required or skipped report row that can be resolved inside Codex artifacts.
  5. Run --validate-target.
  6. Re-run the migrator and validator until the report and validator have no actionable generated-artifact fixes left.

Do not edit source Claude Code files, unrelated project code, secrets, or another repository during this loop. If a report row requires source-provider changes or product judgment, leave the generated Codex artifact with clear manual guidance instead of changing the source.

Commands

Choose the migrator command.

MIGRATE_TO_CODEX='python3 .codex/skills/migrate-to-codex/scripts/migrate-to-codex.py'

Inspect the migration before writing.

$MIGRATE_TO_CODEX --source ~/.claude/ --scan-only
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --plan
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --doctor

Dry-run, then run without --dry-run, for global and project.

$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --dry-run
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/
$MIGRATE_TO_CODEX --source ./.claude/ --target ./.codex/ --dry-run
$MIGRATE_TO_CODEX --source ./.claude/ --target ./.codex/

Run the post-migration validator against each target after edits.

$MIGRATE_TO_CODEX --validate-target ~/.codex/
$MIGRATE_TO_CODEX --validate-target ./.codex/

Run $MIGRATE_TO_CODEX --help for flags (--scan-only, --plan, --doctor, --validate-target, defaults, and so on). Deep tables and more links are in references/differences.md.

Other files in this skill

references/differences.md (verbatim)

Migration Differences

Summary

This reference covers Claude Code to Codex migration only. It lists migration differences, partial mappings, and unsupported Claude Code behavior. Direct 1:1 mappings are intentionally omitted. When the converter preserves Claude-only semantics as prompt guidance, it also emits a manual_fix_required report row and writes a ## MANUAL MIGRATION REQUIRED block into the generated file.

Docs last checked: 2026-04-20. If today's date is later, re-open the official Codex docs below and the Claude Code docs map before trusting these mappings.

Instructions

Source Codex Migration behavior Caveat
.claude/CLAUDE.md, CLAUDE.md, or claude.md AGENTS.md symlink Linked automatically when content looks provider-neutral This keeps one shared instruction body instead of duplicating docs.
Root AGENTS.md Root AGENTS.md Reported as active The converter does not overwrite or symlink the target file to itself.
Instruction content with /hooks, .claude/agents/, settings paths, subagent language, or permission-mode assumptions Generated AGENTS.md copy Manual rewrite pass The converter intentionally breaks the symlink when obvious Claude-only semantics need a Codex-specific edit.

Commands

Source Codex Migration behavior Caveat
.claude/commands/*.md .agents/skills/source-command-<name>/SKILL.md Converted to one-file Codex skills Slash-command invocation, argument-hint, allowed-tools, $ARGUMENTS, shell-output interpolation, and file-reference expansion are preserved as manual-review text.
Command files with runtime expansion One-file Codex skills plus manual_fix_required rows Preserved as prompt text Argument placeholders, shell-output interpolation, automatic file expansion, model/agent routing, and executable hook behavior have different runtime behavior and must be checked manually.

Skills

Source Codex Migration behavior Caveat
.claude/skills/<name>/SKILL.md .agents/skills/<name>/SKILL.md Converted; selected support directories are copied Skill-local scripts/, references/, and assets/ are copied when they are real files under the source skill root.
.claude/skills/<name>.md .agents/skills/<name>/SKILL.md Converted as a single-file skill No sibling support directories are copied for this legacy shape.
allowed-tools No strict skill allowlist Preserved as prompt guidance in SKILL.md agents/openai.yaml can declare tool dependencies, but that is not a permission boundary.
user-invocable policy.allow_implicit_invocation Manual review only Similar intent, not equivalent semantics.
model / effort No skill-level model pin Unsupported Codex model selection is session/agent scoped in this converter.
disable-model-invocation No direct equivalent Unsupported Requires a manual rewrite if the source skill depends on this behavior.
argument-hint / context / agent / hooks / paths / shell No direct equivalent Unsupported Keep only if the behavior can be rewritten into prompt guidance or config.

MCP and config

Source Codex Migration behavior Caveat
.mcp.json or .claude.json mcpServers .codex/config.toml [mcp_servers.<name>] Converted Project .mcp.json and global .claude.json use the same source shape for this migrator. Codex supports additional MCP server fields such as cwd, enabled_tools, disabled_tools, and timeout settings, but this converter only writes fields that map clearly from Claude source config.
Claude Code model/sandbox settings or MCP config personality = "friendly" Written when the migrator generates .codex/config.toml Codex supports none, friendly, and pragmatic; Claude Code migrations default to friendly to preserve a warm assistant style.
type: sse No SSE support Unsupported Codex supports stdio and streamable HTTP in current docs.
headers.Authorization: Bearer ${VAR} bearer_token_env_var Direct auth rewrite Only the bearer-token shape is rewritten this way; ${VAR:-default} fallbacks are not preserved.
headers with ${VAR} env_http_headers Partial mapping Static headers map to http_headers; ${VAR:-default} fallbacks are not preserved.
env with ${VAR} env_vars Partial mapping Literal values stay in env; self-references become env_vars, and ${VAR:-default} fallbacks are not preserved.
oauth.callbackPort mcp_oauth_callback_port Manual review only oauth.clientId, oauth.authServerMetadataUrl, and headersHelper are unsupported.
enabledMcpjsonServers / disabledMcpjsonServers Per-server enabled Partial mapping enableAllProjectMcpServers has no direct equivalent in this converter.
allowedMcpServers / deniedMcpServers requirements.toml Manual policy mapping Not written by this converter.
.claude/settings.local.json No local-only Codex equivalent Unsupported Codex project config is tied to trusted project behavior.

Subagents

Source Codex Migration behavior Caveat
.claude/agents/*.md .codex/agents/*.toml Converted Missing name or description is inferred and reported for review.
tools / disallowedTools No source-style fine-grained agent permissions Preserved as prompt guidance in developer_instructions Use sandbox_mode, [permissions], MCP tool filters, or app tool filters manually when intent is clear.
skills No spawn-time preload equivalent Preserved as prompt guidance in developer_instructions skills.config is enable/disable config, not preload behavior.
mcpServers Codex custom-agent mcp_servers or shared Codex MCP config Manual review only Codex custom-agent files can include MCP config, but this converter does not automatically map Claude subagent mcpServers. Use shared Codex MCP config or manually add agent-local mcp_servers when the source intent is clear.
permissionMode sandbox_mode Partial mapping Only acceptEdits and readOnly are mapped; default, dontAsk, bypassPermissions, and plan are preserved as manual-review prompt guidance.
model + effort model + model_reasoning_effort Partial mapping by model family Sonnet-family effort is biased one tier higher for coding-agent behavior; source max maps to Codex xhigh.
hooks / memory / background / isolation / maxTurns No direct equivalent Unsupported Foreground/background and resume behavior do not map cleanly to Codex custom-agent files.
initialPrompt No direct equivalent Unsupported Only applies when the agent runs as the main Claude session agent.
Auto-delegation by description Automatic or explicit Codex sub-agent spawning Behavior change Not a 1:1 match; verify generated agent descriptions manually.
Independent agent permissions Parent sandbox inheritance + runtime overrides Behavior change Codex custom-agent files set defaults, not hard isolation from the parent turn.

Plugin Marketplaces

Source Codex Migration behavior Caveat
.claude/plugins/ Codex plugins / skills / MCP servers / apps Reported as manual_fix_required only Codex plugins can bundle skills, MCP servers, and apps, but the migrator does not copy plugin trees. Migrate the plugin, bundled skills, commands, agents, hooks, and MCP config by hand.
.claude/plugin-marketplaces.json Codex plugin install or local plugin path Reported as manual_fix_required only Marketplace entries can point to local or remote plugin sources; the migrator does not fetch or install them. Codex marketplace metadata lives under .agents/plugins/marketplace.json or ~/.agents/plugins/marketplace.json.
.claude-plugin/marketplace.json Codex plugin install or local plugin path Reported as manual_fix_required only Treat it as marketplace source material. Do not copy it into Codex as a legacy marketplace; adapt it to the Codex plugin marketplace layout if you keep it local.
metadata.pluginRoot No direct equivalent Unsupported Shorthand plugin sources that depend on metadata.pluginRoot need manual layout.
Marketplace or plugin.json custom skills / agents paths Codex plugin manifest and bundled skill paths Manual review only Codex plugins can declare bundled skills, MCP servers, and apps. Custom Claude plugin paths still need manual layout review; no automated scan.
Plugin commands/ .agents/skills/<name>/SKILL.md Manual Treat like any other command migration if you copy files by hand.
strict, hooks, mcpServers, lspServers, outputStyles No direct equivalent Unsupported No automatic plugin config import.

Hooks

Source Codex Migration behavior Caveat
hooks in ~/.claude/settings.json, .claude/settings.json, or .claude/settings.local.json .codex/hooks.json + [features].codex_hooks = true Partial conversion Review behavior before relying on migrated hooks; Claude and Codex hook runtimes are not 1:1.
Notification notify Manual rewrite only notify is a turn-complete notification command, not a general lifecycle hook or approval-prompt hook.
PreToolUse PreToolUse in .codex/hooks.json Partial conversion Codex currently runs PreToolUse for shell commands only and blocks only permissionDecision: "deny", legacy decision: "block", or exit code 2.
PostToolUse PostToolUse in .codex/hooks.json Partial conversion Codex currently runs PostToolUse for shell commands only; decision: "block" becomes model feedback, and continue: false stops execution. Formatting or fixups that Claude tied to Edit/Write should move to a Stop hook, because only Bash is matched for PostToolUse.
UserPromptSubmit UserPromptSubmit in .codex/hooks.json Partial conversion Codex can inject context or block a prompt, but it ignores matcher for this event and does not support source if filters.
SessionStart SessionStart in .codex/hooks.json Partial conversion Codex matches startup and resume; Claude may also expose other session flows.
Stop Stop in .codex/hooks.json Partial conversion Codex ignores matcher for Stop, can request a continuation prompt, and does not expose every source subagent/teammate stop lifecycle.
PermissionRequest / SubagentStart / SubagentStop / TaskCreated / TaskCompleted / StopFailure / PreCompact / PostCompact / SessionEnd No direct equivalent Unsupported Keep as manual follow-up items; Codex does not expose matching lifecycle coverage today.
type: "command" type: "command" Partial conversion command, timeout / timeoutSec, and statusMessage map. Empty commands are skipped by Codex.
type: "prompt" / type: "agent" / type: "http" / async: true No direct equivalent Unsupported Codex parses prompt / agent but skips them, and async hooks are skipped. HTTP hooks need a wrapper command.
Hook matcher + if filters Regex matcher only Partial conversion Codex keeps regex matcher for PreToolUse, PostToolUse, and SessionStart only. Source if filters do not map.
Hooks in skills, agents, and plugins No direct equivalent Unsupported Codex discovers hooks from config layers, not from skill or subagent manifests.

Planning and validation

Command Behavior Caveat
--plan Prints staged migration output and generated artifact paths without writing files Still depends on the selected source, target, and component flags.
--doctor Prints readiness, risk counts, and manual-review items without writing files Static guidance only; it does not prove the migrated setup works.
--validate-target Validates an already migrated Codex target Checks TOML parseability, skill frontmatter, custom-agent TOML fields, AGENTS.md size, and MCP command availability.

Minimal examples

Source skill metadata becomes prompt guidance:

allowed-tools:
  - Read
  - Bash
## MANUAL MIGRATION REQUIRED

Claude `allowed-tools` was preserved as prompt guidance, not a Codex permission boundary.

You're allowed to use these tools:

- Read
- Bash

Source subagent metadata becomes TOML plus prompt guidance:

skills:
  - release-notes
tools:
  - Read
disallowedTools:
  - Bash
sandbox_mode = "workspace-write"
developer_instructions = """
## Skills
- $release-notes

## Tools
You're allowed to use these tools:
- Read

Don't use these tools:
- Bash
"""

Sources

Back to openai/skills (Skills Catalog for Codex) or Agent skills.