| 2026-10-10 |

Корешок у карточки проекта, «без активности», перенос задачи в проект (0.82)
...
- ProjectsView/ArchiveView: у карточки проекта левая грань 6px (китовый
--gn-border-width-accent, тот же шаг, что у полосы шапки страницы) и цвета
проекта — того же, что метка у имени и заливка прогресса; у проекта без
цвета грань берёт акцент кита. У карточки задачи рамка осталась ровной 2px:
по одной этой грани видно, что перед тобой папка с задачами, а не сама
задача. Тот же корешок у карточки проекта в архиве и у заготовок списков,
иначе при загрузке карточка дёрнула бы ширину содержимого. Наведение
подкрашивает рамку, но не корешок — цвет грани принадлежит проекту, а не
состоянию карточки.
- ProjectsView: у проекта без задач подвал больше не пустует — вместо
свежести стоит «без активности» (ключ projects.noActivity, три локали).
- kit-overrides.css: полоса прокрутки спрятана у всех табов — правило было
только у фильтра «Списка задач», и на странице проекта табы статуса
оставались с полосой. Прокрутка сохранена.
- TaskCard/TaskMoveDialog: в «⋯»-меню карточки задачи появились «Перейти к
проекту» (нет у задачи без проекта и на странице самого проекта) и
«Переместить в проект». Перенос — модалка с выбором проекта (GnModal +
GnSelect кита, первым пунктом «без проекта», текущий проект выбран по
умолчанию) → PATCH /api/tasks/{id} с project_id: XP и монеты за перенос не
начисляются, успех подтверждается тостом, а списки перечитываются по
событию moved (в «Выдаче» и на странице задачи подписки на task.changed
нет — без события карточка осталась бы в старом проекте).
- ТЗ 0.82.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
14 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
15 hours ago
|
Страница задачи не едет по горизонтали, отступ табов статуса (0.78)
...
- TaskView: мобильный трек сетки — minmax(0, 1fr) вместо голого 1fr
(тот не сжимается ниже min-content: 517px в коробке 358px), колонки
получили min-width: 0 — на 390px страница уезжала вбок (scrollWidth 533).
- TaskView: overflow-wrap: break-word у md-view — длинный неразрывный токен
в описании (URL, инлайновый code) заставлял абзац скроллиться по горизонтали.
- ListView: отступ снизу у табов статуса 0.6rem → 1.25rem, табы липли
к первой карточке списка.
- ТЗ 0.78.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
17 hours ago
|
| 2026-10-09 |

Проекты: цвет, сайт, фавикон, закрепление, README из репозитория (0.63–0.67)
...
- Цвет-метка проекта (0.63): у проекта может быть цвет-кружок. Селектор
цвета — сырым блоком в стиле кита (в ките компонента нет); кружок рисует
общий компонент ProjectColorDot.
- Сайт проекта (0.63): отдельное поле site_url. Иконку сайта тянет
бэкенд-прокси с кэшем (GET /api/projects/{id}/favicon, том favicons) —
сторонние favicon-сервисы не используются, данные не покидают VPS. В 0.65
иконка встала в метку проекта (кружок + фавикон), а ссылка на сайт —
чипом в шапке страницы проекта.
- Карточка списка кликабельна целиком (0.63; кнопка «Открыть» дублировала
ссылку), тайтл крупнее (0.65), клетки прогресса — поверх полосы кита
(0.64): сегментированной полосы в ките нет.
- Закрепление проектов (0.66): поле pinned, закреплённые — секцией сверху,
сортировка списка по свежести активности, подвал карточки — отсчёт до
ближайшего дедлайна.
- Место булавки переставлено (0.67): на карточке — правый верхний угол
рядом с бейджем актуальности и видна всегда (была приглушена в подвале),
на странице проекта — кнопка-булавка рядом с именем (искали строкой
«Закреплён» в параметрах).
- Репозиторий проекта (0.67): ссылка на git-репозиторий — отдельное поле
repository_url, отдельно от заметки и сайта. README из репозитория
показывается вторым описанием — карточкой «README из репозитория» под
заметкой, со ссылкой на репозиторий и сворачиванием длинного текста;
тянет такой же бэкенд-прокси с кэшем (GET /api/projects/{id}/readme),
не нашли — «README не найден». Распознавание ссылки на репозиторий в
заметке проекта снято (у задачи README-вместо-описания остаётся),
данные в БД не мигрировались.
- Фантомный отступ перед именем у проекта без цвета и фавикона (0.67):
ProjectMark рисовал пустой спан в ряду с gap.
- ТЗ 0.63–0.67; MCP зеркалит поля проекта (color, site_url,
repository_url, pinned). Тесты: 207.
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 |
Подсказка про README — у заметки проекта, не у задачи
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Карточка тегов на странице задачи: максимум 400px, внутри скролл
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Подсказка: описание можно заполнить ссылкой на публичный репозиторий
...
В подписи редактора при создании задачи и на странице задачи
(пустое описание, инлайн-правка) — «вставьте ссылку на публичный
репозиторий — вместо описания подтянется README». Локали ×3, ТЗ 0.41.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
README.md вместо описания-ссылки на репозиторий
...
Если описание задачи — одна ссылка на git-репозиторий, на странице
задачи вместо неё показывается README.md оттуда (с подписью-ссылкой
на источник; сырое описание в БД не меняется, чекбоксы README не
патчат описание).
Хост не обязан быть GitHub/GitLab (ТЗ 3.3, 0.41): селф-хостед системы
ищутся эвристикой — API github/gitlab/gitea + raw-пути web-интерфейсов
с дефолтной веткой HEAD (проверено на селф-хостед GitBucket);
не нашли — 404, остаётся ссылка. Кэш прочтений в памяти, 10 минут.
- backend: services/readme.py (эвристика + перебор, кэш),
GET /api/repo-readme?url=, тесты (кандидаты, кэш) — 159 тестов
- frontend: api.getRepoReadme, TaskView показывает README вместо
описания при одиночной ссылке; локали task.readmeFrom ×3
Проверено headless на живом фронте: git.gnexus.space (GitBucket) и
github.com — README рендерится, при неудаче остаётся ссылка.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Лоадеры и скелетоны: спиннер обновления в шапках, скелетоны под макет страниц
...
- Спиннер обновления (GnLoader circle, .refresh-loader fixed под топбаром) в
#actions шапок списков: задачи, стек, проекты, архив, проект, задача, опции
- Скелетоны заменены с рамочного .skeleton-stack на макет-мимикрирующие
карточки кита: списки — сетка карточек с бейджами, задача — сетка main/сайд,
статы — метрики, сад — блок + строки
- kit-overrides.css: только теговые бейджи/чипы без uppercase, позиция спиннера
- Локаль common.loading (ru/en/uk)
Проверено headless на живом фронте: скелетоны на первом входе (list 4 карточки,
task 5 карточек/12 линий, stats 3 метрики, garden блок+2 линии, projects 3,
archive 2, stack 3+6 бейджей), спиннер появляется при обновлении данных.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Теги: подсказки существующих по набору в полях тегов
...
GnTagInput кита (v0.4.0) без автодополнения — тонкая обёртка TagField:
строка чипов-подсказок под полем, фильтр по набираемому тексту (он читается
из всплывающего input-события внутреннего поля кита). Клик по подсказке
добавляет тег и очищает ввод синтетическим input-событием.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Статус-блок: «Завершено» у задачи в работе, «Не хочется делать» — только до начала
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
Предложение ИИ: кнопки «Не то» вместо «Я сам», все действия — мелкие
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
ИИ-детализация: только оформление (заголовок/описание/теги EN), суммаризация проектов (ТЗ 0.40)
...
- Убрано ИИ-планирование с 0% попадания: LLM больше не предлагает
проект, приоритет и оценку времени — их заполняет пользователь
- Заполненные пользователем поля не угадываются при первичном анализе;
«Переспросить ИИ» (force) — полный анализ
- Ответ LLM — на языке исходного текста; новые теги — только английские
- Улучшено сжатие заголовка: лаконичное название + описание с шагами
- Суммаризация заметок проектов (projects.summary, миграция
a9b8c7d6e5f4): контекст LLM вместо полных заметок; перегенерация
при правке заметки
- Фикс \u-эскейпов в JSON-колонках (ensure_ascii=False): MCP-агенты
видят кириллицу, а не «u0432»
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
|
| 2026-09-21 |

