4.4 KiB
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
Для тяжелых операций:
#[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:
- Rust input/output DTO.
- TypeScript DTO in
src/domain/types.ts. - Wrapper in
src/api/tauriCommands.ts. - UI usage.
- 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 слишком большой. Новую логику по возможности выносить:
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 -- --checkcargo clippy --all-targets --all-features -- -D warningscargo test --all-targets- Relevant Windows/manual check if touching service/install/elevation.
Если cargo недоступен в среде, честно написать, что backend проверен только статически. Не изображать компилятор, у него и так тяжелая жизнь.
Как отчитываться
Перед финальным ответом применить .agent/skills/communication-reporting/SKILL.md и .agent/checklists/communication.md.
Минимум для нетривиальной задачи:
- короткая сводка;
- таблица файлов
Файл / Что изменилось / Зачем; - важные места без пересказа каждой строки;
- что проверено;
- что не проверено;
- конкретные риски.