Минулого тижня я поставив діагноз: шість AI-інструментів для коду, шість пропрієтарних форматів конфігурації, нуль інтероперабельності. CLAUDE.md невидимий для Cursor. .cursor/rules — порожній звук для Copilot. Тижні накопиченого командного інтелекту замкнені в парсері того вендора, який випадково його прочитає.

Кожна відповідь на той пост погоджувалась — lock-in реальний — і далі ставила те саме питання: «І що мені з цим робити?» Справедливо. Діагностувати заручницьку ситуацію без плану порятунку — це просто коментаторство. Ось план порятунку.

Чому «обирай мудро» більше не працює

За минулий тиждень ґрунт під ногами зсунувся тричі. GitHub заморозив усі індивідуальні підписки на Copilot 20 квітня — агентні обчислення вилізли за межі того, що витримує фіксована підписка. VP of Product Джо Біндер визнав, що «агентні воркфлоу фундаментально змінили обчислювальні потреби Copilot». 15 квітня Zed випустив паралельних субагентів та універсальний LLM-шлюз. 14 квітня Anthropic перебудував Claude Code в десктопний застосунок з хмарними Routines. OpenAI оновив свій Agents SDK 15 квітня із sandboxed execution та MCP-інтеграціями. Інструменти мутують щотижня. Ваші правила не мають сидіти в тому, що ви обрали пів року тому.

Проблему ви вже знаєте. Цей гайд дає робоче рішення, яке можна закомітити сьогодні.

Фікс: один канонічний файл, п'ять вендорських копій

Концепція образливо проста. Тримайте один source-of-truth файл із правилами у вендор-нейтральній директорії. Синхронізуйте його до кожного вендорського формату шелл-скриптом. Ніколи не редагуйте вендорські файли напряму.

Крок 1: Створіть .ai/rules.md

Оберіть ім'я директорії, яке жоден вендор ще не зайняв. .ai/ підходить.

.ai/
├── rules.md           # Канонічні правила проєкту
├── architecture.md    # Контекст архітектури
├── patterns.md        # Конвенції коду
└── sync.sh            # Скрипт, що дарує свободу

Ваш rules.md — звичайний 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.

Джерело істини. Будь-який інструмент може його прочитати. Будь-яка людина може його прочитати. Жодної вендорської магії — просто Markdown.

Крок 2: Скрипт синхронізації

#!/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."

Двадцять рядків. П'ять вендорів. Одне джерело. Запускайте після кожної правки. Ось і весь трюк.

Крок 3: Автоматизуйте, бо самі не згадаєте

Ви себе знаєте. Додайте pre-commit хук:

#!/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

Редагуєте канонічний файл, комітите — вендорські копії оновлюються самі. Заголовок # Auto-generated каже колегам тримати руки подалі від згенерованих файлів.

Крок 4: Архітектурний контекст

Самих правил недостатньо. AI-інструменти також споживають документацію з архітектури та карти компонентів. Той самий патерн — тримайте їх у .ai/, конкатенуйте під час синхронізації:

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

Розширте sync.sh, щоб конкатенувати rules.md + architecture.md + patterns.md. Claude Code нативно працює з кількома файлами контексту; для інструментів, які не вміють — один великий файл теж працює.

Що не портується

Ось де вендори відпрацьовують свій lock-in, і де я перестаю прикидатись, що це лікує все.

Конфігурації рантайму агентів. Routines у Claude Code — хмарні агенти, що запускаються за розкладом або подіями GitHub — не мають аналога в Cursor. Паралельна оркестрація агентів у Cursor працює зовсім не так, як субагенти Zed. Це рантаймова поведінка, а не статичний контекст. Жоден конфіг-файл їх не захоплює, тому що це не конфіг. Це фічі продукту, які ви орендуєте.

Накопичена пам'ять. Claude Code будує MEMORY.md з часом — лог минулих рішень, помилок, вивчених патернів. Знання, яке AI генерує в процесі роботи, а не те, що ви пишете самі. Синхронізувати його неможливо, бо воно не існує, доки AI його не створить. Змінили інструмент — втратили пам'ять. Як змінити терапевта і почати з першого сеансу, тільки терапевт ще й ваше ім'я забув.

Підлаштовані під модель формулювання. «Завжди використовуй описові назви змінних» — працює всюди. Але якщо ви тижнями тюнили правила, щоб експлуатувати те, як Claude обробляє неоднозначність, або обходити схильність GPT до надмірних абстракцій — ці нюанси не портуються. Різні моделі, різні примхи, різні режими фейлів.

Портативний шар покриває приблизно 80% того, що робить ваш AI-інструмент корисним на проєкті. Решта 20% — справді вендор-специфічні. Знати де проходить межа — важливіше, ніж прикидатись, що її немає.

CI: не довіряй нікому, особливо собі

Додайте перевірку дрифту в пайплайн:

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

Хтось відредагував CLAUDE.md руками? CI вбиває PR. Дрифту немає. Машина, якій байдуже на ваші почуття чи дедлайни, забезпечує порядок.

Чому жоден вендор не побудує це за вас

MCP дав нам універсальний протокол для з'єднання інструментів. Ніхто не зробив того самого для контексту проєкту. Жодного стандарту ai-rules.json, жодної специфікації інтероперабельності, жодної робочої групи. Кожен вендор виграє від несумісності — випадковий lock-in, який нічого не коштує в обслуговуванні і окупається утриманням.

JetBrains опитали 10 000+ розробників у квітні 2026-го і виявили Claude Code із 91% задоволеності та NPS +54. Вражаючі цифри, які вимірюють sunk cost не менше, ніж якість. Команди з п'ятдесятьма CLAUDE.md файлами по репозиторіях не переходять на інше. Не тому, що Claude незамінний, а тому що математика міграції достатньо жорстока, щоб убити розмову ще до її початку.

Ваш .ai/rules.md перетворює цю математику з «два тижні ручного переписування» на «запусти скрипт, перевір diff». Це не портує все. Ті 20% — пам'ять, рантаймова поведінка, модель-специфічний тюнінг — все ще коштують реальних зусиль. Але це різниця між lock-in за вибором і lock-in через недбалість.

Інструменти не хочуть, щоб ви це будували. Але й не заважають. Просто розраховують, що вам буде лінь.

Не будьте лінивими.