Команды

From docs/ru/commands.md at cc732c3 View on GitHub

Каждая команда ниже — это интерфейс к одному и тому же реестру плагинов и одному и тому же хранилищу SQLite, и каждая из них работает уже сегодня. Подкоманда, чей плагин исключён при компиляции (например, rtok run без фичи cmd), печатает not implemented и завершается с кодом 0, поэтому урезанная сборка никогда не блокирует хост.

КомандаЧто делает
rtok pluginsсписок плагинов: id, включён ли, интерфейсы
rtok config show|init|validate|get|set|pathодин файл конфигурации; show --sources показывает, откуда взялось каждое значение
rtok hook <event>точка входа хуков Claude Code (JSON на stdin → JSON на stdout)
rtok mcpMCP-сервер через stdio: read, search, tree, expand, mem_*, инструменты графа
rtok proxyпромежуточный узел для ANTHROPIC_BASE_URL / OPENAI_BASE_URL: запись расхода, необязательный режим сжатия
rtok batchзадания Batch провайдеров (submit, status, fetch) через rtok proxy; см. batch-flex.md
rtok dashboardлокальный интерфейс на React поверх WebSocket API, читающий то же хранилище
rtok run -- <cmd>запустить команду, заархивировать сырой вывод, напечатать отфильтрованную версию
rtok filter --stdinотфильтровать данные, не выполняя команду (OpenCode tool.execute.after)
rtok expand <id>напечатать заархивированные данные целиком или по --lines / --grep
rtok statsизмерения из логов сессий и прокси
rtok doctorпроверить хуки, MCP-серверы, цепочку прокси — включая то, сколько каждый стоит за ход, и сколько места освободит rtok agents junk clear
rtok agents install claude|cursor|codex|opencode|kilo|pi|zcode|kimi|copilot|aider|windsurf|zedустановить в хост с резервными копиями; --dry-run
rtok agents uninstall claude|cursor|codex|opencode|kilo|pi|zcode|kimi|copilot|aider|windsurf|zedубрать rtok из хоста с резервными копиями; --dry-run
rtok agents listкаждое известное приложение: тип и имя, путь и версия, файлы конфигурации, модули rtok, версия установленного плагина
rtok agents junk list|clearпапки каждого агента, виды мусора и размеры; clear — пробный прогон до --yes, без --agent, --kind, --include review или --older-than чистит только собственные логи и архивы rtok, перепроверяет каждый элемент прямо перед удалением, --include review удаляет и те слитые, чистые, простаивающие worktree, которые удалил бы rtok worktree gc (stale-worktrees; остальные показаны с причиной gc и остаются), --items, --sort и --min-size настраивают построчный список элементов, --trash переносит в корзину ОС, код выхода 1, если запланированное осталось
rtok graph index [path]построить индекс символов tree-sitter для дерева
rtok graph impact <name> [--all] [--project <id|dir>]что сломается при изменении символа (файлы сгруппированы и обрезаны по plugins.graph.impact_tokens; --all печатает все строки), по проекту и связанным с ним проектам; dead и affected тоже идут по этому набору (символ, который зовёт только связанный проект, не мёртвый; git diff читается в каждом проекте, тесты перечислены по проектам); --project есть и у index, status. Один ответ, один лимит; при включённом watch rtok mcp следит за каждым проектом набора
rtok graph review [--since <ref>|--staged] [--json] [--project <id|dir>]список чтения по git diff, упорядоченный по риску: оценка каждого изменённого файла, определения, до которых не доходит тест, и диапазоны строк
rtok graph diff [--from <ref>|<project>:<ref>]... [--from-export <file>] [--to <ref>|working] [--json] [--project <id|dir>]что изменение сделало с графом, MCP graph_diff: символы изменённые (сигнатура или тело), добавленные, удалённые, переименованные или перенесённые, и добавленные или удалённые рёбра вызовов; у каждого изменённого или удалённого символа его вызывающие из проекта и связанных проектов. Старая сторона читается из объектной базы git (без checkout, рабочее дерево не трогается); --from по умолчанию HEAD, --to — рабочее дерево. Переименование показывается, только если ровно одно удалённое и одно добавленное определение имеют одно тело; текст обрезается по plugins.graph.max_tokens с expand <id> для остального, --json полный. --from <проект>:<ref> (имя, id или каталог проекта; повторяемый) сравнивает этот проект со своим ref, остальные берут обычный --from. --from-export <файл> сравнивает рабочее дерево с сохранённым rtok graph export --level symbols вместо ревизии: показывает добавленные и удалённые символы и добавленные и удалённые связи реестра (со ссылкой git связи сравнить нельзя, реестр не хранит историю), но не изменения и не рёбра, потому что в экспорте нет сигнатур; MCP путь к файлу не принимает. Файлы, которые изменились, но которые не читает ни одна грамматика (бинарные, язык без грамматики, не разбираются), перечислены как changed, not analysed; исключённые проектом файлы не перечисляются
rtok graph export [--level overview|symbols] [--focus <symbol> [--depth N]] [--no-redact] [--from <file>] [--format json|svg|png] [--scale 1-4] [--transparent] [-o <file>] [--project <id|dir>]граф в виде файла, MCP graph_export (только JSON): JSON rtok.graph.v1 (проекты, связи, символы, вызовы; схема в docs/schemas/, формат в plugins). overview — проекты и связи, symbols добавляет все символы и вызовы, --focus оставляет символы в пределах --depth вызовов от одного. Домашний каталог, имя пользователя и абсолютные пути скрываются без --no-redact; --from показывает сохранённый экспорт и не трогает ни реестр, ни индекс. --format svg рисует картинку того же экспорта (200 самых связанных узлов, легенда и подвал с проектами, областью, бэкендом, indexed_at, версией, временем экспорта и пометкой о неполноте; подвал говорит, сколько узлов скрыто); --format png растрирует её в --scale раз больше исходного размера (от 1 до 4, по умолчанию 1) и требует -o; --transparent убирает фон. Для PNG на машине нужен шрифт. В rtok tui клавиша e на странице Graph пишет тот же файл той же функцией (формат, уровень, скрытие личных данных включено, пока его не выключат, файл, который вы назвали), а v открывает сохранённый JSON только для чтения
rtok memory import <file>импортировать заметки в формате JSONL с дедупликацией по хешу тела
rtok otel flush|statusэкспортировать журналы через OTLP/HTTP или показать отметки (watermarks)
rtok task create|list|show|status|next|ready|claim|release|dep|priority|sync|initплан проекта в адаптере [tasks]; claim берёт готовую задачу, dep записывает блокер, sync поднимает счётчики id и сообщает о расхождениях
rtok task export github|linear [--dry-run] [--json]односторонне отразить задачи с диска в GitHub Issues или Linear; повторный запуск без изменений не отправляет записей
rtok benchA/B-сравнение двух конфигураций хоста на фиксированных задачах

