| 2026-09-22 |
Экран входа /login: одна кнопка «Войти», редирект неавторизованных (ТЗ 0.38, 3.17)
...
- /login вне навигационной оболочки: логотип + кнопка, инициация SSO-флоу
с return_to (по образцу navi.gnexus.space)
- /auth/me 401 → редирект на /login с исходным адресом; /auth/logout
после очистки сессии ведёт на /login вместо JSON {"ok": true}
- api.ts/realtime.ts при 401 ведут на SPA-роут /login, а не на SSO-флоу —
иначе страница входа мгновенно уводила на авторизацию
- оффлайн (сетевая ошибка /auth/me) не считается «не залогинен» — ТЗ 3.15
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
13 hours ago
|
| 2026-09-21 |
Мультиюзерность: фронтенд и ТЗ (ТЗ 0.34, батч 3)
...
- userScope.ts: localStorage-ключи скоупятся по user_id (второй аккаунт
в том же браузере не видит чужих фильтров/дедупа тостов)
- realtime.ts (дедуп own-activity) и ProjectView.vue (фильтры проекта) —
через scopedKey
- App.vue: setStorageUserId из /auth/me
- SettingsView: раздел «Токены MCP» — генерация (plaintext один раз,
с копированием), список, отзыв; api.ts: типы + listMcpTokens/
createMcpToken/deleteMcpToken
- McpView: текст «токен в Настройках» (connectTokenText) в ru/en/uk
- Локали: ключи mcpToken* в ru/en/uk (в ru/en/uk попали литералы
ru_new/en_new/uk_new вместо блоков — исправлено)
- docs/TZ.md → 0.34: 1.2 (мультиюзерность + claim-on-first-login),
3.10 (per-user токены, MCP_TOKEN удалён), 5 (User, McpToken,
AppSetting/AppSettingGlobal)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|

Пачка 1 ревью: безопасность + порча данных (находки 1-5)
...
Бэкенд:
- DELETE /api/tags/{id} требовал сессии только фактически — добавлен UserDep;
регрессия-тест проверяет require_user на каждом /api-роуте (не пройдёт для
любого нового эндпоинта без UserDep).
- Вложения: SVG отклоняется (скриптуемый формат — inline-отдача = stored XSS),
лимит 10 МБ на файл, X-Content-Type-Options: nosniff на отдаче.
- Open redirect закрыт: return_to только внутренние пути (не //, не внешние).
- MCP-токен сравнивается constant-time (hmac.compare_digest).
- Дефолтный SESSION_SECRET валит старт валидатором — молчаливо подделываемая
кука вместо этого даёт явную ошибку конфигурации.
- backend/data/ (runtime-вложения) в .gitignore.
Фронтенд:
- Черновик инлайн-правки больше не переезжает между задачами: при смене
/tasks/:id сбрасываются descEditing/draft, заголовочный InlineField
перемонтируется по key=taskId (PATCH старого текста в новую задачу).
- Утечка SSE-подписок: onRealtime сам отписывается при dispose scope —
N визитов на страницу больше не оставляют N load() на мёртвых инстансах.
- Out-of-order: токен запроса в load() TaskView/ProjectView — поздний ответ
старого id не перетирает данные нового; ListView — то же на фильтрах.
- Смена фильтра сбрасывает пагинацию: watch(filters, {deep}) (ТЗ 3.6).
- Двойной submit не создаёт дубликаты: busy в TaskForm и quickAdd стека.
- Утечка Pixi: unmount во время init уничтожает рендерер после резолва.
- Оффлайн-старт PWA: /auth/me без сети не роняет onMounted молча.
Тесты: 103 passed (+6: auth-все-роуты, SVG, oversize, nosniff, return_to,
дефолтный секрет). ruff/mypy чисты.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Пачка UI + Ollama + SSE-реактивность (ТЗ 3.14)
...
- Бейдж приоритета с иконкой (PriorityBadge) во всех видах
- Фильтры страницы проекта запоминаются в localStorage (глубокий watch)
- DurationInput (ч/мин, шаг 5), ConfirmDialog, пагинация, иконки удаления
- Диалоги: «В архив» warning, кнопки поменяны местами
- Автодетализация на Ollama 192.168.1.130 (qwen3.5:2b, think:false)
- SSE /api/events: шина realtime, публикации после коммита, coarse-события + refetch
- Фронт: realtime.ts, удаление поллинга StackView, refetch по видам,
подавление во время drag сада, дедуп XP-тостов
- Тесты 93 passed, e2e двух вкладок; ТЗ 0.24
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|