Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,30 @@

## [Unreleased]

### Added

- Общий shadcn/ui-слой на Radix UI, CVA, Lucide и семантических theme tokens.
- Responsive workspace shell, command palette, task composer dialog и desktop/mobile documentation gallery.
- Актуальный production-логотип в SVG/PNG, favicon и product preview.

### Changed

- Главная теперь сфокусирована на личной работе, очередях разбора/review и последних изменениях.
- List и Kanban используют единые фильтры и представления; task rows стали read-first и ведут в карточку.
- Аналитика показывает только измеримые свойства текущей модели: WIP, review, незакреплённые и stale tasks.
- `/pages/my` оставлен как legacy redirect на overview; отдельная маркетинговая workspace-страница удалена.
- Web-контейнер доступен только внутри Compose-сети, публичный browser endpoint обслуживает Nginx.

### Removed

- Повторяющиеся KPI/summary blocks, постоянная inline-форма создания и недостоверный project pulse score.

### Fixed

- GitHub Actions и Docker builds больше не зависят от устаревшего Corepack keyring в Node.js 22.13.1;
точная версия `pnpm@9.15.4` устанавливается напрямую, а workspace scripts используют активный pnpm.
- Refresh/logout больше не делят строгий edge rate limit с login, что устраняет ложный разлогин при серии
обычных перезагрузок; login и invitation acceptance сохраняют отдельный строгий лимит.

## [1.1.0] - 2026-08-21

Expand Down
3 changes: 3 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ docker compose config --quiet
Добавляйте тесты для authorization boundaries, межорганизационной изоляции, token lifecycle,
миграций, кеш-инвалидации и realtime-подписок.

При заметном изменении UI обновите production-галерею по инструкции
[`docs/screenshots/README.md`](./docs/screenshots/README.md) и визуально проверьте desktop/mobile кадры.

## Коммиты и pull request

