# Аудит программы 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).