Переключатель организаций в сайдбаре (дизайн-базлайн v2, A1) показывает все
организации человека, текущая отмечена, выбор другой пересобирает Shell по
ключу организации. Вход без организации в адресе открывает последнюю
открытую или первую по списку вместо экрана «нет доступа»; предпочтение
переехало в localStorage.
Разделы «Платформа» и «Хранилище файлов» видны только администратору
установки, relay для звонков у остальных менеджеров только на чтение;
настройки установки запрашиваются с /api/v1/instance/.
Ссылка-приглашение /join: вошедший принимает приглашение и попадает в новую
организацию, гость без учётной записи задаёт имя и пароль полями мастера
первого запуска. Ожидающие приглашения показаны в списке сотрудников
строками «Приглашён» с меню «отправить ещё раз» и «отозвать» — теми же
элементами, что строка сотрудника.
e2e: проекту internal-ui задана русская локаль браузера, моки сессии отдают
язык установки — сценарии перестали зависеть от языка машины; добавлены
сценарии переключателя, строки приглашения и регистрации гостя.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Скрипт был зелёным всегда. `$ErrorActionPreference = "Stop"` не влияет на код
возврата нативных команд, поэтому упавший pytest проходил как успех: проверено
на живом примере — прежняя схема при команде с кодом 3 доходила до конца и
возвращала 0. Теперь каждый шаг сверяется с $LASTEXITCODE, провалившиеся
перечисляются в конце, скрипт выходит с 1.
Кроме этого:
- явные `-f compose.yaml -f compose.dev.yaml`: сервисы frontend и web-chat
(node) существуют только в dev-оверлее, в базовом compose frontend —
production-образ nginx, где нет npm. Голый `docker compose` три шага из
четырёх выполнить не мог в принципе;
- добавлены CLI-тесты и e2e — раньше их не было ни в одном скрипте;
- порядок от быстрых проверок к длинным: typecheck, vitest, CLI, e2e, backend
(~20 минут). Дешёвые ошибки всплывают за секунды;
- скрипт не останавливается на первом падении: прогоняет всё и показывает
список провалов, иначе каждая ошибка стоила бы отдельного круга.
playwright.config.ts: `webServer` поднимал только internal-ui на :5173, а
проект web-chat-mobile ходит на :5175 — без заранее поднятого dev-стека прогон
падал. Описаны оба сервера, e2e стали самодостаточными; без этого включать их
в check.ps1 не имело смысла.
Проверка: полный прогон скрипта — 6 шагов, все зелёные, exit code 0
(typecheck ×2, vitest 76, CLI 9, e2e 8, backend 624).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- нет зашитых доменов: help-домен по умолчанию localhost (задаёт установщик через
CHATBALLS_HELP_BASE_DOMAIN), фронт определяет портал помощи пробой /api/v1/help/,
ALLOWED_HOSTS без вендорских хостов, CI environment url — из CHATBALLS_APP_DOMAIN
- DEFAULT_FROM_EMAIL по умолчанию no-reply@localhost; JWT-аудитория support-токена
chatballs.support; загрузчик виджета: window.ChatballsChat, события chatballs-chat-*
- «Контакты»: продукты берутся из данных организации ({code, name}), цвет —
детерминированно по коду; зашитый список продуктов вендора убран
- npm-скоупы @chatballs/*, тема chatballsTheme/buildTheme
- тестовый bootstrap: организация demo, сотрудник staff.member@example.org,
продукты site/app; фикстуры на example.com
- убрана мёртвая привязка Shell к e-mail сотрудника вендора
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Public checkout belongs to product backends, not Hub (ADR-HUB-0014,
ADR-HUB-0018). Delete apps/checkout and its wiring: compose service, nginx
pay.localhost route, npm workspace and dev script, playwright project,
HubApplication type, check.ps1 typecheck and README mentions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Playwright e2e (mocked API) for internal-ui: OWNER lands on the command
center with the global sidebar; OPERATOR lands on sales dialogs with the
sales sidebar and no company-level navigation; owner-only route shows the
403 permission screen; shell renders at the 1024px minimum width
- auto-start the internal-ui dev server via Playwright webServer
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>