| 2026-09-21 |
Фильтры проекта на моб — ширина 10rem (просьба пользователя)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
8 hours ago
|
«Новая задача» на моб — GnIconButton кита вместо ручного квадрата
...
Штатный компонент кита (.btn-icon 38×38, иконка 22px) вместо самодельного
сжатия .btn с перебивкой border-left; переключение display по брейкпоинту.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
8 hours 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
8 hours 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
9 hours ago
|
Страница-инструкция по MCP + ссылка в настройках (ТЗ 0.31)
...
- Новый вид McpView (/mcp-help): что реализует, инструменты, адрес сервера
(из location.origin, кнопка «Скопировать»), токен, примеры подключения
(Claude Code и универсальный JSON), раздел про контекст проекта.
- Карточка-ссылка «MCP для ИИ-агентов» в «Настройках».
- Тексты i18n ru/en/uk.
- vite-прокси: '/mcp' регэкспом ^/mcp(/|$) — путь страницы /mcp-help
не должен проксироваться в backend (префиксный матч ловил её).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
12 hours ago
|
Пачка 4 ревью: расхождения с ТЗ
...
- Фильтр по приоритету в списке задач (ТЗ 3.6): параметр priority в
GET /api/tasks — градации шкалы 0-10, без приоритета = very_low;
селект в ListView, ключи i18n в ru/en/uk, тест.
- Статистика (ТЗ 3.13): метрики «закрыто», XP, график и теплокарта считают
только закрытия (kind='task') — микронаграды за создание больше не
попадают в «закрыто».
- apply_proposal привязывает задачу только к неархивному проекту; каталог
проектов для LLM-детализации тоже без архивных (ТЗ 3.8.1).
- i18n: «ч» часов в достижениях сада — через словарь (taskui.time.h).
- Докстринги: актуальные номера разделов ТЗ (MCP 3.10, архив 3.8.1).
ТЗ 0.29 (семантика фильтра приоритета в 3.6).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
13 hours ago
|

