| 2026-10-10 |
Интерфейс мандата: бейджи, приёмка, журнал, тосты (0.85)
root
committed
10 hours ago
|
Единая иконка «⋯», действия шапки справа на узком экране, полоса у табов (0.80)
...
- TaskView: иконка меню действий — ph-dots-three-outline, как в карточках
задач, стека и на странице проекта (был залитый ph-dots-three).
- App.vue: до 640px строка действий шапки растягивается на всю ширину и
прижимается вправо — у кита перенесённые действия встают у левого края,
и «⋯» на странице задачи оказывался под бейджами слева.
- ListView: у табов статуса спрятана полоса прокрутки (прокрутка осталась);
переключателю «Приоритетные» дан сдвиг 3px влево-вправо — бегунок кита
выступает за коробку контрола на 5px и вылезал левее соседей по ряду.
- ТЗ 0.80.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
14 hours ago
|
Шторка дропдауна из шапки, полосы прокрутки, меню у правого края (0.79)
...
- App.vue: position:relative + z-index у .page-header — только с 768px.
На мобильных они запирали fixed-шторку в контексте наложения шапки, и
затемнение (вне #app, z 1090) ложилось поверх неё, съедая тапы: меню «⋯»
на странице задачи открывалось затемнённым и не нажималось.
- kit-overrides.css: полосы прокрутки снова китовые (10px, дорожка #16161e,
бегунок #414868) — добавлено только скругление бегунка; scrollbar-width /
scrollbar-color больше не задаются, иначе Chromium игнорирует
::-webkit-scrollbar-* и скругление пропадает.
- dropdownClamp.ts: при развороте меню влево выставляем ещё и left: auto —
китовый left:0 продолжал действовать, и у правой колонки карточек меню
выезжало за вьюпорт (right 1593 при ширине 1440).
- ТЗ 0.79.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
16 hours ago
|

Список задач, карточки и шторка дропдауна на мобильных (0.68–0.77)
...
- Цвета проектов (0.68–0.72): палитра пересобрана с объективным порогом
различимости — 8 базовых тонов × ступени светлоты + 5 нейтральных = 27
клеток, минимальная попарная ΔE76 в CIELAB 12.5 (приглушённые варианты
сливались, чёрный не виден на тёмной панели). Метка проекта — кружок, у
проекта с сайтом — фавикон внутри метки.
- Список задач (0.70–0.74): фильтр по проекту и табы приоритета убраны,
приоритет — переключателем «Приоритетные» с серверной отсечкой
priority_min (7–10; задача без приоритета в отсечку не попадает). Тег
ищется подстрокой имени (параметр tag, icontains с autoescape) с debounce,
ввод — GnCombobox; статус — табы кита с горизонтальной прокруткой. То же
на странице проекта. Фильтры-поля переехали в слот действий шапки.
- Выравнивание фильтров (0.76): кит держит 8px margin-top у input и 15px
margin-bottom у form-group — внутри flex-обёртки они не схлопываются, и
поле стояло на 3.5px выше центра ряда, а крестик сброса (отсчёт от низа
обёртки) уезжал к нижнему краю поля. Отступы внутри фильтра обнулены:
обёртка стала ровно в коробку поля, центры сходятся до пикселя.
- Карточка задачи (0.75–0.76): кликабельна целиком (клик мимо внутренних
ссылок/кнопок и по невыделенному тексту), бейдж проекта — ссылкой.
Свежесть задачи переехала из ряда бейджей в подвал карточки (слот footer,
черта 1px, прижат к низу — в сетке все карточки на одной линии): height
100% содержимого у кита выталкивало подвал, карточка стала flex-колонкой.
Иконка рядом с текстом — с китовым классом normalize.
- Полосы прокрутки (0.76): тонкие, бегунок акцентом, скругление в пилюлю,
прозрачная дорожка — как у полосы меню-дровера кита. Заданы и
scrollbar-width/color, и ::-webkit-scrollbar-*; у дровера приоритетнее
правило кита.
- Шторка дропдауна на мобильных (0.77): до 767px меню — лист снизу во всю
ширину экрана с затемнением и «ручкой», пункты 44px, выезд снизу 0.22s
вместо китового overlay_reveal. Слой затемнения — div вне #app (index.html)
и body:has(.dropdown.is-open): для китового обработчика клик по нему «вне
меню», поэтому тап по затемнению закрывает меню без JS, а JS-кламп
координат на мобильных выключен. Китовый panel_boot оставляет у шапки
transform (содержащий блок для position:fixed) — на мобильных анимация
шапки снята, правило «меню в шапке прижато вправо» тоже оставлено
десктопу. Задача на перенос в кит оформлена отдельно:
gnexus-ui-kit/docs/tasks/gn-dropdown-mobile-sheet.md.
- Кнопка «назад» над шапкой страницы (0.70): показывается, когда в истории
приложения есть предыдущий экран; возврат на экран входа не предлагается.
ТЗ 0.68–0.77; тесты бэкенда 209, ruff/mypy чисто, сборка фронта зелёная.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
17 hours ago
|
| 2026-10-09 |

Сад отключён (0.58): страница «Достижения» вместо сада
...
Сад не готов к использованию, а сервис разрастается — убрали его из
интерфейса и сосредоточились на основном функционале. Код сада,
модель GardenItem, coin_events и rarity у xp_events сохранены: сад
вернётся для доработки.
- Выдача растений прекращается сама: GardenItem создавался лениво в
ensure_garden(), которую звал только GET /api/garden, — UI его
больше не запрашивает.
- Прогресс и ачивки переехали на новую страницу /achievements (пункт
меню на месте «Сада»); /garden редиректит туда же.
- Блок ачивок вынесен в общий components/AchievementsPanel.vue —
им пользуются и «Достижения», и сад (для возврата).
- Баланс монет отдаёт GET /api/xp (coins) — единственная правка
бэкенда; паритет с /api/garden покрыт тестом.
- Тост закрытия — «+N XP • +N монет» с похвалой, без слов про
растение; золотое конфетти за xp >= 25 и «не хочется делать».
- Тексты прогресса — в общем неймспейсе progress.*, сад-специфичные
остались под garden.*.
- ТЗ 0.58: пункт «Сад отключён» с причиной, детальное описание сада
оставлено историческим блоком.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
| 2026-09-30 |
Сырые кастомные блоки — под визуальный язык кита 1.0.0
...
Дерево уровней, маркет, ачивки, график/heatmap статистики, инвентарь и
оверлеи сцены, полнотекстовые превью/миниатюры, tags-fieldset: бордеры
2px var(--gn-border-color-muted) вместо 1px, радиусы 6px (панели) и
3px (инсеты/контролы), поверхностные подложки поверх --gn-surface-panel.
Иконки в заголовках карточек — в цвете заголовка (было тёмные).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 days ago
|
| 2026-09-22 |
Страница-инструкция расширения: /extension в меню веб-версии
...
Скачивание ZIP (extension pack → статика фронта), шаги загрузки unpacked
и подключения MCP-токена; из установленного PWA пункт меню скрыт
(display-mode: standalone), по прямому адресу — пояснение.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Массовое добавление задач: форма не закрывается, проект из контекста (ТЗ 0.39)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Вход с первой попытки: залогиненный с /login сразу уходит на return_to
...
Возврат с SSO попадал обратно на экран входа и требовал второй клик —
теперь /auth/me на /login подтверждает сессию и ведёт на return_to;
return_to не заворачивается сам в себя.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Экран входа /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
18 days ago
|
Тосты: непрозрачный фон вместо rgba-тинки кита
...
Вариантные тосты кита красятся rgba(...,.18) — сквозь них просвечивает
страница. Перебито китовым базовым #1f2335 (селектор 0,2,0), цвет варианта
остаётся в рамке и иконке.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
| 2026-09-21 |
Имя и аватар из SSO: users.name, синк по webhook и при логине (ТЗ 0.36)
...
- users.name (display_name из SSO), миграция f1a2b3c4d5e6
- webhook user.profile_updated: name ← profile.display_name (ключа нет —
не трогаем), avatar_url, locale; username_changed имя не меняет
- /auth/callback: name в сессию и БД (display_name, fallback username)
- /auth/me: профиль из БД, не из cookie-сессии — изменения от webhook
видны сразу, без повторного логина
- фронт: имя в сайдбаре (identity-title), email в meta
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
«Новая задача» на моб — GnIconButton кита вместо ручного квадрата
...
Штатный компонент кита (.btn-icon 38×38, иконка 22px) вместо самодельного
сжатия .btn с перебивкой border-left; переключение display по брейкпоинту.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
Мобильные UI-фиксы: переполнения дашборда/проекта, кнопки-иконки (360px)
...
- Dashboard/ProjectView: grid-треки minmax(0,1fr) вместо 1fr — min-content
nowrap-текста растягивал колонку и ломал страницу на телефоне
- Dashboard: заголовки задач на моб переносятся вместо ellipsis
- «Новая задача» в топбаре и шапке проекта — квадратная кнопка 42×42 на моб;
перебито правило кита .btn.btn-small.with-icon (border-left 32px)
- SettingsView: .token-create — кнопка «Сгенерировать» не уплывает за экран,
на моб поля в столбик
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
Мультиюзерность: фронтенд и ТЗ (ТЗ 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
19 days 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
19 days ago
|
Пачка UI: полоска таймера тостов, мобильный «+», ширина md-редактора, мета-бейджи
...
- Тосты: у .toast-progress-bar кита анимация без duration мгновенно схлопывала
полоску таймера (forwards до scaleX(0) поверх inline transform адаптера);
отключаем селектором той же специфичности (.toast .toast-progress ...).
- Кнопка «Новая задача» на мобильном — компактная кнопка-иконка вместо
растянутого .btn с пустым хвостом после скрытия лейбла.
- Инлайн-редактор описания задачи на всю ширину контейнера (max-width .form-group).
- Ссылка на проект в мете страницы задачи — inline-flex, бейджи на одном базлайне.
- Detailing: зачистка HTML-тегов из markdown-ответов LLM (_clean_markdown).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
Пачка UI: fullscreen сада, отступ empty-state, шапка задачи, форма на всю ширину
...
- fullscreen сада: резерв 64px в ширине бокса — кнопки зума и инвентарь не уезжают за экран
- «Всё спокойно» на главной не слипается с блоком быстрого ввода
- на экранах ≥641px действия шапки страницы не переносятся под длинный заголовок
- форма редактирования на весь контейнер (form-group кита растянута с 600px)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days 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
19 days ago
|
| 2026-09-20 |
Правки формы задачи: убрать «Новый проект», группа «Оценка», отступ тегов
...
- Кнопка «Новый проект» и QuickPrompt удалены из TaskForm — проекты
создаются только на странице проектов.
- Оценки (время и затраты) собраны в fieldset «Оценка» — по образцу
группы дедлайна.
- GnTagInput: подпись внутри рамки отходит от границы (глобальный
padding .tag-input > .label в App.vue — действует во всех местах).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days ago
|
fix: активный пункт навигации по текущей странице
...
GnNavList кита захватывает $route один раз в setup — объект маршрута
после навигации заменяется, и подсветка «залипает» на «Главной».
Обход через публичный API: GnNavList в слоте default шелла с
:key="route.fullPath" — перемонтирование переснимает свежий маршрут;
закрытие drawer — через close из scope слота.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days ago
|
feat: страница «Статистика» с периодами и сравнением + справка «О саде» (ТЗ 0.10)
...
- Страница /stats: день/неделя/месяц с листанием стрелками ‹ ›; метрики
(закрытые задачи, XP, созданные задачи, часы, «дни с результатом») — каждая
GnMetricCard со сравнением с предыдущим аналогичным периодом (дельта + %)
- Анимированный график закрытых задач по бакетам периода (24 часа / 7 дней /
дни месяца), «волна» scaleY при смене периода, подписи через Intl по локали
- Данные — из GET /api/xp/events и списка задач, без новых эндпоинтов
- Сад: кнопка «Как это работает» → GnModal с объяснением механик
- Локали ru/en/uk (stats.*, garden.about*), ТЗ 0.10
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
feat: геймификация — XP, уровни, сад и ачивки (ТЗ 0.8, п. 3.13)
...
Награда за закрытие задачи, принцип «только позитив» (без стриков и сгорания):
- XP = 10 база + бонус за приоритет (0–15) + бонус за оценку времени (0–15),
один раз на задачу (xp_events, UniqueConstraint); удаление задачи не отнимает
- PATCH /api/tasks/{id} при первом закрытии ставит заголовок X-Earned-XP,
фронт ловит его и празднует: конфетти + тост «+N XP» с похвалой
- GET /api/xp — сводка (total_xp, уровень, прогресс)
- Сад (/garden): растение за каждую закрытую задачу + уровень + ачивки-вехи
(1/10/50 задач, уровни 5/10, регулярная, закрытый проект) с прогрессом
- celebrateEarned() в TaskView/ListView/ProjectView/OptionsView; локали ru/en/uk
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
feat(frontend): главная страница на / вместо /stack
...
StackView теперь на path '/', пункт навигации ведёт на /;
/stack оставлен как redirect на / для старых ссылок и PWA-кэша.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
feat(frontend): переименование в GNexus Tasks, тайтлы страниц
...
- Сервис «gntodo» → «GNexus Tasks»: brand топбара, kicker шапок видов,
subtitle навигации (ru/en/uk), index.html, PWA-манифест (short_name Tasks)
- taskui: APP_NAME + setPageTitle(); тайтлы через meta.title роутов
(afterEach в main.ts) — «{страница} — GNexus Tasks»
- TaskView/ProjectView уточняют тайтл после загрузки (watchEffect):
заголовок задачи / имя проекта
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
feat(frontend): дашборд на главной — совмещён со стеком
...
- Dashboard.vue: «В работе», «Просрочено», дедлайны недели, «Следующие»
(to_do по приоритету, топ-5) + сайдбар (сводка статусов, активные проекты)
- StackView — главная «Главное»: дашборд сверху, стек снизу, один список
задач на оба блока (Promise.all задач и проектов)
- Нав-пункт «Главная» (ph-house) вместо «Стек входящих»
- Локали home.* (ru/en/uk); ТЗ 0.7 — новый п. 3.7, перенумерация 3.8–3.11
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
| 2026-09-19 |
Иконки заголовков карточек — ещё темнее (#3b4261)
...
Заодно убраны scoped-дубли .card-title-icon в TaskView/ProjectView
(var(--accent) перебивал глобальный тёмный цвет)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
Убираем дерево задач; иконки заголовков — тёмные
...
- Удалены TreeView (роут /tree и пункт навигации) и TaskTree;
переключатель «Список | Дерево» на странице проекта убран —
остаётся список карточек
- В локалях почищены мёртвые ключи дерева (nav.tree, viewList/
viewTree, tree.* кроме addSubtask/promptSubtask)
- Иконки в заголовках карточек — тёмный #565f89 вместо фиолетового
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
UX-пачка: заметка проекта через MdEditor, троеточие, фиксы шапки
...
- Заметка проекта в drawer'е — тот же MdEditor с тулбаром, что у
описания задачи (новый проп caption; предпросмотр-чекбоксы убраны)
- Кнопка «Действия» в шапке задачи — иконка-троеточие (ph-dots-three)
- «Изменить статус» — маленькая кнопка (size sm)
- Дропдаун шапки не обрезается: overflow:visible у .page-header
(+ декоративная скан-полоска ::after скрыта — с visible overflow
вылезает за рамку); меню прижато к правому краю; z-index шапки
поднят — transform из panel_boot кита делал карточки поверх меню
- Иконки в заголовках карточек — фиолетовый #bb9af7 (сливались)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
Правый drawer — 640px на десктопе
...
Правило .drawer-panel перебивалось селектором кита .drawer .drawer-panel
(выше специфичность) — потому предыдущие попытки не применялись.
Селектор выровнен с китом: width: min(640px, 100vw - 18px).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|