Страница Graph

Страница Graph в rtok dashboard рисует граф кода в два уровня: объёмной 3D-сценой, плоской 2D-сценой или обычным списком (выбор запоминается; без WebGL страница показывает 2D и объясняет почему).

  • Все проекты. Узел на каждый зарегистрированный проект, линия на каждую связь. Правый клик по узлу даёт Select, Open, Re-index, Remove…, Fly to и Copy path; двойной клик открывает проект. Re-index запускает rtok graph projects reindex в воркере: пока он идёт, узел в состоянии indexing, а старые строки продолжают отвечать; затем ok или failed с ошибкой. Remove… показывает dry run rtok graph projects remove (строки индекса и связи, которые уйдут; файлы не трогает) и удаляет только после подтверждения. В rtok tui те же два действия есть на странице Graph.
  • Один проект. Файлы — кубы, типы и модули — октаэдры, функции — сферы, каждый цвета своего проекта и сгруппирован по каталогу. Клик выбирает узел; клик по выбранному файлу раскрывает его определения, по выбранной функции — ставит на неё фокус (вызывающие и вызываемые на глубину от одного до четырёх вызовов, кнопки глубины). Вызов в связанный проект заканчивается контурным узлом цвета этого проекта; клик по нему открывает тот проект с символом в фокусе. +N more поднимает лимит узлов на 500. ⚠ помечает файл, изменённый после последней индексации, а пока такие файлы есть, баннер сообщает, что картина неполная.
  • Боковая панель и поиск. Панель выбранного узла показывает путь и строку, сигнатуру, вызывающих и вызываемых (другие концы рёбер calls на картинке; клик по одному выбирает его) и ссылку Open in editor, vscode://file/<root>/<path>:<line>. Для узла связанного проекта ссылка строится от корня того проекта, а Open in <project> заходит в него. Поле поиска отправляет текст по Enter (простой набор ничего не шлёт) и перечисляет совпадения в проекте и связанных проектах, каждое с проектом; совпадение в этом проекте получает фокус, совпадение в другом открывает тот проект с символом в фокусе.
  • Где вы — видно в адресе. Проект, раскрытые файлы, фокус и глубина лежат в URL страницы: каждый шаг — запись истории, хлебные крошки (All projects / rtok / src/plugins/graph) возвращают назад, а скопированная ссылка открывает тот же вид.
  • Состояния индекса. Непроиндексированный проект показывает команду (rtok graph index --project <id>) и заполняется, когда индекс готов; проект с пропавшим каталогом рисуется пустым контуром и не открывается. Пока watch переиндексирует, страница спрашивает снова и обновляется на месте, не сдвигая сцену.
  • Сравнение. Кнопка Compare на панели проекта просит у сервера тот же отчёт, что и rtok graph diff (страница ничего не пересчитывает), и красит картинку: добавленное зелёным +, удалённое красным − (контурным призраком в раскрытом файле, ведь в рабочем дереве его уже нет), изменённое жёлтым ~, перемещённое синим →; файл берёт единственное изменение своих символов, разные виды делают его изменённым, а добавленный или убранный вызов — зелёная или красная пунктирная линия. У каждого изменения есть и знак в подписи, и слово в подсказке и списке, так что цвет — не единственный признак. Боковая панель даёт счётчики, изменённые (сигнатура или тело) и удалённые символы с их вызывающими, переименованные, перемещённые и добавленные символы, рёбра вызовов, добавленные и убранные связи и файлы changed, not analysed. Старая сторона — HEAD, ссылка или PROJECT:REF из поля (уходит по Enter) либо сохранённый rtok graph export --level symbols, выбранный через выбор файла: страница сама читает файл и шлёт его текст, а не путь, поэтому ничто по /ws не заставит rtok открыть файл. Против экспорта перечисляются только добавленные и удалённые символы и связи. Каждый список обрезается на 500 строк на проект (панель говорит, сколько ещё; все есть в rtok graph diff). Граф вживую продолжает работать; выключение Compare возвращает прежнюю картинку.
  • Граф вживую. Рядом с обозревателем (друг под другом при ширине меньше 900 px) вторая, только для чтения картинка показывает, что делают инструменты графа, по вызовам, приходящим по /ws. Она рисует тот уровень, что и обозреватель, с тем же раскладом и цветами: зарегистрированные проекты или открытый проект. Ввода она не принимает (ни указателя, ни колеса, ни клавиш, курсор остаётся обычной стрелкой). Вызов подсвечивает узел проекта на обзоре или узел с именем его цели в виде одного проекта: кольцо на каждый выполняющийся вызов одного из восьми акцентов, ореол для вызовов за последние 5 минут и красное кольцо у упавшего; сверх восьми выполняющихся вызовов счётчик «busy» показывает, сколько ещё. До первого вызова картинка затемнена и подписана «Waiting for graph calls». Камера берёт в кадр узлы выполняющихся вызовов и вызовов, завершившихся за последние 4 секунды, и плавно возвращается к общей картине, когда таких не осталось (при prefers-reduced-motion она переключается скачком). Кнопки «2D» и «3D» в углу картинки переключают вид; 3D это тот же Three.js, что в части 1, без вращения и выбора: ореол для нагрева, оболочка на каждый выполняющийся вызов и красный каркас у упавшего; без WebGL показывается 2D с уведомлением. У каждого выполняющегося вызова есть небольшая подпись на его узле, в 2D и в 3D: инструмент и счётчик секунд; завершившийся вызов хранит подпись с длительностью 4 секунды и гаснет после 2, вызов, свёрнутый в «+N more», подписывает узел, который держит счётчик, а у вызова вне области подписи нет. Полоса между частями меняет их размер (перетаскивание, стрелки, двойной щелчок возвращает 50/50) и запоминается; «Hide live graph» прячет картинку и завершает подписку на /ws, это тоже запоминается. Страница подписывается, только пока живой граф показан. Ниже: выполняющиеся вызовы, вызовы и сбои, отправленные токены, токены без rtok и сэкономленное, столбцы по инструментам и доли бэкендов за последние 1, 5 или 15 минут либо с запуска rtok web: итоги читаются из хранилища, поэтому после перезагрузки страницы цифры те же (хранилище держит 5000 последних событий вызовов, более старые вызовы из итогов выпадают). На экранах уже 900 px, где живая часть ложится под обозреватель, эти числа сворачиваются в одну строку (выполняется, вызовы, сэкономлено), которая раскрывает полные карточки и снова их сворачивает; от 900 px и шире ничего не меняется. Итоги берутся из summary каждого кадра и строк измерений graph, поэтому окно совпадает с rtok stats по тем же вызовам (столбцы по инструментам и доли бэкендов считают вызовы, перечисленные в кадре). Страница также считает запрошенные символы (и сколько вызовов затронули больше одного проекта), строки lsp_fallback и ответы, обрезанные по max_tokens, точно, по summary, а для symbol, callers, impact, outline, explore и graph_diff ещё сколько запрошенных символов ответы перечисляют (explore запрашивает по одному на идентификатор вопроса, остальные ни одного), файлы перечисленных строк (места вызова под изменённым символом в graph_diff строками диффа не являются) и в скольких проектах есть попадание, как их посчитали бекенды графа при сборке ответа; задержка (медиана и 95-й процентиль) измеряется по вызовам, которые перечисляют кадры, последние 1000. «Freeze» замораживает картинку и считает приходящее за это время; «Unfreeze» догоняет все вызовы. Лента хранит live_feed_rows (200) последних завершённых вызовов, фильтруется по вызывающему (агент и хост, которые хранилище назвало для сессии, например claude 3f9a1c2e; процесс rtok mcp показан хостом и pid, неизвестная хранилищу сессия — своим id), инструменту и проекту, показывает упавшие красным и помечает вызов, не завершившийся за две минуты, как прерванный. Ключи [plugins.graph] live_heat_window_s (300), live_max_events_per_s (50; сколько событий вызовов в секунду показывает панель, счётчики считают каждый вызов) и live_feed_rows (200) читаются при запуске живой части. Карточки «calls» и «saved» несут спарклайн из 30 слотов сервера за выбранное окно (за последние 15 минут для «since start») из тех же корзин, что суммируют итоги; они называются «calls over the last 5 min» и «tokens saved over the last 5 min». Если у страницы есть область (проект, в который вошли, иначе выбранный, со всем, что достают его связи), строка ленты для проекта вне неё получает метку «outside scope» и не подсвечивает холст. На виде одного проекта, когда лимит в 500 узлов скрыл часть узлов, вызов на скрытом считается под «folded calls» на нарисованном файле, чей путь содержит цель вызова, иначе на группе «+N more».
  • Тревоги. Когда проверка здоровья (см. LSP-бэкенд) поднимает тревогу для проекта, его узел получает красный значок на обоих уровнях (красный маркер в 3D, а в списке и подсказке — слово alert), так же как каждая связь в него и каждый контурный символ этого проекта на виде одного проекта. Список тревог вверху страницы — одна строка на вид тревоги («share-1, share-2, share-3 unreachable since 14:02 (3 projects)»). Всплывающее уведомление появляется, когда снимок поднимает или снимает тревогу, и исчезает через несколько секунд или по Dismiss; тревоги, уже горевшие при открытии страницы, попадают в список, но без уведомления.
  • Бэкенд графа. У каждого проекта в списке стоит lsp или tags, а заголовок выбранного проекта объясняет почему: язык, чей сервер отвечает, или причину отката на теги, время последней проверки и время следующей попытки health check. Проект, о котором ещё никто не спрашивал, так и пишет, что записи нет.

