107 lines
4.4 KiB
Markdown
107 lines
4.4 KiB
Markdown
# Skill: Rust / Tauri Backend
|
|
|
|
## Когда использовать
|
|
|
|
Используй этот skill при изменениях в `src-tauri`, Tauri commands, Rust models, validation, storage, adapters, component detection, subscription fetching, config generation или service orchestration.
|
|
|
|
## Главная цель
|
|
|
|
Держать backend надежным, типизированным и безопасным. Backend управляет системой пользователя, поэтому «ну вроде работает» здесь примерно как инструкция по посадке самолета, написанная на салфетке.
|
|
|
|
## Инварианты
|
|
|
|
- Tauri command layer должен быть thin boundary, а не склад всей бизнес-логики.
|
|
- Долгие/blocking операции не должны выполняться на async runtime thread.
|
|
- Все ошибки, которые видит UI, должны быть structured and actionable.
|
|
- Validation должна происходить на backend даже если UI уже проверяет input.
|
|
- Generated config writes должны быть atomic where practical.
|
|
- Secrets never logged or fully displayed.
|
|
|
|
## Preferred command pattern
|
|
|
|
Для тяжелых операций:
|
|
|
|
```rust
|
|
#[tauri::command]
|
|
pub async fn some_command(input: SomeInput) -> Result<SomeOutput, CommandError> {
|
|
tauri::async_runtime::spawn_blocking(move || some_command_impl(input))
|
|
.await
|
|
.map_err(background_task_error)?
|
|
}
|
|
```
|
|
|
|
Implementation function должна быть тестируемой без Tauri runtime, если возможно.
|
|
|
|
## DTO boundary
|
|
|
|
При добавлении или изменении command:
|
|
|
|
1. Rust input/output DTO.
|
|
2. TypeScript DTO in `src/domain/types.ts`.
|
|
3. Wrapper in `src/api/tauriCommands.ts`.
|
|
4. UI usage.
|
|
5. Tests for pure logic.
|
|
|
|
Не использовать `serde_json::Value` как permanent API, если структура известна.
|
|
|
|
## Error handling
|
|
|
|
- Не использовать `unwrap()`/`expect()` в production path.
|
|
- Возвращать `CommandError { code, message, details }`.
|
|
- Для validation использовать список проблем, а не первую попавшуюся ошибку.
|
|
- Internal error text не должен раскрывать secrets.
|
|
- Если операция partial, вернуть partial state/result where possible.
|
|
|
|
## Storage
|
|
|
|
При изменении `storage.rs`:
|
|
|
|
- Keep tmp + bak write pattern.
|
|
- Не превращать invalid JSON в default молча. Prefer corruption backup/restore path.
|
|
- Для critical writes использовать same-directory temp file and rename.
|
|
- Не хранить derived artifacts как source of truth.
|
|
- Не хранить raw subscription/proxy secrets в activity log.
|
|
|
|
## Refactoring guidance
|
|
|
|
`src-tauri/src/commands.rs` слишком большой. Новую логику по возможности выносить:
|
|
|
|
```text
|
|
commands/dto.rs
|
|
commands/status.rs
|
|
commands/profiles.rs
|
|
commands/targets.rs
|
|
commands/components.rs
|
|
commands/subscription.rs
|
|
commands/proxifyre.rs
|
|
commands/singbox.rs
|
|
services/elevated.rs
|
|
services/powershell.rs
|
|
services/proxifyre_service.rs
|
|
services/singbox_service.rs
|
|
```
|
|
|
|
При рефакторинге сохранять external command names, чтобы UI не ломался без причины.
|
|
|
|
## Validation checklist
|
|
|
|
- `cargo fmt --all -- --check`
|
|
- `cargo clippy --all-targets --all-features -- -D warnings`
|
|
- `cargo test --all-targets`
|
|
- Relevant Windows/manual check if touching service/install/elevation.
|
|
|
|
Если `cargo` недоступен в среде, честно написать, что backend проверен только статически. Не изображать компилятор, у него и так тяжелая жизнь.
|
|
|
|
## Как отчитываться
|
|
|
|
Перед финальным ответом применить `.agent/skills/communication-reporting/SKILL.md` и `.agent/checklists/communication.md`.
|
|
|
|
Минимум для нетривиальной задачи:
|
|
|
|
- короткая сводка;
|
|
- таблица файлов `Файл / Что изменилось / Зачем`;
|
|
- важные места без пересказа каждой строки;
|
|
- что проверено;
|
|
- что не проверено;
|
|
- конкретные риски.
|