Fight World Online — Telegram Mini App RPG. Игроки выбирают класс, участвуют в PvP-боях на арене, башне и в лесу, прокачивают магии/умения, вступают в кланы.
bun install
cd server && bun run migrate-active # миграция для multiple characters
bun run dev # запуск из корняfwo-tg/
├── server/ # Бекенд: Hono HTTP + Socket.IO + Mongoose + Telegram Bot (grammy)
├── client/ # Фронтенд: React + React Router + Zustand + tma.js (Telegram Mini App)
├── shared/ # Общие типы и схемы (Character, Item, Clan, Magic, etc.)
├── AGENTS.md # ← этот файл
└── docs/agents/ # Детальная документация по подсистемам
| Слой | Технологии |
|---|---|
| Server HTTP | Hono (роутинг), Valibot (валидация), hono/client (типизированный RPC) |
| Server WS | Socket.IO (игровые события, лобби, бои) |
| Server DB | Mongoose 8, MongoDB |
| Server Bot | grammy (Telegram Bot API) |
| Client | React 19, React Router 7, Zustand, tma.js SDK |
| Сборка | Bun, Biome (линтер/форматтер) |
| Монорепо | Bun workspaces |
- Архитектура — монорепо, алиасы путей, пайплайн данных, конфигурация
- Сервер — CharacterService, API layer,
arena.charactersкеш, middleware - Клиент — роутинг, Zustand-сторы, ApiClient, хуки
- Система эффектов — Affect/Effect/LongEffect/Passive, PlayerAffects, EffectService, глобальные флаги
- Multiple Characters — добавленная фича: несколько персонажей,
active, кеш, клиентский UX
- Все DB-операции над персонажами — только через
server/api/character.ts CharacterService— in-memory обёртка надCharдокументом, с бизнес-логикойarena.characters[id]— глобальный кеш CharacterService по_idowner= Telegram user ID (строка), не уникальный идентификатор- HTTP хендлеры используют
withValidation()для единообразной обработки ошибок - Клиент использует
createRequest()поверх типизированного Hono RPC клиента - Zustand store:
useCharacterStore— единственный источник текущего персонажа на клиенте - ProtectedRoute: гидратация стора через
useEffect(не в теле компонента)