Перейти к содержанию

On this page Отладка TUI-команд слэша Hermes: Python, gateway, Ink UI.

Skill metadata​

| | |---|--- | |Source| Встроенный (установлен по умолчанию) | |Path| skills/software-development/debugging-hermes-tui-commands | |Version| 1.0.0 | |Author| Hermes Agent | |License| MIT | |Tags| debugging, hermes-agent, tui, slash-commands, typescript, python | |Related skills| python-debugpy, node-inspect-debugger, systematic-debugging |

Reference: full SKILL.md​

info Ниже приведено полное описание навыка, которое Hermes загружает при активации этого навыка. Это те инструкции, которые видит агент, когда навык активен.

Debugging Hermes TUI Slash Commands

Overview​

Слэш-команды Hermes охватывают три уровня — реестр команд Python, JSON-RPC-мост tui_gateway и фронтенд Ink/TypeScript. Когда команда ведёт себя некорректно (отсутствует в автодополнении, работает в CLI, но не в TUI, конфигурация сохраняется, но интерфейс не обновляется), ошибка почти всегда вызвана рассогласованием одного из уровней с другим. Используйте этот навык при возникновении проблем со слэш-командами в TUI Hermes, особенно когда команды не отображаются в автодополнении, некорректно работают в TUI или их необходимо добавить/обновить.

When to Use​

  • Слэш-команда существует в одной части кодовой базы, но работает не полностью
  • Команду нужно добавить как в бэкенд, так и во фронтенд
  • Автодополнение команд не работает для определённых команд
  • Поведение команды различается между CLI и TUI
  • Команда сохраняет конфигурацию, но не применяет изменения в реальном времени в TUI

Architecture Overview​

[code] Python backend (hermes_cli/commands.py) <- канонический COMMAND_REGISTRY
│
▼
TUI gateway (tui_gateway/server.py) <- slash.exec / command.dispatch
│
▼
TUI frontend (ui-tui/src/app/slash/) <- локальные обработчики + fallthrough

[/code] Определения команд должны быть согласованно зарегистрированы в Python и TypeScript для корректной работы. Python COMMAND_REGISTRY является источником истины для: диспетчеризации CLI, справки gateway, меню Telegram BotCommand, карты подкоманд Slack и данных автодополнения, отправляемых в Ink.

Investigation Steps​

  1. Проверьте, существует ли команда во фронтенде TUI: [code] search_files --pattern "/commandname" --file_glob ".ts" --path ui-tui/
    search_files --pattern "/commandname" --file_glob "
    .tsx" --path ui-tui/

[/code] 2. Изучите определение команды в TUI: [code] read_file ui-tui/src/app/slash/commands/core.ts
# Если не там:
search_files --pattern "commandname" --path ui-tui/src/app/slash/commands --target files

[/code] 3. Проверьте, существует ли команда в бэкенде Python: [code] search_files --pattern "CommandDef" --file_glob "*.py" --path hermes_cli/
search_files --pattern "commandname" --path hermes_cli/commands.py --context 3

[/code] 4. Изучите реализацию gateway: [code] search_files --pattern "complete.slash|slash.exec" --path tui_gateway/

[/code]

Fix: Missing Command Autocomplete​

Если команда существует в TUI, но не отображается в автодополнении: 1. Добавьте запись CommandDef в COMMAND_REGISTRY в hermes_cli/commands.py: [code] CommandDef("commandname", "Описание команды", "Session",
cli_only=True, aliases=("alias",),
args_hint="[arg1|arg2|arg3]",
subcommands=("arg1", "arg2", "arg3")),

[/code] 2. Внимательно выбирайте cli_only и доступность через gateway: * cli_only=True — только в интерактивном CLI/TUI * gateway_only=True — только в мессенджер-платформах * ни один — доступно везде * gateway_config_gate="display.foo" — доступность через gateway, управляемая конфигом 3. Убедитесь, что subcommands соответствует ожидаемым опциям автодополнения по табуляции, показываемым TUI. 4. Если команда выполняется на стороне сервера, добавьте обработчик в HermesCLI.process_command() в cli.py: [code] elif canonical == "commandname":
self._handle_commandname(cmd_original)

[/code] 5. Для команд, доступных через gateway, добавьте обработчик в gateway/run.py: [code] if canonical == "commandname":
return await self._handle_commandname(event)

[/code]