Используйте небольшие Conventional Commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`,
Expand Down
51 changes: 30 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div align="center">
<img src="./apps/web/public/logo.png" width="104" alt="Tracker logo" />
<img src="./apps/web/public/logo.svg" width="96" alt="Tracker logo" />
<h1>Tracker</h1>
<p><strong>Командный task tracker с организациями, ролями, realtime-доской и безопасной browser session.</strong></p>

Expand All @@ -14,10 +14,9 @@

---

Tracker — full-stack монорепозиторий для управления проектами и задачами. Он сочетает быстрый
Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache и Socket.IO. Проект рассчитан
на развитие как модульный монолит: границы домена явные, а frontend и backend можно развёртывать
независимо.
Tracker — full-stack монорепозиторий для управления проектами и задачами. Актуальный интерфейс построен
вокруг личного фокуса, очередей разбора, компактного списка, Kanban и измеримой аналитики потока.
Frontend и API развёртываются независимо, а backend сохраняет границы модульного монолита.

> [!IMPORTANT]
> Репозиторий предоставляет укреплённый baseline, но не заменяет production-платформу. Перед публичным
Expand All @@ -27,8 +26,12 @@ Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache
## Возможности

- организации, membership-роли `OWNER` / `ADMIN` / `MEMBER` и проекты;
- задачи с приоритетами, статусами, исполнителями, фильтрами и сохранёнными представлениями;
- list, kanban, overview, analytics и детальная карточка задачи;
- задачи с приоритетами, статусами, исполнителями, фильтрами и локально сохранёнными представлениями;
- рабочая главная с личной очередью, разбором, review и последними изменениями;
- компактный list view, Kanban с drag-and-drop и едиными фильтрами;
- измеримая аналитика WIP, review, незакреплённых и давно не обновлённых задач;
- полноценная карточка задачи с редактированием, комментариями, activity и подборкой похожих задач;
- command palette, горячая клавиша создания, светлая/тёмная тема и responsive mobile UI;
- комментарии и история активности;
- realtime-инвалидация данных через защищённые project rooms Socket.IO;
- приглашения с одноразовым токеном и сроком действия;
Expand All @@ -37,24 +40,26 @@ Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache
- Docker Compose и Kubernetes base с restricted security context;
- CI: lint, typecheck, 17 API tests, build, dependency audit, CodeQL и Dependency Review.

## Скриншоты
## Интерфейс

| Вход | Рабочее пространство |
| --- | --- |
| ![Экран входа](./docs/screenshots/01-sign-in.png) | ![Рабочее пространство](./docs/screenshots/02-workspace.png) |
![Главная Tracker](./docs/screenshots/02-overview.png)

| Обзор | Задачи |
| Вход | Список задач |
| --- | --- |
| ![Обзор проекта](./docs/screenshots/03-overview.png) | ![Список задач](./docs/screenshots/04-tasks.png) |
| ![Экран входа](./docs/screenshots/01-sign-in.png) | ![Компактный список задач](./docs/screenshots/03-tasks.png) |

| Доска | Аналитика |
| Kanban | Аналитика потока |
| --- | --- |
| ![Канбан-доска](./docs/screenshots/05-boards.png) | ![Аналитика проекта](./docs/screenshots/06-analytics.png) |
| ![Kanban-доска](./docs/screenshots/04-boards.png) | ![Аналитика потока задач](./docs/screenshots/05-analytics.png) |

<details>
<summary><strong>Карточка задачи</strong></summary>
<summary><strong>Карточка задачи и мобильный интерфейс</strong></summary>

![Карточка задачи](./docs/screenshots/06-task-detail.png)

![Карточка задачи](./docs/screenshots/07-task-detail.png)
| Мобильная главная | Мобильный список |
| --- | --- |
| ![Мобильная главная](./docs/screenshots/07-mobile-overview.png) | ![Мобильный список задач](./docs/screenshots/08-mobile-tasks.png) |

</details>

Expand Down Expand Up @@ -107,7 +112,7 @@ decisions: при его отказе API продолжает работать
- production runtime выполняет `prisma migrate deploy`, а demo seed выключен по умолчанию;
- сервисы запускаются без root, с read-only filesystem/capability restrictions;
- plaintext Kubernetes Secret не хранится в репозитории;
- high-severity dependency audit на 2026-08-21: 0 известных уязвимостей.
- high-severity dependency audit на 2026-08-27: 0 известных уязвимостей.

Не публикуйте уязвимости в issues. Используйте процедуру из [`SECURITY.md`](./SECURITY.md). Полная модель
угроз и residual risks: [`docs/THREAT_MODEL.md`](./docs/THREAT_MODEL.md).
Expand All @@ -116,7 +121,7 @@ decisions: при его отказе API продолжает работать

| Область | Стек |
| --- | --- |
| Web | Next.js 15, React 19, React Query 5, Zustand 5, dnd-kit |
| Web | Next.js 15, React 19, shadcn/ui, Radix UI, React Query 5, Zustand 5, dnd-kit |
| API | NestJS 11, Passport JWT, Socket.IO 4, class-validator |
| Data | PostgreSQL 16, Prisma 6, Redis 7 |
| Tooling | TypeScript 5.9, ESLint 8, Node test runner, pnpm 9 |
Expand Down Expand Up @@ -160,8 +165,8 @@ docker compose ps
| Swagger (если включён) | `http://localhost:8080/api/docs` |
| API readiness | `http://localhost:8080/api/health/ready` |

Прямые порты PostgreSQL, Redis, API и Web привязаны к loopback для локальной диагностики. Публичной
точкой входа считается Nginx на `8080`.
Прямые порты PostgreSQL, Redis и API привязаны к loopback для локальной диагностики. Web-контейнер
доступен только внутри Compose-сети: единственной браузерной точкой входа является Nginx на `8080`.

Остановить окружение:

Expand Down Expand Up @@ -241,6 +246,9 @@ pnpm db:migrate # development migration flow
pnpm db:seed # explicit demo seed
```

Документационные скриншоты снимаются с production-сборки через Nginx на `8080`; SVG/PNG логотип и
product preview находятся в [`apps/web/public`](./apps/web/public).

Полная проверка deployment manifests:

```bash
Expand Down Expand Up @@ -315,6 +323,7 @@ Access token намеренно не сохраняется в browser storage.
- [Threat model](./docs/THREAT_MODEL.md)
- [Operations runbook](./docs/operations/runbook.md)
- [Frontend audit](./docs/frontend-audit.md)
- [Обновление скриншотов](./docs/screenshots/README.md)
- [Security policy](./SECURITY.md)
- [Contributing](./CONTRIBUTING.md)
- [Changelog](./CHANGELOG.md)
Expand Down
3 changes: 3 additions & 0 deletions apps/api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ NestJS backend для аутентификации, организаций, пр

Полный список routes генерируется Swagger из запущенного приложения.

На edge login и invitation acceptance используют отдельный строгий limit. Refresh/logout проходят через
общий API edge limit; controller policies дополнительно ограничивают refresh/logout до 30 запросов в минуту.

## Архитектурные границы

