@emaxe/tuigram 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ru.md ADDED
@@ -0,0 +1,656 @@
1
+ # 🚀 TuiGram
2
+
3
+ **Русский** · [English](./README.md)
4
+
5
+ [![npm](https://img.shields.io/npm/v/@emaxe/tuigram)](https://www.npmjs.com/package/@emaxe/tuigram)
6
+ [![node](https://img.shields.io/node/v/@emaxe/tuigram)](https://nodejs.org)
7
+ [![license](https://img.shields.io/npm/l/@emaxe/tuigram)](./LICENSE)
8
+ [![downloads](https://img.shields.io/npm/dm/@emaxe/tuigram)](https://www.npmjs.com/package/@emaxe/tuigram)
9
+ [![platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey)](#-установка)
10
+
11
+ Полнофункциональный терминальный клиент Telegram (TUI + CLI) на Node.js на базе протокола MTProto (`teleproto`).
12
+
13
+ Позволяет полноценно общаться в Telegram прямо из терминала: просматривать список чатов с разделением по категориям, читать переписку с сохранением форматирования (жирный, курсив, ссылки, подсветка кода), отправлять сообщения, ответы (Reply), редактировать, удалять, ставить реакции и отправлять файлы.
14
+
15
+ ```
16
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
17
+ │ 🚀 TuiGram │ Alex Rivers (@alex_rivers) │ ● В сети │
18
+ │ 👥 Tech Chat [1420 уч.] ✍️ Sam печатает... │
19
+ ├──────────────────────────────┬──────────────────────────────────────────────────────────────┤
20
+ │ [1:Все] [2:ЛС] [3:Группы] … │ ──────────────── Сегодня ──────────────── │
21
+ │ [/] Поиск чатов... │ │
22
+ │ 📌 👤 Sam Lee · Let me know… │ Sam Lee [13:40] │
23
+ │ 👥 Tech Chat · Nice work! [3]│ Have you checked the latest release? │
24
+ │ 🤖 Deploy Bot · Done! 12:10│ │
25
+ │ 📢 News Channel · Дайд… [12] │ Sam Lee [13:41] │
26
+ │ 👤 Mia Novak · 📷 Фото 9:41 │ 📷 Фото · 1.8 MB │
27
+ │ 💾 Избранное · Ссылка вчр│ │
28
+ │ │ Вы [13:42] ✓✓ │
29
+ │ │ ┌─ Ответ на сообщение #1042 │
30
+ │ │ Yes, testing it right now! │
31
+ │ │ 👍 4 🔥 2 │
32
+ │ ├──────────────────────────────────────────────────────────────┤
33
+ │ │ ↩️ Ответ на [Sam Lee]: "Have you checked…" [Esc] │
34
+ │ │ Пишу ответ прямо здесь█ │
35
+ ├──────────────────────────────┴──────────────────────────────────────────────────────────────┤
36
+ │ [Tab] Панель │ [Enter] Отправить │ [1-6] Вкладки │ [F1] Помощь │ [Ctrl+Q] Выход │
37
+ └─────────────────────────────────────────────────────────────────────────────────────────────┘
38
+ ```
39
+
40
+ ---
41
+
42
+ ## 📑 Содержание
43
+
44
+ - [Особенности и возможности](#-особенности-и-возможности)
45
+ - [«Скриншоты»](#-скриншоты)
46
+ - [Установка](#-установка)
47
+ - [Первый запуск](#-первый-запуск)
48
+ - [Где хранятся файлы](#-где-хранятся-файлы)
49
+ - [Разработка](#-разработка)
50
+ - [Горячие клавиши](#️-горячие-клавиши)
51
+ - [Слэш-команды](#-слэш-команды-в-поле-ввода)
52
+ - [Отправка файлов и картинок](#-отправка-файлов-и-картинок)
53
+ - [Темы оформления](#-темы-оформления)
54
+ - [Использование через консоль (CLI)](#️-использование-через-консоль-cli)
55
+ - [Структура проекта](#-структура-проекта)
56
+ - [Безопасность](#-безопасность)
57
+ - [История изменений](#-история-изменений)
58
+ - [Участие в разработке](#-участие-в-разработке)
59
+ - [Лицензия](#-лицензия)
60
+
61
+ ---
62
+
63
+ ## ⚡ Особенности и возможности
64
+
65
+ - **Полноценный интерактивный TUI**:
66
+ - Двухпанельный адаптивный интерфейс (список чатов слева + история и поле ввода справа);
67
+ - Поддержка управления клавиатурой и мышью (клики, прокрутка колесом);
68
+ - Категории чатов: Все, Личные (ЛС), Группы, Каналы, Боты, Непрочитанные;
69
+ - Мгновенный поиск и фильтрация чатов по названию и `@username` (`/`);
70
+ - Отображение статуса набора текста («Собеседник печатает...») в реальном времени;
71
+ - Цветовое форматирование Telegram Entities (Bold, Italic, Monospace Code, URLs, Mentions, Spoilers);
72
+ - Индикаторы медиа-вложений (фото, видео, документы, голосовые, стикеры, опросы);
73
+ - Реакции на сообщения (👍, 🔥, ❤️);
74
+ - Бесконечная пагинация истории сообщений вверх (`PageUp` / `Ctrl+U`);
75
+ - Контекстные режимы быстрого ответа (Reply `Ctrl+R`) и редактирования (Edit `Ctrl+E`);
76
+ - Модальные окна: Справка (`F1` / `?`), Сведения о чате (`Ctrl+P`), Меню действий (`Ctrl+A`), Отправка файла (`Ctrl+O`).
77
+ - **Автономный CLI-режим**:
78
+ - Быстрая отправка сообщений и файлов из командной строки;
79
+ - Просмотр списка диалогов и истории в терминале;
80
+ - Потоковый стриминг живых обновлений.
81
+ - **Умная конфигурация**:
82
+ - Ключи и сессия хранятся в пользовательских директориях ОС — пакет остаётся read-only и переживает обновления;
83
+ - Безопасное хранение сессии и ключей (`chmod 0600`).
84
+
85
+ ---
86
+
87
+ ## 🖼 «Скриншоты»
88
+
89
+ TuiGram живёт в терминале, поэтому вместо картинок — точные текстовые снимки экранов.
90
+ Подписи, подсказки и формат вывода взяты из кода интерфейса, а не придуманы:
91
+ данные в примерах вымышленные.
92
+
93
+ Главное окно показано в начале README. Ниже — остальные экраны клиента.
94
+
95
+ ### Поиск и фильтрация чатов
96
+
97
+ Клавиша `/` включает мгновенный поиск по названию и `@username`, цифры `1`–`6`
98
+ переключают категории.
99
+
100
+ ```
101
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
102
+ │ 🚀 TuiGram │ Alex Rivers (@alex_rivers) │ ● В сети │
103
+ ├──────────────────────────────┬──────────────────────────────────────────────────────────────┤
104
+ │ [1:Все] [2:ЛС] [3:Группы] … │ ──────────────── Сегодня ──────────────── │
105
+ │ [/] tech█ │ │
106
+ │ 👥 Tech Chat · Nice work! [3]│ Sam Lee [11:02] │
107
+ │ 📢 Tech Digest · Выпуск… │ Let me know how it goes. │
108
+ │ 🤖 TechSupport Bot · Ок │ │
109
+ │ │ Вы [11:05] ✓✓ │
110
+ │ 3 из 214 чатов │ Will do 👍 │
111
+ │ ├──────────────────────────────────────────────────────────────┤
112
+ │ │ Введите сообщение…█ │
113
+ └──────────────────────────────┴──────────────────────────────────────────────────────────────┘
114
+ ```
115
+
116
+ <details>
117
+ <summary><b>Справка — <code>F1</code> / <code>?</code></b></summary>
118
+
119
+ Полный список горячих клавиш и слэш-команд прямо в клиенте.
120
+
121
+ ```
122
+ ┌──────────────────────────────────────────────────────────────────────────┐
123
+ │ 🚀 TuiGram — Горячие клавиши и управление │
124
+ │ │
125
+ │ Навигация и фокус: │
126
+ │ [Tab] / [Shift+Tab] Фокус: Чаты → Сообщения → Ввод │
127
+ │ [↑] / [↓] Перемещение по списку чатов │
128
+ │ [Enter] Открыть чат / Загрузить историю │
129
+ │ [PageUp] / [Ctrl+U] Прокрутка вверх / старая история │
130
+ │ │
131
+ │ Вкладки фильтрации диалогов: │
132
+ │ [1] Все чаты [2] Личные (ЛС) [3] Группы │
133
+ │ [4] Каналы [5] Боты [6] Непрочитанные │
134
+ │ [/] Поиск чатов по названию/username │
135
+ │ │
136
+ │ Работа с сообщениями: │
137
+ │ [Enter] Отправить [Ctrl+R] Ответить (Reply) │
138
+ │ [Ctrl+J] Перенос строки [Ctrl+E] Редактировать сообщение │
139
+ │ [Ctrl+A] Меню действий [Ctrl+O] Отправить файл / фото │
140
+ │ [Ctrl+P] Инфо о чате [Esc] Закрыть окно / режим │
141
+ │ │
142
+ │ Слэш-команды в поле ввода: │
143
+ │ /help /info /sendfile /sendfile <путь> /clear /logout │
144
+ │ │
145
+ │ Выход: │
146
+ │ [Ctrl+Q] или [Ctrl+C] Безопасный выход из клиента │
147
+ │ │
148
+ │ [ Закрыть ] │
149
+ └──────────────────────────────────────────────────────────────────────────┘
150
+ ```
151
+
152
+ </details>
153
+
154
+ <details>
155
+ <summary><b>Меню действий с сообщением — <code>Ctrl+A</code></b></summary>
156
+
157
+ Ответ, редактирование, удаление, реакции и скачивание вложения.
158
+ Пункты «Редактировать» и «Скачать» появляются только там, где они применимы.
159
+
160
+ ```
161
+ ┌──────────────────────────────────────────────────────┐
162
+ │ ⚡ Действия с сообщением #1042 │
163
+ │ Sam Lee: Have you checked the latest release? │
164
+ ├──────────────────────────────────────────────────────┤
165
+ │ ↩️ Ответить (Reply) │
166
+ │ ✏️ Редактировать текст │
167
+ │ 🗑️ Удалить сообщение │
168
+ │ 👍 Поставить реакцию 👍 │
169
+ │ 🔥 Поставить реакцию 🔥 │
170
+ │ ❤️ Поставить реакцию ❤️ │
171
+ │ 📥 Скачать медиа-вложение │
172
+ │ 📋 Скопировать текст в ввод │
173
+ ├──────────────────────────────────────────────────────┤
174
+ │ [↑↓] Выбор [Enter] Выполнить [Esc] Отмена │
175
+ └──────────────────────────────────────────────────────┘
176
+ ```
177
+
178
+ </details>
179
+
180
+ <details>
181
+ <summary><b>Отправка файла — <code>Ctrl+O</code></b></summary>
182
+
183
+ Несколько путей через `|` уходят одним альбомом. Строка под чекбоксом сразу
184
+ показывает, чем именно станет файл на стороне Telegram.
185
+
186
+ ```
187
+ ┌────────────────────────────────────────────────────────────┐
188
+ │ 📤 Отправка файла или документа │
189
+ ├────────────────────────────────────────────────────────────┤
190
+ │ Путь к файлу (несколько — через |) [Ctrl+F] Обзор │
191
+ │ ┌────────────────────────────────────────────────────────┐ │
192
+ │ │ ~/Desktop/photo.png | ~/Desktop/chart.png█ │ │
193
+ │ └────────────────────────────────────────────────────────┘ │
194
+ │ Подпись (необязательно): │
195
+ │ ┌────────────────────────────────────────────────────────┐ │
196
+ │ │ Две картинки с релиза │ │
197
+ │ └────────────────────────────────────────────────────────┘ │
198
+ │ [ ] Как файл, без сжатия [Ctrl+D] │
199
+ │ ✓ photo.png · 2.4 MB · уйдёт как фото │
200
+ ├────────────────────────────────────────────────────────────┤
201
+ │ [ Отправить ] [ Отмена ] │
202
+ │ [Tab] Поля [Enter] Далее [Ctrl+F] Обзор [Esc] Выход │
203
+ └────────────────────────────────────────────────────────────┘
204
+ ```
205
+
206
+ </details>
207
+
208
+ <details>
209
+ <summary><b>Обзор файлов — <code>Ctrl+F</code></b></summary>
210
+
211
+ Навигация по папкам стрелками, размер подсвеченного файла — внизу.
212
+
213
+ ```
214
+ ┌──────────────────────────────────────────────────────────┐
215
+ │ 📁 Выбор файла: /Users/alex/Desktop │
216
+ ├──────────────────────────────────────────────────────────┤
217
+ │ .. <папка> │
218
+ │ screenshots/ <папка> │
219
+ │ ▸ photo.png 2.4 MB │
220
+ │ chart.png 812 KB │
221
+ │ report.pdf 1.1 MB │
222
+ │ archive.zip 18.7 MB │
223
+ ├──────────────────────────────────────────────────────────┤
224
+ │ photo.png · 2.4 MB │
225
+ │ [↑↓] Навигация [Enter] Выбрать [Esc] Назад │
226
+ └──────────────────────────────────────────────────────────┘
227
+ ```
228
+
229
+ </details>
230
+
231
+ <details>
232
+ <summary><b>Сведения о чате — <code>Ctrl+P</code></b></summary>
233
+
234
+ ID, тип, username, число участников и описание.
235
+
236
+ ```
237
+ ┌──────────────────────────────────────────────────────┐
238
+ │ ℹ Информация о чате │
239
+ ├──────────────────────────────────────────────────────┤
240
+ │ Название: Tech Chat │
241
+ │ Тип: supergroup │
242
+ │ ID: -1001234567890 │
243
+ │ Username: @techchat │
244
+ │ Участников: 1420 │
245
+ │ Уведомления: Включены │
246
+ │ │
247
+ │ О чате / О себе: │
248
+ │ Чат про терминальные клиенты и MTProto. │
249
+ ├──────────────────────────────────────────────────────┤
250
+ │ [ Закрыть ] │
251
+ └──────────────────────────────────────────────────────┘
252
+ ```
253
+
254
+ </details>
255
+
256
+ ### Консольный режим
257
+
258
+ <details>
259
+ <summary><b>Вывод CLI-команд</b></summary>
260
+
261
+ **`tuigram dialogs --limit 8`**
262
+
263
+ ```
264
+ 📂 Загрузка диалогов (макс. 8)...
265
+
266
+ 📌 [user ] Sam Lee id=100200301
267
+ [supergroup] Tech Chat id=-1001234567890 (+3)
268
+ [bot ] Deploy Bot id=100200302
269
+ [channel ] News Channel id=-1009876543210 (+12)
270
+ [saved ] Избранное id=100200300
271
+ [user ] Mia Novak id=100200303 (+1)
272
+ [group ] Team Terminal id=-400112233
273
+ [user ] Nina Ivanova id=100200304
274
+
275
+ Всего получено: 8 диалогов
276
+ ```
277
+
278
+ **`tuigram history @sam_lee --limit 5`**
279
+
280
+ ```
281
+ 💬 Загрузка истории для @sam_lee (макс. 5 сообщений)...
282
+
283
+ [29.08.2026, 11:02:14] #1040 Sam Lee: Let me know how it goes.
284
+ [29.08.2026, 11:05:41] #1041 Вы: Will do 👍
285
+ [29.08.2026, 13:40:07] #1042 Sam Lee: Have you checked the latest release?
286
+ [29.08.2026, 13:41:22] #1043 Sam Lee: 📷 Фото
287
+ [29.08.2026, 13:42:55] #1044 Вы (в ответ на #1042): Yes, testing it right now! (изменено)
288
+
289
+ Всего отображено: 5 сообщений
290
+ ```
291
+
292
+ **`tuigram listen`**
293
+
294
+ ```
295
+ 🟢 Подключено как: Alex Rivers (@alex_rivers)
296
+ Слушаю обновления в реальном времени... Нажмите Ctrl+C для выхода.
297
+
298
+ [13:40:07] + НОВОЕ [-1001234567890] Sam Lee: Have you checked the latest release?
299
+ [13:41:19] ✍️ ПЕЧАТАЕТ чат: -1001234567890
300
+ [13:42:55] + НОВОЕ [-1001234567890] Вы: Yes, testing it right now!
301
+ [13:43:30] ~ ИЗМЕНЕНО [-1001234567890] #1044: Yes, testing it right now! 🚀
302
+ [13:44:02] - УДАЛЕНО [123456789] IDs: 1039, 1038
303
+ ```
304
+
305
+ </details>
306
+
307
+ ---
308
+
309
+ ## 📦 Установка
310
+
311
+ ### Вариант 1: глобальная установка из npm (рекомендуется)
312
+
313
+ ```bash
314
+ npm install -g @emaxe/tuigram
315
+ ```
316
+
317
+ После этого команда `tuigram` доступна в любом каталоге.
318
+
319
+ ### Вариант 2: разовый запуск без установки
320
+
321
+ ```bash
322
+ npx @emaxe/tuigram
323
+ ```
324
+
325
+ ### Вариант 3: из исходников (для разработки)
326
+
327
+ ```bash
328
+ git clone https://github.com/emaxe/tuigram.git
329
+ cd tuigram
330
+ npm install
331
+ npm start
332
+ ```
333
+
334
+ ---
335
+
336
+ ## ⚙️ Первый запуск
337
+
338
+ ### 1. Ключи Telegram API
339
+
340
+ Получите `api_id` и `api_hash` на [https://my.telegram.org](https://my.telegram.org) (раздел *API development tools*), затем:
341
+
342
+ ```bash
343
+ tuigram init
344
+ ```
345
+
346
+ Команда спросит оба ключа и сохранит их с правами `0600`. Для скриптов и CI есть неинтерактивный вариант:
347
+
348
+ ```bash
349
+ tuigram init --api-id 1234567 --api-hash 0123456789abcdef0123456789abcdef
350
+ ```
351
+
352
+ Альтернатива — переменные окружения `TELEGRAM_API_ID` и `TELEGRAM_API_HASH`: они имеют приоритет над файлом настроек.
353
+
354
+ ### 2. Авторизация и запуск
355
+
356
+ ```bash
357
+ tuigram
358
+ ```
359
+
360
+ При первом запуске TuiGram предложит ввести номер телефона, код подтверждения из Telegram и пароль 2FA (если включён). После этого сессия сохранится, и последующие запуски будут происходить мгновенно.
361
+
362
+ Отдельно авторизоваться можно командой `tuigram login`.
363
+
364
+ > **В неинтерактивной среде** (CI, пайп, `< /dev/null`) вход по телефону невозможен:
365
+ > `tuigram login` сразу завершится с понятной ошибкой вместо зависания. Если сессия
366
+ > уже есть — команда просто сообщит, под кем вы авторизованы, и вернёт код `0`.
367
+ > Для автоматизации положите готовый `session.txt` в директорию данных
368
+ > (путь подскажет `tuigram paths`).
369
+
370
+ ---
371
+
372
+ ## 📂 Где хранятся файлы
373
+
374
+ Ничего не пишется внутрь самого пакета — это важно при глобальной установке, где каталог `node_modules` обычно недоступен на запись и стирается при обновлении.
375
+
376
+ | Что | macOS / Linux | Windows |
377
+ |---|---|---|
378
+ | Настройки (`.env`) | `~/.config/tuigram/.env` | `%APPDATA%\tuigram\.env` |
379
+ | Сессия | `~/.local/share/tuigram/session.txt` | `%LOCALAPPDATA%\tuigram\session.txt` |
380
+ | Загрузки из чатов | `~/.local/share/tuigram/downloads/` | `%LOCALAPPDATA%\tuigram\downloads\` |
381
+
382
+ Посмотреть актуальные пути и состояние конфигурации:
383
+
384
+ ```bash
385
+ tuigram paths
386
+ ```
387
+
388
+ Переопределить расположение можно переменными `TUIGRAM_CONFIG_DIR` и `TUIGRAM_DATA_DIR` (учитываются также `XDG_CONFIG_HOME` / `XDG_DATA_HOME`).
389
+
390
+ **Приоритет настроек** (сверху вниз, первое найденное выигрывает):
391
+ 1. переменные окружения процесса;
392
+ 2. `.env` в корне проекта — только при запуске из клона репозитория;
393
+ 3. `~/.config/tuigram/.env` — основной файл установленного CLI.
394
+
395
+ Сессия из старых установок (`<проект>/data/session.txt`) переносится в новое расположение автоматически при первом запуске — повторно логиниться не нужно.
396
+
397
+ ---
398
+
399
+ ## 🛠 Разработка
400
+
401
+ При запуске из клона репозитория работает интерактивное меню-диспетчер:
402
+
403
+ ```bash
404
+ ./run.sh # или npm run menu
405
+ ```
406
+
407
+ Оно даёт удобный выбор режима (TUI, логин, диалоги, отправка, тесты, очистка).
408
+
409
+ Тесты и проверка содержимого будущего npm-пакета:
410
+
411
+ ```bash
412
+ npm test # юнит-тесты
413
+ node scripts/check-package.js # проверка, что в пакет не утекают .env и сессия
414
+ ```
415
+
416
+ ---
417
+
418
+ ## ⌨️ Горячие клавиши
419
+
420
+ | Сочетание клавиш | Область | Действие |
421
+ |---|---|---|
422
+ | `Tab` / `Shift+Tab` | Глобально | Фокус по кругу: Список диалогов → Лента сообщений → Поле ввода |
423
+ | `↑` / `↓` | Список диалогов | Выбор чата |
424
+ | `Enter` | Список диалогов | Открыть выбранный чат и загрузить историю |
425
+ | `1` .. `6` | Список диалогов | Переключение категорий: `1:Все`, `2:ЛС`, `3:Группы`, `4:Каналы`, `5:Боты`, `6:Непроч` |
426
+ | `/` | Список диалогов | Поиск / фильтрация чатов |
427
+ | `Enter` | Поле ввода | Отправить набранное сообщение |
428
+ | `Ctrl+J` | Поле ввода | Перенос строки без отправки |
429
+ | `Ctrl+R` | Чат / Ввод | Ответить (Reply) на последнее сообщение |
430
+ | `Ctrl+E` | Чат / Ввод | Редактировать своё последнее сообщение |
431
+ | `Ctrl+A` | Сообщения | Контекстное меню действий (Реакции, Удаление, Скачивание, Ответ) |
432
+ | `Ctrl+O` | Глобально | Отправить файл / фото / документ |
433
+ | `Ctrl+F` | Окно отправки | Обзор файлов (навигация по папкам) |
434
+ | `Ctrl+D` | Окно отправки | Отправить без сжатия, документом |
435
+ | `Ctrl+P` | Глобально | Информация о текущем чате (ID, участники, ссылки) |
436
+ | `PageUp` / `Ctrl+U`| История | Прокрутка вверх / подгрузка старой истории |
437
+ | `PageDown` / `Ctrl+D`| История | Прокрутка вниз |
438
+ | `Esc` | Модальные окна | Закрыть модальное окно / отменить Reply/Edit |
439
+ | `F1` или `?` | Глобально | Окно справки со всеми горячими клавишами |
440
+ | `Ctrl+Q` / `Ctrl+C` | Глобально | Безопасный выход из клиента |
441
+
442
+ ---
443
+
444
+ ## 💬 Слэш-команды в поле ввода
445
+
446
+ В поле ввода сообщения доступны быстрые команды (начинаются с `/`):
447
+
448
+ - `/help` — открыть окно помощи;
449
+ - `/info` — подробная информация о текущем чате;
450
+ - `/sendfile` — открыть окно отправки файла;
451
+ - `/sendfile <путь>` — отправить файл сразу;
452
+ - `/sendfile <путь> -- <подпись>` — файл с подписью;
453
+ - `/sendfile <путь> | <путь> -- <подпись>` — альбом из нескольких файлов;
454
+ - `/clear` — очистить экранную ленту сообщений;
455
+ - `/logout` — выйти из аккаунта Telegram.
456
+
457
+ ---
458
+
459
+ ## 📎 Отправка файлов и картинок
460
+
461
+ Три способа: окно `Ctrl+O`, слэш-команда `/sendfile`, консольная команда `sendfile`.
462
+
463
+ **Окно отправки (`Ctrl+O`)**
464
+
465
+ - `Ctrl+F` — обзор файлов: навигация по папкам стрелками, `Enter` — войти в папку или выбрать файл, `Esc` — назад. Внизу показывается размер подсвеченного файла.
466
+ - Путь можно и просто ввести: понимает `~/Desktop/foto.png`, пути в кавычках и с экранированными пробелами — то есть перетаскивание файла прямо в терминал работает.
467
+ - Несколько файлов — через `|` в поле пути (или добавляйте их по одному через обзор). До 10 штук уходят одним альбомом.
468
+ - `Ctrl+D` — отправить без сжатия, документом. Полезно, когда важно исходное качество картинки.
469
+ - Строка под чекбоксом сразу показывает, что именно уйдёт: `✓ photo.png · 2.4 MB · уйдёт как фото`.
470
+ - Если в этот момент активен режим ответа (`Ctrl+R`), файл уйдёт **ответом** на сообщение.
471
+
472
+ **Что уходит фото, а что документом**
473
+
474
+ `.png`, `.jpg`, `.jpeg` Telegram принимает как сжатое фото; видеоформаты (`.mp4`, `.mov`, `.mkv` и т.п.) — как видео; всё остальное, включая `.webp` и `.heic`, — документом. Флажок «Как файл, без сжатия» (`Ctrl+D`, в CLI — `--as-file`) заставляет отправить документом что угодно.
475
+
476
+ **Прогресс и отмена**
477
+
478
+ Во время загрузки в строке состояния идут проценты. `Esc` прерывает отправку.
479
+
480
+ **Скачивание входящих**
481
+
482
+ `Ctrl+A` на сообщении → «Скачать медиа-вложение». Файл сохранится в подкаталоге
483
+ `downloads/` директории данных (путь покажет `tuigram paths`).
484
+
485
+ ---
486
+
487
+ ## 🎨 Темы оформления
488
+
489
+ Тема задаётся в `.env`:
490
+
491
+ ```env
492
+ TUI_THEME=default # тёмная (по умолчанию)
493
+ TUI_THEME=nord # Nord
494
+ TUI_THEME=light # светлая
495
+ ```
496
+
497
+ Все цвета заданы hex-значениями и сводятся к палитре xterm-256 (индексы ≥ 16).
498
+ Именованные цвета (`blue`, `cyan`, `gray`) специально не используются: они
499
+ занимают индексы 0–15, которые тема терминала перекрашивает по-своему — из-за
500
+ этого синий фон мог рисоваться бирюзовым, а серый текст пропадать совсем.
501
+
502
+ Контраст каждой пары «текст на фоне» проверяется автотестом по WCAG (порог 3:1)
503
+ уже **после** конверсии в xterm-256, то есть ровно в том виде, в каком цвет
504
+ увидит пользователь.
505
+
506
+ ---
507
+
508
+ ## 🛠️ Использование через консоль (CLI)
509
+
510
+ TuiGram можно запускать в режиме консольных утилит (при запуске из клона
511
+ репозитория подставьте `node bin/tuigram.js` вместо `tuigram`):
512
+
513
+ ```bash
514
+ # Авторизация
515
+ tuigram login
516
+
517
+ # Список диалогов
518
+ tuigram dialogs --limit 30
519
+
520
+ # Просмотр истории чата (@username, ID или me для «Избранного»)
521
+ tuigram history @sam_lee --limit 20
522
+ tuigram history me
523
+
524
+ # Отправка текстового сообщения
525
+ tuigram send me "Привет из терминала!"
526
+ tuigram send @friend "Встречаемся в 18:00"
527
+
528
+ # Отправка файла (несколько путей уходят одним альбомом)
529
+ tuigram sendfile me ./screenshot.png
530
+ tuigram sendfile me ~/a.png ~/b.png --caption "Две картинки"
531
+ tuigram sendfile me ~/photo.png --as-file # без сжатия, документом
532
+
533
+ # Живой стрим обновлений в реальном времени
534
+ tuigram listen
535
+ ```
536
+
537
+ ---
538
+
539
+ ## 📁 Структура проекта
540
+
541
+ ```
542
+ TuiGram/
543
+ ├── bin/
544
+ │ └── tuigram.js # CLI исполняемый файл
545
+ ├── src/
546
+ │ ├── index.js # Главная точка входа (TUI / CLI роутер)
547
+ │ ├── config.js # Пути пользовательских директорий и загрузчик .env
548
+ │ ├── state.js # Реактивное централизованное хранилище состояния
549
+ │ ├── telegram/
550
+ │ │ ├── client.js # Создание и управление MTProto клиентом
551
+ │ │ ├── auth.js # Интерактивный логин-визард и 2FA
552
+ │ │ ├── dialogs.js # Получение, фильтрация и поиск диалогов
553
+ │ │ ├── messages.js # Загрузка истории, отправка, правка, файлы, реакции
554
+ │ │ ├── listener.js # Живой фоновый слушатель событий MTProto
555
+ │ │ ├── entities.js # Парсинг пиров, типы чатов и кэш сущностей
556
+ │ │ └── formatter.js # Telegram Entities -> Blessed ANSI форматирование
557
+ │ ├── ui/
558
+ │ │ ├── screen.js # Управление Blessed Screen
559
+ │ │ ├── theme.js # Темы оформления (Default Dark, Nord, Light)
560
+ │ │ ├── app.js # Главный координатор интерфейса
561
+ │ │ └── components/
562
+ │ │ ├── header.js # Верхняя шапка и статус подключения
563
+ │ │ ├── chatList.js # Список диалогов со скроллом, табами и поиском
564
+ │ │ ├── chatView.js # Лента сообщений с автоскроллом и форматированием
565
+ │ │ ├── inputBox.js # Поле ввода с плашкой Reply/Edit и историей
566
+ │ │ ├── statusBar.js # Нижняя строка подсказок и тостов
567
+ │ │ └── modals/
568
+ │ │ ├── helpModal.js # Окно справки
569
+ │ │ ├── chatInfoModal.js # Окно информации о чате
570
+ │ │ ├── actionModal.js # Меню действий с сообщением
571
+ │ │ ├── fileModal.js # Диалог отправки файла
572
+ │ │ └── confirmModal.js # Диалог подтверждения
573
+ │ ├── cli/
574
+ │ │ ├── cliCommands.js # Автономные CLI команды
575
+ │ │ ├── init.js # tuigram init / paths — настройка и диагностика
576
+ │ │ └── formatters.js # Консольные форматтеры таблиц и логов
577
+ │ └── utils/
578
+ │ ├── storage.js # Файловые операции и сохранение сессий
579
+ │ └── time.js # Форматирование времени и дат
580
+ ├── scripts/
581
+ │ └── check-package.js # Предпубликационная проверка npm-пакета
582
+ ├── test/
583
+ │ └── unit.test.js # Юнит-тесты
584
+ ├── .env.example # Пример конфигурации
585
+ ├── run.sh # Меню-диспетчер для разработки
586
+ ├── AGENTS.md # Правила кодовой базы (источник правды для ИИ-агентов)
587
+ ├── CHANGELOG.md
588
+ ├── LICENSE
589
+ ├── package.json
590
+ ├── README.md
591
+ └── README.ru.md
592
+ ```
593
+
594
+ > В опубликованный npm-пакет попадают только `bin/`, `src/`, `README.md`, `README.ru.md`,
595
+ > `CHANGELOG.md`, `LICENSE` и `.env.example` — см. поле `files` в `package.json`.
596
+
597
+ ---
598
+
599
+ ## 🔒 Безопасность
600
+
601
+ **Где лежит авторизация.** Единственный файл — `session.txt` в директории данных
602
+ (`~/.local/share/tuigram/` или `%LOCALAPPDATA%\tuigram\`; путь можно сменить через
603
+ `TUIGRAM_DATA_DIR`, посмотреть — командой `tuigram paths`). Внутри строка
604
+ `StringSession` от MTProto: версия формата, номер дата-центра, его адрес и порт,
605
+ и 256-байтный `authKey`, закодированные в base64. Пароля и кода подтверждения там нет.
606
+
607
+ - Файл сессии и файл настроек сохраняются с правами `0600` — чтение и запись только владельцу.
608
+ - Ни сессия, ни ключи не лежат внутри пакета: `npm update` их не затрагивает.
609
+ - `data/` и `.env` в `.gitignore` и исключены из npm-пакета полем `files`;
610
+ проверка `node scripts/check-package.js` падает, если секрет всё же попал в сборку.
611
+ - **`authKey` хранится в открытом виде**: base64 — это кодирование, а не шифрование.
612
+ Кто прочитает файл, тот получит полный доступ к аккаунту без телефона, кода и 2FA.
613
+ Не кладите его в общие папки и незашифрованные бэкапы. Если файл утёк —
614
+ завершите сеанс в официальном клиенте («Настройки → Устройства»), это отзовёт ключ
615
+ на сервере, и строка станет бесполезной.
616
+ - `/logout` в TUI отзывает ключ на сервере и удаляет файл сессии.
617
+ - Никакие данные не передаются сторонним серверам — прямое соединение с официальными
618
+ серверами Telegram MTProto.
619
+
620
+
621
+ ---
622
+
623
+ ## 📜 История изменений
624
+
625
+ Все заметные изменения фиксируются в [CHANGELOG.md](./CHANGELOG.md).
626
+ Формат — [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
627
+ версионирование — [SemVer](https://semver.org/lang/ru/).
628
+
629
+ ---
630
+
631
+ ## 🤝 Участие в разработке
632
+
633
+ Баг-репорты и pull request'ы приветствуются:
634
+ [issues](https://github.com/emaxe/tuigram/issues).
635
+
636
+ Перед отправкой изменений:
637
+
638
+ ```bash
639
+ npm test # юнит-тесты должны быть зелёными
640
+ node scripts/check-package.js # в пакет не должны попасть .env и сессия
641
+ ```
642
+
643
+ Правила кодовой базы для людей и ИИ-агентов собраны в [AGENTS.md](./AGENTS.md) —
644
+ единый источник правды по архитектуре, стилю, тестам и безопасности.
645
+ Если работаете с Claude Code, Cursor или Copilot, начните с него.
646
+
647
+ Обе версии README (`README.md` и `README.ru.md`) должны обновляться вместе.
648
+
649
+ ---
650
+
651
+ ## 📄 Лицензия
652
+
653
+ [MIT](./LICENSE) © Maksim Klisin
654
+
655
+ TuiGram — неофициальный клиент. Проект не связан с Telegram Messenger Inc.
656
+ и не аффилирован с ним.