Jak przenieść Claude Code do Codexa: AGENTS.md, skille i MCP krok po kroku
Zasady z Claude Code w globalnym AGENTS.md, CLAUDE.md czytany przez Codexa, skille w ~/.agents/skills, MCP jednym poleceniem i przetestowany skrypt do synchronizacji.

👁 118 przeczytań
3 listopada kupiłem najwyższy plan ChatGPT, Pro 500 za 2199 zł miesięcznie, i od razu miałem problem. Przez ostatnie miesiące całą robotę przy blogach, teledyskach i aplikacjach prowadziłem w Claude Code. Zebrało się tam kilkaset notatek o projektach, sześć własnych skilli, pliki CLAUDE.md w kilkunastu folderach i podpięte serwery MCP. Codex po pierwszym uruchomieniu nie wiedział o tym nic. Pisał półpauzy, choć od lat używam tylko dywizu, i pytał o rzeczy, które Claude znał na pamięć.
Przeniesienie zajęło mi jedno popołudnie. Najwięcej dało nie samo kopiowanie, tylko zrozumienie, gdzie Codex szuka instrukcji. Poniżej opisuję cały proces, z błędem, na który trafiłem w oficjalnym importerze, i ze skryptem, którego teraz używam.
Przeniesienie w skrócie
- Instrukcje: globalne zasady w
~/.codex/AGENTS.md, a pliki CLAUDE.md w projektach Codex przeczyta po dopisaniu jednej linijki wconfig.toml - Skille: foldery z SKILL.md kopiujesz do
~/.agents/skills, format jest ten sam - MCP:
codex mcp add nazwa --url adres, logowanie OAuth przezcodex mcp login - Czego nie przenosić: starych sesji, jeśli są długie i pełne zrzutów ekranu
- Gotowy skrypt:
synchronizuj-skille.pydo pobrania niżej
Dwa narzędzia, dwa nazewnictwa
Claude Code i Codex robią to samo: czytają twoje pliki, uruchamiają polecenia i piszą kod albo teksty. Różnią się adresami. Claude szuka zasad w CLAUDE.md, Codex w AGENTS.md. Claude trzyma skille w ~/.claude/skills, Codex w ~/.agents/skills. Serwery MCP Claude zapisuje w JSON-ie, Codex w pliku TOML. Jeśli nie wiesz, czym te narzędzia różnią się w codziennej pracy, zacznij od tekstu Codex czy Claude Code. Tu zakładam, że masz oba i chcesz, żeby zachowywały się tak samo.
Codex czyta AGENTS.md w dwóch miejscach. Pierwsze to folder domowy Codexa, czyli ~/.codex/AGENTS.md, ważny dla wszystkich rozmów. Drugie to projekt: Codex schodzi od katalogu głównego repozytorium do bieżącego folderu i w każdym bierze najwyżej jeden plik. Pliki bliżej bieżącego folderu trafiają później, więc nadpisują ogólniejsze zasady. Domyślny limit to 32 KiB na instrukcje, a resztę Codex ucina bez ostrzeżenia.
Krok 1: zasady w globalnym AGENTS.md
Nie miałem globalnego CLAUDE.md, bo moje zasady żyły w pamięci Claude Code jako osobne notatki: pisz po polsku, tylko dywiz, na koniec podaj linki, nie zmyślaj liczb, nie publikuj w sklepie bez mojej zgody. Zebrałem z nich jeden plik ~/.codex/AGENTS.md na 60 linijek. Lepiej spisać sedno niż wkleić wszystko: im krótsze instrukcje, tym mniej kontekstu zjadają przy każdej wiadomości.
Na końcu pliku dopisałem jedną sekcję, która zrobiła największą różnicę. Wskazałem Codexowi folder pamięci Claude Code jako bazę wiedzy tylko do odczytu. Nic nie kopiuję, więc Codex zawsze widzi aktualny stan notatek, które Claude zapisuje na bieżąco.
## Wiedza o projektach
Pełna wiedza o projektach leży w pamięci Claude Code (tylko do odczytu):
C:\Users\ty\.claude\projects\<nazwa-projektu>\memory\
- Zacznij od MEMORY.md (indeks), potem konkretne pliki.
- Przy zadaniu o projekcie najpierw przeszukaj ten folder.Krok 2: CLAUDE.md w projektach bez przepisywania
Projekty z własnym CLAUDE.md nie wymagają tworzenia drugiego pliku. W ~/.codex/config.toml wystarczą dwie linijki:
project_doc_fallback_filenames = ["CLAUDE.md"]
project_doc_max_bytes = 65536Pierwsza każe Codexowi czytać CLAUDE.md tam, gdzie nie ma AGENTS.md. Druga podnosi limit z 32 KiB do 64 KiB, bo część moich plików projektowych jest długa. Tę samą wartość 65536 OpenAI podaje w przykładzie w dokumentacji.
Krok 3: skille do ~/.agents/skills
Skill to folder z plikiem SKILL.md, a obok mogą leżeć skrypty i materiały. Format jest wspólny, więc skille z Claude działają w Codexie bez przeróbek. Codex wymaga w nagłówku SKILL.md dwóch pól: name i description. Opis decyduje o tym, kiedy model sam sięgnie po skill, więc warto napisać w nim wprost, do czego służy.
Najpierw skopiowałem skille do ~/.codex/skills, bo tak radziły starsze poradniki. Codex je wczytał, ale aktualna dokumentacja jako folder osobistych skilli podaje ~/.agents/skills, więc przeniosłem je tam. Skill wywołujesz ręcznie, wpisując $ i nazwę albo /skills, a model wybiera go też sam, gdy zadanie pasuje do opisu.
Jedna rzecz zaskakuje przy dużej liczbie skilli: lista z ich opisami zajmuje najwyżej 2% okna kontekstu. Gdy skilli jest dużo, Codex skraca opisy, a niektóre może pominąć z ostrzeżeniem. Pełny SKILL.md ładuje się dopiero przy użyciu.
Gotowy skrypt: synchronizuj-skille.py
Skille w Claude ciągle poprawiam, więc jednorazowe kopiowanie nie wystarczyło. Napisałem skrypt, który przenosi je jednym poleceniem i nie rusza skilli założonych w Codexie ręcznie. Prowadzi rejestr tego, co sam skopiował, i nadpisuje tylko te foldery. Przy okazji sprawdza, czy każdy SKILL.md ma pola name i description.
Pobierz synchronizuj-skille.py (Python 3.8+, bez dodatkowych bibliotek, Windows, macOS i Linux)
Przed publikacją przetestowałem go na czystym folderze z pięcioma przypadkami: podgląd bez zapisu, pierwsza kopia, ponowne uruchomienie po zmianie skilla, skill bez nagłówka i nieistniejący folder źródłowy. Skill o tej samej nazwie, który już był w Codexie, został nietknięty, a skill bez nagłówka skopiował się z ostrzeżeniem i kodem wyjścia 1. Polskie znaki w nazwach i opisach przeszły bez problemu.
Nie przepłacaj za subskrypcje AI
Prowadzę sklep z rocznymi dostępami do narzędzi AI, taniej niż w cenniku producenta. Sprawdź, co jest teraz na stanie.
Użycie:
python synchronizuj-skille.py --na-sucho # pokaż plan, nic nie zapisuj
python synchronizuj-skille.py # ~/.claude/skills -> ~/.agents/skills
python synchronizuj-skille.py --zrodlo D:/moje-skille --zrodlo ~/.claude/skills
python synchronizuj-skille.py --cel ./projekt/.agents/skillsPełny kod:
"""Synchronizacja skilli z Claude Code do Codexa (promptowy.com).
Kopiuje foldery skilli (każdy z plikiem SKILL.md) z Claude Code do folderu,
z którego Codex czyta skille użytkownika. Domyślnie:
źródło: ~/.claude/skills
cel: ~/.agents/skills
Skrypt prowadzi rejestr skopiowanych skilli (.synchronizuj-skille.json w folderze
docelowym). Przy kolejnym uruchomieniu nadpisuje tylko je, a skille założone
w Codexie ręcznie zostawia w spokoju. Sprawdza też, czy SKILL.md ma pola
name i description, bez których Codex skilla nie wczyta.
Użycie:
python synchronizuj-skille.py # domyślne foldery
python synchronizuj-skille.py --na-sucho # tylko pokaż, co by zrobił
python synchronizuj-skille.py --zrodlo D:/skille --zrodlo ~/.claude/skills
python synchronizuj-skille.py --cel ./projekt/.agents/skills
Wymaga Pythona 3.8+, bez dodatkowych bibliotek. Działa na Windows, macOS i Linux.
Po synchronizacji uruchom Codexa ponownie, żeby wczytał skille.
"""
import argparse
import json
import re
import shutil
import sys
from pathlib import Path
REJESTR_PLIK = ".synchronizuj-skille.json"
POMIJAJ = shutil.ignore_patterns("__pycache__", ".git", "node_modules", ".DS_Store")
def sciezka(tekst):
return Path(tekst).expanduser().resolve()
def sprawdz_frontmatter(skill_md):
"""Zwraca listę braków w nagłówku SKILL.md (pusta lista = w porządku)."""
tekst = skill_md.read_text(encoding="utf-8", errors="replace")
m = re.match(r"^---\s*\n(.*?)\n---", tekst, re.S)
if not m:
return ["brak nagłówka --- na początku pliku"]
naglowek = m.group(1)
return [f"brak pola {pole}" for pole in ("name", "description")
if not re.search(rf"^{pole}\s*:\s*\S", naglowek, re.M)]
def main():
p = argparse.ArgumentParser(description="Kopiuje skille z Claude Code do Codexa.")
p.add_argument("--zrodlo", action="append", type=sciezka,
help="folder ze skillami (można podać kilka razy); domyślnie ~/.claude/skills")
p.add_argument("--cel", type=sciezka, default=sciezka("~/.agents/skills"),
help="folder skilli Codexa; domyślnie ~/.agents/skills")
p.add_argument("--na-sucho", action="store_true", help="nic nie zapisuj, tylko pokaż plan")
a = p.parse_args()
zrodla = a.zrodlo or [sciezka("~/.claude/skills")]
rejestr_plik = a.cel / REJESTR_PLIK
nasze = set()
if rejestr_plik.exists():
nasze = set(json.loads(rejestr_plik.read_text(encoding="utf-8")))
skopiowane, pominiete, ostrzezenia = [], [], []
for zrodlo in zrodla:
if not zrodlo.is_dir():
print(f"BRAK {zrodlo} - folder nie istnieje, pomijam")
continue
for skill in sorted(x for x in zrodlo.iterdir() if (x / "SKILL.md").is_file()):
cel = a.cel / skill.name
if skill.name in skopiowane:
pominiete.append(skill.name)
print(f"DUBEL {skill.name} - już skopiowany z wcześniejszego źródła, pomijam")
continue
if cel.exists() and skill.name not in nasze:
pominiete.append(skill.name)
print(f"POMIJAM {skill.name} - w celu jest skill o tej nazwie, którego nie kopiowałem")
continue
for brak in sprawdz_frontmatter(skill / "SKILL.md"):
ostrzezenia.append(f"{skill.name}: {brak}")
if not a.na_sucho:
a.cel.mkdir(parents=True, exist_ok=True)
if cel.exists():
shutil.rmtree(cel)
shutil.copytree(skill, cel, ignore=POMIJAJ)
skopiowane.append(skill.name)
print(f"{'PLAN' if a.na_sucho else 'OK'}{' ' * (9 - len('PLAN' if a.na_sucho else 'OK'))}{skill.name} <- {zrodlo}")
if not a.na_sucho and skopiowane:
rejestr_plik.write_text(json.dumps(sorted(nasze | set(skopiowane)), ensure_ascii=False, indent=1),
encoding="utf-8")
print(f"\n{'Do skopiowania' if a.na_sucho else 'Skopiowane'}: {len(skopiowane)}, pominięte: {len(pominiete)}, cel: {a.cel}")
for o in ostrzezenia:
print(f"UWAGA {o} - Codex wymaga pól name i description w nagłówku SKILL.md")
if skopiowane and not a.na_sucho:
print("Uruchom Codexa ponownie, żeby wczytał skille.")
return 1 if ostrzezenia else 0
if __name__ == "__main__":
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8")
sys.exit(main())Krok 4: serwery MCP
Serwery MCP dodaje się jednym poleceniem. Dla serwera dostępnego pod adresem, a tak działa większość nowych usług, wygląda to tak:
codex mcp add flashboards --url https://flashboards.yaroflasher.com/api/mcp
codex mcp login flashboards
codex mcp listU mnie przy dodawaniu FlashBoards Codex sam otworzył logowanie OAuth w przeglądarce, bo byłem już zalogowany w serwisie. Serwery uruchamiane lokalnie dodaje się przez codex mcp add nazwa -- polecenie, a zmienne środowiskowe przez --env przed separatorem. Wszystko ląduje w sekcjach [mcp_servers.nazwa] w config.toml. Jak zbudować własny serwer, opisałem w tekście Własny serwer MCP w 15 minut.
Importer z błędem i sesje, których nie warto ruszać
Codex ma wbudowany importer. W aplikacji jest pozycja Importuj w ustawieniach, a pod spodem pracuje skill migrate-to-codex z trybami --scan-only, --plan i --dry-run. Puściłem go na swoim komputerze. Skan znalazł sześć skilli i nic poza nimi: żadnych poleceń, subagentów ani globalnego CLAUDE.md. Pamięci projektów importer w ogóle nie bierze pod uwagę, a to ona była dla mnie najcenniejsza.
Tryb --plan wywrócił się na pierwszym skillu z polskimi znakami: UnicodeDecodeError: 'charmap' codec can't decode byte 0x98. Skrypt czyta pliki domyślnym kodowaniem systemu, a polski Windows ma cp1250. Obejście to uruchomienie z ustawioną zmienną PYTHONUTF8=1. Mój skrypt czyta wszystko jako UTF-8, więc tego problemu nie ma.
Importer potrafi też przenieść rozmowy z ostatnich 30 dni jako wątki Codexa. Ja tego nie zrobiłem i odradzam przy długich sesjach. Zrzuty ekranu wklejone do rozmowy trafiają do transkryptu w całości. U mnie jeden wątek w Codex Desktop urósł kiedyś do 33 GB i aplikacja próbowała go wczytać do pamięci. Lepiej zacząć w Codexie od czystej karty, z dobrym AGENTS.md i dostępem do notatek.
Sprawdzenie, czy Codex widzi wszystko
Na koniec zadałem Codexowi z terminala cztery pytania kontrolne: jaką ma zasadę o myślnikach, jakie widzi skille, co jest w pierwszych liniach mojego indeksu notatek i czy ma narzędzia FlashBoards. Na zasadę i skille odpowiedział poprawnie od razu. Z plikiem notatek poradził sobie dopiero przy pełnym dostępie (-s danger-full-access), bo w trybie tylko do odczytu jego piaskownica na Windows zgłaszała błąd. W aplikacji z włączonym pełnym dostępem działa to bez dodatkowych flag.
Codex ma teraz te same zasady i tę samą wiedzę co Claude. Ile kosztuje każda wiadomość i jak nie przepalić tygodniowego limitu, opisuję w tekście Codex bez przepalania limitu. Następny krok zrobiłem w drugą stronę: Claude Code sam zleca zadania Codexowi przez oficjalną wtyczkę OpenAI.
Czytasz Promptowego częściej? Dodaj go do preferowanych źródeł w Google, a nowe teksty będą wyżej w Twoich wynikach.
Źródła
- OpenAI, Custom instructions with AGENTS.md: https://learn.chatgpt.com/docs/agent-configuration/agents-md
- OpenAI, Agent Skills: https://learn.chatgpt.com/docs/build-skills
- OpenAI, Model Context Protocol w Codex CLI: https://learn.chatgpt.com/docs/extend/mcp?surface=cli
- OpenAI, Configuration Reference: https://learn.chatgpt.com/docs/config-file/config-reference
- Daniel Vaughan, The Codex CLI Agent Migration System: https://codex.danielvaughan.com/2026/05/13/codex-cli-agent-migration-system-import-claude-code-sessions-skills-config/
- Własny test importu i konfiguracji, Codex CLI 0.162.1, 3 listopada 2026
Cały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →- dygot.plCrowdStrike buduje hamulec dla agentów AI. Sam antywirus już nie wystarcza
- przewagi.plAgent AI w małej firmie w 2026: co zrobi sam, ile kosztuje (od 14 900 zł netto) i gdzie potrzebny jest człowiek
- jutropis.plUstawa o AI podpisana. Skargi do KRiBSI i testy dla firm
- generatornia.plZaproszenie na andrzejki z AI: gotowe prompty i skład grafiki bez błędów w tekście
