202 lines
15 KiB
Markdown
202 lines
15 KiB
Markdown
# Полный отчёт по программе PAPA YU (Tauri + React)
|
||
|
||
**Дата:** 23 января 2026
|
||
**Объект анализа:** приложение papa-yu (десктоп на Tauri 2 + React 19).
|
||
**Задача:** анализ архитектуры, связей, промптов и состояния программы в целом **без внесения исправлений**.
|
||
|
||
---
|
||
|
||
## 1. Архитектура программы
|
||
|
||
### 1.1. Общая схема
|
||
|
||
Приложение построено по схеме **двух слоёв**:
|
||
|
||
| Слой | Технологии | Расположение |
|
||
|------|------------|--------------|
|
||
| **Backend (оболочка)** | Tauri 2, Rust | `desktop/src-tauri/` |
|
||
| **Frontend (UI)** | React 19, Vite 7, TypeScript | `desktop/ui/` |
|
||
|
||
- **Tauri** обеспечивает нативное окно, загрузку веб-интерфейса (из `../ui/dist` в production или с `http://localhost:5173` в dev) и минимальную инициализацию (плагин логов в debug).
|
||
- **React-приложение** — SPA с HashRouter: все экраны рендерятся на клиенте, отдельного сервера рендеринга нет.
|
||
|
||
### 1.2. Структура каталогов
|
||
|
||
```
|
||
papa-yu/
|
||
├── desktop/
|
||
│ ├── src-tauri/ # Tauri (Rust)
|
||
│ │ ├── src/
|
||
│ │ │ ├── main.rs # точка входа, вызов app_lib::run()
|
||
│ │ │ └── lib.rs # tauri::Builder, setup (log), run
|
||
│ │ ├── capabilities/
|
||
│ │ │ └── default.json # окно "main", core:default
|
||
│ │ ├── build.rs
|
||
│ │ ├── Cargo.toml
|
||
│ │ └── tauri.conf.json
|
||
│ └── ui/ # Frontend (React)
|
||
│ ├── src/
|
||
│ │ ├── App.tsx
|
||
│ │ ├── main.tsx
|
||
│ │ ├── index.css
|
||
│ │ ├── config/routes.ts
|
||
│ │ ├── store/app-store.ts
|
||
│ │ ├── lib/event-bus.ts
|
||
│ │ ├── components/
|
||
│ │ │ ├── layout/Layout.tsx
|
||
│ │ │ ├── ErrorBoundary.tsx
|
||
│ │ │ └── ErrorDisplay.tsx
|
||
│ │ └── pages/
|
||
│ │ ├── Dashboard.tsx
|
||
│ │ ├── Tasks.tsx
|
||
│ │ ├── ChatAgent.tsx
|
||
│ │ ├── PolicyEngine.tsx
|
||
│ │ ├── AuditLogger.tsx
|
||
│ │ ├── SecretsGuard.tsx
|
||
│ │ ├── Reglamenty.tsx
|
||
│ │ ├── TMCZakupki.tsx
|
||
│ │ ├── Finances.tsx
|
||
│ │ ├── Personnel.tsx
|
||
│ │ ├── Documents.tsx
|
||
│ │ └── NotFound.tsx
|
||
│ ├── package.json
|
||
│ ├── vite.config.ts
|
||
│ └── tailwind.config.ts
|
||
├── desktop-core/
|
||
│ └── tools/project-auditor/
|
||
│ └── index.ts # пустой файл
|
||
├── index/
|
||
│ └── manifest.json # version, sources
|
||
├── СИНХРОНИЗАЦИЯ_ПАПОК.md
|
||
└── PAPA YU.command
|
||
```
|
||
|
||
### 1.3. Сборка и запуск
|
||
|
||
- **Конфиг Tauri** (`tauri.conf.json`): productName «PAPA YU», identifier `com.papa-yu`, одно окно 800×600, resizable. `beforeDevCommand` и `beforeBuildCommand` обращаются к `$HOME/papa-yu/desktop/ui` (npm run dev / npm run build), frontend в dev — `http://localhost:5173`, в production — `../ui/dist`.
|
||
- **UI:** сборка — `tsc -b && vite build`, dev — `vite` (порт по умолчанию Vite, в конфиге Tauri указан 5173).
|
||
- **Единый запуск для пользователя:** скрипт `PAPA YU.command` в корне; для разработки — `cargo tauri dev` из `desktop/src-tauri`.
|
||
|
||
---
|
||
|
||
## 2. Выстроенные связи
|
||
|
||
### 2.1. Роутинг
|
||
|
||
- **React Router:** `HashRouter`, маршруты заданы в `App.tsx` и в `config/routes.ts`.
|
||
- **Маршруты:** `/` (Dashboard), `/tasks`, `/reglamenty`, `/tmc-zakupki`, `/finances`, `/personnel`, `/documents`, `/chat`, `/policies`, `/audit`, `/secrets`, `*` (NotFound).
|
||
- **RouteTracker:** при смене `location.pathname` вызывает `useAppStore.getState().setCurrentRoute(location.pathname)` — актуализация текущего маршрута в store.
|
||
|
||
### 2.2. Глобальное состояние (Zustand)
|
||
|
||
**Store** (`store/app-store.ts`):
|
||
|
||
- `currentRoute` — текущий путь (обновляется RouteTracker).
|
||
- `systemStatus` — три флага: `policyEngine`, `auditLogger`, `secretsGuard` (все по умолчанию `'active'`); используются на Dashboard для отображения статусов карточек.
|
||
- `recentAuditEvents` — массив событий аудита; пополняется при переходе с Dashboard по карточкам (addAuditEvent).
|
||
- `error` / `setError` — глобальное сообщение об ошибке (показ через ErrorDisplay).
|
||
|
||
Никаких вызовов Tauri (invoke) или бэкенд-API из store нет — только клиентское состояние.
|
||
|
||
### 2.3. Event Bus
|
||
|
||
**Файл:** `lib/event-bus.ts`.
|
||
|
||
- Синглтон с методами `on(event, callback)` и `emit(event, data)`.
|
||
- События: `NAVIGATE`, `ROUTE_CHANGED`.
|
||
- **Использование:** в `Layout.tsx` при клике по пункту навбара вызываются `eventBus.emit(Events.NAVIGATE, { path })` и `eventBus.emit(Events.ROUTE_CHANGED, { path })`. Подписчиков на эти события в коде нет — механизм заложен под будущее использование.
|
||
|
||
### 2.4. Layout и навигация
|
||
|
||
- **Layout** оборачивает все страницы внутри `HashRouter` и рендерит навбар с 8 пунктами: Панель, Задачи, Регламенты, ТМЦ и закупки, Финансы, Персонал, Документы, Чат с агентом. Страницы Policy Engine, Audit, Secrets в навбар не выведены — доступ только через Dashboard.
|
||
- Навбар строится по `ROUTES` из `config/routes.ts`; активный пункт — по `location.pathname`. Переход — через `Link` и дополнительный `onClick` с вызовом eventBus.
|
||
|
||
### 2.5. Dashboard → Policy / Audit / Secrets
|
||
|
||
- На **Dashboard** три карточки: Движок политик, Журнал аудита, Защита секретов.
|
||
- По клику: `eventBus.emit(NAVIGATE)`, `addAuditEvent(...)` с типом `navigation`, затем `navigate(path)` на `/policies`, `/audit` или `/secrets`.
|
||
- Текст и статус карточек берутся из `useAppStore` → `systemStatus` (всегда «Активен» в текущей реализации).
|
||
|
||
### 2.6. Обработка ошибок
|
||
|
||
- **ErrorBoundary** (классовый компонент) оборачивает всё приложение в `App.tsx`. При ошибке в дереве React показывает экран «Произошла ошибка» с кнопками «Вернуться» (сброс состояния ошибки) и «Перезагрузить».
|
||
- **ErrorDisplay** — глобальный тост: показывает `error` из store, автоскрытие через 10 с и кнопку закрытия. Чтобы сообщение появилось, кто-то должен вызвать `setError(...)`; в текущем коде вызовов нет (задел под будущее).
|
||
|
||
### 2.7. Связь Frontend ↔ Backend (Tauri)
|
||
|
||
- **Нет кастомных Tauri-команд** (в `lib.rs` только `tauri::Builder::default()`, setup с плагином log и `run()`).
|
||
- **Нет вызовов `invoke`** из UI — фронт не обращается к Rust-логике.
|
||
- **Capabilities:** в `default.json` разрешено только окно `main` и `core:default`. Специальных разрешений (файловая система, shell и т.д.) не настроено.
|
||
|
||
Итог: связь между фронтом и бэкендом ограничена тем, что Tauri загружает и отображает веб-интерфейс; обмена данными или командами между React и Rust нет.
|
||
|
||
---
|
||
|
||
## 3. Разделы и страницы
|
||
|
||
| Маршрут | Страница | Назначение по коду |
|
||
|--------|----------|--------------------|
|
||
| `/` | Dashboard | Панель с тремя карточками (Policy Engine, Audit Logger, Secrets Guard) и переходом на соответствующие страницы; блок «Система безопасности». |
|
||
| `/tasks` | Tasks | Задачи: пример списка задач, теги, категория (Аудит/Рефакторинг/Анализ/Другое), «пути к папкам» (folder links). Всё в локальном state, без сохранения и без отправки на backend. |
|
||
| `/reglamenty` | Reglamenty | Раздел «Регламенты» (АРМАК, ФАА, ЕАСА, Mura Menasa) — заглушка/контент по ТЗ. |
|
||
| `/tmc-zakupki` | TMCZakupki | ТМЦ и закупки — заглушка. |
|
||
| `/finances` | Finances | Финансы — заглушка. |
|
||
| `/personnel` | Personnel | Персонал — заглушка. |
|
||
| `/documents` | Documents | Документы — заглушка. |
|
||
| `/chat` | ChatAgent | Чат с агентом: ввод сообщений, кнопки «Очистка чата» и «Откат» (откат последнего сообщения). Ответ — захардкоженная строка (имитация через setTimeout). |
|
||
| `/policies` | PolicyEngine | Движок политик — страница по маршруту, доступ с Dashboard. |
|
||
| `/audit` | AuditLogger | Журнал аудита — страница по маршруту, доступ с Dashboard. |
|
||
| `/secrets` | SecretsGuard | Защита секретов — страница по маршруту, доступ с Dashboard. |
|
||
| `*` | NotFound | Страница «не найдено». |
|
||
|
||
Страницы PolicyEngine, AuditLogger, SecretsGuard, Reglamenty, TMCZakupki, Finances, Personnel, Documents в отчёте не разбирались построчно — констатируются как реализованные экраны с навигацией; бизнес-логика (правила, логи, секреты, регламенты и т.д.) может быть минимальной или заглушками.
|
||
|
||
---
|
||
|
||
## 4. Backend (Rust / Tauri) и desktop-core
|
||
|
||
### 4.1. Что есть
|
||
|
||
- **main.rs:** точка входа, `windows_subsystem = "windows"` в release, вызов `app_lib::run()`.
|
||
- **lib.rs:** сборка приложения Tauri, в `setup` при `cfg!(debug_assertions)` подключается `tauri_plugin_log` (LevelFilter::Info), затем `run(tauri::generate_context!())`.
|
||
- **tauri.conf.json:** конфигурация окна, сборки, путей к UI (см. выше).
|
||
- **capabilities/default.json:** одно окно `main`, права `core:default`.
|
||
- **Cargo.toml:** зависимости — tauri 2.9.5, tauri-plugin-log 2, serde, serde_json, log; сборка — tauri-build 2.5.3.
|
||
|
||
Кастомных команд, обработчиков событий Tauri, доступа к файлам/сети из Rust — нет.
|
||
|
||
### 4.2. desktop-core
|
||
|
||
- В репозитории есть каталог `desktop-core/tools/project-auditor/` с файлом `index.ts`. Файл **пустой** — логика аудитора проекта в Tauri-приложении не реализована и из приложения не вызывается.
|
||
|
||
---
|
||
|
||
## 5. Промпты и ИИ
|
||
|
||
- В кодовой базе **papa-yu (Tauri + UI) нет ни одного промпта** к внешним ИИ/LLM и нет интеграции с API языковых моделей.
|
||
- **Чат с агентом** (`ChatAgent.tsx`): ответ агента — фиксированная строка: *«Ответ ИИ агента будет отображаться здесь. Результаты действий агента подключаются к backend.»* — выводится через `setTimeout` через 500 ms после отправки сообщения пользователем. То есть реализована только **заглушка диалога**; реальный диалог с ИИ и промпты планируются к подключению позже.
|
||
|
||
---
|
||
|
||
## 6. Связь с другими папками (по документации)
|
||
|
||
По файлу **СИНХРОНИЗАЦИЯ_ПАПОК.md**:
|
||
|
||
- **`~/Desktop/папа-ю`** — документация и ТЗ (спеки, планы). Кода нет; используется как ориентир.
|
||
- **`~/PAPA/PAPA-YU`** — полная версия на **Electron** + React (Dashboard, Tasks, Policy Engine, Chat и др.). Запуск: `npm run dev:electron` / `npm run build:electron`. Рассматривается как источник фич для переноса в Tauri-версию.
|
||
- **`~/papa-yu`** — основное десктоп-приложение на **Tauri** + React; единая точка запуска и текущая разработка.
|
||
|
||
Текущий отчёт относится только к коду в **`~/papa-yu`** (и при необходимости к упомянутому в нём `desktop-core` и `index/manifest.json`).
|
||
|
||
---
|
||
|
||
## 7. Краткие выводы
|
||
|
||
1. **Архитектура:** двухслойная — Tauri 2 (оболочка + лог в debug) и SPA на React 19 (Vite 7, HashRouter, Zustand, свой event-bus).
|
||
2. **Связи:** роутинг и store синхронизированы (currentRoute); навбар и Dashboard ведут на все заявленные страницы; event-bus и ErrorDisplay заложены, но мало задействованы; **обмена с Rust нет** — кастомных команд и invoke нет.
|
||
3. **Разделы:** все перечисленные в ТЗ маршруты присутствуют; часть страниц — заглушки или минимальный UI; задачи и чат работают только на клиенте (чат — с фиксированным ответом).
|
||
4. **Backend:** только запуск Tauri и плагин логов; desktop-core/project-auditor пустой.
|
||
5. **Промпты:** в проекте papa-yu промптов и интеграции с ИИ нет; чат — заглушка с текстом про будущее подключение к backend.
|
||
|
||
Документ подготовлен как отчёт по текущему состоянию программы **без предложений по исправлению кода**.
|