Common Issues​

  1. Команда отображается в TUI, но не в автодополнении. Команда определена в коде TUI, но отсутствует в COMMAND_REGISTRY в hermes_cli/commands.py. Данные автодополнения приходят из Python.
  2. Команда отображается в автодополнении, но не работает. Проверьте обработчик команды в tui_gateway/server.py и обработчик фронтенда в ui-tui/src/app/createSlashHandler.ts. Если команда является локальной в Ink, она должна обрабатываться в ветке app.tsx built-in; в противном случае она попадает в slash.exec и должна иметь обработчик на Python.
  3. Поведение команды различается между CLI и TUI. Возможно, у команды разные реализации. Проверьте оба — cli.py::process_command и локальный обработчик TUI. Локальные обработчики TUI имеют приоритет над диспетчеризацией через gateway.
  4. Команда сохраняет конфигурацию, но не применяет изменения в реальном времени. Для локальных команд TUI простого вызова config.set недостаточно. Также необходимо немедленно обновить соответствующее состояние nanostore (обычно через patchUiState(...)) и передать новое состояние через компоненты рендеринга. Пример: /details collapsed должен обновить видимость деталей в реальном времени, а не просто сохранить details_mode; глобальная /details <mode> в рамках сессии может потребовать отдельного флага переопределения команды, чтобы команды реального времени могли переопределять встроенные умолчания разделов, в то время как запуск/синхронизация конфигурации сохраняют стандартное поведение развёрнутых блоков thinking/tools.
  5. Gateway-диспетчеризация молча игнорирует команду. Gateway диспетчеризирует только известные ему команды. Проверьте, что GATEWAY_KNOWN_COMMANDS (формируется автоматически из COMMAND_REGISTRY) включает каноническое имя. Если команда cli_only с gateway_config_gate, убедитесь, что значение конфига для гейта истинно.

Debugging Tactics​

Когда поверхностная проверка не выявляет ошибку: * Зависание или некорректное поведение на стороне Python: используйте навык python-debugpy для остановки внутри _SlashWorker.exec или обработчика команды. remote-pdb на входе в обработчик — самый быстрый путь. * Ink-сторона не реагирует: используйте навык node-inspect-debugger для остановки в диспетчере слэш-команд app.tsx или в ветке локальной команды. sb('dist/app.js', <line>) после npm run build. * Несоответствие реестра / неясно, какая сторона неверна: сравните каноническую запись COMMAND_REGISTRY со списком локальных команд TUI бок о бок.

Pitfalls​

  • Не забудьте указать правильную категорию для команды в CommandDef (например, "Session", "Configuration", "Tools & Skills", "Info", "Exit")
  • Убедитесь, что все псевдонимы правильно зарегистрированы в кортеже aliases — никаких других изменений в файлах не требуется, всё остальное (меню Telegram, отображение Slack, автодополнение, справка) формируется на основе этого
  • Для команд с подкомандами убедитесь, что кортеж subcommands в CommandDef соответствует тому, что указано в коде TUI
  • Команды с cli_only=True не будут работать на платформах gateway/мессенджеров — если только не добавлен gateway_config_gate и гейт не истинен
  • После добавления состояния живого UI проверьте всех потребителей старого свойства/помощника и пробросьте новое состояние через все пути рендеринга, а не только через активный поток. Рендеринг деталей TUI имеет как минимум два важных пути: живые StreamingAssistant/ToolTrail и строки MessageLine в стенограмме/ожидающие. Проход /clean должен явно проверять оба.
  • Пересоберите TUI (npm --prefix ui-tui run build) перед тестированием — режим наблюдения tsx может отставать при первом запуске

Verification​

После исправления: 1. Пересоберите TUI: [code] cd /home/bb/hermes-agent && npm --prefix ui-tui run build

[/code] 2. Запустите TUI и протестируйте команду: [code] hermes --tui

[/code] 3. Введите / и убедитесь, что команда отображается в предложениях автодополнения с ожидаемым описанием и подсказкой аргументов. 4. Выполните команду и подтвердите: * Ожидаемое поведение сработало * Любые сохранённые изменения конфигурации корректны (read_file ~/.hermes/config.yaml) * Состояние живого UI отражает изменения немедленно (а не только после перезапуска) 5. Если команда также доступна через gateway, протестируйте её хотя бы с одной платформы мессенджеров (или запустите тесты gateway: scripts/run_tests.sh tests/gateway/).