From 3f11521fcc411002d35bfe23706fac507c9091db Mon Sep 17 00:00:00 2001 From: Evgenij I Date: Fri, 10 Apr 2026 00:34:08 +0300 Subject: [PATCH] i18n(uk): add missing root files (CLAUDE.md, clean-code-rules, resources, etc.) - Translate CLAUDE.md, clean-code-rules.md, resources.md - Translate pr-review plugin (README, commands, agents) - Translate documentation templates (ADR, api-endpoint, function-docs) - Copy RELEASE_NOTES.md, LICENSE, claude-howto-logo.png as-is - Update TRANSLATION_QUEUE.md to 100% Ref: luongnv89/claude-howto#63 --- uk/CLAUDE.md | 161 ++++++++++++++++++++++++ uk/LICENSE | 21 ++++ uk/RELEASE_NOTES.md | 11 ++ uk/claude-howto-logo.png | Bin 0 -> 39398 bytes uk/clean-code-rules.md | 115 ++++++++++++++++++ uk/resources.md | 255 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 563 insertions(+) create mode 100644 uk/CLAUDE.md create mode 100644 uk/LICENSE create mode 100644 uk/RELEASE_NOTES.md create mode 100644 uk/claude-howto-logo.png create mode 100644 uk/clean-code-rules.md create mode 100644 uk/resources.md diff --git a/uk/CLAUDE.md b/uk/CLAUDE.md new file mode 100644 index 0000000..fbdd141 --- /dev/null +++ b/uk/CLAUDE.md @@ -0,0 +1,161 @@ + + + + +# CLAUDE.md + +Цей файл надає настанови для Claude Code (claude.ai/code) при роботі з кодом у цьому репозиторії. + +## Огляд проєкту + +Claude How To — це навчальний репозиторій з функцій Claude Code. Це **документація-як-код** — основний продукт — markdown-файли, організовані в пронумеровані навчальні модулі, а не виконуваний додаток. + +**Архітектура**: Кожен модуль (01-10) охоплює конкретну функцію Claude Code з готовими шаблонами для копіювання, Mermaid-діаграмами та прикладами. Система збірки валідує якість документації та генерує EPUB-книгу. + +## Типові команди + +### Перевірки якості pre-commit + +Уся документація повинна пройти чотири перевірки якості перед комітами (запускаються автоматично через pre-commit хуки): + +```bash +# Install pre-commit hooks (runs on every commit) +pre-commit install + +# Run all checks manually +pre-commit run --all-files +``` + +П'ять перевірок: +1. **markdown-lint** — Структура та форматування Markdown через `markdownlint` +2. **cross-references** — Внутрішні посилання, якорі, синтаксис блоків коду (Python-скрипт) +3. **mermaid-syntax** — Валідація коректного парсингу всіх Mermaid-діаграм (Python-скрипт) +4. **link-check** — Доступність зовнішніх URL (Python-скрипт) +5. **build-epub** — EPUB генерується без помилок (при змінах `.md`) + +### Налаштування середовища розробки + +```bash +# Install uv (Python package manager) +pip install uv + +# Create virtual environment and install Python dependencies +uv venv +source .venv/bin/activate +uv pip install -r scripts/requirements-dev.txt + +# Install Node.js tools (markdown linter and Mermaid validator) +npm install -g markdownlint-cli +npm install -g @mermaid-js/mermaid-cli + +# Install pre-commit hooks +uv pip install pre-commit +pre-commit install +``` + +### Тестування + +Python-скрипти в `scripts/` мають юніт-тести: + +```bash +# Run all tests +pytest scripts/tests/ -v + +# Run with coverage +pytest scripts/tests/ -v --cov=scripts --cov-report=html + +# Run specific test +pytest scripts/tests/test_build_epub.py -v +``` + +### Якість коду + +```bash +# Lint and format Python code +ruff check scripts/ +ruff format scripts/ + +# Security scan +bandit -c scripts/pyproject.toml -r scripts/ --exclude scripts/tests/ + +# Type checking +mypy scripts/ --ignore-missing-imports +``` + +### Збірка EPUB + +```bash +# Generate ebook (renders Mermaid diagrams via Kroki.io API) +uv run scripts/build_epub.py + +# With options +uv run scripts/build_epub.py --verbose --output custom-name.epub --max-concurrent 5 +``` + +## Структура каталогів + +``` +├── 01-slash-commands/ # Ярлики, ініційовані користувачем +├── 02-memory/ # Приклади постійного контексту +├── 03-skills/ # Повторно використовувані можливості +├── 04-subagents/ # Спеціалізовані AI-асистенти +├── 05-mcp/ # Приклади Model Context Protocol +├── 06-hooks/ # Автоматизація на основі подій +├── 07-plugins/ # Пакетні функції +├── 08-checkpoints/ # Знімки сесій +├── 09-advanced-features/ # Планування, мислення, фони +├── 10-cli/ # Довідник CLI +├── scripts/ +│ ├── build_epub.py # Генератор EPUB (рендерить Mermaid через Kroki API) +│ ├── check_cross_references.py # Валідація внутрішніх посилань +│ ├── check_links.py # Перевірка зовнішніх URL +│ ├── check_mermaid.py # Валідація синтаксису Mermaid +│ └── tests/ # Юніт-тести для скриптів +├── .pre-commit-config.yaml # Визначення перевірок якості +└── README.md # Основний довідник (також індекс модулів) +``` + +## Настанови щодо контенту + +### Структура модуля +Кожна пронумерована папка дотримується патерну: +- **README.md** — Огляд функції з прикладами +- **Файли прикладів** — Готові шаблони для копіювання (`.md` для команд, `.json` для конфігурацій, `.sh` для хуків) +- Файли організовані за складністю функцій та залежностями + +### Mermaid-діаграми +- Усі діаграми повинні успішно парситися (перевіряється pre-commit хуком) +- Збірка EPUB рендерить діаграми через Kroki.io API (потрібен інтернет) +- Використовуйте Mermaid для блок-схем, діаграм послідовностей та архітектурних візуалізацій + +### Перехресні посилання +- Використовуйте відносні шляхи для внутрішніх посилань (напр., `(01-slash-commands/README.md)`) +- Блоки коду повинні вказувати мову (напр., ` ```bash `, ` ```python `) +- Якірні посилання використовують формат `#heading-name` + +### Валідація посилань +- Зовнішні URL повинні бути доступні (перевіряється pre-commit хуком) +- Уникайте посилань на тимчасовий контент +- Використовуйте пермалінки де можливо + +## Ключові архітектурні рішення + +1. **Пронумеровані папки вказують порядок навчання** — Префікс 01-10 відображає рекомендовану послідовність вивчення функцій Claude Code. Ця нумерація навмисна; не реорганізовуйте за алфавітом. + +2. **Скрипти — утиліти, а не продукт** — Python-скрипти в `scripts/` підтримують якість документації та генерацію EPUB. Фактичний контент — у пронумерованих папках модулів. + +3. **Pre-commit — привратник** — Усі перевірки якості повинні пройти перед прийняттям PR. CI-конвеєр запускає ці ж перевірки як другий прохід. + +4. **Рендеринг Mermaid потребує мережі** — Збірка EPUB викликає Kroki.io API для рендерингу діаграм. Помилки збірки тут зазвичай пов'язані з мережею або невалідним синтаксисом Mermaid. + +5. **Це туторіал, а не бібліотека** — При додаванні контенту зосереджуйтесь на чітких поясненнях, готових прикладах та візуальних діаграмах. Цінність — у навчанні концепцій, а не у наданні повторно використовуваного коду. + +## Конвенції комітів + +Дотримуйтесь формату conventional commits: +- `feat(slash-commands): Add API documentation generator` +- `docs(memory): Improve personal preferences example` +- `fix(README): Correct table of contents link` +- `refactor(hooks): Simplify hook configuration examples` + +Скоуп повинен відповідати назві папки де можливо. diff --git a/uk/LICENSE b/uk/LICENSE new file mode 100644 index 0000000..cf8db6a --- /dev/null +++ b/uk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 luongnv89 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/uk/RELEASE_NOTES.md b/uk/RELEASE_NOTES.md new file mode 100644 index 0000000..0055ec6 --- /dev/null +++ b/uk/RELEASE_NOTES.md @@ -0,0 +1,11 @@ +## v2.2.0 — 2026-03-26 + +### Bug Fixes + +- Remove dead marketplace link failing CI link checks (3fdf0d6) +- Add `sandboxed` and `pycache` to cSpell dictionary (dc64618) + +**Full Changelog**: https://github.com/luongnv89/claude-howto/compare/v2.1.0...v2.1.1 + +--- +**Last Updated**: April 9, 2026 diff --git a/uk/claude-howto-logo.png b/uk/claude-howto-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..94d34a45374b844b19effad50bd4cff1a7e11e4d GIT binary patch literal 39398 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 N8R(f@z@B%${~s( + + + +# Правила чистого коду для AI-генерації коду + +Ці правила спрямовують генерацію коду для створення підтримуваного, професійної якості коду. + +## Змістовні назви +- Використовуйте назви, що розкривають намір та пояснюють чому щось існує +- Уникайте дезінформації та безглуздих розрізнень (напр., `data`, `info`, `manager`) +- Використовуйте вимовні, такі що легко шукаються назви +- Назви класів: іменники (напр., `UserAccount`, `PaymentProcessor`) +- Назви методів: дієслова (напр., `calculateTotal`, `sendEmail`) +- Уникайте ментального маппінгу та кодувань (Угорська нотація, префікси) + +## Функції +- Тримайте функції маленькими (< 20 рядків ідеально) +- Робіть лише одну річ — Принцип єдиної відповідальності +- Один рівень абстракції на функцію +- Обмежуйте аргументи: 0-2 ідеально, 3 максимум, уникайте аргументів-прапорців +- Без побічних ефектів — функція повинна робити те, що каже її назва +- Розділяйте команди (зміна стану) від запитів (повернення інформації) +- Надавайте перевагу виключенням над кодами помилок + +## Коментарі +- Код повинен бути самопояснювальним — уникайте коментарів коли можливо +- Корисні коментарі: юридична інформація, попередження, TODO, документація публічного API +- Погані коментарі: надлишкові, що вводять в оману, або пояснюють поганий код +- Ніколи не коментуйте код — видаляйте його (система контролю версій зберігає історію) +- Якщо потрібен коментар, подумайте про рефакторинг коду + +## Форматування +- Тримайте файли маленькими та зосередженими +- Вертикальне форматування: пов'язані концепції поруч, порожні рядки розділяють концепції +- Горизонтальне форматування: обмежуйте довжину рядка (80-120 символів) +- Використовуйте консистентні відступи та командний стиль +- Групуйте пов'язані функції разом + +## Об'єкти та структури даних +- Об'єкти: ховають дані за абстракціями, відкривають поведінку через методи +- Структури даних: відкривають дані, мають мінімальну поведінку +- Закон Деметри: спілкуйтесь тільки з безпосередніми друзями, уникайте `a.getB().getC().doSomething()` +- Не відкривайте внутрішню структуру через геттери/сеттери наосліп + +## Обробка помилок +- Використовуйте виключення, а не коди повернення або прапорці помилок +- Пишіть `try-catch-finally` першим, коли код може не виконатись +- Надавайте контекст у повідомленнях виключень +- Не повертайте `null` — повертайте порожні колекції або використовуйте Optional/Maybe +- Не передавайте `null` як аргументи + +## Класи +- Маленькі класи: вимірюються відповідальностями, а не рядками +- Принцип єдиної відповідальності: одна причина для зміни +- Висока зв'язність (cohesion): змінні класу використовуються багатьма методами +- Низька зв'язаність (coupling): мінімальні залежності між класами +- Принцип відкритості/закритості: відкритий для розширення, закритий для модифікації + +## Юніт-тести +- Швидкі, Незалежні, Повторювані, Самоперевіряючі, Своєчасні (F.I.R.S.T.) +- Один assert на тест (або одна концепція) +- Якість тестового коду дорівнює якості продакшен-коду +- Читабельні назви тестів, що описують що тестується +- Патерн Arrange-Act-Assert + +## Принципи якості коду +- **DRY (Don't Repeat Yourself)**: Без дублювання +- **YAGNI (You Aren't Gonna Need It)**: Не будуйте для гіпотетичного майбутнього +- **KISS (Keep It Simple)**: Уникайте зайвої складності +- **Правило скаута**: Залишайте код чистішим, ніж ви його знайшли + +## Code Smells, яких варто уникати +- Довгі функції або класи +- Дублювання коду +- Мертвий код (невикористані змінні, функції, параметри) +- Feature envy (метод більше цікавиться іншим класом) +- Inappropriate intimacy (класи знають занадто багато один про одного) +- Довгі списки параметрів +- Primitive obsession (надмірне використання примітивів замість маленьких об'єктів) +- Switch/case (розгляньте поліморфізм) +- Тимчасові поля (змінні класу використовуються лише іноді) + +## Конкурентність +- Тримайте конкурентний код окремо від іншого коду +- Обмежуйте область синхронізованих/заблокованих даних +- Використовуйте потокобезпечні колекції +- Тримайте синхронізовані секції маленькими +- Знайте свої моделі виконання та примітиви + +## Проєктування систем +- Відокремлюйте конструювання від використання (впровадження залежностей) +- Використовуйте фабрики, будівельники для складного створення об'єктів +- Програмуйте на інтерфейси, а не на реалізації +- Надавайте перевагу композиції над успадкуванням +- Застосовуйте патерни проєктування коли вони спрощують, а не для демонстрації + +## Рефакторинг +- Рефакторіть безперервно, а не великими порціями +- Завжди майте тести, що проходять, до та після +- Маленькі кроки: одна зміна за раз +- Поширені рефакторинги: Витягнути метод, Перейменувати, Перемістити, Вбудувати + +## Документація +- Самодокументований код > коментарі > зовнішня документація +- Публічні API потребують чіткої документації +- Включайте приклади в документацію +- Тримайте документацію близько до коду (ідеально — в коді) + +--- + +**Основна філософія**: Код читається в 10 разів частіше, ніж пишеться. Оптимізуйте для читабельності та підтримуваності, а не для хитрості. + +--- +**Останнє оновлення**: Квітень 2026 diff --git a/uk/resources.md b/uk/resources.md new file mode 100644 index 0000000..66ecd13 --- /dev/null +++ b/uk/resources.md @@ -0,0 +1,255 @@ + + + + + + + Claude How To + + +# Список корисних ресурсів + +## Офіційна документація + +| Ресурс | Опис | Посилання | +|--------|------|-----------| +| Claude Code Docs | Офіційна документація Claude Code | [code.claude.com/docs/en/overview](https://code.claude.com/docs/en/overview) | +| Anthropic Docs | Повна документація Anthropic | [docs.anthropic.com](https://docs.anthropic.com) | +| MCP Protocol | Специфікація Model Context Protocol | [modelcontextprotocol.io](https://modelcontextprotocol.io) | +| MCP Servers | Офіційні реалізації MCP-серверів | [github.com/modelcontextprotocol/servers](https://github.com/modelcontextprotocol/servers) | +| Anthropic Cookbook | Приклади коду та туторіали | [github.com/anthropics/anthropic-cookbook](https://github.com/anthropics/anthropic-cookbook) | +| Claude Code Skills | Репозиторій навичок спільноти | [github.com/anthropics/skills](https://github.com/anthropics/skills) | +| Agent Teams | Координація та співпраця кількох агентів | [code.claude.com/docs/en/agent-teams](https://code.claude.com/docs/en/agent-teams) | +| Scheduled Tasks | Повторювані завдання з /loop та cron | [code.claude.com/docs/en/scheduled-tasks](https://code.claude.com/docs/en/scheduled-tasks) | +| Chrome Integration | Автоматизація браузера | [code.claude.com/docs/en/chrome](https://code.claude.com/docs/en/chrome) | +| Keybindings | Налаштування клавіатурних скорочень | [code.claude.com/docs/en/keybindings](https://code.claude.com/docs/en/keybindings) | +| Desktop App | Нативний десктопний додаток | [code.claude.com/docs/en/desktop](https://code.claude.com/docs/en/desktop) | +| Remote Control | Віддалене управління сесіями | [code.claude.com/docs/en/remote-control](https://code.claude.com/docs/en/remote-control) | +| Auto Mode | Автоматичне управління дозволами | [code.claude.com/docs/en/permissions](https://code.claude.com/docs/en/permissions) | +| Channels | Багатоканальна комунікація | [code.claude.com/docs/en/channels](https://code.claude.com/docs/en/channels) | +| Voice Dictation | Голосовий ввід для Claude Code | [code.claude.com/docs/en/voice-dictation](https://code.claude.com/docs/en/voice-dictation) | + +## Інженерний блог Anthropic + +| Стаття | Опис | Посилання | +|--------|------|-----------| +| Code Execution with MCP | Як вирішити проблему роздування контексту MCP за допомогою виконання коду — 98.7% зменшення токенів | [anthropic.com/engineering/code-execution-with-mcp](https://www.anthropic.com/engineering/code-execution-with-mcp) | + +--- + +## Опанування Claude Code за 30 хвилин + +_Відео_: https://www.youtube.com/watch?v=6eBSHbLKuN0 + +_**Усі поради**_ +- **Досліджуйте просунуті функції та скорочення** + - Регулярно перевіряйте нові функції редагування коду та контексту Claude в їхніх нотатках до випусків. + - Вивчіть клавіатурні скорочення для швидкого перемикання між чатом, файлами та редактором. + +- **Ефективне налаштування** + - Створюйте проєктно-специфічні сесії з чіткими назвами/описами для легкого пошуку. + - Закріпіть найчастіше використовувані файли або папки, щоб Claude мав до них доступ у будь-який час. + - Налаштуйте інтеграції Claude (напр., GitHub, популярні IDE) для оптимізації процесу кодування. + +- **Ефективне Q&A по кодовій базі** + - Ставте Claude детальні запитання про архітектуру, патерни проєктування та конкретні модулі. + - Використовуйте посилання на файли та рядки у запитаннях (напр., "Що робить логіка в `app/models/user.py`?"). + - Для великих кодових баз надайте резюме або маніфест, щоб допомогти Claude зосередитись. + - **Приклад промпту**: _"Can you explain the authentication flow implemented in src/auth/AuthService.ts:45-120? How does it integrate with the middleware in src/middleware/auth.ts?"_ + +- **Редагування та рефакторинг коду** + - Використовуйте інлайн-коментарі або запити в блоках коду для отримання цілеспрямованих правок ("Refactor this function for clarity"). + - Запитуйте порівняння до/після. + - Дозвольте Claude генерувати тести або документацію після значних правок для забезпечення якості. + - **Приклад промпту**: _"Refactor the getUserData function in api/users.js to use async/await instead of promises. Show me a before/after comparison and generate unit tests for the refactored version."_ + +- **Управління контекстом** + - Обмежуйте вставлений код/контекст лише тим, що стосується поточного завдання. + - Використовуйте структуровані промпти ("Here's file A, here's function B, my question is X") для найкращої продуктивності. + - Видаляйте або згортайте великі файли у вікні промпту, щоб не перевищувати ліміти контексту. + - **Приклад промпту**: _"Here's the User model from models/User.js and the validateUser function from utils/validation.js. My question is: how can I add email validation while maintaining backward compatibility?"_ + +- **Інтеграція командних інструментів** + - Підключайте сесії Claude до репозиторіїв та документації вашої команди. + - Використовуйте вбудовані шаблони або створюйте власні для повторюваних інженерних завдань. + - Співпрацюйте, діляться стенограмами сесій та промптами з колегами. + +- **Підвищення продуктивності** + - Давайте Claude чіткі, цілеорієнтовані інструкції (напр., "Summarize this class in five bullet points"). + - Видаляйте зайві коментарі та шаблонний код з вікон контексту. + - Якщо вивід Claude збився з курсу, скиньте контекст або переформулюйте запитання. + - **Приклад промпту**: _"Summarize the DatabaseManager class in src/db/Manager.ts in five bullet points, focusing on its main responsibilities and key methods."_ + +- **Практичні приклади використання** + - Дебаг: Вставте помилки та стек-трейси, потім запитайте можливі причини та виправлення. + - Генерація тестів: Запитайте property-based, юніт або інтеграційні тести для складної логіки. + - Код-рев'ю: Попросіть Claude виявити ризиковані зміни, граничні випадки або code smells. + - **Приклади промптів**: + - _"I'm getting this error: 'TypeError: Cannot read property 'map' of undefined at line 42 in components/UserList.jsx'. Here's the stack trace and the relevant code. What's causing this and how can I fix it?"_ + - _"Generate comprehensive unit tests for the PaymentProcessor class, including edge cases for failed transactions, timeouts, and invalid inputs."_ + - _"Review this pull request diff and identify potential security issues, performance bottlenecks, and code smells."_ + +- **Автоматизація робочих процесів** + - Скриптуйте повторювані завдання (форматування, очищення, перейменування) за допомогою промптів Claude. + - Використовуйте Claude для створення описів PR, нотаток до релізів або документації на основі git diff. + - **Приклад промпту**: _"Based on the git diff, create a detailed PR description with a summary of changes, list of modified files, testing steps, and potential impacts. Also generate release notes for version 2.3.0."_ + +**Порада**: Для найкращих результатів комбінуйте кілька цих практик — почніть з закріплення критичних файлів та резюмування цілей, потім використовуйте цілеспрямовані промпти та інструменти рефакторингу Claude для поступового покращення кодової бази та автоматизації. + + +**Рекомендований робочий процес з Claude Code** + +### Рекомендований робочий процес з Claude Code + +#### Для нового репозиторію + +1. **Ініціалізація репо та інтеграція Claude** + - Налаштуйте новий репозиторій з базовою структурою: README, LICENSE, .gitignore, кореневі конфіги. + - Створіть файл `CLAUDE.md` з описом архітектури, високорівневих цілей та настанов кодування. + - Встановіть Claude Code та підключіть до репозиторію для пропозицій коду, створення тестів та автоматизації. + +2. **Використовуйте режим плану та специфікації** + - Використовуйте режим плану (`shift-tab` або `/plan`) для створення детальної специфікації перед реалізацією. + - Запитайте Claude про пропозиції архітектури та початкове компонування проєкту. + - Тримайте чітку, цілеорієнтовану послідовність промптів — запитуйте контури компонентів, основні модулі та відповідальності. + +3. **Ітеративна розробка та рев'ю** + - Реалізуйте основні функції маленькими частинами, запитуючи Claude про генерацію коду, рефакторинг та документацію. + - Запитуйте юніт-тести та приклади після кожного інкременту. + - Підтримуйте поточний список завдань у CLAUDE.md. + +4. **Автоматизація CI/CD та деплою** + - Використовуйте Claude для створення каркасу GitHub Actions, npm/yarn скриптів або робочих процесів деплою. + - Легко адаптуйте конвеєри, оновлюючи CLAUDE.md та запитуючи відповідні команди/скрипти. + +```mermaid +graph TD + A[Start New Repository] --> B[Initialize Repository Structure] + B --> C[Create README, LICENSE, .gitignore] + C --> D[Create CLAUDE.md] + D --> E[Document Architecture & Guidelines] + E --> F[Install & Link Claude Code] + + F --> G[Enter Plan Mode] + G --> H[Draft Feature Specification] + H --> I[Get Architecture Suggestions] + I --> J[Define Components & Modules] + + J --> K[Implement Feature Chunk] + K --> L[Generate Code with Claude] + L --> M[Request Unit Tests] + M --> N[Review & Refactor] + N --> O{More Features?} + O -->|Yes| K + O -->|No| P[Update Task List in CLAUDE.md] + + P --> Q[Setup CI/CD Pipeline] + Q --> R[Scaffold GitHub Actions] + R --> S[Create Deployment Scripts] + S --> T[Test Automation] + T --> U[Repository Ready] + + style A fill:#e1f5ff + style G fill:#fff4e1 + style K fill:#f0ffe1 + style Q fill:#ffe1f5 + style U fill:#90EE90 +``` + +#### Для існуючого репозиторію + +1. **Налаштування репо та контексту** + - Додайте або оновіть `CLAUDE.md` з документацією структури репо, патернів кодування та ключових файлів. Для legacy-репозиторіїв використовуйте `CLAUDE_LEGACY.md` з описом фреймворків, карт версій, інструкцій, багів та нотаток оновлення. + - Закріпіть або виділіть основні файли, які Claude повинен використовувати для контексту. + +2. **Контекстне Q&A по коду** + - Запитуйте Claude про код-рев'ю, пояснення багів, рефакторинг або плани міграції з посиланням на конкретні файли/функції. + - Давайте Claude чіткі межі (напр., "modify only these files" або "no new dependencies"). + +3. **Управління гілками, worktree та кількома сесіями** + - Використовуйте кілька git worktree для ізольованих функцій або виправлень та запускайте окремі сесії Claude на кожен worktree. + - Тримайте вкладки/вікна терміналу організованими за гілкою або функцією для паралельних робочих процесів. + +4. **Командні інструменти та автоматизація** + - Синхронізуйте власні команди через `.claude/commands/` для крос-командної консистентності. + - Автоматизуйте повторювані завдання, створення PR та форматування коду через слеш-команди або хуки Claude. + - Діліться сесіями та контекстом з членами команди для спільного усунення проблем та рев'ю. + +```mermaid +graph TD + A[Start with Existing Repository] --> B{Legacy Codebase?} + B -->|Yes| C[Create CLAUDE_LEGACY.md] + B -->|No| D[Create/Update CLAUDE.md] + C --> E[Document Frameworks & Version Maps] + D --> F[Document Structure & Patterns] + E --> G[Pin Key Files for Context] + F --> G + + G --> H[Identify Task Type] + H --> I{Task Category} + I -->|Bug Fix| J[Ask Claude for Bug Analysis] + I -->|Code Review| K[Request Code Review] + I -->|Refactor| L[Plan Refactoring Strategy] + I -->|Migration| M[Create Migration Plan] + + J --> N[Set Explicit Boundaries] + K --> N + L --> N + M --> N + + N --> O{Multiple Features?} + O -->|Yes| P[Create Git Worktrees] + O -->|No| Q[Work on Main Branch] + P --> R[Launch Separate Claude Sessions] + R --> S[Organize Terminal Tabs] + Q --> S + + S --> T[Setup Team Automation] + T --> U[Sync .claude/commands/] + U --> V[Configure Slash Commands] + V --> W[Setup Hooks for Automation] + W --> X[Share Session Context with Team] + + X --> Y{More Tasks?} + Y -->|Yes| H + Y -->|No| Z[Workflow Complete] + + style A fill:#e1f5ff + style C fill:#ffecec + style D fill:#fff4e1 + style P fill:#f0ffe1 + style T fill:#ffe1f5 + style Z fill:#90EE90 +``` + +**Поради**: +- Починайте кожну нову функцію або виправлення зі специфікації та промпту в режимі плану. +- Для legacy та складних репозиторіїв зберігайте детальні настанови в CLAUDE.md/CLAUDE_LEGACY.md. +- Давайте чіткі, зосереджені інструкції та розбивайте складну роботу на багатофазні плани. +- Регулярно очищайте сесії, обрізайте контекст та видаляйте завершені worktree, щоб уникнути безладу. + +Ці кроки описують основні рекомендації для плавних робочих процесів з Claude Code як у нових, так і в існуючих кодових базах. + +--- + +## Нові функції та можливості (Березень 2026) + +### Ключові ресурси функцій + +| Функція | Опис | Дізнатися більше | +|---------|------|------------------| +| **Auto Memory** | Claude автоматично вивчає та запам'ятовує ваші уподобання між сесіями | [Посібник з пам'яті](02-memory/) | +| **Remote Control** | Програмне управління сесіями Claude Code із зовнішніх інструментів та скриптів | [Просунуті функції](09-advanced-features/) | +| **Web Sessions** | Доступ до Claude Code через браузерні інтерфейси для віддаленої розробки | [Довідник CLI](10-cli/) | +| **Desktop App** | Нативний десктопний додаток Claude Code з покращеним UI | [Claude Code Docs](https://code.claude.com/docs/en/desktop) | +| **Extended Thinking** | Перемикання глибокого мислення через `Alt+T`/`Option+T` або змінну `MAX_THINKING_TOKENS` | [Просунуті функції](09-advanced-features/) | +| **Permission Modes** | Тонке управління: default, acceptEdits, plan, auto, dontAsk, bypassPermissions | [Просунуті функції](09-advanced-features/) | +| **7-Tier Memory** | Managed Policy, Project, Project Rules, User, User Rules, Local, Auto Memory | [Посібник з пам'яті](02-memory/) | +| **Hook Events** | 25 подій: PreToolUse, PostToolUse, PostToolUseFailure, Stop, StopFailure, SubagentStart, SubagentStop, Notification, Elicitation та інші | [Посібник з хуків](06-hooks/) | +| **Agent Teams** | Координація кількох агентів для складних завдань | [Посібник з субагентів](04-subagents/) | +| **Scheduled Tasks** | Налаштування повторюваних завдань з `/loop` та cron | [Просунуті функції](09-advanced-features/) | +| **Chrome Integration** | Автоматизація браузера з headless Chromium | [Просунуті функції](09-advanced-features/) | +| **Keyboard Customization** | Налаштування клавіатурних скорочень включаючи chord-послідовності | [Просунуті функції](09-advanced-features/) | + +--- +**Останнє оновлення**: Квітень 2026