Пачка 3 ревью: гонки наград и остатки фронтенда
...
- Гонка дейли: уникальный частичный индекс (source, day) + колонка
coin_events.day; параллельные POST /api/xp/daily отдают granted=False
вместо 500 (IntegrityError ловится молча).
- Гонка ensure_garden (параллельные GET /api/garden): работа в savepoint,
при нарушении уникальности (uq_coin_level, kind+ref_id) — откат и выход;
дубли бонусов уровня и растений исключены.
- Параллельное закрытие: PATCH и MCP update_task берут задачу с FOR UPDATE
OF tasks (Postgres; SQLite игнорирует) — двойных наград/спавнов нет.
- redetail утверждённой задачи — no-op: ai_proposal больше не стирается,
фоновая LLM не будится (worker и так работает только с raw).
- Фронт: ProjectView подписан на SSE (task/project changed/deleted);
SSE-refetch на странице задачи не затирает начатый ввод тега;
просрочка дедлайна считается по локальной дате, а не UTC; бросок
предмета мимо сада игнорируется (не прилипает к краю); пауза refetch'а
сада держится до конца своего move-запроса, а не фиксированные 300 мс.
- Тест: redetail no-op для approved. 110 passed.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
13 hours 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
13 hours ago
|
«Новая задача» в шапке проекта: на мобильном — кнопка-иконка
...
size="sm" (плитка иконки 32px вместо 46px) + на ≤640px лейбл скрывается,
кнопка сжимается до компактной 54x38 — как «+» топбара.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
14 hours ago
|
Чекбоксы списков задач в описании кликабельны и сохраняются (ТЗ 0.26)
...
Клик по чекбоксу в отображаемом описании переключает соответствующий
- [ ] / - [x] в сыром markdown (маркеры - * + и нумерованные списки)
и сохраняет PATCH'ем описания. marked рендерит чекбоксы с disabled —
атрибут снимается во view-режиме, иначе клики не всплывают вовсе;
повторный клик до ответа блокируется до перерендера.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
14 hours 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
14 hours ago
|
ИИ-детализация: короткий тайтл, шаги в описании, контекст проектов, валидация (ТЗ 0.25)
...
- LLM предлагает короткий заголовок для перегруженных тайтлов и описание
с нумерованными шагами, если они очевидны
- в контекст добавлены открытые проекты с описаниями — назначение по смыслу
- теги: разрешены новые (1-2 при отсутствии подходящих), до 3, не обязательно один
- валидация ответа: заглушки «NULL»/пробелы отбрасываются, дубли схлопываются,
new_project без валидного имени не протекает; несуществующие теги создаются
при утверждении
- фронт: строки «Новый заголовок»/«Описание с шагами» в карточке предложения
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours 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
15 hours ago
|
| 2026-09-20 |
Сад: инвентарь декораций — покупка кладёт на склад, drag на карту и обратно
...
- Бэк: garden_items.x/y nullable; покупка декорации не размещает её,
а кладёт в инвентарь; PATCH с x/y null возвращает декорацию в инвентарь
(растениям — 400); авторазмещение учитывает только размещённые элементы.
- Фронт: полоса инвентаря под сценой с чипами, drag из инвентаря на карту
с призраком у курсора, drag размещённой декорации обратно в инвентарь,
GnAlert «Куплено…» в маркете. Фикс: убран pointer-events:none у декораций —
из-за него декорации нельзя было перетаскивать по карте.
- Миграция f2a3b4c5d6e7, локали ru/en/uk, ТЗ 0.15.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Сад-сцена: монеты, растения на карте, магазин декораций и расширений
...
Контент открывается за опыт, покупается за монеты: XP — ранг садовника
(только растёт), монеты — валюта сада. Монеты за закрытие = floor(xp/2)
(заголовок X-Earned-Coins) и бонус 25×L за уровень; журнал — coin_events.
- Бэкенд: CoinEvent/GardenItem + миграция с backfill монет; сервис сада
(баланс, авторазмещение спиралью вокруг домика, виды по уровням,
premium только у rare/epic); API /api/garden — сцена, перемещение,
апгрейд растений, магазин декораций и расширений карты.
- Фронт: SVG-сцена GardenScene (сетка 20px, домик, drag&drop, поповер
роста), кошелёк в шапке, маркет (расширения, декорации, каталог видов
с замками), тост «+XP • +N монет», локали ru/en/uk.
- Тесты сада (10), ТЗ 0.14 (3.13 + модель данных).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Сущность «документ»: описания и заметки — единый текст с вложениями
...
- Новая таблица documents (owner_type task|project, owner_id, body) —
описания задач и заметки проектов теперь одна сущность; на моделях
полиморфная relationship + свойства description/note (API не меняется).
- Вложения привязаны к документу: attachments.document_id; эндпоинты
/api/documents/{id}/attachments; URL файла /api/attachments/{id}/file
не тронут (зашит в сохранённый markdown и PWA-кэш).
- Миграция d9e8f7c6b5a4: перенос текстов в документы (документ заводится
каждому владельцу), бэкфилл вложений, дроп старых колонок.
- Картинки в заметке проекта: Ctrl+V в инлайн-редакторе, drawer на
странице проекта и в списке проектов.
- MCP: поиск по описанию через join по документу; вложения в _full.
- ТЗ 0.13: модель данных обновлена.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Проект: карандаш заметки + правки инлайн-селектов
...
- Заметка проекта: карандаш виден (color:inherit) и стоит справа на линии
заголовка, как на странице задачи.
- GnSelect перекрывает @change своим внутренним onChange — сохранение по
change молча не срабатывало; убран @change="save" из инлайн-селектов
(актуальность и приоритет проекта, приоритет задачи), сохранение — по ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Вставка картинок в описание: в позицию курсора + просмотр на весь экран
...
- MdEditor сам обрабатывает Ctrl+V с картинками: файл грузится колбэком
uploadImages, markdown-ссылка вставляется в позицию курсора textarea,
миниатюры вставленного показываются под полем (клик — лайтбокс).
- Новый MdLightbox: полноэкранный просмотр картинки (клик по фону,
крестик или Esc закрывает); подключён к отображению описания задачи
(клик по img в md-view) и заметки проекта, а также к предпросмотру
редактора.
- TaskForm: paste-логика перенесена в MdEditor (колбэк uploadImages).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Блок подзадач: кнопка справа, список отделён отступом
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Карандаш описания: margin-top -23px
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Правки страницы задачи: карандаш описания и малая кнопка статуса
...
- Карандаш описания: тёмный цвет в тон заголовку карточки, прижат
к правому краю линии «Описание».
- «Изменить статус»: большая кнопка заменена на маленькую иконку
(GnIconButton с карандашом), dropdown-меню прежнее.
- Инлайн-правка заголовка: .inline-field/.inline-editing на всю ширину
шапки, поле растягивается, кнопки ✓/✗ рядом.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Фикс стилизации инлайн-редакторов: GnInput вместо bare-инпутов
...
В ките GnInput bare рендерит input вообще без класса (стили кита живут
в селекторе .form-group .label .input), поэтому инлайн-редакторы были
голыми браузерными полями. Теперь инлайн использует GnInput/GnSelect
с полной обёрткой кита; в строках параметров и шапке поле ужато
(:deep-переопределения размеров, отступы формы убраны), классы width
вешаются на сам input, т.к. attrs-класс не попадает на обёртку.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Инлайн-редактирование полей на страницах задачи и проекта
...
- Новый компонент InlineField: враппер «показ ↔ редактор» с кнопками ✓/✗,
Esc = отмена, throw из save() оставляет редактор открытым.
- Страница задачи: заголовок правится кликом в шапке, описание — по
карандашу (MdEditor без подписи), в «Параметрах» все 8 строк видны
всегда; приоритет, оценка, фактически, деньги (бюджет+оценка одним
PATCH) и дедлайн (дата+период, взаимоисключающие) правятся инлайн.
- Страница проекта: инлайн для названия, заметки, актуальности, приоритета.
- MdEditor: caption='' скрывает подпись, undefined — стандартная.
- Локали: common.notSet, task.editTitle/editDescription,
task.deadlineConflict, projectPage.editNote.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
«Я сам» больше не открывает форму правки
...
Кнопка просто отменяет помощь ИИ: утвердить задачу без применения
предложения (apply_proposal=false) — без принудительного перехода
в форму правки.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Кнопка «Я сам» в карточке предложения ИИ
...
Утверждает задачу без применения предложения (apply_proposal=false)
и сразу открывает форму правки — детали пользователь заполняет сам.
ru/en/uk: task.proposalMyself.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Баг: переход подзадача → родитель не обновлял данные страницы
...
/vue-router переиспользует инстанс TaskView при переходе между
/tasks/:id — onMounted не срабатывает, экран оставался на старой
задаче. Данные теперь перезагружаются по watch(taskId); заодно
сбрасывается режим правки. Та же защита добавлена в ProjectView.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Разгрузка формы создания: «Дополнительно» свёрнуто, редирект на задачу
...
- Оценки (время, затраты) и дедлайн в TaskForm свёрнуты в GnAccordion
«Дополнительно»: при создании скрыты (детализация — позже), при правке
раскрыты по умолчанию.
- После создания задачи из стека (StackView) и со страницы проекта
(ProjectView) пользователь направляется на страницу созданной задачи —
там блоки заполняются через «Редактировать».
- Локали: stack.form.extra (ru/en/uk).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
feat: метка «ментально сложная» — кнопка «Не хочется делать» + геймификация
...
- Task.mentally_hard (миграция c8f7e6d5b4a3) + поле в TaskUpdate/TaskOut
- compute_task_xp: +10 WILLPOWER_BONUS за закрытие «ментально сложной»
- заголовок X-Mentally-Hard при закрытии; +2 теста (66 зелёных)
- TaskView: warning-кнопка-переключатель в карточке статуса (скрыта у done)
- TaskBadges: warning-бейдж «ментально сложная»
- празднование: «+N XP • сила воли», золотое конфетти всегда, фраза в тосте
- сад: ачивка «Преодоление» 5/25/50; справка сада и локали ru/en/uk обновлены
- ТЗ 0.12: пункт про метку в 3.13
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
stats: переключатель диапазона сетки активности — полгода / год
...
- GnTabs «Полгода / Год» в шапке сетки активности: 26 или 52 недели
- Заголовок секции зависит от диапазона (stats.heatmapHalf/heatmapYear)
- GnTabs в ките тянется на width:100% — в шапке посажены в одну строку
- Локали ru/en/uk; ТЗ 0.11: сетка активности «за полгода или год»
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
feat(frontend): сравнительный график и сетка активности на статистике
...
- График периодов стал сравнительным: текущий и предыдущий аналогичный период
— пары столбиков (час↔час, день недели↔день недели, число↔число), легенда
«Сейчас / Предыдущий период»
- Сетка активности «как в гитхабе»: последние 26 недель, заливка 0–4 по
закрытым задачам или XP (переключатель), тултипы с датой, легенда
- Локали ru/en/uk, ТЗ 0.10 дополнен
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|