Skip to content

Repository files navigation

Focus Flow

Персональный local-first таск-трекер на React/TypeScript. Он объединяет быстрый захват задач, Сегодня, проекты, список и доску Входящих, календарь и дедлайны, матрицу Эйзенхауэра, поиск и фильтры, таймер фокуса, привычки, корзину/архив и настраиваемое оформление.

Текущая реализация — браузерный MVP. Она проверяет продуктовые сценарии и адаптеры, но ещё не является Tauri-сборкой для Ubuntu.

Запуск с нуля

Понадобятся Git, Node.js 18.19 или новее и npm (он устанавливается вместе с Node.js). Проверить версии можно так:

git --version
node --version
npm --version
  1. Склонируйте репозиторий и перейдите в папку проекта:

    git clone https://github.com/S0K0lAN/Tracker.git
    cd Tracker
  2. Установите зафиксированные в package-lock.json зависимости:

    npm ci
  3. Запустите сервер разработки:

    npm run dev
  4. Откройте на компьютере http://localhost:4173. При первом открытии приложение автоматически загрузит демонстрационные данные.

Чтобы остановить сервер, вернитесь в терминал и нажмите Ctrl+C. При следующих запусках достаточно выполнить cd Tracker и npm run dev.

Production-сборка локально

npm run build
npm run preview

После запуска откройте http://localhost:4173.

Открытие с телефона

Dev-сервер слушает локальную сеть. Подключите телефон и компьютер к одному Wi-Fi и откройте http://<локальный-IP-компьютера>:4173. Текущий локальный IP можно узнать командой ip -4 -brief address show scope global.

Не пробрасывайте порт 4173 в интернет: это сервер разработки без production- защиты и авторизации.

Проверка

npm test
npm run build
npm run test:e2e

Демо-данные

При первом запуске приложение создаёт воспроизводимый демонстрационный набор: проекты, задачи разных приоритетов и состояний, пересекающиеся временные слоты, многодневные дедлайны, теги, подзадачи, напоминания, вложения и историю привычек. Даты рассчитываются относительно дня запуска.

Если в браузере уже есть локальные данные, откройте «Настройки → Данные» и нажмите «Сбросить», чтобы загрузить актуальный demo-набор из src/domain/seed.ts. Существующие локальные изменения при этом будут заменены.

Маршруты: /today, /inbox, /projects, /calendar, /matrix, /search, /habits, /trash, /settings.

Что реализовано

  • Создание и редактирование задач с проектом, датами, важностью, вычисляемой срочностью, тегами, напоминаниями, подзадачами и вложениями.
  • Отдельный просмотр существующей задачи; редактор и действия запускаются явно.
  • Просмотр изображений/PDF/текста, голосовой capture с русским parser и текстовым fallback: обычная дата задаёт начало, «до»/«дедлайн» — дедлайн.
  • Проекты, глобальный поиск, сохранённые фильтры и сортировка Входящих.
  • Входящие в виде списка или доски с отдельным переходом в календарное планирование.
  • Календарь на год, месяц, неделю, три дня и день; периоды листаются кнопками, свайпом или мышью; полный список задач ячейки месяца и диапазонная диаграмма дедлайнов на неделю/месяц/год.
  • Мягкое удаление, восстановление, окончательное удаление и отдельный архив.
  • Привязанный к задаче 25-минутный таймер фокуса и накопление минут.
  • Создание и редактирование привычек с описанием, десятью векторными иконками и индивидуальным ритмом.
  • Светлая/тёмная тема, акценты, глобальные семейство/масштаб шрифта, встроенные и пользовательский фон.
  • Schema v3, миграция schema v2, localStorage backup/recovery.
  • Глубокая проверка импортируемых сущностей и безопасные локальные data:-URL вложений; повреждённые копии помещаются в quarantine до восстановления.
  • OAuth-подключение Google Drive, ручная загрузка удалённой копии, автосинхронизация и безопасный выбор версии при конфликте.
  • Реестр провайдеров удалённого хранилища: новый адаптер подключается без изменения доменной модели задач, а сохраняемые config-поля обязаны быть явно классифицированы как публичные.
  • Unit/component, Playwright E2E, WCAG AA и windowed performance gate на 500 задач.

Важные документы

Статус Google Drive

В браузерном MVP реализован OAuth через Google Identity Services и Drive API v3 с минимальным scope drive.appdata. Приложение умеет найти существующую копию focus-flow-data.json, загрузить её, создать новую, обновлять после локальных изменений и обнаруживать изменение удалённой ревизии. При первом подключении разных копий пользователь явно выбирает источник; перед импортом локальное состояние сохраняется в отдельный backup.

Drive media upload не документирует атомарный compare-and-swap: приложение повторно проверяет ID/version непосредственно перед записью и никогда не разрешает обнаруженный конфликт автоматически, но между проверкой и PATCH остаётся best-effort окно гонки. Для полной межустройственной гарантии нужны будущие immutable revisions/base snapshot и трёхсторонний merge.

Настройка Google OAuth

  1. В Google Cloud Console создайте или выберите проект, включите Google Drive API и настройте OAuth consent screen.

  2. Создайте credential типа OAuth client ID → Web application. Добавьте точный адрес приложения в Authorized JavaScript origins, например http://localhost:4173 для локальной разработки и открывайте приложение именно по этому адресу: OAuth origin должен совпадать полностью. Для production используйте стабильный HTTPS origin.

  3. Скопируйте .env.example в .env.local и замените пример публичным Client ID:

    cp .env.example .env.local
    VITE_GOOGLE_CLIENT_ID=000000000000-example.apps.googleusercontent.com

    Client secret браузерному приложению не нужен и не должен попадать в .env.local.

  4. Перезапустите npm run dev, откройте «Настройки → Синхронизация», выберите Google Drive и нажмите «Подключить Google Drive».

Client ID также можно ввести непосредственно в настройках; это публичный идентификатор. Access token существует только в памяти вкладки и исключён из localStorage и удалённого snapshot. После перезапуска выбранный провайдер, Client ID, удалённая ревизия и настройка автосинхронизации сохраняются, но браузер попросит нажать «Продолжить с Google», чтобы получить новый краткоживущий token. Это ограничение безопасной browser-only OAuth-модели: полностью фоновое постоянное подключение потребует BFF с защищённым refresh token либо будущей Tauri-версии с Authorization Code + PKCE и системным secret store.

OAuth с адреса телефона вида http://192.168.x.x:4173 не следует считать production-сценарием. Для входа с телефона разверните приложение на HTTPS и добавьте этот origin в Google Cloud Console.

Автоматический E2E проверяет OAuth-поток с имитацией Google API; реальный live smoke не выполняется без отдельного тестового Client ID и аккаунта. Поэтому репозиторий не заявляет проверенную live-совместимость с конкретной Google конфигурацией.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages