W zeszłym tygodniu postawiłem diagnozę: sześć narzędzi AI do kodowania, sześć własnościowych formatów konfiguracji, zero interoperacyjności. CLAUDE.md niewidoczny dla Cursora. .cursor/rules nic nie znaczy dla Copilota. Tygodnie skumulowanej wiedzy zespołowej zamknięte w parserze tego vendora, który akurat raczy je czytać.
Każda odpowiedź na tamten tekst zgadzała się, że lock-in jest prawdziwy — a potem zadawała to samo pytanie: "No dobra, ale co mam z tym zrobić?" Fair. Diagnozowanie sytuacji zakładniczej bez planu ratunkowego to komentarz, nie pomoc. Oto plan ratunkowy.
Dlaczego "wybierz mądrze" przestało wystarczać
W ciągu ostatniego tygodnia grunt zmienił się trzy razy. GitHub zamroził wszystkie indywidualne zapisy na Copilota 20 kwietnia, bo agentowy compute rozwalił model subskrypcyjny — VP of Product Joe Binder przyznał, że "agentic workflows fundamentalnie zmieniły zapotrzebowanie Copilota na moc obliczeniową." 15 kwietnia Zed wypuścił równoległe subagenty i uniwersalny LLM gateway. 14 kwietnia Anthropic przebudował Claude Code w desktopową aplikację z Routines wyzwalanymi z chmury. OpenAI zaktualizował swój Agents SDK 15 kwietnia o sandboxowane wykonanie i integracje MCP. Narzędzia mutują co tydzień. Twoje reguły nie powinny być uwięzione w tym, które akurat wybrałeś pół roku temu.
Problem znasz. Ten poradnik daje ci działające rozwiązanie, które możesz commitnąć dzisiaj.
Łatka: jeden kanoniczny plik, pięć kopii vendor
Koncept jest obraźliwie prosty. Trzymaj jeden source-of-truth z regułami w katalogu niezależnym od vendora. Synchronizuj go do każdego formatu skryptem shellowym. Nigdy nie edytuj plików vendorów bezpośrednio.
Krok 1: Utwórz .ai/rules.md
Wybierz nazwę katalogu, której żaden vendor jeszcze nie zajął. .ai/ pasuje.
.ai/
├── rules.md # Kanoniczne reguły projektu
├── architecture.md # Kontekst architektury
├── patterns.md # Konwencje kodu
└── sync.sh # Skrypt, który cię uwalnia
Twój rules.md to zwykły Markdown:
---
project: my-app
lang: [typescript, python]
updated: 2026-04-21
---
# Project Rules
## Code Style
- Strict TypeScript. No `any`. Ever.
- Python: Black formatter, 88-char lines.
- All functions get docstrings. No exceptions.
## Architecture
- Monorepo: apps/ for services, packages/ for shared libs.
- API routes in `src/routes/`, logic in `src/services/`.
- Never import across apps directly. Use packages.
## Testing
- Unit tests co-located: `foo.ts` → `foo.test.ts`.
- Integration tests in `__tests__/integration/`.
- 80% branch coverage minimum on services/.
## Deployment
- Main branch auto-deploys to staging.
- Production: manual approval + passing E2E.
- Env vars in Vault, never in .env files.
## Gotchas
- Payments service uses legacy Stripe v2 client. Don't refactor — vendor contract.
- GraphQL types generate at build time. Run `make codegen` after schema changes.
Source of truth. Każde narzędzie to przeczyta. Każdy człowiek to przeczyta. Zero vendorskiej magii, czysty Markdown.
Krok 2: Skrypt synchronizacji
#!/usr/bin/env bash
set -euo pipefail
CANONICAL=".ai/rules.md"
[ ! -f "$CANONICAL" ] && echo "No ${CANONICAL} found." && exit 1
HEADER="# Auto-generated from .ai/rules.md — do not edit directly"
BODY=$(printf '%s\n\n%s' "$HEADER" "$(cat "$CANONICAL")")
echo "$BODY" > CLAUDE.md # Claude Code
mkdir -p .cursor && echo "$BODY" > .cursor/rules # Cursor
mkdir -p .github && echo "$BODY" > .github/copilot-instructions.md # GitHub Copilot
echo "$BODY" > GEMINI.md # Gemini
mkdir -p .windsurf && echo "$BODY" > .windsurf/rules # Windsurf
echo "Synced to 5 vendor configs."
Dwadzieścia linii. Pięciu vendorów. Jedno źródło. Odpalasz po każdej edycji. To cały trick.
Krok 3: Zautomatyzuj, bo zapomnisz
Znasz siebie. Dodaj pre-commit hook:
#!/usr/bin/env bash
# .git/hooks/pre-commit (or husky / lefthook)
if git diff --cached --name-only | grep -q "^\.ai/"; then
echo "Changes in .ai/ — syncing vendor configs..."
bash .ai/sync.sh
git add CLAUDE.md .cursor/rules .github/copilot-instructions.md \
GEMINI.md .windsurf/rules
fi
Edytujesz kanoniczny plik, commitujesz, kopie vendorów aktualizują się same. Nagłówek # Auto-generated mówi kolegom z zespołu, żeby trzymali łapy z dala od generowanych plików.
Krok 4: Kontekst architektury
Same reguły nie wystarczą. Narzędzia AI czytają też dokumentację architektury i mapy komponentów. Ten sam wzorzec — trzymaj je w .ai/, konkatenuj podczas synchronizacji:
<!-- .ai/architecture.md -->
# System Architecture
## Services
- **api-gateway**: Express.js — auth + routing
- **user-service**: Python/FastAPI — owns user data
- **payments**: Node.js — Stripe integration (legacy v2)
- **notifications**: Go — async via SQS
## Data Flow
Requests → api-gateway → service → own DB.
Cross-service: SQS events only. Never direct HTTP.
Rozszerz sync.sh o konkatenację rules.md + architecture.md + patterns.md. Claude Code obsługuje wiele plików kontekstowych natywnie; dla narzędzi, które tego nie potrafią, jeden duży plik spełnia zadanie.
Czego nie da się przenieść
Tutaj vendorzy zarabiają swój lock-in — i tutaj przestaję udawać, że to naprawia wszystko.
Konfiguracja runtime agentów. Claude Code Routines — agenty chmurowe wyzwalane harmonogramami lub eventami z GitHuba — nie mają odpowiednika w Cursorze. Orkiestracja równoległych agentów w Cursorze działa zupełnie inaczej niż subagenty Zeda. To zachowania runtime, nie statyczny kontekst. Żaden plik konfiguracyjny tego nie uchwyci, bo to nie jest konfiguracja. To funkcje produktu, które wynajmujesz.
Skumulowana pamięć. Claude Code buduje MEMORY.md z czasem — log przeszłych decyzji, błędów, wyuczonych wzorców. Wiedza, którą AI generuje w trakcie użytkowania, nie coś, co sam piszesz. Nie zsynchronizujesz tego, bo to nie istnieje, dopóki AI tego nie stworzy. Zmień narzędzie, strać pamięć. Jak zmiana terapeuty i zaczynanie od sesji pierwszej, tyle że terapeuta też zapomniał twoje imię.
Wording dostrojony pod model. "Zawsze używaj opisowych nazw zmiennych" działa wszędzie. Ale jeśli spędziłeś tygodnie na tuningowaniu reguł pod to, jak Claude radzi sobie z niejasnościami albo żeby uniknąć tendencji GPT do nad-abstrakcji — te niuanse się nie przenoszą. Inne modele, inne dziwactwa, inne tryby awarii.
Portowalna warstwa pokrywa mniej więcej 80% tego, co sprawia, że twoje narzędzie AI jest użyteczne w projekcie. Pozostałe 20% jest naprawdę vendor-specific. Wiedza, gdzie leży granica, jest ważniejsza niż udawanie, że jej nie ma.
CI: nie ufaj nikomu, szczególnie sobie
Dodaj wykrywanie dryfu do swojego pipeline'a:
# .github/workflows/ai-rules-check.yml
name: AI Rules Sync Check
on: [pull_request]
jobs:
check-sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Verify vendor configs match source
run: |
bash .ai/sync.sh
if ! git diff --quiet; then
echo "Vendor configs drifted from .ai/rules.md"
git diff --stat
exit 1
fi
Ktoś edytuje CLAUDE.md ręcznie? CI ubija PR-a. Dryf wyeliminowany. Maszyna, która ma gdzieś twoje uczucia i twój deadline, pilnuje porządku.
Dlaczego żaden vendor tego za ciebie nie zbuduje
MCP dało nam uniwersalny protokół do integracji narzędzi. Nikt nie zrobił tego samego dla kontekstu projektowego. Zero standardu ai-rules.json, zero specyfikacji interoperacyjności, zero grupy roboczej. Każdy vendor zyskuje na niekompatybilności — przypadkowy lock-in, którego utrzymanie nic nie kosztuje, a zwraca się w retencji.
JetBrains przepytał 10 000+ developerów w kwietniu 2026 i odkrył, że Claude Code ma 91% satysfakcji i NPS +54. Imponujące liczby, które mierzą sunk cost tak samo, jak jakość. Zespoły z pięćdziesięcioma plikami CLAUDE.md rozrzuconymi po repozytoriach nie zmieniają narzędzia. Nie dlatego, że Claude jest niezastąpiony, ale dlatego, że matematyka migracji jest na tyle brutalna, żeby zabić rozmowę, zanim się zacznie.
Twój .ai/rules.md zmienia tę matematykę z "dwa tygodnie ręcznego przepisywania" na "odpal skrypt, sprawdź diff." To nie przeniesie wszystkiego. Te 20% — pamięć, zachowania runtime, tuning pod konkretny model — nadal kosztuje realny wysiłek. Ale to różnica między byciem zamkniętym z wyboru a byciem zamkniętym z lenistwa.
Narzędzia nie chcą, żebyś to zbudował. Nie zabraniają ci też. Po prostu liczą na to, że ci się nie będzie chciało.
Niech ci się chce.



