papayu/#U0410#U0423#U0414#U0418#U0422_#U041f#U0420#U041e#U0413#U0420#U0410#U041c#U041c#U042b.md
2026-02-11 22:00:43 +03:00

186 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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