```text
Expand Down
30 changes: 25 additions & 5 deletions apps/web/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Tracker Web

Next.js App Router frontend для overview, списка задач, kanban-доски, аналитики и task details.
Next.js App Router frontend для личного рабочего фокуса, списка задач, Kanban, аналитики потока и task details.

## Слои

Expand All @@ -12,10 +12,29 @@ Next.js App Router frontend для overview, списка задач, kanban-д
| `lib` | API client, React Query keys и realtime hooks |
| `store` | in-memory session и persisted UI preferences |
| `shared` | icons и общие frontend utilities |
| `@tracker/ui` | переиспользуемые UI primitives |
| `@tracker/ui` | shadcn/ui-примитивы на Radix UI, CVA и семантические theme tokens |

Backend DTO импортируются из `@tracker/types`; page components не дублируют transport contracts.

## UI system

Компоненты интерфейса находятся в `packages/ui` и следуют композиционной модели shadcn/ui. Radix UI
обеспечивает focus management и keyboard behavior для dialog, dropdown и tooltip; визуальные варианты
задаются через CVA, а классы объединяются через общий `cn`. Цвета экранов используют семантические
CSS variables (`background`, `foreground`, `primary`, `muted`, `destructive`), поэтому светлая и тёмная
темы не требуют локальных цветовых исключений. Конфигурация генератора находится в `components.json`.

Production-знак Tracker хранится в [`public/logo.svg`](./public/logo.svg); PNG fallback, favicon и
product preview лежат рядом. Документационная галерея находится в [`../../docs/screenshots`](../../docs/screenshots).

## Информационная архитектура

- overview отвечает на вопрос «что делать дальше»: личная работа, разбор, review и свежие изменения;
- list оптимизирован для сканирования, а изменение полей выполняется в task detail;
- list и Kanban читают один набор фильтров/views из Zustand, но сами задачи остаются server state;
- create task открывается как dialog из shell, route toolbar, command palette или клавиши `C`;
- analytics не выводит health/capacity score без estimates и completion timestamps.

## Session model

- Access token хранится только в памяти Zustand store и исчезает при reload.
Expand All @@ -39,11 +58,11 @@ Realtime hook подключается к namespace `/tasks`, подписыва
## Маршруты

- `/` — overview;
- `/pages/my` — workspace entry;
- `/pages/my` — legacy redirect на overview;
- `/tasks` — список и фильтры;
- `/tasks/[taskId]` — карточка, комментарии и activity;
- `/boards` — kanban;
- `/analytics` — распределение и показатели проекта.
- `/analytics` — измеримые показатели потока задач.

Горячие клавиши: `C` для create task, `Ctrl+K` / `⌘K` для command palette.

Expand All @@ -57,7 +76,8 @@ NEXT_PUBLIC_SOCKET_URL=http://localhost:3001
```

`NEXT_PUBLIC_*` встраиваются в browser bundle и не должны содержать секреты. Для same-origin deployment
используйте `/api/v1` и публичный origin ingress/Nginx для Socket.IO.
используйте `NEXT_PUBLIC_API_URL=/api/v1` и пустой `NEXT_PUBLIC_SOCKET_URL`: browser подключится к
публичному origin ingress/Nginx. Значения выше предназначены для запуска Web/API без reverse proxy.

## Команды

Expand Down
9 changes: 9 additions & 0 deletions apps/web/components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": { "config": "tailwind.config.ts", "css": "src/app/globals.css", "baseColor": "slate", "cssVariables": true, "prefix": "" },
"aliases": { "components": "@tracker/ui", "utils": "@tracker/ui", "ui": "@tracker/ui", "lib": "@/lib", "hooks": "@/hooks" },
"iconLibrary": "lucide"
}
1 change: 1 addition & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"@tracker/types": "workspace:*",
"@tracker/ui": "workspace:*",
"clsx": "^2.1.1",
"lucide-react": "^1.34.0",
"next": "^15.5.23",
"next-themes": "^0.4.6",
"react": "^19.2.8",
Expand Down
25 changes: 11 additions & 14 deletions apps/web/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/web/public/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions apps/web/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/web/public/preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/web/src/app/analytics/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export default function AnalyticsPage() {
return (
<WorkspacePage
title="Аналитика"
description="Отдельный экран метрик: статус workflow, готовность проекта и распределение нагрузки по команде."
description="Измеримые показатели потока задач без условных рейтингов и прогнозов."
>
{(data) => <AnalyticsContent data={data} />}
</WorkspacePage>
Expand Down
Loading
Loading