🎯Lo que obtienes aquí
Entender exactamente qué cambia en una skill al migrarla de Claude a Codex: dónde queda, qué hay que adaptar y cómo el sidecar openai.yaml resuelve el problema de las dependencias MCP + branding.
Contenido detallado
📦 Skill en Codex — .agents/skills/ no .codex/skills/
Esto es lo primero que confunde. Quien viene de Claude piensa: «.claude/skills/ en Claude → .codex/skills/ en Codex». Incorrecto. La skill está en .agents/skills/.
Por qué .agents/ y no .codex/
.agents/ es la convención de la spec abierta Agent Skills (agentskills.io). Cualquier tool que respete la spec lee desde ahí. Codex simplemente sigue la convención, en vez de inventar su propia ruta.
Resultado: tu skill en .agents/skills/ funciona hoy en Codex y mañana en Cursor/Gemini/cualquier herramienta compatible, sin mover archivos.
Paths correctos
~/.agents/skills/<nome>/ ← global (suas skills) ./.agents/skills/<nome>/ ← projeto (skills do repo) # NÃO existe: .codex/skills/ ← Codex não enxerga .codex/agents/skills/ ← idem
⚠️Síntoma del error
"Instalé la skill, pero $minha-skill no se activa." → Primero verifica el PATH. Probablemente esté en .codex/skills/. Muévelo a .agents/skills/, actualiza Codex y vuelve a funcionar.
Conceptos clave
Path obligatorio
agentskills.io
Otras tools leen
Plugins → recargar
📝 SKILL.md — casi idéntico al de Claude
El archivo SKILL.md en sí es prácticamente lo mismo. Por eso funciona la spec: frontmatter YAML con name e description, cuerpo en Markdown. Estas son las 4 cosas que siempre coinciden.
SKILL.md en Codex
--- name: revisar-pr description: Use when the user asks to review a PR or diff. --- # Revisar PR ## Passo a passo 1. Identifica a PR 2. Lê diff completo 3. Verifica bugs/edge cases/security 4. Retorna findings categorizados
✓ Lo que SIEMPRE funciona
- • Frontmatter
name+description - • Body en markdown estándar
- • Carpetas
scripts/,references/,assets/ - • Referencias relativas (
./references/x.md) - • Encabezados, listas, bloques de código
✗ Lo que NO se puede portar
- •
allowed-toolsen el frontmatter (se ignora) - •
disable-model-invocation(ignorado) - • Backtick-bang
`!cmd`(se convierte en texto) - • Description > 8KB (truncada silenciosamente)
- •
model: opusen el frontmatter (no se respeta)
💡Los 4 pilares portables
La spec Agent Skills define exactamente 4 cosas en común: nombre del archivo (SKILL.md), los campos name y description, cuerpo markdown, convención de carpetas. Mantén tu skill en estos 4 pilares y pasará al otro runtime sin problemas.
Conceptos clave
Especificación común
Sin extensión personalizada
scripts/refs/assets
Que se convierten en sidecar
📎 El sidecar agents/openai.yaml
Aquí está el detalle que más distingue a Codex: todo lo que es específico del runtime (branding para la UI, dependencias del MCP server, flags de comportamiento) va en un archivo separado — agents/openai.yaml dentro de la carpeta de la skill.
Estructura completa con sidecar
.agents/skills/minha-skill/ ├── SKILL.md ← obrigatório (spec) ├── agents/ │ └── openai.yaml ← SIDECAR do Codex ├── scripts/ ├── references/ └── assets/
Ejemplo de openai.yaml
# Branding pra UI do Codex branding: display_name: "Revisar PR" icon: "🔍" category: "code-review" # MCP servers requeridos pela skill mcp_servers: - name: github command: npx args: ["-y", "@modelcontextprotocol/server-github"] env: GITHUB_TOKEN: "${GITHUB_TOKEN}" # Flags de comportamento hidden: false require_confirmation: true
Branding
Nombre para mostrar, ícono, categoría. Aparece en la UI. Sin esto, queda genérico.
Dependencias de MCP
La skill declara los MCP que necesita. La instalación queda lista para usar.
Flags
Hidden, require_confirmation, etc. Comportamiento por skill.
Es opcional
Sin openai.yaml la skill funciona. Solo pierdes algunos refinamientos: no hay ícono en la UI, el branding es genérico y las dependencias de MCP deben instalarse a mano, fuera de la skill. Con el sidecar, la experiencia queda pulida.
Conceptos clave
Metadatos separados
Skill se ejecuta sin
Declara la dependencia
Ícono, nombre
📏 El límite oculto de description (~8K)
Codex tiene un límite no documentado de unos 8.000 caracteres para la description cuando se indexa en el catálogo. Por encima de eso, la description se trunca, y tu skill pierde los triggers que están al final.
🚨El escenario peligroso
- Creas una skill en Claude con una description extensa (15KB): funciona bien allí
- Puerta directa a Codex
- Codex trunca en ~8K. Los triggers del final desaparecen.
- La skill parece funcionar (todavía se activa con algunos prompts), pero pierde casos
- Nunca te das cuenta porque no aparece ningún error: es silencioso
Técnica de front-loading
Coloca los triggers y ejemplos más importantes en los primeros 1-2KB. El resto puede venir después (y puedes quitarlo sin problema).
// CERTO — triggers no topo description: | Use when reviewing PRs. Triggers: "revisa PR", "review pull request", "code review". Examples: "revisa PR #123", "review da branch atual". More context (pode ser truncado): ... // ERRADO — triggers no fim description: | This skill specializes in deep technical code review with focus on correctness, security, and edge cases. It analyzes pull requests by reading the full diff and ... [muito mais texto] ... Triggers: "revisa PR" ← truncado, nunca alcança
🦜Polyskill anticipa
El adapter Codex de polyskill aplica automáticamente front-loading: toma los triggers de la description portable y los mueve al principio al generarla para Codex. No tienes que pensar en eso.
Conceptos clave
No documentado
Sin errores
Activadores al principio
Resuelve en el build
🚫 Sin backtick-bang nativo — cómo resolverlo
Codex no interpreta `!cmd` (backtick-bang) como ejecución de shell previa al prompt. La skill que dependa de esto para inyectar contexto dinámico (estado de git, registro actual, branch) necesita una adaptación.
🔷 Claude (original)
Branch: `!git branch --show-current` Último commit: `!git log -1 --oneline` Com base no acima, sugira...
El comando se EJECUTA. El resultado ya aparece en el prompt.
🟣 Codex (prosa de respaldo)
Antes de empezar, ejecuta: - `git branch --show-current` - `git log -1 --oneline` Con base en los resultados, sugiere...
El agente EJECUTA los comandos cuando lee la skill.
Alternativa: script delegado
Si necesitas una salida idempotente y estructurada, pon la lógica en un script:
# scripts/context.sh #!/bin/bash echo "Branch: $(git branch --show-current)" echo "Commit: $(git log -1 --oneline)" # SKILL.md Antes de começar, rode `./scripts/context.sh` e leia o output.
🦜Polyskill al momento de portar
Cuando importas una skill de Claude con backtick-bang, el adapter de Codex de polyskill reescribe automáticamente como prosa de respaldo. No es magia: es simple y funciona. Pierdes un poco de elegancia a cambio de portabilidad.
Conceptos clave
Codex no tiene
"Ejecuta X y analiza"
Lógica en sh
Automático en la importación
🔌 MCP servers en Codex
La misma especificación de MCP. Se ejecuta el mismo server. Solo cambia la declaración — TOML en lugar de JSON, dentro del config.toml o en el sidecar openai.yaml de la skill (cuando MCP es una dependencia específica).
🔷 Claude (.mcp.json)
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@mcp/github"],
"env": {
"TOKEN": "$GH_TOKEN"
}
}
}
}
🟣 Codex (config.toml)
[mcp_servers.github]
command = "npx"
args = ["-y", "@mcp/github"]
[mcp_servers.github.env]
TOKEN = "${GH_TOKEN}"
Dónde declarar — config.toml × sidecar
Conceptos clave
Server compartido
Solo cambia la sintaxis
config.toml × sidecar
Sidecar instala MCP
$ Invocación $skill — no es /skill
Codex usa el signo de dólar para invocar una skill explícitamente y reservar slash para los comandos integrados. $nome-skill en lugar de /nome-skill. Un pequeño detalle que te afecta desde el primer día.
🔷 Claude Code
/review ← skill OU slash command /plan ← built-in /output-style x ← built-in
Todo es slash. Sin separación.
🟣 Codex
$review ← skill /help ← built-in (Codex) /model ← built-in (Codex)
Separación: $ para skill, / para built-in.
💡La ayuda de autocompletar
Escribe $ y Codex sugiere las skills disponibles. Aunque olvides que es un signo de dólar y no una barra, el autocompletado lo corrige rápido.
Conceptos clave
Sigilo de invocación
Reservado
Nombre de la skill
Lista de skills
🎯Resumen del módulo
Siguiente ruta:
T4 — Convierte tu proyecto (prompt-template + checklist + 5 trampas)