feat(ai-chat): role-selection cards as new-chat empty-state (verified live) #113
Closed
Ghost
wants to merge 0 commits from
feat/ai-chat-role-cards into develop
pull from: feat/ai-chat-role-cards
merge into: vvzvlad:develop
vvzvlad:main
vvzvlad:fix/269-table-menu-refocus
vvzvlad:feat/275-codeblock-buttons
vvzvlad:feat/276-ai-chat-dock
vvzvlad:feat/274-ai-chat-page-diff
vvzvlad:feat/270-stress-accent
vvzvlad:feat/273-temp-note-delete
vvzvlad:develop
vvzvlad:feat/268-comment-hover
vvzvlad:docs/dev-stand-guide
vvzvlad:feat/266-scroll-position
vvzvlad:fix/260-collab-docname-slugid
vvzvlad:test/244-phase2-tail
vvzvlad:fix/262-reindex-progress-realtime
vvzvlad:fix/258-changelog-compare-links
vvzvlad:feature/offline-sync
vvzvlad:feat/git-sync
vvzvlad:feat/184-autonomous-agent-runs
vvzvlad:fix/244-dataloss-bugs
vvzvlad:feat/246-spoiler
vvzvlad:feat/221-image-captions
vvzvlad:test/244-part-b
vvzvlad:feat/251-intentional-clear
vvzvlad:fix/embeddings-reindex-progress
vvzvlad:refactor/193-tool-spec-registry
vvzvlad:fix/255-ws-redis-adapter-leak
vvzvlad:fix/252-e2e-open-handles
vvzvlad:feat/229-catalog-yaml
vvzvlad:feat/243-blob-sandbox
vvzvlad:feat/228-inline-footnotes
vvzvlad:fix/qa-ui-bugs-216-218
vvzvlad:feature/agent-roles-catalog
vvzvlad:fix/share-alias-rename
vvzvlad:fix/ai-chat-empty-render
vvzvlad:feat/191-chat-doc-binding
vvzvlad:feat/201-temporary-notes
vvzvlad:feat/198-interrupt-agent
vvzvlad:feat/ai-chat-full-history
vvzvlad:feat/199-ai-generate-title
vvzvlad:feat/205-share-aliases
vvzvlad:batch/issues-189-187-170
vvzvlad:feat/170-mcp-test-button
vvzvlad:feat/189-context-badge
vvzvlad:feat/198-interrupt-agent-send-now
vvzvlad:fix/issues-190-159
vvzvlad:fix/ai-chat-new-chat-during-stream
vvzvlad:fix/ai-chat-stream-perf
vvzvlad:batch/issues-2026-06-25
vvzvlad:feat/ai-chat-persistent-history
vvzvlad:fix/ai-chat-copy-chat-wysiwyg
vvzvlad:fix/ai-stream-reset-resilience
vvzvlad:fix/ai-stream-undici-timeout
vvzvlad:fix/footnote-review-1227-followup
vvzvlad:fix/ai-chat-token-counter-realtime
vvzvlad:docs/manual-qa-test-plan
No Reviewers
Labels
Clear labels
bug
epic
feature
idea
needs-human
review/approved
review/changes-requested
review/needs
Something isn't working
Large multi-phase effort spanning many changes
New functionality request
Idea / proposal for discussion
эскалация: нужно решение человека
в последнем ревью нет открытых blocking-находок
последнее ревью оставило открытые blocking-находки
head не ревьюился (head != reviewed_head)
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: vvzvlad/gitmost#113
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "feat/ai-chat-role-cards"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Фича: выбор agent-role карточками в пустом окне чата
Отчёт по скиллу архитектора.
1. Задача
Из
docs/backlog/ai-chat-role-cards-empty-state.md: заменить выпадающий список<Select label="Agent role">на цветные карточки identity по центру пустого окна нового чата. Клик по карточке применяет роль; если не нажал и просто написал — срабатывает дефолтный Universal assistant; после первого сообщения карточки исчезают.2. Анализ / ключевое решение
Карточки рисуются через УЖЕ существующий проп
emptyStateуMessageList(его использует публичный шэр), а не отдельным блоком. Цепочка:AiChatWindowсобирает<RoleCards/>→ChatThread emptyState→MessageList. Тогда:<Center>);messages.length>0, empty-state не рендерится,selectedRoleIdостаётсяnull);roleIdв body, фиксация роли при создании чата) не меняется — изменения чисто фронтовые.3. Решение
RoleCards(role-cards.tsx+role-cards.module.css): первая карточка — Universal assistant (серая, valuenull, подсвечена по умолчанию), далее по карточке на каждую включённую роль; цвет циклично из палитры 10 имён Mantine через чистый хелперroleCardColor(index); theme-aware CSS-переменные (-light/-light-color/-filled) — корректны в светлой и тёмной теме; эмодзи опционально, описание вtitle. Каждая карточка —UnstyledButtonсaria-pressed(a11y + тестируемость).ai-chat-window.tsx: удалён блок<Select>и его импорт; добавленroleCardsNode(только приactiveChatId===null && enabledRoles.length>0), передан вChatThread emptyState.chat-thread.tsx: добавлен пропemptyState?: ReactNode, форвард вMessageList.4. Найденные баги
Ревью-субагент: проблем не найдено — APPROVE с первого прохода (wiring корректен, удаление Select ничего не сломало, дефолт без регресса, палитра/тесты содержательны, посторонних изменений нет).
5. Тестирование — статистика
Юнит/компонентные тесты: 2 файла / 9 тестов зелёные (
role-card-color.test.ts+role-cards.test.tsx); clienttsc --noEmitчисто.Циклы ревью: 1 (APPROVE, 0 правок).
Живая браузерная проверка: 1 цикл, автономный субагент, headless Chromium, реальный стенд + LLM. Багов: 0. Засеяно 3 включённые роли (Пират/Дедушка/Ревьюер).
<Select>: 4UnstyledButton[aria-pressed](Universal + 3 роли с эмодзи), без нативного<select>и без комбобокса «Agent role» (скринf3-cards).aria-pressed=true; клик по «Пират» → у негоtrue, у Universalfalse; обратный клик возвращает (скриныf3-pirate-selected).🏴☠️ Пиратв шапке, пиратский ответ «Ahoy there, matey!»), карточки исчезли (скринf3-role-bound).f3-negative).🤖 Generated with Claude Code
Pull request closed