Конфигурация 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, дефолт trueui.commands.default_expanded_depth
Заголовок раздела «ui.commands.default_expanded_depth»Управляет тем, сколько уровней дерева раскрыто по умолчанию при открытии браузера команд. Отрицательные значения зажимаются до 0 аксессором и отвергаются как ошибка валидатором.
Как и auto_collapse_empty и show_type_badges, это поле использует указатель *int, чтобы загрузчик мог отличить отсутствующий ключ (nil → использовать дефолт по спецификации 1) от явного значения. Установка default_expanded_depth: 0 означает all-collapsed (на входе ни одна группа не раскрыта); пропуск ключа восстанавливает дефолт 1 (раскрыты только группы верхнего уровня). Любое положительное целое раскрывает до этой глубины.
ui.commands.auto_collapse_empty
Заголовок раздела «ui.commands.auto_collapse_empty»Если true (по умолчанию), сессии fuzzy-фильтра автоматически сворачивают и затемняют поддеревья с нулём совпадений; предыдущее состояние раскрытия восстанавливается на Esc.
ui.commands.show_type_badges
Заголовок раздела «ui.commands.show_type_badges»Если true (по умолчанию), правый список команд показывает цветной бэйдж типа (shell, script, workflow, service_exec, service_run, builtin, dwe) рядом с каждым command ID. Установите false, чтобы скрыть бэйджи на узких или монохромных терминалах.
Семантика указателей — omit vs explicit zero
Заголовок раздела «Семантика указателей — omit vs explicit zero»Все три поля (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.
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 закрывает оверлей.
Форма параметров (in-TUI оверлей)
Заголовок раздела «Форма параметров (in-TUI оверлей)»На пути с двухпанельным фреймом (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, и в справке ?.
Fallback-лестница
Заголовок раздела «Fallback-лестница»Браузер инспектирует терминал на старте и грациозно деградирует. Ниже минимума для двух панелей (или при ошибке чтения размера) он сразу падает на плоский список 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-бэйджами