- Rust 69.4%
- Svelte 27.5%
- TypeScript 1.6%
- HTML 0.9%
- Python 0.5%
|
|
||
|---|---|---|
| assets | ||
| docs | ||
| scripts | ||
| src | ||
| src-tauri | ||
| .gitignore | ||
| CHANGELOG.md | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
FAN Store Manager
Кросс-платформенный десктоп для управления серверным репозиторием FAN Store
Описание
FAN Store Manager — кросс-платформенное десктоп-приложение на Tauri 2 + SvelteKit 2 для визуального управления серверным репозиторием FAN Store. Заменяет CLI-скрипты fan-store / fan-store.ps1, добавляя SSH/SFTP-подключение, drag-n-drop загрузку пакетов, управление дистрибутивами fan с rollback, атомарные операции с backup/rollback и прогресс-бары для всех transfer-операций.
Один пользователь (разработчик FAN), личный рабочий инструмент.
Возможности
- SSH-подключение — подключение по ключу (ed25519/RSA), тест соединения, хранение настроек в локальном store
- Browse — визуальное дерево каталогов сервера (
packages/,dist/,releases/), JSON viewer с подсветкой синтаксиса - Загрузка пакетов — drag-n-drop
.tar.gz, инспекция метаданных, SHA-256, обновлениеindex.json - Загрузка дистрибутивов — 5 платформ (
darwin-arm64,darwin-x64,linux-arm64,linux-x64,windows-x64), валидация версий, активация черезmanifest.json - Откат fan — 3 режима: только смена активной версии / удаление новых / архивация в
releases/ - Удаление пакетов — 3 режима: только из индекса / полное удаление / архивация в
releases/ - Атомарные операции — backup → операция → verify → rollback при ошибке (все модули в
ops/) - Прогресс — стриминг progress-событий через Tauri Channel с процентами и ETA
- Dry-run — просмотр эффекта операции без внесения изменений на сервере
- Auto-reconnect — reconnect с exponential backoff при разрыве SSH-сессии
Стек
| Компонент | Технология |
|---|---|
| Каркас | Tauri 2 |
| Frontend | SvelteKit 2 (Svelte 5) |
| Стили | Tailwind CSS 4 |
| Сборка | Vite 8 |
| Адаптер | @sveltejs/adapter-static (SPA mode) |
| SSH/SFTP | russh 0.50 + russh-sftp 2 |
| Хеширование | sha2 0.10 |
| Архивы | tar 0.4 + flate2 1 |
| Сериализация | serde + serde_json |
| Async | tokio (full features) |
| Ошибки | thiserror 2 |
| Логи | log 0.4 |
Prerequisites
- Node.js 18+
- Rust 1.70+
- Tauri 2 CLI:
cargo install tauri-cli - Системные зависимости: Tauri prerequisites
- Windows: WebView2 Runtime (обычно предустановлен)
- macOS: Xcode Command Line Tools
- Linux:
gtk3,webkit2gtk-4.1,libayatana-appindicator3-dev
Установка и запуск
# Клонировать
git clone <repo-url>
cd fan-store-manager
# Установить зависимости
npm install
# Development mode
npm run tauri dev
# Build
npm run tauri build
Scripts
| Команда | Описание |
|---|---|
npm run dev |
Vite dev server (фронтенд) |
npm run tauri dev |
Tauri dev (бэкенд + фронтенд) |
npm run build |
Production build фронтенда |
npm run preview |
Preview production build |
npm run check |
Svelte type-check |
Структура проекта
fan-store-manager/
├── src-tauri/ # Rust backend (Tauri core)
│ ├── src/
│ │ ├── main.rs # Tauri entrypoint + plugin registration
│ │ ├── ssh_client.rs # SSH client (russh): connect, auth, session
│ │ ├── sftp_ops.rs # SFTP primitives: list, read, write, upload, download
│ │ ├── archive_inspect.rs # Read package.json from .tar.gz (tar + flate2)
│ │ ├── hash.rs # SHA-256 utilities
│ │ ├── index_json.rs # Parse / update index.json
│ │ ├── manifest_json.rs # Parse / update manifest.json
│ │ ├── atomic.rs # Atomic ops: backup → execute → verify → rollback
│ │ ├── commands.rs # Tauri IPC command handlers
│ │ ├── progress.rs # Progress event streaming via Tauri Channel
│ │ ├── ops/ # Business operations
│ │ │ ├── mod.rs # Module exports
│ │ │ ├── upload_package.rs # Upload extension/skill/theme
│ │ │ ├── upload_dist.rs # Upload fan distributions (5 platforms)
│ │ │ ├── rollback_fan.rs # 3 rollback modes
│ │ │ └── delete_package.rs # 3 delete modes
│ │ └── lib.rs # Library root
│ ├── Cargo.toml
│ ├── tauri.conf.json
│ ├── capabilities/default.json
│ ├── build.rs
│ └── icons/ # App icons (multi-platform)
├── src/ # SvelteKit frontend
│ ├── routes/
│ │ ├── +layout.svelte # App shell (sidebar + header)
│ │ ├── +layout.ts # ssr = false (SPA mode)
│ │ ├── +page.svelte # Root redirect
│ │ ├── connect/ # SSH connection page
│ │ ├── browse/ # Server directory tree
│ │ ├── upload/ # Package upload
│ │ ├── dist/ # Distribution management
│ │ ├── versions/ # Version management + rollback
│ │ └── packages/ # Package list + deletion
│ └── lib/
│ ├── components/ # UI components
│ │ ├── confirm-dialog.svelte # Preview + confirm modal
│ │ ├── file-tree.svelte # Server directory tree
│ │ ├── json-viewer.svelte # Syntax-highlighted JSON
│ │ └── progress-bar.svelte # Upload/operation progress
│ ├── stores/ # Svelte stores
│ │ ├── connection.ts # Connection state
│ │ └── operations.ts # Active operations + progress
│ └── utils/
│ └── format.ts # File size / date formatting
├── docs/ # Documentation
│ ├── specs/ # Feature specifications
│ │ └── spec_fan-store-manager_2026-07-20.md
│ └── features/ # Roadmaps & reports
│ └── fan-store-manager/
├── svelte.config.js
│ vite.config.ts
├── tsconfig.json
├── tailwind.config.ts
└── package.json
Серверная структура
Приложение управляет следующей структурой на сервере (/opt/repos/fan-store/):
/opt/repos/fan-store/
├── index.json # Индекс всех пакетов
├── packages/ # Текущие версии пакетов (*.tar.gz)
├── dist/ # Дистрибутивы fan
│ └── manifest.json # Активная версия + платформы
└── releases/ # Архивные версии (long-term storage)
Форматы данных
index.json — индекс пакетов:
{
"packages": {
"<name>": {
"name": "string",
"version": "string",
"type": "extension | skill | theme",
"filename": "string",
"sha256": "string",
"size": number,
"uploadedAt": "ISO-8601"
}
}
}
manifest.json — активные дистрибутивы:
{
"latest": "string (semver)",
"releasedAt": "ISO-8601",
"platforms": {
"<platform>": { "filename": "string", "sha256": "string", "size": number }
}
}
Платформы: darwin-arm64, darwin-x64, linux-arm64, linux-x64, windows-x64.
Лицензия
Private tool — not for distribution.