Дерево зависимостей на экране
01vibe tree рисует пакеты, которые разрешил проект, деревом, говорит о каждом, как его текст доходит до агента, и объясняет почему. В терминале команда открывает интерактивный экран; в скрипте печатает простое дерево или JSON. Эта страница об этой команде, её экране и о том, как агент может посмотреть на экран без терминала.
vibe tree --plain --path hello-vibe
project: <TMP>/work/hello-vibe
STATIC.md: (none)
packages: 1 roots: 1
columns: load T=transitive C=condition S=in STATIC.md
org.vibevm.world/wal dynamic . . .
Что показывает
03Команда читает закоммиченный лок-файл, манифесты и сгенерированные стартовые файлы проекта по --path и ничего не пишет: она никогда не трогает дерево, манифест, лок или сгенерированные файлы. Каждый пакет — одна строка, с колонками в фиксированном порядке. Колонка загрузки — стартовая полоса (boot lane), в которую попал стартовый фрагмент пакета, прочитанная из сгенерированных файлов, а не пересчитанная, так что экран показывает то, что прочитает агент. Пакет, который встречается под несколькими родителями, рисуется под каждым и после первого раза помечается (*), без повторного раскрытия. Строка статуса показывает размер скомпилированной полосы в байтах и строках.
04 spec: vibe tree answers that algorithmically: it…
vibe tree answers
that algorithmically: it renders the resolved package tree annotated with the
effective load type and the flags that explain it, and emits the same data as
JSON for downstream tools.
05 spec: It operates on the workspace discovered…
It operates on the workspace discovered from--path(default.), reading the committedvibe.lock, the node manifests, and the generated boot artifacts.
06 spec: vibe tree is a read-only analyzer…
vibe tree is a read-only analyzer over the current project. It mutates
nothing (REQ: never writes to the tree, manifests, lockfile, or artifacts).
07 spec: Each package is one row. Columns…
Each package is one row. Columns, left to right (REQ: this order):
08 spec: The load value is the lane…
The load value is the lane a package's boot snippet actually lands in, read
from the committed artifacts (REQ):
09 spec: vibe tree renders each package under…
vibe treerenders each package under each parent, marks a re-occurrence with a trailing(*)and does not re-expand it, and cycle-guards the walk on the package's qualifiedgroup/name(REQ).
10 spec: The status line shows the size…
The status line shows the size of the statically-compiled lane: the byte count
and line count of STATIC.md (REQ).
Три вывода
11В терминале по умолчанию открывается интерактивный экран. Когда вывод не терминал или с --plain, команда печатает статичное дерево. --json выдаёт один объект с теми же данными, что отрисовывает экран, валидный по поставляемой схеме, для любого инструмента ниже по конвейеру.
12 цитата из спецификации
interactive TUI — the default on a tty (§2.11);
13 spec: plain: — a static ASCII tree…
plain — a static ASCII tree when not on a tty, or under --plain.
14 spec: --json: — the machine surface (§2.7)…
--json — the machine surface (§2.7), the same data a GUI consumes;
15 spec: vibe tree --json emits one object…
vibe tree --jsonemits one object, the same data model the TUI renders, valid against the shipped schema (REQ:schema_version = 1).
16С деревом приходят два предупреждения. Дрейф корней значит, что список корней в лок-файле расходится с манифестом, то есть лок отстал. Устаревшие артефакты значат, что закоммиченные стартовые файлы расходятся со свежим вычислением, то есть проекту нужен vibe reinstall.
17 spec: root-drift: — vibe.lock meta.root_dependencies disagrees…
root-drift —vibe.lockmeta.root_dependenciesdisagrees with the rootvibe.toml[requires.packages](the lock is behind).
18 spec: stale-artifacts: — the committed lanes disagree…
stale-artifacts — the committed lanes disagree with a freshEffectiveBootrecompute (the tree needsvibe reinstall).
Экран
19У экрана три режима отображения, каждый из них конфигурация одного виджета дерева и ни один не плоский список, и три формы дерева, выбираемые для каждого режима; активный режим выбирается из меню, показывается в строке статуса и запоминается. Главные действия сидят на функциональных клавишах: F1 открывает «Поиск везде», F2 — меню сортировки, F3 — меню режима, F4 — экран настроек, F6 копирует текущий экран, а Shift+F6 открывает настройки копирования. Подвал перечисляет активные клавиши, а Shift записан стрелкой, чтобы подсказки были короче.
20 spec: REQ. vibe tree has three display…
REQ. vibe tree has three display modes, each a Tree-widget (§3.1) configuration
(§3.2) — none is a flat list:
21 spec: REQ. The pipeline offers three shapes…
REQ. The pipeline offers three shapes, selectable per context on the F2 sort menu (§7.2), default = (a):
22 spec: REQ. The active mode is chosen…
REQ. The active mode is chosen from the F3 menu (§7.1) — not a bare cycle key. The active mode is shown in the status line and persisted (§9).
23 spec: REQ. Primary actions are on function…
REQ. Primary actions are on function keys:F1Search Everywhere (§7.3),F2sort menu (§7.2),F3mode menu (§7.1),F4settings (opens thevibe prefssettings UI — PROP-041),F6copy /Shift+F6copy-settings (§10.2). The footer lists the active keys with short labels;Shiftis written as↑(e.g.Shift+F6→↑F6) to keep hints short.
24Внутри дерева стрелки двигают и панорамируют, Space сворачивает узел, Enter открывает карточку деталей, а Shift с горизонтальной стрелкой переключает вкладки в любом месте приложения. Поиск везде работает как в IDE: вкладка «Все», которая ищет по всему, и вкладки по категориям. Меню сортировки зависит от режима. Элементы управления сгруппированы, и Tab шагает между группами. Модальные окна складываются стопкой: каждое новое рисуется поверх предыдущего, Esc закрывает верхнее, а на базовом экране Esc спрашивает перед выходом, потому что сессия могла грузиться долго.
25 spec: REQ. Within a tree: ↑/↓ move…
REQ. Within a tree:↑/↓move selection (+ scroll),←/→pan horizontally,Spacefolds/unfolds the selected node,Enteropens the detail card (§8).Shift+←/→switches tabs app-wide — the tree's display tabs (in tabs mode) and the Search Everywhere category tabs (§7.3); plain←/→stay tree-pan (which is why tab-switch takes Shift). These direct keys are exempt from the F-key scheme (they are navigation, not commands).
26 spec: REQ. F1 opens the Search Everywhere…
REQ.F1opens the Search Everywhere window — thevibe-actionsSearch Everywhere engine (PROP-039 §10), in the IntelliJ IDEA idiom: a hybrid "All" tab that searches everything, plus per-category tabs that narrow it (Tab/Shift+Tabcycle; the "All" tab carries a category checkbox filter). Three providers ship (PROP-039 §10.4):
27 spec: REQ. F2 opens a dialog whose…
REQ. F2 opens a dialog whose content depends on the active mode:
28 spec: REQ. A screen's controls are partitioned…
REQ. A screen's controls are partitioned into focus groups — cohesive clusters the user steps between withTab(andShift+Tabbackwards). Within a group the group's own keys act (arrows move a radio selection, typing edits a field,Enteractivates a button). A screen with more than one focus group declares a Tab Order — the explicit sequenceTabcycles — per screen; a single-group screen has no Tab Order (Tabis inert there).Tabnever switches display tabs (that isShift+←/Shift+→, §5.3) and never activates a control (that isEnter).
29 spec: REQ. Modals form a stack: opening…
REQ. Modals form a stack: opening a modal pushes it; it draws over everything below (each lower layer still visible as backdrop); input goes only to the top modal;Escpops the top modal (returning to the one beneath). A feature may push a modal over a modal — e.g. copy-settings (§10.2) → file-path (§10.5) is a depth-2 stack. The base screen is the bottom of the stack;Escat the bottom triggers quit-confirm (§7.4), it does not pop.
30 spec: REQ. At the base screen, Esc…
REQ. At the base screen,Escopens a confirm dialog ("Really quit?") withYes/Nobuttons;Yes/Enter-on-Yes quits,No/Escreturns. The confirmation exists because loading may be slow andEscis used pervasively in modals — an accidental singleEscmust not discard the session.
31Копирование работает по принципу «что вижу, то и копирую»: каждый экран сериализует то, что показывает, текстом по умолчанию, Markdown или файлом по запросу; экспорт в PNG зарезервирован и говорит об этом. Состояние интерфейса, режим и выбор сортировки, формы и порядка, сохраняется под ~/.vibe/tree/ и восстанавливается при следующем запуске; отсутствующий или сломанный файл откатывает к умолчаниям. Ярус цветов определяется один раз из окружения, и его можно переопределить в настройках.
32 spec: REQ. F6 copies the current screen…
REQ.F6copies the current screen straight to the clipboard as text (the provider's default format).Shift+F6opens the copy-settings modal: aRadioGroupfor format (Markdown / PNG — and later PlantUML / Mermaid) and aRadioGroupfor destination (clipboard / file). Confirming with destination = file pushes the file-path modal (§10.5) over it (§6 stack).
33 spec: REQ. Each screen (tree/sub-tables/tabs; the card)…
REQ. Each screen (tree/sub-tables/tabs; the card) supplies a copy provider — an object that knows how to serialize what is currently shown into a copy format. A tree provider serializes the tree with its current display options; the card provider serializes the card's fields. Copy is "what I see is what I copy": in tabs mode only the active tab is serialized.
34 spec: REQ. PNG export (a rasterized tree…
REQ. PNG export (a rasterized tree image; a designed package info-card image) is
reserved — selecting PNG opens the ComingSoon modal (§2.10) until the
rasterization (font + image crates) is built. Named non-goal-for-now (§12).
35 spec: REQ. UI state persists under ~/.vibe/tree/…
REQ. UI state persists under~/.vibe/tree/as one or more JSON files. Saved: the active mode (§4.4), the per-context sort + shape + block-order choices (§7.2, §3.3). On TUI launch the settings are loaded and the UI restored to them; a missing/corrupt file falls back to defaults (never a hard error). Writing is atomic; the directory is created if absent. (This is the machine-global~/.vibe/config root, distinct from the project's.vibe/.)
36 spec: REQ. Tier detection is a pure…
REQ. Tier detection is a pure function over the environment —detect_tier(colorterm: Option<&str>, term: Option<&str>) -> Tier($COLORTERMfirst, then$TERM;crosstermexposes no colour-count API). The TUI reads the env once at launch in a sanctioned spot and feeds the values in; the detected tier is overridable through the settings system (§9). The default is Tier 3: anything not explicitly dumb (an unset or emptyTERM/COLORTERM, or a genericTERM=xterm) is assumed truecolor, because every incumbent terminal renders truecolor and several (notably on Windows) do not advertise the capability via env at all — defaulting to Tier 3 keeps a modern terminal colourful instead of degrading it to mono. The lower tiers are the fallback (the degradation path), reached only when the environment explicitly advertises a lower capability (a 256-colourTERM, or an explicitly dumbTERM=linux/dumb); Tier 0 is never reached from an unset env. A genuinely limited terminal is otherwise overridden viavibe.tree.tier.
Собственный терминал
37vibe term запускает vibeterm, терминальное приложение с оболочкой внутри, так что экран можно использовать и рассматривать сам по себе. vibe tree, запущенный внутри vibeterm, не открывает второго окна: он занимает текущий терминал на время сессии.
38 spec: REQ. vibe term launches the vibeterm…
REQ. vibe term launches the vibeterm terminal app hosting an interactive
shell, so the terminal can be used and eyeball-debugged standalone.
39 spec: A vibe tree launched inside vibeterm…
Avibe treelaunched inside vibeterm (this env present) does not spawn a second window — it upgrades the current terminal in place: the-t/ vibeterm launch resolves to the in-terminal console TUI here, so a plain shell becomes a "VibeTree terminal" for the session (PROP-036 §2.13). Outside vibeterm,-tstill opens the desktop app.
Как посмотреть на экран из агента
40У агента нет терминала, поэтому команды vibe aiui отрисовывают экран для него. Глагол render строит ту же модель, что и vibe tree по --path, прогоняет скрипт клавиш при заданном размере, по умолчанию 80x24, и печатает снимок в одном из двух форматов: простым текстом или cells, кодированием повторов каждой ячейки с её глифом, цветами и модификаторами, для утверждений о стиле. Скрипт клавиш — разделённый пробелами список имён клавиш: функциональные клавиши, стрелки, Enter, Esc, Tab и остальные, с префиксом Shift+, где нужно. Клавиши, которые вышли бы из процесса или изменили мир, F4 и клавиши копирования, отвергаются, а не выполняются. Глагол model проецирует состояние вовсе без отрисовки, а глаголы terminal управляют живой сессией vibeterm.
41 spec: REQ. vibe aiui is the agent-facing…
REQ. vibe aiui is the agent-facing command family. Its render-plane verb:
42 spec: builds the vibe tree model…
builds thevibe treemodel at--path(the same resolvervibe treeuses), drives--send(§3) at--size(default80x24), and prints the--formatsnapshot (§2, defaulttext) to stdout.
43 spec: REQ. A rendered Buffer projects…
REQ. A rendered Buffer projects to one of two snapshot formats, the same schema every observation plane emits:
44 spec: cells: — JSON: {cols, rows, rows:[[run,…],…]}…
cells— JSON:{cols, rows, rows:[[run,…],…]}where each run is{n, ch, fg?, bg?, mods?}—ncells of glyphchsharing a style, run-length encoded per row;fg/bgare#rrggbb(or an ANSI role name),modsthe set ofbold/dim/italic/underlined/reversedpresent. Enables style/colour assertions (e.g. "the active group's border run is the accent colour").
45 spec: REQ. A key script…
REQ. A key script is a space-separated list of key names driving the TUI before the snapshot. The grammar: function keysF1–F12; navigationUp,Down,Left,Right;Enter,Esc,Tab,BackTab,Space,Backspace; aShift+prefix on any of them (e.g.Shift+Left,Shift+Tab≡BackTab). Names are case-insensitive.
46 spec: REQ. A scripted key that would…
REQ. A scripted key that would escape the process or mutate the world is refused, not executed:F4(spawns the settings subprocess) andF6/Shift+F6(write the clipboard) are rejected by the key-script parser (§3).
47 spec: REQ. The model-plane verb projects…
REQ. The model-plane verb projects the TUI state — no rendering at all:
48 цитата из спецификации
REQ. The terminal-plane verbs drive a live vibeterm control session:
49Под этим у каждого действия интерфейса есть адрес, action://<group>/<name>, а наблюдаемое состояние — один сериализуемый снимок с фокусом, открытыми модальными окнами, видимыми строками и включёнными действиями с их причинами, без типов отрисовки. Безголовая поверхность перечисляет действия, вызывает одно по адресу, возвращает снимок и выполняет поиск; так агент управляет экраном, не видя его.
50 spec: REQ. An action is named…
REQ. An action is named by anActionAddrwith the textual formaction://<group>/<name>[?<params>], where<group>is a dotted namespace (e.g.vibe.tree,core),<name>is a dotted/kebab identifier (e.g.copy.markdown,search.everywhere), and the optional<params>is a&-separatedkey=valuequery carrying invocation parameters (§5).(group, name)is the identity; the query is not part of identity. Examples:action://vibe.tree/copy.markdown,action://vibe.tree/sort?by=name&dir=asc,action://core/search.everywhere.
51 spec: REQ. The observable UI state…
REQ. The observable UI state is a serialisable ModelView snapshot (focus, open modals, visible
rows, current tree/selection, the active tab, the set of enabled actions with their addresses +
reasons). It is a pure projection of the Model and carries no rendering types — so an AI reads
structured state, never pixels.
52 spec: REQ (built; the in-process form ships).…
REQ (built; the in-process form ships). The core offers a headless AIUI surface:list_actions(filter?)(enumerate the registry with live enablement + reasons + params),invoke(addr, args)(the sameinvokeas §7.1),state() -> ModelView(§11.2), andsearch(query, tab?)(drive §10 programmatically).vibe-actions/src/aiui.rsimplementslist_actions+invoke, andvibe aiui stateprojects the §11.2ModelViewlive, citing this section in its own--help. Because enablement is pure + introspectable, the model is serialisable, and invocation is address-based, this surface is a thin adapter with a no-oppresent. The architecture must keep it a thin adapter — it was prototyped on the TUI, and the remaining JSON-RPC / MCP bindings are further adapters over the same surface. This is the founding AIUI goal (DO18): the headless surface is the reference; visual surfaces are projections.
Особые случаи и правила
53Английский — полная локаль интерфейса и последний запасной вариант; другая локаль может отставать и откатывается молча. Пакет может поставить собственный файл локали, а языковой пакет может его заменить.
54 spec: REQ. English is the default, mandatory-complete…
REQ. English is the default, mandatory-complete locale and the terminating fallback. Other locales may lag and fall back silently. Locale switch is atomic (ArcSwap<Catalogue>); a package may shiplocales/<lang>.ftl, and a dedicated language-pack package may override, merged by explicit priority (language-pack > package locale > inline English).