Аудит программы 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.
Ошибка возникает, когда:
- На GitHub нет релиза с файлом
latest.json, или
- В
tauri.conf.json в plugins.updater.pubkey указана заглушка REPLACE_WITH_PUBLIC_KEY_AFTER_tauri_signer_generate, или
- Ответ сервера не прошёл проверку подписи/формата.
Рекомендации:
- Для отключения проверки обновлений до настройки: не показывать текст ошибки в шапке постоянно; показывать только после нажатия кнопки и обрабатывать «нет обновлений» и сетевые ошибки отдельно (например, тост «Обновлений нет» / «Ошибка сети»).
- Для включения обновлений: сгенерировать ключи (
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).