VibeVM
Contents
On this page
ru
Publisher
org.vibevm.core
Version
1.0.0latest
Adapts
org.vibevm.core/vibevm-docs
Audiences
user, author, agent
Reading time
4 min
Rendered
Read aloud
never

Дерево зависимостей на экране

01vibe tree рисует пакеты, которые разрешил проект, деревом, говорит о каждом, как его текст доходит до агента, и объясняет почему. В терминале команда открывает интерактивный экран; в скрипте печатает простое дерево или JSON. Эта страница об этой команде, её экране и о том, как агент может посмотреть на экран без терминала.

02
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 committed vibe.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 tree renders 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 qualified group/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 --json emits 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.lock meta.root_dependencies disagrees with the root vibe.toml [requires.packages] (the lock is behind).
18 spec: stale-artifacts: — the committed lanes disagree…
stale-artifacts — the committed lanes disagree with a fresh EffectiveBoot recompute (the tree needs vibe 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: F1 Search Everywhere (§7.3), F2 sort menu (§7.2), F3 mode menu (§7.1), F4 settings (opens the vibe prefs settings UI — PROP-041), F6 copy / Shift+F6 copy-settings (§10.2). The footer lists the active keys with short labels; Shift is 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, Space folds/unfolds the selected node, Enter opens 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. F1 opens the Search Everywhere window — the vibe-actions Search 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+Tab cycle; 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 with Tab (and Shift+Tab backwards). Within a group the group's own keys act (arrows move a radio selection, typing edits a field, Enter activates a button). A screen with more than one focus group declares a Tab Order — the explicit sequence Tab cycles — per screen; a single-group screen has no Tab Order (Tab is inert there). Tab never switches display tabs (that is Shift+←/Shift+→, §5.3) and never activates a control (that is Enter).
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; Esc pops 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; Esc at the bottom triggers quit-confirm (§7.4), it does not pop.
30 spec: REQ. At the base screen, Esc…
REQ. At the base screen, Esc opens a confirm dialog ("Really quit?") with Yes/No buttons; Yes/Enter-on-Yes quits, No/Esc returns. The confirmation exists because loading may be slow and Esc is used pervasively in modals — an accidental single Esc must not discard the session.

31Копирование работает по принципу «что вижу, то и копирую»: каждый экран сериализует то, что показывает, текстом по умолчанию, Markdown или файлом по запросу; экспорт в PNG зарезервирован и говорит об этом. Состояние интерфейса, режим и выбор сортировки, формы и порядка, сохраняется под ~/.vibe/tree/ и восстанавливается при следующем запуске; отсутствующий или сломанный файл откатывает к умолчаниям. Ярус цветов определяется один раз из окружения, и его можно переопределить в настройках.

32 spec: REQ. F6 copies the current screen…
REQ. F6 copies the current screen straight to the clipboard as text (the provider's default format). Shift+F6 opens the copy-settings modal: a RadioGroup for format (Markdown / PNG — and later PlantUML / Mermaid) and a RadioGroup for 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 ($COLORTERM first, then $TERM; crossterm exposes 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 empty TERM/COLORTERM, or a generic TERM=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-colour TERM, or an explicitly dumb TERM=linux/dumb); Tier 0 is never reached from an unset env. A genuinely limited terminal is otherwise overridden via vibe.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…
A vibe tree launched 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, -t still 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 the vibe tree model at --path (the same resolver vibe tree uses), drives --send (§3) at --size (default 80x24), and prints the --format snapshot (§2, default text) 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?} — n cells of glyph ch sharing a style, run-length encoded per row; fg/bg are #rrggbb (or an ANSI role name), mods the set of bold/dim/italic/underlined/reversed present. 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 keys F1–F12; navigation Up, Down, Left, Right; Enter, Esc, Tab, BackTab, Space, Backspace; a Shift+ 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) and F6/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 an ActionAddr with the textual form action://<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 &-separated key=value query 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 same invoke as §7.1), state() -> ModelView (§11.2), and search(query, tab?) (drive §10 programmatically). vibe-actions/src/aiui.rs implements list_actions + invoke, and vibe aiui state projects the §11.2 ModelView live, 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-op present. 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 ship locales/<lang>.ftl, and a dedicated language-pack package may override, merged by explicit priority (language-pack > package locale > inline English).

For an agent

This page has a machine mirror. The citation carries the version rather than latest, so what an agent quotes does not move under it.

spec://org.vibevm.core/vibevm-docs@1.0.0/reference/tree

.md.xmlllms.txt