Каждый флаг — это ключ конфигурации

Нет флага, который нельзя было бы сделать постоянным. rtok proxy --port 8791 и [proxy] port = 8791 — одна и та же настройка, заданная двумя способами, а rtok config show --sources сообщает, какой уровень победил. Цепочка приоритетов описана в Конфигурации.

Сокращение и возврат исходного

rtok run -- <cmd> выполняет команду, архивирует сырой вывод и печатает отфильтрованную версию с прикреплённым id. rtok expand <id> печатает исходные данные обратно. Эта пара и есть весь контракт отсутствия потерь — ничто из того, что сокращает rtok, не теряется безвозвратно.

Измерение

rtok stats читает таблицу measurements. Строки появляются от плагинов, вызывающих Ctx::record с Measurement, и от прокси, записывающего реальный usage из ответов API. rtok stats --calibrate заново подгоняет оценщик «символов на токен» под эти реальные значения.

rtok bench прогоняет две конфигурации хоста на фиксированном наборе задач из bench/tasks.toml и сравнивает их.

События вызовов графа

rtok dashboard показывает, что делают инструменты графа. Каждый вызов symbol, callers, impact, outline и explore в любом процессе rtok (MCP-сервер, rtok mcp --call) пишет в хранилище событие начала, событие прогресса и событие конца. Дашборд читает новые события каждые 250 мс и отправляет их по /ws кадрами {"type":"calls"}, поэтому вызов из другого процесса виден в течение секунды (оба срока проверяет tests/web_live.rs). Страница включает кадры сообщением {"calls":{"subscribe":true}} и выключает значением false; пока ни один сокет не подписан, ничего не читается.

Событие конца содержит инструмент, символ, проект и бэкенд (lsp, tags или text, берётся из заголовка ответа; для фиксированного режима пусто), время выполнения, оценку токенов ответа и строки измерений graph, которые записал вызов (samples: вид, байты и оценка токенов до и после). Это те же строки, что показывает rtok stats --plugin graph. Неудачный вызов заканчивается с ok: false и текстом ошибки. В событиях только имена, пути и числа, без исходного кода.

В кадре не больше 100 событий. При всплеске начало и прогресс завершённого вызова сворачиваются в его конец, а summary кадра считает каждый вызов опроса, так что итоги не теряют событий. Повторной отправки нет: сокет видит события, записанные после подписки (первый кадр пустой и несёт номер последнего события), а итог за окно читается из хранилища. Хранилище держит последние 5000 событий.