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

Конфигурация ui

Опциональный блок ui: в workspace.yml настраивает интерактивный браузер команд, используемый dwe commands, когда тот вызывается без точного command ID.

Браузер работает на общем фреймворке tui: две панели с рамками (дерево слева, список команд справа), нижняя строка статуса (бренд · breadcrumb · ? help) и модальная справка по ?, которая перечисляет биндинги, активные в текущем режиме. Фокус панелей переключается по Tab / Shift+Tab; сфокусированная панель подсвечивается своей рамкой. Мышь поддерживается (см. Мышь).

Блок грузится тем же мягким загрузчиком, что и остальной workspace.yml: отсутствующий блок и неизвестные ключи молча игнорируются на этапе загрузки. Выделенный валидатор ui (запускаемый через dwe validate) подсвечивает неизвестные ключи как warning’и, а невалидные значения (например, отрицательную глубину) — как error’ы.

ui:
commands:
default_expanded_depth: 1 # int, дефолт 1
auto_collapse_empty: true # bool, дефолт true
show_type_badges: true # bool, дефолт true

Управляет тем, сколько уровней дерева раскрыто по умолчанию при открытии браузера команд. Отрицательные значения зажимаются до 0 аксессором и отвергаются как ошибка валидатором.

Как и auto_collapse_empty и show_type_badges, это поле использует указатель *int, чтобы загрузчик мог отличить отсутствующий ключ (nil → использовать дефолт по спецификации 1) от явного значения. Установка default_expanded_depth: 0 означает all-collapsed (на входе ни одна группа не раскрыта); пропуск ключа восстанавливает дефолт 1 (раскрыты только группы верхнего уровня). Любое положительное целое раскрывает до этой глубины.

Если true (по умолчанию), сессии fuzzy-фильтра автоматически сворачивают и затемняют поддеревья с нулём совпадений; предыдущее состояние раскрытия восстанавливается на Esc.

Если true (по умолчанию), правый список команд показывает цветной бэйдж типа (shell, script, workflow, service_exec, service_run, builtin, dwe) рядом с каждым command ID. Установите false, чтобы скрыть бэйджи на узких или монохромных терминалах.

Все три поля (default_expanded_depth, auto_collapse_empty, show_type_badges) используют указательные типы (*int / *bool), чтобы загрузчик мог отличить отсутствующий ключ (nil → использовать дефолт по спецификации) от явного значения. Простые int/bool смешали бы эти два состояния, потому что отсутствующий ключ и явный 0/false оба десериализуются в zero-value.

Практические последствия:

  • Установка default_expanded_depth: 0 сворачивает все группы на входе; пропуск ключа даёт дефолт 1.
  • Установка auto_collapse_empty: false или show_type_badges: false — это намеренный отказ; пропуск любого ключа восстанавливает его дефолт true.
workspace.yml
ui:
commands:
default_expanded_depth: 2
auto_collapse_empty: true
show_type_badges: false

Опустите блок целиком, чтобы принять все дефолты; существующие файлы workspace.yml без блока ui: продолжают работать так же.

Фокус переключается между двумя панелями по Tab / Shift+Tab. Биндинги навигации и выбора диспетчеризуются в сфокусированную панель; биндинги, специфичные для дерева (→/l, ←/h), инертны в списке, а run-режимные глаголы (e, y) отсутствуют вне run-режима. Модалка ? перечисляет ровно те биндинги, что активны в текущем режиме.

БиндингДействие
Tab / Shift+Tabпереключить фокус между панелью дерева и списка
↑/↓, k/jпереместить курсор в сфокусированной панели
, lраскрыть фокусированную группу или войти в её первого ребёнка (только дерево; no-op в списке)
, hсвернуть фокусированную группу или перейти к её родителю (только дерево; no-op в списке)
Home / Endперейти к первой / последней строке сфокусированной панели
PgUp / PgDnпроскроллить сфокусированную панель на один вьюпорт
Enterна группе дерева: переключить раскрытие; на элементе списка: подтвердить выбор (запуск, inspect или edit, в зависимости от точки входа)
/войти в режим inline-фильтра
iоткрыть inspect-оверлей для подсвеченной команды
yпереключить skip-confirm (только run-режим); строка статуса показывает [--yes ON]
eподтвердить подсвеченную команду и принудительно открыть форму параметров (только run-режим)
?переключить модальную справку
Esc, q, Ctrl+Cвыйти из браузера

