Перейти к содержимому

Карта маршрутов

Оболочка приложения (ControlCenterLayout) оборачивает каждый маршрут внутри рабочего пространства через ShellRoute. Каждый пункт назначения внутри оболочки имеет префикс рабочего пространства — /workspaces/:workspaceId/… — а идентификатор рабочего пространства в URL служит единственным источником истины для активного рабочего пространства. Префикса не имеют только поверхности, существующие до контекста: /splash, /onboarding, /signed-out и голый выбор /workspaces — все на весь экран и вне оболочки.

Шлюз считается пройденным, когда у вошедшего пользователя подключён хотя бы один хост кода и существует хотя бы одно рабочее пространство.

Отсутствующие учётные данные и незавершённая настройка — разные экраны, и различителем служит users.onboarding_finished_at, считанный из собственного identity.me вызывающего, а никогда не «рабочее пространство существует»: последнее неверно в тот момент, когда кого-то приглашают в рабочее пространство, которое он не создавал. Без подключённого хоста кода аккаунт, прошедший онбординг, попадает на /signed-out для повторной аутентификации; аккаунт, не прошедший его, — на /onboarding. Пока флаг неизвестен, страж удерживает заставку, а не гадает, потому что он никогда не перенаправляет обратно из онбординга.

Путь Экран
/splash Стартовая заставка, которая определяет результат шлюза онбординга
/onboarding Подключение хоста кода, создание рабочего пространства или присоединение к нему, песочница, адаптер по умолчанию, затем голос. Шаг выбора рабочего пространства пропускается, если аккаунт уже состоит в нём
/signed-out Повторная аутентификация: та же карточка подключений к хостам кода, которую отображает раздел «Настройки», без полосы шагов и кнопки продолжения — маршрутизатор уходит с неё сам, как только хост кода отчитается о подключении
/workspaces Список и выбор рабочего пространства
/workspaces/:workspaceId Перенаправляет на /workspaces/:workspaceId/inbox

Пути ниже опускают префикс /workspaces/:workspaceId.

Путь Параметры запроса Экран
/inbox — Единые входящие: pull request, классифицированные по жизненному циклу ревью, плюс работа без PR, блокирующая оператора. Целевой маршрут после прохождения шлюза; голый /workspaces/:workspaceId перенаправляет сюда
/spaces — Поверхность пространств, пространство не выбрано
/spaces/:spaceId ?m=<messageId>, ?tab=<key> Одно пространство; m — глубокая ссылка на сообщение, которая поглощается при открытии
/tickets — Доска тикетов
/tickets/:ticketId — Тикет: список и детали
/projects/:projectId — Обзор проекта
/pull-requests ?repo=<owner/name> Список pull request; repo выбирает этот репозиторий на левой панели
/pull-requests/compose ?space=<spaceId> Создание нового pull request; space задаёт пространство, изолированный worktree которого предоставляет ветку
/pull-requests/:owner/:repo/:prNumber ?tab=<key>, ?comment=<id> Детали pull request с просмотром diff; comment — числовой REST-id одного комментария
/pipelines — Список запусков конвейера
/pipelines/run ?templateId=<id> Запуск конвейера вручную
/pipelines/:runId — Детали запуска конвейера (временная шкала шагов)
/plans — Хаб Plan Studio: активные планы, документы планов, плейбуки
/plans/:kind/:id — Plan Studio для одного плана; kind — orchestration или document
/meetings — Список встреч
/meetings/record — Экран записи встречи в реальном времени
/meetings/:meetingId — Детали встречи: заметки, транскрипт, пункты действий, решения
/calendar — Календарь: представления «Месяц», «Неделя» и «Расписание»
/calendar/:eventId — Детали события календаря (соседний маршрут; использует тот же ключ страницы, что и календарь)
/newsfeed — Список ленты новостей
/newsfeed/article/:articleId — Чтение статьи
/observability — Хаб наблюдаемости: вкладки «Использование», «Инсайты», «Онлайн» и «Качество» над лентой журналов запусков рабочего пространства. По умолчанию открывается вкладка «Использование»
/users/:login — Профиль пользователя GitHub
/teams/:organization/:slug — Профиль команды организации GitHub
/api-keys — Управление API-ключами. Нет точки входа в навигации — доступно только по URL
/settings/… — Экраны настроек (ниже)

