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