Пока активен inline-фильтр (/), напечатанные символы уточняют fuzzy-запрос — строка запроса рендерится внутри панели дерева, дерево сужается на лету с обновлёнными счётчиками совпадений M/N, Enter фиксирует отфильтрованное раскрытие, а Esc восстанавливает прежнее состояние раскрытия. Буквы-действия (i, e, y, …) при фильтрации печатаются в запрос, а не диспетчеризуются.

Пока открыт inspect-оверлей (i), он захватывает ввод: ↑/↓, k/j, PgUp/PgDn, Home/End скроллят центрированный вьюпорт, Enter подтверждает (возвращает тот же Result, что и Enter из списка), а Esc закрывает оверлей.

На пути с двухпанельным фреймом (TTY ≥ 80 колонок) выбор команды с параметрами открывает форму параметров как оверлей поверх браузера — браузер затемняется под ней, строка статуса остаётся видимой — вместо того чтобы сначала разбирать TUI. Вы заполняете параметры на месте; многополевые формы скроллятся внутри оверлея (сфокусированное поле остаётся видимым). При отправке оверлей закрывается, браузер выходит, и команда запускается в обычном терминале (баннер + потоковый вывод) с введёнными значениями. Esc отменяет форму и возвращает вас в браузер без запуска команды, сохраняя состояние курсора / раскрытия / фильтра; Ctrl+C выходит из всего TUI.

Enter автоматически пропускает форму, когда у каждого обязательного параметра уже есть значение (из --set или объявленного дефолта) — команда запускается сразу без оверлея. Используйте e (edit-parameters), чтобы принудительно открыть форму, даже когда обязательные значения уже удовлетворены. Команда без параметров всегда запускается сразу по Enter.

Команда всё равно исполняется после выхода из TUI (она стримит вывод docker / пайплайна в обычный терминал); в оверлей переезжает только ввод параметров. Промпт confirmation:, если он объявлен, по-прежнему показывает своё yes/no в обычном терминале после выхода из TUI, непосредственно перед запуском. На узком (< 80 колонок) fallback браузер сохраняет плоский поток exit-then-form. Прямые вызовы dwe commands <id>--set или без), piped / неинтерактивные и --output json не затрагиваются. (Голый dwe commands --set … без id на TTY по-прежнему открывает браузер — значения --set просто предзаполняют оверлей.)

Биндинги e (edit-parameters) и y (skip-confirm) регистрируются только в run-режиме (дефолт, когда --inspect / -i не задан); в inspect-режиме и в edit-режиме vars-браузера они отсутствуют и в keymap, и в справке ?.

Браузер инспектирует терминал на старте и грациозно деградирует. Ниже минимума для двух панелей (или при ошибке чтения размера) он сразу падает на плоский список huh.NewSelect — in-TUI режима с одной панелью больше нет.

УсловиеПоведение
non-TTYвызывающее место завершается с существующей ошибкой no exact command ID given; pass a full command ID or run in an interactive terminal; до браузера дело не доходит (а Run защитно отменяет, если всё же дошло)
TTY, width < 80 или height < 15делегирует плоскому списку huh.NewSelect (pre-browser UX)
TTY, width ∈ [80, 99]two-panel фрейм без счётчиков групп (N) и без бэйджей типов
TTY, width ≥ 100полный two-panel фрейм с бэйджами и счётчиками (breadcrumb всегда показан в нижней строке статуса)

NO_COLOR=1 учитывается автоматически через lipgloss/bubbletea: бэйджи рендерятся как простой текст, focus-маркер использует bold вместо цвета.

Фрейм включает поддержку мыши:

  • Одиночный клик в панели перемещает курсор на кликнутую строку и ставит фокус на эту панель; он никогда не переключает группу и не запускает команду.
  • Двойной клик работает как Enter на кликнутой строке — переключает группу дерева или подтверждает элемент списка.
  • Колесо скроллит панель под указателем (дерево, список команд или открытый оверлей инспекта), не меняя фокус — работает независимо от того, какая панель сфокусирована.
  • Клик по подсказке ? help в строке статуса переключает модальную справку; клики внутри открытой модалки проглатываются.
  • workspace.md — обзор top-level конфигурации
  • commands/ — определения пользовательских команд
  • styles.md — ключи палитры, используемые type-бэйджами