instructions | CLAUDE.md plus plugin-level guidance surfaces | rules/ plus AGENTS.md support | AGENTS.md, AGENTS.override.md, and config fallback instruction files | AGENTS.md, CLAUDE.md fallback, and config-driven instruction files | Keep one instruction source of truth and compile it into the host-native guidance surface rather than duplicating prose by hand. Also keep host-specific caveats explicit, like Cursor rules not affecting Tab. |
skills | skills/<skill>/SKILL.md with the richest documented frontmatter | skills/<skill>/SKILL.md with a narrower documented frontmatter set and compatibility dirs | skills/<skill>/SKILL.md, optionally bundled through plugins or discovered through .agents/skills | skills/<skill>/SKILL.md plus compatibility dirs inside host config space | Skills stay the semantic center. Preserve shared metadata and strip or downgrade host-only frontmatter during migration and build. |
commands | native commands/ markdown command files, with increasing convergence toward skills | native command and slash-command surfaces | no documented plugin-packaged command directory today | native command system through markdown or config definitions | Treat commands as first-class where the host exposes them. For Codex, degrade commands into skills and instruction routing instead of pretending parity exists. |
agents | plugin agents/ with rich frontmatter and isolation settings | plugin agents plus Cursor subagents | custom agents in .codex/agents/*.toml and subagent workflows | primary agents and subagents with model and permission config | Treat agents as specialist execution surfaces. Compile one specialist concept into each host’s native agent or subagent format, even when the storage location differs. |
hooks | hooks/hooks.json, inline plugin hooks, settings hooks, and skill or agent frontmatter hooks | hooks/hooks.json plus project and user hook locations | hooks/hooks.json in the plugin bundle gated by [features].plugin_hooks = true, with .codex/hooks.json and ~/.codex/hooks.json still documented for broader project/user hook config where [features].hooks is the general flag and codex_hooks is deprecated | JS or TS plugin event handlers | Normalize hook intent and compile per host. Do not assume event names or return contracts are portable 1:1. |
permissions | tool scoping and approval controls live in Claude-specific agent, hook, and runtime surfaces | hook allow or deny decisions, CLI permission config, and subagent tool access | approvals, sandbox policy, hook matchers, and custom-agent config | first-class permission config plus per-agent overrides | Keep allow / ask / deny as the canonical authoring model. When one host lacks a per-skill field, move the policy to its native agent, hook, or runtime control plane. |
runtime | .mcp.json or inline MCP config, plus plugin support files | mcp.json, host mcp.json config, plugin support files, and richer auth surfaces | .mcp.json in plugins plus active MCP state in config.toml, with optional .app.json | config-driven MCP plus JS or TS plugin runtime | Runtime owns MCP, auth, readiness/env wiring, helper code, local runtimes, and passthrough dirs. Compile into bundle-local files when possible and external host config when required. |
distribution | .claude-plugin/plugin.json, marketplaces, install scopes, user configuration, reload surface, and adjacent plugin assets | .cursor-plugin/plugin.json, marketplace metadata, publish surface, local install path, reload-window flow | .codex-plugin/plugin.json, marketplace catalogs, cache install path, interface metadata, restart-after-update flow | npm or local JS plugin distribution plus config-based loading rather than one shared manifest | Distribution owns userConfig, brand, legal links, icons, screenshots, install metadata, and publish metadata. Emit rich manifest fields where supported and install shims where they are not. |