Files
abdristus/docs/TASKS.md

165 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`
- [ ] **INFRA-02** Создать Angular-проект с флагом `--standalone` (без NgModules)
- [ ] **INFRA-03** Настроить Rust-зависимости в `Cargo.toml`: `argon2`, `chacha20poly1305`, `sqlx`, `keyring`, `uuid`
- [ ] **INFRA-04** Настроить npm-зависимости: `@tauri-apps/api`, `rxjs`, установить ESLint + строгий TypeScript
- [ ] **INFRA-05** Настроить `tauri-plugin-global-shortcut` в `main.rs`
- [ ] **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_<uuid>.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`
- [ ] **FE-CORE-03** Реализовать `VaultService`: `BehaviorSubject<Account[]>` для хранения сессионного стейта
- [ ] **FE-CORE-04** В `VaultService`: реализовать метод `clear()`сброс данных из памяти при блокировке
- [ ] **FE-CORE-05** Реализовать `CryptoStrategyService`: интерфейс `AuthStrategy` с двумя реализациями — `MasterPasswordStrategy` и `BiometricStrategy`
---
## `[FE-MODELS]` — Frontend: Модели данных (Angular · `app/models/`)
- [ ] **FE-MODELS-01** Определить интерфейс `AccountDTO` (raw данные от Rust)
- [ ] **FE-MODELS-02** Реализовать класс `Account` с геттерами, валидацией и методом `accept(visitor)` для паттерна Visitor
- [ ] **FE-MODELS-03** Реализовать класс `User` с полями профиля
- [ ] **FE-MODELS-04** Реализовать `CsvExportVisitor` — экспорт аккаунтов в CSV через паттерн Visitor
---
## `[FE-SHARED]` — Frontend: UI-кит (Angular · `app/shared/`)
- [ ] **FE-SHARED-01** Создать компонент `ButtonComponent` (primary / secondary / tertiary варианты из `DESIGN.md`)
- [ ] **FE-SHARED-02** Создать компонент `PasswordInputComponent`: поле ввода + иконка показать/скрыть
- [ ] **FE-SHARED-03** В `PasswordInputComponent`: добавить визуальный индикатор сложности пароля (weak / fair / strong)
- [ ] **FE-SHARED-04** Создать компонент `AccountCardComponent`: отображение одной записи (сервис, логин, кнопки действий)
- [ ] **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 по глобальному шорткату