pimenov.ai

База знаний

Перенос скилла из Claude в Codex: пошаговое руководство

Как перенести skill из Claude Code в OpenAI Codex: общий стандарт SKILL.md, что переезжает без правок, а что нужно адаптировать вручную.

Опубликовано

Скилл (skill) — это папка с файлом SKILL.md, которая даёт ИИ-агенту готовый навык: инструкции, при необходимости скрипты и справочные материалы под конкретную задачу. Это руководство показывает, как перенести скилл из Claude Code в OpenAI Codex: что переедет без единой правки, а что придётся поправить руками.

📌
Главное: Claude и Codex используют один открытый стандарт Agent Skills (agentskills.io). Сам формат SKILL.md общий, поэтому перенос обычно сводится к смене папки и проверке нескольких полей. Переписывать навык с нуля не нужно.

Что переносится, а что нет: картина целиком

Три вещи, важные до начала переноса:

  • Тело и метаданные скилла общие. name, description и markdown-инструкции работают в обоих агентах одинаково.
  • Различается расположение папки. Claude читает скиллы из .claude/skills, Codex — из .agents/skills. Это самая частая причина, по которой перенесённый навык «не виден».
  • Часть полей frontmatter есть только у Claude. Их нужно либо убрать, либо заменить на механизм Codex.
Элемент скиллаПеренос
name, descriptionБез изменений
Markdown-инструкции (тело)Без изменений
Папки scripts/, references/, assets/Без изменений
Расположение папки скиллаМеняется (см. таблицу путей)
Claude-поля frontmatter (allowed-tools, disable-model-invocation и др.)Убрать или адаптировать
Динамические вставки и подстановки $ARGUMENTSПереписать вручную

Анатомия скилла

Скилл — это директория с обязательным файлом SKILL.md и опциональными вложенными папками:

summarize-changes/
├── SKILL.md          # обязательно: метаданные + инструкции
├── scripts/          # опционально: исполняемый код
├── references/       # опционально: справочные материалы
└── assets/           # опционально: шаблоны, ресурсы

SKILL.md состоит из двух частей: YAML-фронтматтер между --- (что это за навык и когда его применять) и markdown-инструкции (что именно делать).

Оба агента используют прогрессивное раскрытие: при старте в контекст попадают только name, description и путь к скиллу, а полное тело SKILL.md подгружается, только когда агент применяет навык. Поэтому description — это рабочий триггер: по нему агент и решает, включать навык.

💡
Совет: в description выносите вперёд ключевой сценарий и слова-триггеры. И Claude, и Codex обрезают длинные описания в общем списке навыков, поэтому первое предложение важнее последнего.

Где лежат скиллы: Claude против Codex

УровеньClaude CodeCodex
Пользовательский (все проекты)~/.claude/skills/<name>/~/.agents/skills/<name>/
Репозиторий / проект.claude/skills/<name>/.agents/skills/<name>/
Системный / админскийmanaged settings/etc/codex/skills/
Плагин<plugin>/skills/<name>/плагин Codex
⚠️
Главный подвох переноса: Codex читает скиллы из .agents/skills, а не из .codex/skills и не из .claude/skills. Codex сканирует .agents/skills от текущей папки вверх до корня репозитория. Положите навык не туда — и агент просто его не увидит.

В Codex навык можно вызвать явно (/skills или $имя-скилла) или положиться на неявный вызов по description. В Claude — командой /имя-скилла или автоматически.


Соответствие полей frontmatter

Поле в ClaudeЧто делать в Codex
nameОставить как есть
descriptionОставить, вынести триггеры в начало
when_to_useВлить текст в description (отдельного поля в Codex нет)
Тело markdownОставить как есть
scripts/, references/, assets/Перенести как есть, проверить пути в тексте
Динамическая вставка командыАналога нет: вынести в явный шаг «выполни …» или в скрипт
$ARGUMENTS, $1, $nameАналога нет: описать аргументы словами в инструкциях
allowed-tools, disallowed-toolsУбрать; доступ к инструментам в Codex регулируется политикой подтверждений
disable-model-invocation: trueПеренести в agents/openai.yaml: policy.allow_implicit_invocation: false
model, effortУбрать; задаётся на уровне сессии Codex
context: fork, agentПрямого аналога нет; субагенты в Codex настраиваются отдельно
pathsАналога нет; ограничение опишите словами в description
📌
name и description — единственные обязательные поля в обоих агентах. Всё остальное — надстройки Claude поверх общего стандарта, и именно они требуют внимания при переносе.

Сквозной пример: скилл «summarize-changes»

Возьмём реальный навык из официальных примеров Claude Code: он показывает незакоммиченные изменения в git и помечает рискованные места. Удобно для код-ревью и сообщений к коммитам. В нём есть Claude-специфичная вставка, на которой обычно спотыкается перенос.

Исходный скилл в Claude

Файл ~/.claude/skills/summarize-changes/SKILL.md:

---
name: summarize-changes
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
allowed-tools: Read Grep
---

## Current changes

!`git diff HEAD`

## Instructions

Summarize the changes above in two or three bullet points, then list any
risks you notice such as missing error handling, hardcoded values, or tests
that need updating. If the diff is empty, say there are no uncommitted changes.

Здесь две Claude-специфичные детали:

  • allowed-tools: Read Grep — список инструментов, разрешённых без запроса. В стандарте Agent Skills этого поля нет.
  • Строка !git diff HEAD — динамическая вставка: Claude выполняет команду и подставляет результат в текст до того, как скилл попадёт в модель. Codex так не умеет.

