186 lines
12 KiB
Markdown
186 lines
12 KiB
Markdown
# Аудит программы PAPA YU
|
||
|
||
**Дата:** 29 января 2026
|
||
**Объект:** приложение PAPA YU (Tauri 2 + React), репозиторий PAPA-YU.
|
||
|
||
---
|
||
|
||
## 1. Архитектура программы
|
||
|
||
### 1.1. Общая схема
|
||
|
||
| Слой | Технологии | Расположение |
|
||
|------|------------|--------------|
|
||
| **Backend** | Tauri 2, Rust | `desktop/src-tauri/` |
|
||
| **Frontend** | React 19, Vite 7, TypeScript | `desktop/ui/` |
|
||
| **Конфигурация** | tauri.conf.json, capabilities | `desktop/src-tauri/` |
|
||
|
||
- Одно окно приложения (title: «PAPA YU», 800×600, resizable).
|
||
- Frontend загружается в dev с `http://localhost:5173`, в production из `../ui/dist`.
|
||
|
||
### 1.2. Дерево каталогов (ключевое)
|
||
|
||
```
|
||
PAPA-YU/
|
||
├── desktop/
|
||
│ ├── src-tauri/ # Tauri (Rust)
|
||
│ │ ├── src/
|
||
│ │ │ ├── main.rs # точка входа → app_lib::run()
|
||
│ │ │ ├── lib.rs # Builder, плагины, invoke_handler
|
||
│ │ │ ├── types.rs # Action, AnalyzeReport, DiffItem, …
|
||
│ │ │ └── commands/
|
||
│ │ │ ├── mod.rs
|
||
│ │ │ ├── analyze_project.rs
|
||
│ │ │ ├── preview_actions.rs
|
||
│ │ │ ├── apply_actions.rs
|
||
│ │ │ └── undo_last.rs
|
||
│ │ ├── capabilities/default.json
|
||
│ │ ├── icons/ # иконки приложения (в т.ч. icon_source.png)
|
||
│ │ ├── Cargo.toml
|
||
│ │ └── tauri.conf.json
|
||
│ └── ui/ # React SPA
|
||
│ ├── src/
|
||
│ │ ├── App.tsx, main.tsx
|
||
│ │ ├── config/routes.ts
|
||
│ │ ├── store/app-store.ts
|
||
│ │ ├── lib/analyze.ts, event-bus.ts, anime-utils.ts
|
||
│ │ ├── components/layout/Layout.tsx, ErrorBoundary, ErrorDisplay
|
||
│ │ └── pages/ # Tasks, Dashboard, Reglamenty, …
|
||
│ ├── public/logo-papa-yu.png
|
||
│ ├── package.json
|
||
│ └── vite.config.ts
|
||
├── desktop-core/tools/project-auditor/ # index.ts (минимально/пусто)
|
||
├── index/manifest.json # version, sources
|
||
├── PAPA YU.command # скрипт запуска .app
|
||
├── СБОРКА_И_ОБНОВЛЕНИЯ.md
|
||
├── ОТЧЁТ_ПО_ПРОГРАММЕ.md
|
||
└── СИНХРОНИЗАЦИЯ_ПАПОК.md
|
||
```
|
||
|
||
### 1.3. Backend (Rust)
|
||
|
||
- **Плагины:** dialog, updater, process; в debug — log.
|
||
- **Команды (invoke):** `analyze_project`, `preview_actions`, `apply_actions`, `undo_last`.
|
||
- **Типы:** Action, ActionKind, AnalyzeReport, PreviewResult, ApplyResult, UndoResult, DiffItem и др. (см. `types.rs`).
|
||
|
||
### 1.4. Frontend (React)
|
||
|
||
- **Роутинг:** HashRouter, маршруты в `config/routes.ts` и `App.tsx`.
|
||
- **Состояние:** Zustand (`store/app-store.ts`): currentRoute, systemStatus, recentAuditEvents, error.
|
||
- **Связь с backend:** вызовы `invoke()` из `lib/analyze.ts` (analyze_project) и из `pages/Tasks.tsx` (preview_actions, apply_actions, undo_last).
|
||
- **События:** `listen('analyze_progress')` в Tasks; eventBus (NAVIGATE, ROUTE_CHANGED) в Layout.
|
||
|
||
---
|
||
|
||
## 2. Пути запуска
|
||
|
||
| Способ | Путь / команда | Примечание |
|
||
|--------|----------------|------------|
|
||
| Разработка | `cd ~/PAPA-YU/desktop/src-tauri` → `cargo tauri dev` | Поднимает UI на порту 5173, открывает окно |
|
||
| Запуск .app (после сборки) | `~/PAPA-YU/desktop/src-tauri/target/release/bundle/macos/PAPA YU.app` | Двойной клик или `open "…/PAPA YU.app"` |
|
||
| Скрипт в корне проекта | `~/PAPA-YU/PAPA YU.command` | Запускает указанный .app; если его нет — предлагает собрать |
|
||
| DMG (установка) | `~/PAPA-YU/desktop/src-tauri/target/release/bundle/dmg/` | После `cargo tauri build`; пользователь открывает DMG и перетаскивает приложение в «Программы» |
|
||
| Сборка | `cd ~/PAPA-YU/desktop/src-tauri` → `cargo tauri build` | beforeBuildCommand: сборка UI из `$HOME/PAPA-YU/desktop/ui` |
|
||
|
||
**Жёстко заданные пути в конфиге:**
|
||
- `tauri.conf.json` → `build.beforeDevCommand` и `beforeBuildCommand`: `$HOME/PAPA-YU/desktop/ui`.
|
||
- `build.frontendDist`: `../ui/dist` (относительно src-tauri).
|
||
|
||
---
|
||
|
||
## 3. Связи и ссылки
|
||
|
||
### 3.1. Внешние
|
||
|
||
| Назначение | URL / значение |
|
||
|------------|----------------|
|
||
| Обновления (updater) | `https://github.com/yrippert-maker/papayu/releases/latest/download/latest.json` |
|
||
| Репозиторий (по документации) | `https://github.com/yrippert-maker/papayu` |
|
||
|
||
### 3.2. Внутренние (Frontend ↔ Backend)
|
||
|
||
| UI | Команда Tauri | Файл |
|
||
|----|----------------|------|
|
||
| Анализ проекта | `analyze_project(path)` | `lib/analyze.ts` → `invoke('analyze_project', { path })` |
|
||
| Предпросмотр изменений | `preview_actions(payload)` | `Tasks.tsx` → `invoke('preview_actions', { payload })` |
|
||
| Применить изменения | `apply_actions(payload)` | `Tasks.tsx` → `invoke('apply_actions', { payload })` |
|
||
| Откат | `undo_last(path)` | `Tasks.tsx` → `invoke('undo_last', { path })` |
|
||
|
||
### 3.3. События (Backend → Frontend)
|
||
|
||
| Событие | Где эмитится | Где слушается |
|
||
|---------|--------------|----------------|
|
||
| `analyze_progress` | analyze_project.rs, apply_actions.rs, preview_actions.rs, undo_last.rs | Tasks.tsx |
|
||
|
||
### 3.4. Права (capabilities)
|
||
|
||
- `core:default`, `dialog:allow-open`, `core:event:allow-listen`, `updater:default`, `process:allow-restart`.
|
||
|
||
---
|
||
|
||
## 4. Маршруты UI
|
||
|
||
| Путь | Страница | Доступ |
|
||
|------|----------|--------|
|
||
| `/` | Редирект на `/tasks` | — |
|
||
| `/tasks` | Tasks (анализ проекта) | Навбар |
|
||
| `/control-panel` | Dashboard | Навбар |
|
||
| `/reglamenty` | Reglamenty | Нет в навбаре (прямой URL) |
|
||
| `/tmc-zakupki`, `/finances`, `/personnel` | TMCZakupki, Finances, Personnel | Нет в навбаре |
|
||
| `/chat` | Редирект на `/tasks` | — |
|
||
| `/policies`, `/audit`, `/secrets` | PolicyEngine, AuditLogger, SecretsGuard | Прямой URL / с Dashboard |
|
||
| `*` | NotFound | — |
|
||
|
||
---
|
||
|
||
## 5. Отчёт об ошибках
|
||
|
||
### 5.1. Ошибка в интерфейсе: «Could not fetch a valid…»
|
||
|
||
**Симптом:** Рядом с логотипом в шапке приложения отображается сообщение вида «Could not fetch a valid...» (обрезка полного текста).
|
||
|
||
**Причина:** Это результат нажатия кнопки «Проверить обновления» (иконка загрузки рядом с логотипом). Плагин updater вызывает `check()` по endpoint
|
||
`https://github.com/yrippert-maker/papayu/releases/latest/download/latest.json`.
|
||
Ошибка возникает, когда:
|
||
1. На GitHub нет релиза с файлом `latest.json`, или
|
||
2. В `tauri.conf.json` в `plugins.updater.pubkey` указана заглушка `REPLACE_WITH_PUBLIC_KEY_AFTER_tauri_signer_generate`, или
|
||
3. Ответ сервера не прошёл проверку подписи/формата.
|
||
|
||
**Рекомендации:**
|
||
- Для отключения проверки обновлений до настройки: не показывать текст ошибки в шапке постоянно; показывать только после нажатия кнопки и обрабатывать «нет обновлений» и сетевые ошибки отдельно (например, тост «Обновлений нет» / «Ошибка сети»).
|
||
- Для включения обновлений: сгенерировать ключи (`tauri signer generate`), подставить публичный ключ в `tauri.conf.json`, публиковать подписанные артефакты и `latest.json` в GitHub Releases (см. `СБОРКА_И_ОБНОВЛЕНИЯ.md`).
|
||
|
||
### 5.2. Конфигурация updater
|
||
|
||
- **Проблема:** `pubkey` в `tauri.conf.json` — строка-заглушка; проверка подписи обновлений не может пройти.
|
||
- **Действие:** Заменить на реальный публичный ключ после `tauri signer generate` или временно не показывать пользователю сырое сообщение об ошибке updater.
|
||
|
||
### 5.3. Зависимость путей от $HOME
|
||
|
||
- **Проблема:** Сборка и dev зависят от путей `$HOME/PAPA-YU/desktop/ui`. При переносе проекта или другом имени пользователя команды могут не найти каталог.
|
||
- **Действие:** Либо сохранять единый стандарт размещения (например, всегда `~/PAPA-YU`), либо вынести путь в переменную окружения и использовать её в конфиге/скриптах.
|
||
|
||
### 5.4. Скрипт PAPA YU.command
|
||
|
||
- **Проблема:** Ищет .app в `$ROOT/desktop/src-tauri/target/release/bundle/macos`, где `ROOT` — каталог, откуда запущен скрипт. Если скрипт вызывается не из корня PAPA-YU, путь будет неверным.
|
||
- **Действие:** Либо всегда запускать из корня проекта, либо задать ROOT явно (например, по фиксированному пути или по расположению скрипта с учётом известной структуры папок).
|
||
|
||
### 5.5. desktop-core и index
|
||
|
||
- `desktop-core/tools/project-auditor/index.ts` — по сути пустой/минимальный; не используется из основного приложения.
|
||
- `index/manifest.json` — только `version` и пустой `sources`; связь с Tauri/UI не прослеживается.
|
||
|
||
---
|
||
|
||
## 6. Сводка
|
||
|
||
| Раздел | Статус |
|
||
|--------|--------|
|
||
| Архитектура (Tauri + React, команды, плагины) | Описана, связи учтены |
|
||
| Пути запуска (dev, .app, DMG, скрипт) | Зафиксированы |
|
||
| Связи (invoke, события, endpoint обновлений) | Перечислены |
|
||
| Ошибка «Could not fetch a valid…» | Объяснена (updater + pubkey/релизы), даны рекомендации |
|
||
| Конфиг updater и пути $HOME | Отмечены как зоны внимания |
|
||
|
||
Рекомендуется: (1) скрыть или смягчить отображение ошибки updater до настройки подписи и релизов; (2) подставить реальный `pubkey` и настроить публикацию `latest.json` при желании использовать обновления; (3) зафиксировать в документации единый путь установки/запуска (например, `~/PAPA-YU` и запуск через `PAPA YU.command` или установку из DMG).
|