Пачка 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
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
|
Чекбоксы списков задач в описании кликабельны и сохраняются (ТЗ 0.26)
...
Клик по чекбоксу в отображаемом описании переключает соответствующий
- [ ] / - [x] в сыром markdown (маркеры - * + и нумерованные списки)
и сохраняет PATCH'ем описания. marked рендерит чекбоксы с disabled —
атрибут снимается во view-режиме, иначе клики не всплывают вовсе;
повторный клик до ответа блокируется до перерендера.
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
|
ИИ-детализация: короткий тайтл, шаги в описании, контекст проектов, валидация (ТЗ 0.25)
...
- LLM предлагает короткий заголовок для перегруженных тайтлов и описание
с нумерованными шагами, если они очевидны
- в контекст добавлены открытые проекты с описаниями — назначение по смыслу
- теги: разрешены новые (1-2 при отсутствии подходящих), до 3, не обязательно один
- валидация ответа: заглушки «NULL»/пробелы отбрасываются, дубли схлопываются,
new_project без валидного имени не протекает; несуществующие теги создаются
при утверждении
- фронт: строки «Новый заголовок»/«Описание с шагами» в карточке предложения
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 |
Сущность «документ»: описания и заметки — единый текст с вложениями
...
- Новая таблица 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
20 days ago
|
Проект: карандаш заметки + правки инлайн-селектов
...
- Заметка проекта: карандаш виден (color:inherit) и стоит справа на линии
заголовка, как на странице задачи.
- GnSelect перекрывает @change своим внутренним onChange — сохранение по
change молча не срабатывало; убран @change="save" из инлайн-селектов
(актуальность и приоритет проекта, приоритет задачи), сохранение — по ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days 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
20 days ago
|
Блок подзадач: кнопка справа, список отделён отступом
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days ago
|
Карандаш описания: margin-top -23px
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days ago
|
Правки страницы задачи: карандаш описания и малая кнопка статуса
...
- Карандаш описания: тёмный цвет в тон заголовку карточки, прижат
к правому краю линии «Описание».
- «Изменить статус»: большая кнопка заменена на маленькую иконку
(GnIconButton с карандашом), dropdown-меню прежнее.
- Инлайн-правка заголовка: .inline-field/.inline-editing на всю ширину
шапки, поле растягивается, кнопки ✓/✗ рядом.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days 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
20 days 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
20 days ago
|
«Я сам» больше не открывает форму правки
...
Кнопка просто отменяет помощь ИИ: утвердить задачу без применения
предложения (apply_proposal=false) — без принудительного перехода
в форму правки.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
20 days ago
|