Правила ведення документації
Аудиторія: розробник проекту. Це особистий довідник, не онбординг. Мета: за 10 секунд згадати значення/умову/послідовність під час дискусії чи рефакторингу. Цей файл також читається AI (Claude Code, Cursor) — правила написані так, щоб AI міг за ними створювати й оновлювати документи без додаткових пояснень.
Процес заповнення (як робити поетапно) — в AUTHORING.
Принципи
- Довідник, не туторіал. Пишемо так, щоб знайти потрібне за 10 секунд, а не читати з початку.
- UI — хребет, бек — опорні картки. Читач стартує з UI (що бачить у програмі) і переходить на бек за лінками (що це тригерить / звідки оновлюється).
- Схематично + нюанси. Не описуємо що робить кожна стрічка. Описуємо що є, в якому порядку, які числа/умови, які нюанси і чому вони такі.
- Чому, не як. Якщо рішення неочевидне — пояснюємо чому так зробили, не як зроблено на рівні синтаксису.
- Один файл — одна одиниця. UI-секція і бек-сервіс живуть у різних файлах і пов’язуються лінками.
- Файл ↔ нода Canvas. Кожен файл у
docs/має бути представлений як нода наCanvas.canvas. Якщо підтема надто мала щоб мати окрему ноду — зливаємо з батьківським файлом у секцію. Схованих файлів без ноди не повинно бути. - Не посилайся на те, чого немає на Canvas. Wiki-лінки
[[X]]у тілі файлів можна ставити тільки на файли які представлені нодою на Canvas. Якщо хочеться послатись на дрібну підтему — злий її у файл, який є на Canvas, і посилайся на нього (можна на секцію через[[файл#секція|Секція]]).
Межа глибини
Описуємо:
- Числа: таймаути, інтервали, ліміти, пороги
- Умови, фільтрації, послідовність кроків
- Залежності: хто що тригерить, хто від кого залежить
- Нюанси поведінки які можуть здивувати або стати предметом суперечки
- Чому саме таке рішення — якщо неочевидне
Не описуємо:
- Синтаксис виклику методів
- Деталі транспорту (
fetchvsaxios,Promise.racevsPromise.all) — якщо не впливає на поведінку - Інфраструктура без бізнес-логіки (IPC, ping між вікнами, tab-to-tab запити)
- Імена полів і типи які очевидні з коду
Правило великого пальця: якщо без цього факту читач може прийняти помилкове рішення — описуємо. Якщо це тільки як зроблено, без впливу на поведінку — пропускаємо. У сумнівах — описуємо коротко в секції «Нюанси».
Структура docs/
docs/
├── CONVENTIONS.md # цей файл
├── Canvas.canvas # головний вхід — візуальна мапа
├── ui/ # UI-екрани, секції, колонки, діалоги
├── services/ # бек-сервіси: інтервали, сендери, runner'и
├── entities/ # сутності даних: чат, лист, нотатка, таск, інвайт
├── flows/ # процеси: логін, логаут, ініціалізація
└── system/ # інфраструктура: БД, settings, tabs, update
- UI-файли — українською як в розмові в команді (
Чат.md,Колонка фаворитів.md,Sleep Mode.md). Це єдина мова якою ми обговорюємо інтерфейс — нема сенсу вгадувати англ відповідник для пошуку. - Для meta і flow-кроків —
kebab-caseабо просте англ («Login.md»). - Виняток: для бек-файлів що відповідають класу/сервісу в коді — PascalCase, щоб назва файлу збігалась з іменем класу (напр.
NetworkService.md,ChatSender.md). Це робить навігацію між кодом і доками швидшою. - Допускається один рівень вкладеності якщо тема розгалужується (напр.
entities/chat/Invites.md). Глибше — знак що треба рефакторити. Home.mdне використовуємо — вхід черезCanvas.canvas.
Шаблон сторінки
Обов’язковий початок
#Тег1 #Тег2
[[Назва-файлу]]
# Людська назва
`контекстна стрічка: шлях в коді або "(UI-елемент)"` — одна фраза опису- Теги — тип сторінки (див. нижче). Один рядок, без ком.
- Backlink
[[Назва-файлу]]— для зворотного пошуку в Obsidian. - H1 — як називаємо в розмові (для UI), або назва класу/сервісу (для бек).
- Контекстна стрічка — для бек: шлях
`src/main/...ts`. Для UI:(UI-елемент)або(UI-секція).
Опційні секції (використовувати за потреби)
## Що це / Що показує
Один абзац: роль елемента в системі.
## Числа / Інтервали / Таймаути
Таблиця або список з бізнес-значеннями.
## Логіка / Умови / Фільтри
Пронумерований список або таблиця.
## Нюанси
Неочевидні моменти з поясненням *чому*.
## Зв'язки
- Тригерить: [[...]]
- Оновлюється від: [[...]]
- Читає: [[...]]
- Стартує: [[...]]
## Чому так
Пояснення неочевидних архітектурних рішень. Тільки коли справді є причина.Порядок секцій — приблизно такий як вище, але можна адаптувати. Обов’язкова тільки «шапка» (теги + backlink + H1 + контекстна стрічка + одна фраза).
Типи сторінок і теги
| Тип | Тег | Вміст |
|---|---|---|
| UI-елемент | #UI | Екран, секція, колонка, діалог, тулбар |
| Сервіс | #Service | Фоновий процес, сендер, runner |
| Інтервал | #Interval | Додатковий тег для сервісів з таймером |
| Сутність | #Entity | Структура даних: чат, лист, нотатка, таск |
| Процес | #Flow | Послідовність кроків: логін, логаут, ініціалізація |
| Система | #System | Інфраструктура без бізнес-логіки (БД, settings, tabs) |
| Мета | #Meta | Самі конвенції, індекси |
Теги можна комбінувати (#Service #Interval). Теги — єдиний інструмент фільтрації, тримаємо їх дисципліновано.
Правила для UI-сторінок
- Назва — як звемо в команді («колонка фаворитів»), а не як в коді (
FavoritesColumn.tsx) - Шлях до коду — опційний. Якщо компонент складний — можна вказати, але зазвичай не треба
- Обов’язкова секція
Зв'язки— звідки дані (лінк на бек-сервіс), що тригерить (лінк на дію) - Описуємо: які дані показуються, які дії доступні, які фільтри й стани, які обмеження
- Не описуємо: верстку, стилі, компоненти, імена пропсів
Правила для Service-сторінок
- Шлях у коді — обов’язковий у шапці
#Interval— якщо є таймер- Секції:
Інтервал(якщо є),Логіка,Нюанси,Зв'язки - Нюанси зазвичай найцінніше: stop-листи, watchdog’і, захисти від подвійного запуску, рандомізації
Правила для Entity-сторінок
- Описуємо структуру даних і ключові властивості сутності
- Приклад: для
Chat— два режими відправки (Limited/Unlimited), типи повідомлень, черга - Лінки на сервіси які цю сутність продукують/споживають
Правила для Flow-сторінок
- Структура — пронумерований список кроків
- Короткі flow (≤3 кроки) — описуємо в одному файлі
- Довгі flow — окрема сторінка на крок, у головній тільки список з лінками
Посилання і підфайли
Робимо підфайл:
- Підтема має ≥5 рядків специфіки, не вписується в батьківську
- На підтему може бути посилання з іншого місця (самостійна одиниця)
НЕ робимо підфайл:
- Кілька рядків — просто секція в батьківському файлі
- Тема має сенс тільки в контексті батька
Backlink у кожному файлі — [[Назва-файлу]] одразу після тегів. Це дає Obsidian видимість у графі навіть якщо на файл мало хто посилається.
Canvas
Canvas.canvas — головний і єдиний вхід у документацію. Відкриваючи docs/, відкриваємо саме його.
Кольори по типах
| Тип | Колір | Hex |
|---|---|---|
| UI | блакитний | #64b5f6 |
| Service (operator-level) | зелений | #66bb6a |
| Service (lady-level) | рожевий | #f48fb1 |
| Entity | фіолетовий | #9575cd |
| Flow | жовто-зелений | #00c853 |
| System | темно-зелений | #66bb6a (з групою) |
Типи стрілок (підпис на стрілці)
тригерить— натискання/подія запускає процесоновлює— сервіс пише дані в UI/entityчитає— UI читає дані з entity/storeстартує— один сервіс стартує інший (ініціалізація)per-анкету— зв’язок типу one-to-many через скоуп анкети
Групи
Обводимо ноди одного типу в групу з кольоровим підписом (наприклад «Інтервали оператора», «Сервіси ТЮ»).
Як оновлювати
- Після зміни коду — відкрий відповідний файл у
docs/і онови його частиною того самого коміту. Коміт з логікою без оновлення доків — це борг. - Через AI — «онови
docs/xxx.mdпід зміну вsrc/yyy.ts». AI читає цей файл і дотримується формату. - При видаленні коду — видаляй і відповідні доки. Мертвих сторінок бути не повинно.
- При додаванні нової логіки — новий файл за шаблоном.
Оновлюємо коли: змінюються числа, умови, фільтри, порядок кроків, залежності між сервісами.
НЕ оновлюємо для: рефакторингу без зміни поведінки (перейменування змінних, чищення типів, форматування).
Для AI-асистентів
Коли тебе попросили створити або оновити документ:
- Прочитай цей файл повністю перед роботою з
docs/ - Визнач тип сторінки (UI/Service/Entity/Flow/System) і використовуй відповідний шаблон
- Дотримуйся межі глибини: бізнес-нюанси — так, синтаксис/транспорт — ні
- Перевір чи не треба оновити пов’язані файли (секція
Зв'язки) - Після оновлення сервісу перевір чи не треба оновити UI-сторінку що читає його дані, і навпаки
- Якщо створюєш новий файл — додай його ноду в
Canvas.canvasз правильним кольором і типовими зв’язками