# AGENTS.md ## Назначение ProxyWarden — standalone Windows desktop-приложение для удобного per-app proxy routing. Стек: Tauri 2, Rust backend, React/TypeScript frontend, Vite, PowerShell installer/control scripts. Приложение управляет выбранными Windows-приложениями через ProxiFyre и, опционально, через локальный sing-box runtime. Этот файл — главный контракт для кодового агента. Любой агент, который меняет репозиторий, обязан соблюдать эти правила. Да, даже если ему очень хочется «быстренько поправить одну кнопочку» и случайно переписать половину сетевого стека. Особенно тогда. ## Продуктовая рамка Проект не должен превращаться в коммерческий SaaS, Node gateway, VPN-провайдер, proxy server или облачный control plane. Это локальная Windows-утилита для себя и друзей. Цель: надежно и понятно конфигурировать маршрутизацию выбранных приложений через внешний SOCKS5 proxy или через локальный sing-box, не ломая системную сеть и не пряча опасные действия за безобидными кнопками. ## Архитектурные инварианты - Control App, ProxiFyre и Local sing-box — разные компоненты. Не смешивать их ответственность. - ProxiFyre — обязательный слой для per-app routing. - Local sing-box — optional runtime. Внешний SOCKS5 flow обязан работать без sing-box. - React UI не пишет generated config напрямую. UI вызывает typed Tauri commands. - `src/api/tauriCommands.ts` — единственная TypeScript-обертка над `invoke(...)`. - Rust backend отвечает за storage, validation, config generation, component detection, service/install orchestration и structured errors. - `C:\ProgramData\ProxyWarden\config` и `C:\ProgramData\ProxyWarden\state` — source of truth. - `C:\ProgramData\ProxyWarden\generated\proxifyre-app-config.json` и `sing-box-config.json` — derived artifacts. Их можно пересоздавать. - Install/start/stop/uninstall — только явные действия пользователя. `apply` не должен скрыто устанавливать, удалять или «чинить» компоненты. - Subscription URL, credentials, proxy passwords и userinfo нельзя выводить полностью в UI, logs, diagnostics, crash text или activity. - Summary panel должен оставаться read-only: без install/start/stop/apply/delete/input/subscription mutations. - Любые elevated операции должны быть максимально явными и проверяемыми. ## Основная структура ```text src/ api/tauriCommands.ts # typed invoke facade app/App.tsx # текущая UI orchestration зона, слишком крупная app/readiness.ts # apply gating logic app/viewModel.ts # display/view helpers domain/types.ts # TypeScript DTO mirror ui/* # reusable presentational components styles/app.css # основной CSS src-tauri/ tauri.conf.json # Tauri config, security, window config capabilities/default.json # Tauri permissions/capabilities src/models.rs # Rust domain models/defaults src/validation.rs # normalization/validation src/storage.rs # JSON storage, tmp/bak writes src/activity.rs # activity log src/subscription.rs # subscription fetch/parse src/component_detection.rs # ProxiFyre/sing-box detection src/singbox_service.rs # sing-box Windows service logic src/process.rs # process/system helpers src/helper.rs # helper/elevation boundary src/adapters/* # ProxiFyre/sing-box/proxy-router adapters src/commands.rs # Tauri command handlers; currently too large tests/* # Rust integration/domain tests scripts/ install-control-app.ps1 install-proxyfier.ps1 install-singbox.ps1 prepare-release.ps1 ``` ## Агентские skill-модули Подробные инструкции лежат в `.agent/skills`: - `.agent/skills/repository-orientation/SKILL.md` — как быстро понять репозиторий. - `.agent/skills/rust-tauri-backend/SKILL.md` — Rust/Tauri backend changes. - `.agent/skills/react-typescript-ui/SKILL.md` — frontend/UI changes. - `.agent/skills/security-hardening/SKILL.md` — CSP, секреты, temp files, storage, SSRF, elevated boundary. - `.agent/skills/windows-services-powershell/SKILL.md` — Windows service/install/PowerShell изменения. - `.agent/skills/subscriptions-routing/SKILL.md` — subscription, sing-box, ProxiFyre routing. - `.agent/skills/testing-ci-release/SKILL.md` — проверки, CI, release hygiene. - `.agent/skills/communication-reporting/SKILL.md` — короткие понятные планы, ревью и отчеты с таблицами файлов. Перед сложным изменением прочитать релевантный skill. Перед любым нетривиальным ответом владельцу проекта — прочитать `communication-reporting`. Да, инструкция про то, как не писать кашу, теперь тоже инструкция. Так мы и живем. ## Стиль общения агента Пользователь — разработчик, но ему не нужен роман о каждом `match`, `useState` и переименованном импорте. Писать надо как для человека, которому нужно быстро принять решение: что изменилось, где изменилось, зачем и что проверить. Перед любым нетривиальным ответом прочитать `.agent/skills/communication-reporting/SKILL.md` и перед финальным сообщением пройти `.agent/checklists/communication.md`. ### Обязательные правила - Сначала результат, потом детали. - Короткие абзацы, списки и таблицы вместо полотна текста. - Для нетривиальных изменений использовать таблицу `Файл / Что изменилось / Зачем`. - Не объяснять каждую строку. Объяснять важные места, решения, риски и поведение. - Технические термины использовать только когда они помогают. Сложный термин объяснять одной простой фразой. - Проверки делить на выполненные, не выполненные и требующие Windows/manual check. - Для ревью группировать находки по приоритетам: `Критично`, `Важно`, `Можно потом`, `Косметика`. - Не писать корпоративный туман вроде «улучшена архитектура» без указания, что именно стало проще, безопаснее или понятнее. - Не заявлять “всё проверено”, если Rust tests, Windows service flow, Tauri build или UAC сценарии не запускались. ### Минимальный формат финального ответа ```md ## Коротко - 1-3 главных результата. ## Файлы | Файл | Что изменилось | Зачем | |---|---|---| | `path/file` | простое описание | практическая причина | ## Проверки | Проверка | Статус | Комментарий | |---|---|---| | `command` | выполнено / не выполнено | почему | ## Риски - Что осталось проверить или почему риска нет. ``` Если задача маленькая, формат можно сжать до нескольких строк. Если задача security/service/storage/routing-sensitive, детали обязательны, потому что «ну вроде работает» — это не инженерный метод, а жанр народного фольклора. ## Правила изменений ### Backend - Не добавлять новую Tauri command без typed wrapper в `src/api/tauriCommands.ts` и соответствующего TypeScript DTO в `src/domain/types.ts`, если command используется UI. - Не возвращать raw strings для сложных ошибок. Использовать structured error DTO: `code`, `message`, `details`. - Тяжелые или блокирующие операции должны быть `async` command + `tauri::async_runtime::spawn_blocking`. - Не вызывать network/process/service/file-heavy logic прямо из async runtime thread. - Не использовать `unwrap()`/`expect()` в production path, кроме очевидно невозможных bootstrap cases с комментарием. - Не писать generated configs неатомарно. Использовать temp + backup + rename where practical. - Не расширять `commands.rs` без необходимости. Для новой логики предпочитать отдельные модули и thin command wrapper. ### Frontend - Не увеличивать `App.tsx`, если можно вынести hook/helper/component. - Не вызывать `invoke(...)` напрямую вне `src/api/tauriCommands.ts`. - Не дублировать apply-readiness проверки в JSX. Расширять `src/app/readiness.ts`. - Для UI использовать существующие компоненты из `src/ui`. - Apply/start/install/delete buttons должны иметь disabled state и понятную причину. - Не показывать secrets. Для subscription/proxy URL использовать redacted display values. - UI должен оставаться compact Windows utility, а не SaaS dashboard с иллюзией корпоративной важности. ### Security - Не отключать CSP. Если CSP мешает, исправлять source policy, а не ставить `csp: null`. - Не добавлять Tauri shell permissions без жесткого scope и отдельного обоснования. - Не запускать произвольные команды из UI input. - Runtime-generated elevated scripts должны использовать непредсказуемые имена, safe directory/ACL и cleanup best-effort. - Удаление директорий допускается только после safe-path/marker/service-path checks. - Subscription fetch должен иметь timeout и защиту от очевидно опасных/local metadata адресов либо explicit allow-mode. ### Windows/service boundary - `-PlanOnly` у PowerShell scripts должен оставаться side-effect-free и возвращать structured JSON. - Install/start/stop/uninstall должны быть явными user actions. - Fuzzy-detected service не считать managed service без проверки `PathName`/metadata. - В Linux/macOS CI не пытаться «проверить» Windows service operations как реальные. Тестировать pure logic/mocks. ## Известный технический долг - `src-tauri/src/commands.rs` слишком большой. Главная цель рефакторинга: разрезать на модули по use-case. - `src/app/App.tsx` слишком большой. Главная цель frontend-рефакторинга: hooks/components/view-model helpers. - `tauri.conf.json` сейчас требует security review, особенно CSP и window resize settings. - JSON storage молча возвращает default при invalid JSON. Нужен corruption recovery через `.bak` и user-visible warning. - ProxiFyre config apply должен стать atomic. - Subscription URL redaction должен исключать userinfo/password. - Link subscription parser сейчас ориентирован на VLESS; не обещать больше, чем реально поддерживается. - Ping/select по server tag может ломаться при duplicate tags. Нужен stable server id. ## Минимальная проверка перед ответом Для docs-only изменений достаточно проверить структуру файлов и отсутствие очевидных Markdown/JSON ошибок. Для frontend изменений: ```powershell npm ci npm run build ``` Для Rust/backend изменений: ```powershell cd src-tauri cargo fmt --all -- --check cargo clippy --all-targets --all-features -- -D warnings cargo test --all-targets ``` Для Tauri/toolchain: ```powershell npm run tauri -- info npm run tauri -- dev npm run tauri -- build ``` Для installer boundaries: ```powershell & .\scripts\install-control-app.ps1 -PlanOnly & .\scripts\install-proxyfier.ps1 -PlanOnly & .\scripts\install-singbox.ps1 -PlanOnly ``` Не оставлять dev/preview/Tauri dev servers запущенными после проверки. ## Формат отчета агента Использовать один из шаблонов: - `.agent/templates/work-plan.md` — короткий план перед работой. - `.agent/templates/change-report.md` — отчет после изменения кода. - `.agent/templates/investigation-report.md` — аудит, расследование, разбор проблемы. - `.agent/templates/user-facing-summary.md` — краткая сводка для владельца проекта. - `.agent/templates/pr-description.md` — описание PR. Каждый нетривиальный ответ должен отвечать на вопросы: 1. Что поменялось или найдено? 2. В каких файлах? 3. Зачем это нужно? 4. Что проверено? 5. Что не проверено? 6. Где остался риск? Не писать «всё готово», если Windows/elevated/service flow не проверялся на Windows. Эта фраза и так слишком много навредила миру.