У разговоров и веток нет собственных маршрутов — ветка это разговор внутри /spaces/:spaceId, который открывается как вкладка редактора, а не адресуется по URL.

Маршрута /dashboard не существует, как и экрана дашборда. Аналитическая поверхность — это /observability, на которую попадают из нижней части боковой панели.

Пункта боковой панели «Планы» нет. Plan Studio открывается как вкладка редактора из строки плана в разговоре, который его создал; /plans и /plans/:kind/:id — глубокие ссылки.

У /observability и /pull-requests/compose нет записи в реестрах заголовков маршрутов и навигационных цепочек, поэтому в заголовке окна у обоих отображается только имя приложения, а цепочка навигации отсутствует.

/settings перенаправляет на /settings/you/appearance. Кнопка настроек на боковой панели и Cmd/Ctrl + , ведут на /settings/you/appearance.

Пути настроек разнесены по пространствам имён по области — you/, workspace/, server/ — потому что сегмент указывает, на кого влияет изменение. Два пути появились раньше такого разделения и не имеют области в URL: /settings/memory и /settings/pipelines.

Путь Экран
/settings/you/appearance Тема, язык, типографика, тема редактора (стартовый экран настроек)
/settings/you/notifications Переключатели по событиям, тихие часы
/settings/you/keybindings Справочник горячих клавиш (только для чтения)
/settings/you/audio Микрофон, диктовка, определение встреч и вывод звуковых пейзажей
/settings/you/devices Привязанные телефоны и удалённое управление
/settings/you/newsfeed Управление лентой: источники, обновление, состояние прочитанного
Путь Экран
/settings/workspace/profile Профиль и идентичность в этом рабочем пространстве: имя, автор git, хостинг кода, календарь
/settings/workspace/general Название, логотип, glob-шаблоны секретов, параллелизм ревью, именование веток, состояние синхронизации, чат-мосты, опасная зона
/settings/workspace/meetings Шаблоны заметок встреч и сохранённые голосовые профили
/settings/workspace/members Состав участников, приглашения, журнал аудита. Журнал аудита разбивается на страницы с необязательным ?cursor=
/settings/workspace/repositories Репозитории, зарегистрированные в этом рабочем пространстве
/settings/workspace/agents Зарегистрированные идентичности агентов
/settings/workspace/skills Настройка навыков
/settings/memory Память рабочего пространства: факты, политики, граф знаний
/settings/workspace/permissions Разрешения агента: матрица ограничений и проверка «что если»
/settings/pipelines Шаблоны конвейеров
/settings/pipelines/:templateId Редактор шаблона конвейера (полотно с перетаскиванием)
Путь Экран
/settings/server/connection Подключение и состояние
/settings/server/sso Единый вход (SAML, OIDC, провижининг SCIM)
/settings/server/providers Провайдеры моделей и адаптеры
/settings/server/mcp Встроенные и внешние MCP-серверы
/settings/server/voice Голосовые модели и модели встреч (ASR, диаризация)
/settings/server/rigs Rigs: что может загружать этот хост, базовые образы, свои образы, работающие машины
/settings/server/sandbox Права на выполнение в песочнице: программы, которые агенты могут запускать из своей рабочей копии ваших репозиториев
/settings/server/diagnostics Диагностика и конфиденциальность: песочница, эмбеддинг, логирование, отчёты о сбоях
/settings/server/backup Резервное копирование и восстановление: снапшоты установки, экспорт по рабочему пространству, импорт и удаление
/settings/server/about О программе и обновления

kSettingsNav в lib/features/settings/settings_nav.dart — единственный источник истины для этого списка. settings_nav_test.dart фиксирует уникальность идентификаторов и маршрутов, плоский порядок обхода J/K и три области. Он не обходит каждый зарегистрированный GoRoute.

Аспект Файл
Маршрутизатор lib/router/app_router.dart
Построители маршрутов lib/router/routes.dart
Стражи аутентификации lib/router/guards.dart
Шлюз онбординга lib/features/auth/providers/onboarding_providers.dart
Навигация настроек lib/features/settings/settings_nav.dart