Пошаговый перенос

  1. Создайте папку в Codex-расположении. Для личного навыка — ~/.agents/skills/summarize-changes/, для командного — .agents/skills/summarize-changes/ в репозитории.
  2. Скопируйте SKILL.md и папки scripts/, references/, assets/ (если они есть) без изменений.
  3. Почистите frontmatter. Оставьте name и description, уберите allowed-tools.
  4. Замените динамические вставки. Строку !git diff HEAD уберите из тела и добавьте явный шаг «выполни git diff HEAD». Либо вынесите команду в scripts/diff.sh.
  5. Перенесите управление вызовом. Если в Claude стоял disable-model-invocation: true, добавьте agents/openai.yaml с policy.allow_implicit_invocation: false.
  6. Проверьте пути и зависимости скриптов, чтобы они запускались в окружении Codex.
  7. Перезапустите Codex и проверьте навык в /skills, затем явным и неявным вызовом.

Эталонный результат для Codex

Структура папки:

~/.agents/skills/summarize-changes/
├── SKILL.md
└── agents/
    └── openai.yaml   # опционально: имя, иконка, политика вызова

SKILL.md:

---
name: summarize-changes
description: Summarizes uncommitted git changes and flags risky spots. Use when the user asks what changed, wants a commit message, or asks to review a diff.
---

## Instructions

1. Run `git diff HEAD` to read the current uncommitted changes.
2. Summarize them in two or three bullet points.
3. List any risks: missing error handling, hardcoded values, or tests that need updating.
4. If the diff is empty, say there are no uncommitted changes.

Опциональный agents/openai.yaml — если хотите задать отображаемое имя и запретить неявный вызов:

interface:
  display_name: "Summarize changes"
  short_description: "Обзор незакоммиченных изменений и рисков"
policy:
  allow_implicit_invocation: false   # вызывать только явно через $summarize-changes

Что изменилось по сравнению с Claude-версией:

  • allowed-tools убрано.
  • Динамическая вставка git diff HEAD превратилась в явный шаг 1.
  • Управление вызовом переехало в agents/openai.yaml.
  • name, description и логика инструкций остались без изменений.

Частные случаи

Скиллы со скриптами

Скрипты переносятся как есть: положите их в scripts/ и ссылайтесь из SKILL.md. Проверьте, что интерпретатор и зависимости (Python, Node и так далее) доступны в окружении Codex. Надёжнее всего так и заменять Claude-вставки команд: детерминированная логика в скрипте работает одинаково везде.

Многофайловые скиллы

Папка references/ и дополнительные markdown-файлы переносятся без изменений. Главное — сохранить относительные ссылки на них внутри SKILL.md, чтобы прогрессивное раскрытие работало: агент подгрузит файл, только когда он понадобится.

Скиллы с аргументами

Если в Claude использовались подстановки $ARGUMENTS или $1, в Codex опишите ожидаемые аргументы словами: «возьми номер задачи из запроса пользователя». Codex подставит контекст запроса сам.

Распространение навыка

Для раздачи скилла другим разработчикам Codex использует плагины: один плагин может содержать несколько скиллов, а также конфигурацию MCP-серверов и ассеты. Прямые папки .agents/skills нужны для локальной разработки и репозиторных навыков.

⚖️
Инструкции против скриптов. Инструкции гибче, скрипты надёжнее. Если шаг должен выполняться детерминированно (форматирование, парсинг, вызов API) — выносите его в скрипт. Если нужна гибкая логика по контексту — оставляйте инструкцией.

Проверка результата

  1. Запустите /skills в Codex — навык должен появиться в списке.
  2. Вызовите его явно: $summarize-changes. Это проверяет сам факт загрузки.
  3. Дайте запрос, который должен включить навык неявно (например, «что я изменил?»). Это проверяет description.
  4. Если в скилле есть скрипты — убедитесь, что они отрабатывают без ошибок окружения.

Типичные ошибки

СимптомПричина и решение
Codex не видит навыкПапка не в .agents/skills. Перенесите и перезапустите Codex
Навык не срабатывает самСлабый description. Вынесите триггеры в начало или вызывайте явно $имя
Пусто там, где в Claude был diffОсталась динамическая вставка команды. Замените явным шагом или скриптом
Навык виден дваждыДва скилла с одним name на разных уровнях. Codex их не сливает — переименуйте
Скрипт падаетНет зависимости или интерпретатора в окружении Codex
Нужно временно выключить навыкВ ~/.codex/config.toml добавьте [[skills.config]] с enabled = false

Чеклист быстрого переноса

Папка скилла лежит в .agents/skills/<name>/ или ~/.agents/skills/<name>/
В SKILL.md есть name и description
Триггеры вынесены в начало description, текст when_to_use влит туда же
Динамические вставки команд заменены на явные шаги или скрипты
Подстановки $ARGUMENTS / $1 переписаны словами
allowed-tools / disallowed-tools убраны
disable-model-invocation перенесён в agents/openai.yaml (allow_implicit_invocation: false)
model, effort, paths, context: fork убраны
Папки scripts/, references/, assets/ на месте, пути в тексте актуальны
Скрипты запускаются в окружении Codex
Навык виден в /skills
Явный вызов $name работает
Неявный вызов срабатывает на тестовом запросе
Нет конфликтов имён между уровнями

Ссылки


По теме

Если собираете собственный набор скиллов и хотите, чтобы они одинаково работали в Claude и Codex, это реально выстроить как единую систему под ваши задачи.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov