Przejdź do treści
Artykuły

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.

10 min czytania
Dwa okna z kodem i strzałka między nimi, ilustracja przeniesienia konfiguracji z Claude Code do Codexa

👁 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 w config.toml
  • Skille: foldery z SKILL.md kopiujesz do ~/.agents/skills, format jest ten sam
  • MCP: codex mcp add nazwa --url adres, logowanie OAuth przez codex mcp login
  • Czego nie przenosić: starych sesji, jeśli są długie i pełne zrzutów ekranu
  • Gotowy skrypt: synchronizuj-skille.py do 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 = 65536

Pierwsza 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.

Zobacz, co jest dostępne

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/skills

Peł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 list

U 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
// Newsletter

Cały tydzień w AI, w jednym mailu

Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.

Zapisz się za darmo →
Za darmo. Wypisujesz się jednym kliknięciem.
// z sieci - nowe teksty w moich serwisach

Wszystkie moje projekty →

Piotr Olszewski

Piotr Olszewski

AUTOR I WYDAWCA

Piotr Olszewski - twórca i autor Promptowego, polskiego serwisu o sztucznej inteligencji. Codziennie śledzi premiery modeli, narzędzia i regulacje AI, i tłumaczy je prostym, konkretnym językiem.

// mapa strony

🛒 Sklep Kinetyka CapCut Pro 460 zł/rok Lovable Pro 450 zł/rok Replit Core 119 zł/rok Zobacz wszystko →
promptowy w liczbach 0tekstów w archiwum0newsów z ostatnich 7 dni0modeli wideo w obserwatorium0zagadek w grach
× ‹ powiększenie ›