Claude Code у проекті ESWF — посібник для нового розробника¶
Аудиторія: розробник, що долучається до ESWF/DOP і вперше відкриває Claude Code в цьому репо. Мета: зрозуміти, як Claude налаштований у нас, як підтримувати конфігурацію актуальною, як користуватись skills/hooks/memory продуктивно.
Дата останньої ревізії: 2026-04-23.
1. Як влаштований контекст — багаторівнева CLAUDE.md¶
Claude Code автоматично читає файли CLAUDE.md з поточної робочої директорії та всіх батьківських каталогів. Ми використовуємо цей механізм як маршрутизацію контексту: коли ви редагуєте файл у backend/, Claude підвантажує backend/CLAUDE.md (а не гігантський корневий).
Структура в нашому репо¶
| Файл | Що містить | Коли вантажиться |
|---|---|---|
| CLAUDE.md | Навігаційний індекс, multi-site архітектура, launchers | Завжди |
| backend/CLAUDE.md | Django apps (21), patterns, URLs, management commands | Робота в backend/ |
| frontend/erp/CLAUDE.md | DOP App: React+Mantine, routing, ItemType, API client | Робота в frontend/erp/ |
| frontend/shop/CLAUDE.md | Client Portal (Next.js SSR) | Робота в frontend/shop/ |
| frontend/portal/CLAUDE.md, frontend/news/CLAUDE.md | Лендінг, блог | Відповідні каталоги |
| mobile/CLAUDE.md, mobile-sales/CLAUDE.md | Driver App, Sales App (React Native + WatermelonDB) | Відповідні каталоги |
| docs/CLAUDE.md | VitePress структура, термінологія DOP vs ERP | Робота в docs/ |
Чому так, а не один великий файл¶
До 2026-04-23 у нас був єдиний кореневий CLAUDE.md на ~900 рядків. Проблеми:
- Редагуєш RN-екран у mobile-sales/ — у контекст тягнеться перелік 21 Django app'а (марно).
- Файл розрісся і його стало важко тримати актуальним (ніхто не пам'ятає, що там написано).
- Опис однієї теми був розкиданий по декількох секціях (frontend/erp — в кореневому; backend-endpoint, який його годує — у backend-секції).
Субдиректорні файли вирішують обидві проблеми: локальний контекст — локально.
Коли CLAUDE.md не підходить — .claude/rules/¶
Окрім CLAUDE.md, Claude Code підтримує каталог .claude/rules/ з path-specific правилами. Кожен файл має YAML frontmatter paths: з glob-паттернами — правило вантажиться, коли Claude торкається файлу, що матчить, незалежно від cwd.
---
paths:
- "backend/**/migrations/*.py"
---
# Migration rules
- НЕ редагувати вручну — завжди через `python manage.py makemigrations`
- Зворотні міграції — окремий файл, не amend
Коли краще .claude/rules/ замість CLAUDE.md:
- Правило прив'язане до типу файлу (міграції, тести, формові компоненти), а не до каталогу
- Шляхи розкидані по монорепо (форми в frontend/erp/ і frontend/shop/ — одне правило на обидва)
- Правило — крос-катне (як писати тести, як структурувати API views)
Коли краще CLAUDE.md: - Опис «що лежить у цьому каталозі» (стек, структура src/, перелік apps) - Правила працюють для всього каталогу без винятків
Ієрархія завантаження Claude Code:
1. Managed CLAUDE.md (організаційний рівень)
2. Project-root CLAUDE.md
3. User-level rules (~/.claude/rules/) — глобальні для всіх проектів
4. Project rules (.claude/rules/) — для цього проекту
5. Nested CLAUDE.md (підкаталоги) — lazy loading за cwd
Слеш-команда для перегляду всіх активних інструкцій — /memory (окремої /rules немає).
Наразі в ESWF використовуємо і CLAUDE.md (кореневий + 8 субдиректорних), і .claude/rules/:
- .claude/rules/document-posting.md — інваріанти посту/анпосту (path-trigger на backend views/serializers/services)
2. Як підтримувати CLAUDE.md актуальним¶
Коли оновлювати¶
Обов'язково (той самий commit):
- Додали нову Django app → backend/CLAUDE.md секція "Django Apps" + корневий URL (якщо community) → backend/CLAUDE.md секція "Main URLs"
- Додали новий horizontal/vertical модуль — додатково пункт в docs/DOCS.md і docs/dop/modules/<h|v>/<module>/README.md
- Змінили стек (наприклад, Mantine 8 → 9, Vite 7 → 8) → секція "Tech Stack" у відповідному frontend-файлі
- Додали новий frontend або мобільний додаток → корневий CLAUDE.md (таблиця "Where to look") + новий <path>/CLAUDE.md
- Змінили архітектурний pattern (multi-tenancy, plugin-system, TenantFilterMixin) → корневий + backend/CLAUDE.md
Не треба оновлювати при: - Фіксі бага (файли і так залишаються на тих самих місцях) - Додаванні нового поля в існуючу модель (модель вже перелічена; додавати кожне поле — не масштабується) - Рефакторингу під капотом без зміни публічного API
Правило однієї відповідальності¶
Кожен факт — у одному місці. Дублювання між корневим і субфайлами — гарантія, що вони разійдуться.
- Корневий → тільки те, що стосується ≥2 підсистем (cross-cutting): multi-site архітектура, launchers, глобальні domain, загальна термінологія.
- Субдиректорний → все, що стосується тільки цього каталогу: стек, структура src/, патерни, gotchas.
Що НЕ писати в CLAUDE.md¶
Це часті анти-патерни:
- ❌ Що робить функція
foo()— код самодокументований через імена. Claude прочитає код швидше, ніж ви напишете опис. - ❌ Історія змін і рішень — для цього є git log і commit messages.
- ❌ «TODO: додати X» — для цього є
docs/todo.mdі issues. - ❌ Копія README — CLAUDE.md і README можуть посилатись один на одного, але не дублюватись.
- ❌ Перелік полів моделі на рівні «id, name, email» — це метадані, які Claude отримає з самого Django. Пишіть тільки нетривіальні поля/зв'язки/gotchas.
Правило перевірки (для review)¶
Перед merge'ом PR, що стосується архітектури, поставте собі 3 питання:
- Чи додав цей PR нове публічне поняття (app, модуль, секція, pattern), якого не було раніше?
- Чи змінив/скасував існуюче поняття, яке раніше згадувалося в CLAUDE.md?
- Чи правильно Claude оцінив би поточний стан після мерджу, якби прочитав CLAUDE.md уперше?
Якщо на (1) або (2) — «так», оновіть CLAUDE.md у тому ж PR.
3. Skills — переиспользование повторюваних патернів¶
Що таке skill¶
Файл .claude/skills/<name>/SKILL.md з frontmatter-ом (name, description). Claude автоматично підхоплює skill, коли опис відповідає задачі. Skill — це не команда, а тригеровий чекліст, який Claude виконує на зустрічі з відповідним завданням.
Коли створювати skill¶
Емпірично: коли процес повторюється тричі за однаковим патерном і має нетривіальні кроки, які легко забути. Приклад: Phase F-1/F-2/F-3/F-4 (hrm, production, baf_sync, budgeting) — 4 модулі одним патерном.
Не створюйте skill наперед. Поки паттерн ще формується, skill застаріватиме швидше, ніж приноситиме користь. Дочекайтесь двох-трьох реальних виконань — тоді зафіксуйте їх.
Наші skills¶
.claude/skills/new-module/SKILL.md — чек-ліст створення нового horizontal/vertical DOP-модуля. 10 чекпоінтів, шаблони коду, посилання на референси (hrm, production, baf_sync, budgeting, consolidation).
Як ми його створили:
1. Побудували 4 Phase F модулі вручну (одним патерном).
2. Витягли інваріанти з коду (не з пам'яті!).
3. Створили skill із прямими посиланнями на backend/budgeting/ як найчистіший референс.
4. Перевірили skill, побудувавши п'ятий модуль (consolidation) — знайшли 3 прогалини в skill v1, одразу виправили.
.claude/skills/custom-form/SKILL.md — чек-ліст створення кастомних форм/списків/полів для: - Документів (TransactionModel) — референси GoodsReceipt, Waybill, DocumentOperation - Довідників (MasterDataModel) — референси Item (номенклатура), Vehicle (ТЗ)
Два обов'язкові «stop-and-think» чекпоінти:
- 🤖 AI-інтеграція — проаналізувати, чим AI може допомогти з цією сутністю; якщо ідеї є, зареєструвати в aiMenuItems.tsx і написати чернетки промптів
- 📒 Облікова операція (для документів) — проаналізувати, яку бух. операцію документ відображає; запропонувати блок проводок (Дт/Кт)
Створено після повторюваної скарги «доводиться кожного разу казати: подивись як зроблено для ПН». Референси проаналізовано Explore-агентом, 10 gotchas витягнуто з реального коду.
Як писати свій skill¶
Структура:
Frontmatter:
---
name: <name>
description: Use when <trigger condition>. Short, specific description
including keywords Claude can match against.
---
Тіло: - Короткий опис «коли запускати» - Список питань, які треба з'ясувати ДО старту (щоб не робити необов'язковий вибір за користувача) - Чекпоінти з шаблонами коду і посиланнями на референси в репо - Секція «Типові пастки» - (опційно) Пост-перевірки, які треба прогнати перед фіналом
Правило: skill — це не документація¶
Skill — інструкція для Claude, не для людини. Відповідно:
- Пишіть в імперативі: «Створи X», «Перевір Y», а не «Ми зазвичай створюємо X».
- Уникайте теорії і мотивації — лише дія.
- Шаблони коду — повні, копі-пейстабельні, з placeholder'ами у форматі <Module>, <model>.
4. Hooks — автоматичні guard-и¶
Що вже налаштовано¶
.claude/settings.json реєструє PreToolUse hook, який блокує Write/Edit/MultiEdit на:
backend/**/migrations/*.py(крім__init__.py) — щоб випадково не зламати міграційну історію*.sqlite3*(включно з .bak) — щоб не перезаписати dev-БД.env*— щоб не витекли секрети в кодову базу*.db— будь-які інші БД
Реалізація: .claude/hooks/guard.py. Скрипт читає JSON зі stdin (протокол Claude Code), повертає exit code 2 при блокуванні — Claude покаже причину і не застосує зміну.
Коли блокування — правильна поведінка¶
Якщо hook спрацював — не вимикайте його. Майже завжди правильний наступний крок:
- Для міграцій: cd backend && python manage.py makemigrations <app> (Claude сам запропонує).
- Для .env: попросіть Claude описати потрібну змінну в README або example.env, а реальний файл редагуйте самі.
- Для db.sqlite3: використовуйте seed-команди замість ручного правлення.
Коли додавати новий hook¶
Якщо ви помітили систематичну проблему, яку можна автоматично запобігти:
- Claude переписує package-lock.json — додайте матчер на нього
- Claude забуває форматувати файл після редагування — додайте PostToolUse з prettier --write
- Claude випадково комітить замість коміту через вас — тут краще memory/feedback, ніж hook
Уникайте хуків для косметичних речей — додають шум у вивід.
Важливий нюанс шляху¶
Hook command виконується в поточній cwd процесу Claude. Якщо користуєтесь відносним шляхом (python .claude/hooks/guard.py), воно зламається, як тільки bash у сесії зайшов у підкаталог. Ми використовуємо $CLAUDE_PROJECT_DIR — абсолютний шлях до корня проєкту, який Claude Code завжди експортує в env:
5. Memory — що зберігається між сесіями¶
Claude зберігає нотатки в ~/.claude/projects/<project>/memory/*.md. Чотири типи:
| Тип | Приклад з нашого проекту |
|---|---|
| feedback | «Завжди відповідати українською», «ERP skin scope — лише chrome», «Не запускати повний build після задачі» |
| project | «CI/CD відкладено до колективної розробки — не пропонувати GitHub Actions без приводу» |
| reference | (відсутні) — використовуй для посилань на зовнішні системи (Linear, Slack, Sentry URL) |
| user | Ім'я, роль, email, мова |
Що НЕ зберігати в memory¶
- Факти, які виводяться з коду (структура файлів, назви моделей) — читай код.
- Git-історія — для цього є
git log. - Рецепти фіксу багів — фікс у коді, контекст у комміті.
- Поточну задачу — для цього TodoWrite і план сесії.
Коли memory зіпсувалась¶
Якщо Claude апелює до memory, яка суперечить реальності: «memory каже, що X існує» vs «насправді X вилучено» — попросіть його прочитати реальність і оновити/видалити застарілий запис. Memory не священна.
6. Практичні прийоми роботи¶
Plan Mode для складних задач¶
Shift+Tab до режиму plan — Claude спочатку аналізує і показує план, нічого не редагує. Використовуйте для:
- Рефакторингу, що зачіпає >3 файли
- Незнайомих частин codebase
- Коли потрібна валідація підходу перед кодом
Можна зробити дефолтним у налаштуваннях, якщо часто в нові зони лізете.
Checkpoints + Esc×2¶
Кожне повідомлення — checkpoint. Esc двічі — повернутись до попереднього стану. Не бійтеся експериментувати: замість ручних .bak файлів — це дешеве відкочування.
@-references¶
Краще, ніж описувати словами. Claude точно читає саме цей файл, не шукає за схожими іменами.
«ultrathink» / «think hard»¶
Ключові слова в промпті підвищують бюджет reasoning'у для конкретної відповіді. Доречно для: - Архітектурних рішень (вибір між двома підходами) - Складних задач, де треба зважити tradeoff'и - Debug з неочевидною причиною
Для рутинних задач не потрібно.
/compact при довгих сесіях¶
Коли сесія >100 повідомлень — /compact <instruction> стискає історію. Приклад корисного instruction'у:
/compact Зберегти архітектурні рішення та активні задачі. Забути деталі форматування коду і проміжні експерименти.
/ultrareview перед великим мержем¶
Запускає багатоагентний cloud-ревью поточної гілки (або PR, якщо є номер). Білінгований. Не плутати з /review (локальний, дешевий, швидший).
Agent для паралельних досліджень¶
Замість того щоб самому грепати по 20 файлах — Agent з subagent_type: Explore. Агент повертає сумарі, ваш основний контекст не забивається результатами grep'ів.
7. Типові помилки нових розробників¶
| Помилка | Чому проблема | Що робити |
|---|---|---|
Викликати Claude з корня, коли задача — у frontend/erp/ |
У контекст потрапляє весь корневий CLAUDE.md, а не локальний | cd frontend/erp перед сесією або в першому промпті |
| Додати модуль, але не оновити backend/CLAUDE.md | Наступна сесія Claude не знатиме про нього | Додавати запис у тому ж PR, що й сам модуль |
| Створити skill на «майбутню повторюваність» | Skill застаріє ще до першого використання | Робіть паттерн вручну ≥3 рази, потім фіксуйте |
| Редагувати файли міграцій, щоб «швидко підправити» | Міграційна історія ломається, продакшн падає | makemigrations + новий файл, не зачіпати старі |
| Копіювати наш CLAUDE.md в інший проект | Там інший стек, інша структура — усе зламається | CLAUDE.md — це specific знання про цей код. Новий проект — новий CLAUDE.md з /init |
| Ігнорувати блокування hook'у | Обходите guard-и → втрачаєте дані | Розберіться, чому блокує; майже завжди є штатний шлях |
| Не використовувати Plan Mode, коли Claude «здогадується» | Неправильний напрям на початку → витрата контексту на виправлення | Shift+Tab перед складною задачею |
8. Чеклист при додаванні нової задачі¶
- Я розумію, де лежить код, який буду змінювати → відповідний
CLAUDE.mdпідхоплено? (pwdпідкаже) - Задача нетривіальна (>3 кроки) → Plan Mode /
ultrathink - Є повторюваний патерн у цій задачі → перевір
.claude/skills/чи вже є skill - Після завершення: чи змінилось щось, що вимагає оновлення CLAUDE.md або docs/?
- Чи не з'явилась нова feedback-думка, яку варто зберегти в memory?
9. Корисні посилання¶
- CLAUDE.md — кореневий індекс
- .claude/skills/new-module/SKILL.md — приклад скілу
- .claude/hooks/guard.py — приклад хука
- .claude/settings.json — реєстрація hook'у
- docs/DOCS.md — оглавлення всієї документації проекту
Офіційна документація Claude Code: docs.anthropic.com/en/docs/claude-code (перевіряйте версію — фічі додаються швидко).