# Project Tasks: Кроссплатформенный Менеджер Паролей > [!NOTE] > Каждый тикет — одна атомарная единица работы: её можно взять, выполнить и смержить независимо от других. > Архитектурные решения описаны в [ARCHITECTURE.md](file:///Users/aleksandrebaklakov/Documents/Code/utils/abdristus/docs/ARCHITECTURE.md). --- ## `[INFRA]` — Инициализация и Инфраструктура - [x] **INFRA-01** Создать Tauri-проект (`tauri init`) с базовой конфигурацией `tauri.conf.json` - [x] **INFRA-02** Создать Angular-проект с флагом `--standalone` (без NgModules) - [x] **INFRA-03** Настроить Rust-зависимости в `Cargo.toml`: `argon2`, `chacha20poly1305`, `sqlx`, `keyring`, `uuid` - [x] **INFRA-04** Настроить npm-зависимости: `@tauri-apps/api`, `rxjs`, установить ESLint + строгий TypeScript - [x] **INFRA-05** Настроить `tauri-plugin-global-shortcut` в `main.rs` - [x] **INFRA-06** Настроить глобальные CSS-переменные и тему (цвета, типографику из `DESIGN.md`) --- ## `[CRYPTO]` — Криптография (Rust · `core/crypto.rs`) - [ ] **CRYPTO-01** Реализовать генерацию случайной соли (`rand`) для Argon2id - [ ] **CRYPTO-02** Реализовать деривацию ключа DEK из Мастер-пароля через Argon2id (параметры: 2 прохода, ≥64 МБ) - [ ] **CRYPTO-03** Реализовать шифрование данных через XChaCha20-Poly1305 (возвращает `nonce` + `ciphertext`) - [ ] **CRYPTO-04** Реализовать дешифрование данных через XChaCha20-Poly1305 (принимает `nonce` + `ciphertext`) - [ ] **CRYPTO-05** Написать unit-тесты: шифрование → дешифрование возвращает исходные данные - [ ] **CRYPTO-06** Написать unit-тест: неверный nonce вызывает ошибку аутентификации --- ## `[PASSGEN]` — Генератор Паролей (Rust · `core/password_gen.rs`) - [ ] **PASSGEN-01** Реализовать генерацию пароля заданной длины из набора символов (буквы, цифры) - [ ] **PASSGEN-02** Добавить поддержку флага включения специальных символов - [ ] **PASSGEN-03** Написать unit-тест: результат соответствует заданным параметрам (длина, набор символов) --- ## `[DB]` — База Данных (Rust · `database/`) - [ ] **DB-01** Написать SQL-схему для таблицы `accounts` (`database/schema.sql`): поля `id`, `service_name`, `encrypted_data`, `nonce`, `updated_at`, `is_deleted` - [ ] **DB-02** Реализовать функцию создания/открытия изолированного файла БД `vault_.sqlite` (`database/repository.rs`) - [ ] **DB-03** Определить Rust-структуры для маппинга таблиц БД (`database/models.rs`) - [ ] **DB-04** Реализовать `INSERT` — добавление новой зашифрованной записи (`repository.rs`) - [ ] **DB-05** Реализовать `SELECT` — получение всех записей по `vault_id` (с фильтром `is_deleted = false`) - [ ] **DB-06** Реализовать `UPDATE` — обновление записи и её поля `updated_at` - [ ] **DB-07** Реализовать `UPDATE` — Soft-delete записи (установка `is_deleted = true`) - [ ] **DB-08** Написать integration-тест для каждой операции репозитория (CRUD) --- ## `[AUTH]` — Аутентификация (Rust · `commands/auth.rs`) - [ ] **AUTH-01** Реализовать IPC-команду `unlock_vault`: принимает Мастер-пароль, возвращает успех/ошибку - [ ] **AUTH-02** Реализовать сохранение DEK в системный Keyring после успешного ввода Мастер-пароля (macOS Keychain) - [ ] **AUTH-03** Реализовать сохранение DEK в системный Keyring (Windows Credential Manager) - [ ] **AUTH-04** Реализовать IPC-команду `unlock_vault_biometric`: вытащить DEK из Keyring через biometric prompt (macOS Touch ID) - [ ] **AUTH-05** Реализовать IPC-команду `unlock_vault_biometric`: вытащить DEK из Keyring через biometric prompt (Windows Hello) - [ ] **AUTH-06** Реализовать IPC-команду `lock_vault`: сбросить сессионный DEK из памяти - [ ] **AUTH-07** Написать integration-тест для команды `unlock_vault` с корректным и некорректным паролем --- ## `[VAULT]` — Управление Записями (Rust · `commands/vault.rs`) - [ ] **VAULT-01** Реализовать IPC-команду `get_accounts`: расшифровать и вернуть все записи для текущей сессии - [ ] **VAULT-02** Реализовать IPC-команду `create_account`: принять данные от фронтенда, зашифровать через DEK, сохранить в БД - [ ] **VAULT-03** Реализовать IPC-команду `update_account`: обновить запись, выставить `updated_at` - [ ] **VAULT-04** Реализовать IPC-команду `delete_account`: выполнить soft-delete (`is_deleted = true`) - [ ] **VAULT-05** Написать integration-тест для каждой IPC-команды vault --- ## `[EVENTS]` — Push-события (Rust · `events/emitter.rs`) - [ ] **EVENTS-01** Реализовать эмиттер события `vault-updated` (отправляется после create/update/delete) - [ ] **EVENTS-02** Реализовать эмиттер события `system-locked` (отправляется при блокировке ОС или по таймеру) --- ## `[FE-CORE]` — Frontend: Сервисы и Ядро (Angular · `app/core/`) - [ ] **FE-CORE-01** Реализовать `TauriIpcService`: типизированная обертка над `window.__TAURI__.invoke` - [ ] **FE-CORE-02** Реализовать `TauriEventBusService`: RxJS-адаптер, слушающий события `vault-updated` и `system-locked` - [x] **FE-CORE-03** Реализовать `VaultService`: `BehaviorSubject` для хранения сессионного стейта - [ ] **FE-CORE-04** В `VaultService`: реализовать метод `clear()` — сброс данных из памяти при блокировке - [ ] **FE-CORE-05** Реализовать `CryptoStrategyService`: интерфейс `AuthStrategy` с двумя реализациями — `MasterPasswordStrategy` и `BiometricStrategy` --- ## `[FE-MODELS]` — Frontend: Модели данных (Angular · `app/models/`) - [x] **FE-MODELS-01** Определить интерфейс `AccountDTO` (raw данные от Rust) - [x] **FE-MODELS-02** Реализовать класс `Account` с геттерами, валидацией и методом `accept(visitor)` для паттерна Visitor - [x] **FE-MODELS-03** Реализовать класс `User` с полями профиля - [x] **FE-MODELS-04** Реализовать `CsvExportVisitor` — экспорт аккаунтов в CSV через паттерн Visitor --- ## `[FE-SHARED]` — Frontend: UI-кит (Angular · `app/shared/`) - [x] **FE-SHARED-01** Создать компонент `ButtonComponent` (primary / secondary / tertiary варианты из `DESIGN.md`) - [x] **FE-SHARED-02** Создать компонент `PasswordInputComponent`: поле ввода + иконка показать/скрыть - [x] **FE-SHARED-03** В `PasswordInputComponent`: добавить визуальный индикатор сложности пароля (weak / fair / strong) - [x] **FE-SHARED-04** Создать компонент `AccountCardComponent`: отображение одной записи (сервис, логин, кнопки действий) - [x] **FE-SHARED-05** Создать компонент `NotificationComponent`: toast-уведомления об ошибках и успехе --- ## `[FE-AUTH]` — Frontend: Экран Авторизации (Angular · `app/features/auth/`) - [ ] **FE-AUTH-01** Создать экран ввода Мастер-пароля: форма с `PasswordInputComponent`, кнопка «Войти» - [ ] **FE-AUTH-02** Подключить экран к `CryptoStrategyService` (`MasterPasswordStrategy`) - [ ] **FE-AUTH-03** Создать экран Биометрии: кнопка «Войти по биометрии», fallback на Мастер-пароль - [ ] **FE-AUTH-04** Подключить экран биометрии к `CryptoStrategyService` (`BiometricStrategy`) - [ ] **FE-AUTH-05** Реализовать навигацию: успешная авторизация → главное окно; ошибка → сообщение об ошибке --- ## `[FE-MAIN]` — Frontend: Главное Окно (Angular · `app/features/main-window/`) - [ ] **FE-MAIN-01** Создать layout главного окна: сайдбар + основной контент - [ ] **FE-MAIN-02** Реализовать список аккаунтов, подписанный на `VaultService` (реактивное обновление) - [ ] **FE-MAIN-03** Добавить строку поиска/фильтрации по названию сервиса - [ ] **FE-MAIN-04** Добавить фильтрацию по тегам - [ ] **FE-MAIN-05** Создать форму добавления записи: поля (сервис, логин, пароль, заметки, теги) + кнопка «Сгенерировать пароль» - [ ] **FE-MAIN-06** Подключить форму добавления к IPC-команде `create_account` - [ ] **FE-MAIN-07** Создать форму редактирования записи (переиспользует форму добавления, предзаполнена данными) - [ ] **FE-MAIN-08** Подключить форму редактирования к IPC-команде `update_account` - [ ] **FE-MAIN-09** Реализовать удаление записи с confirm-диалогом, использовать `delete_account` - [ ] **FE-MAIN-10** Создать экран Настроек: поле «таймер автоблокировки» (минуты), параметры генератора паролей --- ## `[FE-SPOTLIGHT]` — Frontend: Окно Spotlight (Angular · `app/features/spotlight/`) - [ ] **FE-SPOTLIGHT-01** Создать изолированный компонент Spotlight-окна (отдельный `BrowserWindow` в Tauri) - [ ] **FE-SPOTLIGHT-02** Реализовать строку быстрого поиска по аккаунтам (live-filter из `VaultService`) - [ ] **FE-SPOTLIGHT-03** Реализовать быстрое добавление аккаунта прямо из Spotlight-окна - [ ] **FE-SPOTLIGHT-04** Реализовать закрытие Spotlight-окна при потере фокуса (blur event) --- ## `[SYSUX]` — Системные UX-функции (Rust + Angular) - [ ] **SYSUX-01** Зарегистрировать глобальный шорткат (`Cmd/Ctrl+Shift+Space`) для открытия Spotlight (`main.rs`) - [ ] **SYSUX-02** Реализовать таймер бездействия на стороне Rust: по истечении отправлять событие `system-locked` - [ ] **SYSUX-03** Подписать Angular (`TauriEventBusService`) на событие `system-locked` → вызвать `VaultService.clear()` и перейти на экран авторизации - [ ] **SYSUX-04** Реализовать обработку события блокировки ОС (Rust) → отправлять `system-locked` --- ## `[TEST]` — Тестирование - [ ] **TEST-01** Unit-тесты криптографии (покрыты в тикетах CRYPTO-05, CRYPTO-06) - [ ] **TEST-02** Unit-тесты генератора паролей (покрыт в PASSGEN-03) - [ ] **TEST-03** Integration-тесты репозитория БД (покрыты в DB-08) - [ ] **TEST-04** Integration-тесты IPC-команд auth (покрыты в AUTH-07) - [ ] **TEST-05** Integration-тесты IPC-команд vault (покрыты в VAULT-05) - [ ] **TEST-06** Unit-тесты Angular сервисов (`VaultService`, `TauriIpcService`, `CryptoStrategyService`) - [ ] **TEST-07** E2E: создание нового сейфа и первый вход (Мастер-пароль) - [ ] **TEST-08** E2E: добавление и поиск записи в главном окне - [ ] **TEST-09** E2E: автоблокировка по таймеру — данные очищаются из памяти - [ ] **TEST-10** E2E: открытие Spotlight по глобальному шорткату