docs: expand lint scope batch46 (2 files)
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
|
||||
## 2. Архітектура проєкту
|
||||
|
||||
```
|
||||
```text
|
||||
src/
|
||||
api/ // Typed API clients
|
||||
components/ // UI components (buttons, inputs, modals)
|
||||
@@ -34,7 +34,7 @@ routes/ // Route definitions
|
||||
store/ // Zustand stores (optional)
|
||||
styles/ // Global CSS/tokens
|
||||
utils/ // Formatting, validation
|
||||
```
|
||||
```text
|
||||
|
||||
- `features/*` містять логіку конкретних модулів.
|
||||
- `components/*` — лише dumb UI-компоненти (без бізнес-логіки).
|
||||
@@ -51,18 +51,18 @@ utils/ // Formatting, validation
|
||||
"strict": true
|
||||
}
|
||||
}
|
||||
```
|
||||
```text
|
||||
|
||||
### 3.2. Заборонено
|
||||
|
||||
* `any`
|
||||
* `!` non-null assertion (за винятком рідкісних випадків)
|
||||
* глобальний mutable state
|
||||
- `any`
|
||||
- `!` non-null assertion (за винятком рідкісних випадків)
|
||||
- глобальний mutable state
|
||||
|
||||
### 3.3. API-типи
|
||||
|
||||
* Генеруємо типи з API Snapshot / OpenAPI.
|
||||
* Типи для відповідей зберігаються в `src/api/types.ts`.
|
||||
- Генеруємо типи з API Snapshot / OpenAPI.
|
||||
- Типи для відповідей зберігаються в `src/api/types.ts`.
|
||||
|
||||
## 4. React Query (network layer)
|
||||
|
||||
@@ -87,31 +87,31 @@ export async function api<T>(path: string, options?: RequestInit): Promise<T> {
|
||||
|
||||
return res.json();
|
||||
}
|
||||
```
|
||||
```text
|
||||
|
||||
### 4.2. Query Keys
|
||||
|
||||
```
|
||||
```text
|
||||
["teams"]
|
||||
["teams", teamId]
|
||||
["channels", teamId]
|
||||
["messages", channelId]
|
||||
["followups", teamId]
|
||||
["projects", teamId]
|
||||
```
|
||||
```text
|
||||
|
||||
## 5. Стандарти компонентів
|
||||
|
||||
### 5.1. Іменування
|
||||
|
||||
* Компоненти: `PascalCase`
|
||||
* Хуки: `useCamelCase`
|
||||
* Файли: `camel-case.tsx`
|
||||
* Папки: `kebab-case`
|
||||
- Компоненти: `PascalCase`
|
||||
- Хуки: `useCamelCase`
|
||||
- Файли: `camel-case.tsx`
|
||||
- Папки: `kebab-case`
|
||||
|
||||
### 5.2. Компонент повинен мати:
|
||||
### 5.2. Компонент повинен мати
|
||||
|
||||
* Чіткий props-інтерфейс:
|
||||
- Чіткий props-інтерфейс:
|
||||
|
||||
```ts
|
||||
interface MyCompProps {
|
||||
@@ -119,8 +119,8 @@ export async function api<T>(path: string, options?: RequestInit): Promise<T> {
|
||||
onClick: () => void;
|
||||
}
|
||||
```
|
||||
* Внутрішній стан не змішується з зовнішнім API-станом.
|
||||
* Міжкомпонентна логіка виноситься в хуки (наприклад: `useMessages(channelId)`).
|
||||
- Внутрішній стан не змішується з зовнішнім API-станом.
|
||||
- Міжкомпонентна логіка виноситься в хуки (наприклад: `useMessages(channelId)`).
|
||||
|
||||
## 6. Обробка помилок
|
||||
|
||||
@@ -143,20 +143,20 @@ POST — без retry.
|
||||
|
||||
Всі тексти повинні бути в словнику:
|
||||
|
||||
```
|
||||
```text
|
||||
src/i18n/uk.json
|
||||
src/i18n/en.json
|
||||
```
|
||||
```text
|
||||
|
||||
Формат ключів:
|
||||
|
||||
```
|
||||
```text
|
||||
onboarding.welcome_title
|
||||
onboarding.next
|
||||
chat.send
|
||||
chat.input_placeholder
|
||||
followup.create
|
||||
```
|
||||
```text
|
||||
|
||||
Форсувати одразу правильну структуру.
|
||||
|
||||
@@ -164,18 +164,18 @@ followup.create
|
||||
|
||||
### 8.1. Кольори
|
||||
|
||||
```
|
||||
```text
|
||||
--primary: #3F51F5;
|
||||
--success: #43A047;
|
||||
--error: #E53935;
|
||||
--gray-100: #F8F9FA;
|
||||
--gray-200: #ECEFF1;
|
||||
--gray-800: #263238;
|
||||
```
|
||||
```text
|
||||
|
||||
### 8.2. Типографіка
|
||||
|
||||
* System font stack:
|
||||
- System font stack:
|
||||
`"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto`
|
||||
|
||||
### 8.3. Контрасти
|
||||
@@ -184,12 +184,12 @@ followup.create
|
||||
|
||||
## 9. Робота з WebSockets
|
||||
|
||||
* Використовуємо один хук: `useChannelStream(channelId)`.
|
||||
* WS підключається коли відкрито чат.
|
||||
* Події:
|
||||
- Використовуємо один хук: `useChannelStream(channelId)`.
|
||||
- WS підключається коли відкрито чат.
|
||||
- Події:
|
||||
|
||||
* `message.created`
|
||||
* `message.updated`
|
||||
- `message.created`
|
||||
- `message.updated`
|
||||
|
||||
Не зберігати WS-стан у глобальному store.
|
||||
|
||||
@@ -197,11 +197,11 @@ followup.create
|
||||
|
||||
Що треба **вимкнути** у коді, щоб не перевантажити ранніх користувачів:
|
||||
|
||||
* Без drag'n'drop для файлів.
|
||||
* Без реакцій (emoji).
|
||||
* Без WYSIWYG редактора.
|
||||
* Без Co-Memory (файли/документи), лише stub.
|
||||
* Без granular RBAC.
|
||||
- Без drag'n'drop для файлів.
|
||||
- Без реакцій (emoji).
|
||||
- Без WYSIWYG редактора.
|
||||
- Без Co-Memory (файли/документи), лише stub.
|
||||
- Без granular RBAC.
|
||||
|
||||
## 11. Патерни, які Cursor повинен дотримуватися
|
||||
|
||||
@@ -213,7 +213,7 @@ followup.create
|
||||
|
||||
## 12. Приклад робочого промта для Cursor
|
||||
|
||||
```
|
||||
```text
|
||||
You are a senior React/TS engineer.
|
||||
|
||||
Implement Step 2 of the onboarding flow (/onboarding).
|
||||
@@ -226,7 +226,7 @@ Specs:
|
||||
Please output:
|
||||
- list of files to modify
|
||||
- code diff
|
||||
```
|
||||
```text
|
||||
|
||||
## 13. Мета документа
|
||||
|
||||
@@ -234,8 +234,8 @@ Please output:
|
||||
|
||||
Він гарантує:
|
||||
|
||||
* узгоджений стиль,
|
||||
* передбачуваний код,
|
||||
* мінімум помилок,
|
||||
* легку підтримку,
|
||||
* зрозумілість структури для нових девелоперів.
|
||||
- узгоджений стиль,
|
||||
- передбачуваний код,
|
||||
- мінімум помилок,
|
||||
- легку підтримку,
|
||||
- зрозумілість структури для нових девелоперів.
|
||||
|
||||
Reference in New Issue
Block a user