Files
hermes-agent/hermes_cli/subcommands/tools.py
Teknium 71704ffb49 refactor: move Spotify out of core into the spotify catalog plugin
The spotify toolset (plugins/spotify) and its loopback-PKCE login (hermes_cli/auth_spotify.py)
now live in NousResearch/hermes-spotify, installed from the plugin catalog. Same pattern as the
Home Assistant move (fb9fc8a3dd): a LEFT_CORE row installs the plugin for every home that was
using it (a Spotify login in auth.json, or the spotify toolset in platform_toolsets) on
`hermes update` / first start; the toolset name, tool names, schemas, env vars and stored login
(providers.spotify) are unchanged, so nobody re-authenticates.

The one user-visible change is the login command: plugins cannot extend `hermes auth`, so the
plugin registers `hermes spotify login|status|logout`. LeftCoreFeature gains a `cli` field and
moved_command_hint() turns `hermes auth [status|logout] spotify`, and `hermes spotify` while the
plugin is not loaded, into a line naming the new command and the install/enable step for this
home. The dashboard's "needs login" hint names the new command too.

Core drops the Spotify auth constants/dispatch, the CONFIGURABLE_TOOLSETS row and post-setup
step, the core `spotify` entries in the shared-metrics toolset enums, its tests, and the docs
(en + zh-Hans) now point at `hermes plugins install spotify` / `hermes spotify login`.
2026-10-08 19:00:45 -07:00

51 lines
2.6 KiB
Python

"""``hermes tools`` subcommand parser."""
from __future__ import annotations
from typing import Callable
def build_tools_parser(subparsers, *, cmd_tools: Callable) -> None:
"""Attach the ``tools`` subcommand to ``subparsers``."""
tools_parser = subparsers.add_parser(
"tools", help="Configure which tools are enabled per platform",
description="Enable, disable, or list tools for CLI, Telegram, Discord, etc.\n\n"
"Built-in toolsets use plain names (e.g. web, memory).\n"
"MCP tools use server:tool notation (e.g. github:create_issue).\n\n"
"Run 'hermes tools' with no subcommand for the interactive configuration UI.")
tools_parser.add_argument(
"--summary", action="store_true",
help="Print a summary of enabled tools per platform and exit")
tools_sub = tools_parser.add_subparsers(dest="tools_action")
tools_list_p = tools_sub.add_parser(
"list", help="Show all tools and their enabled/disabled status")
tools_list_p.add_argument("--platform", default="cli", help="Platform to show (default: cli)")
tools_disable_p = tools_sub.add_parser("disable", help="Disable toolsets or MCP tools")
tools_disable_p.add_argument(
"names", nargs="+", metavar="NAME",
help="Toolset name (e.g. web) or MCP tool in server:tool form")
tools_disable_p.add_argument(
"--platform", default="cli", help="Platform to apply to (default: cli)")
tools_enable_p = tools_sub.add_parser("enable", help="Enable toolsets or MCP tools")
tools_enable_p.add_argument(
"names", nargs="+", metavar="NAME", help="Toolset name or MCP tool in server:tool form")
tools_enable_p.add_argument(
"--platform", default="cli", help="Platform to apply to (default: cli)")
tools_postsetup_p = tools_sub.add_parser(
"post-setup", help="Run a provider's post-setup install hook (npm/pip/binary)",
description="Run the install/bootstrap hook a tool backend declares — the\n"
"same step `hermes tools` runs after you pick a provider that\n"
"needs extra dependencies (browser Chromium, Camofox, cua-driver,\n"
"KittenTTS/Piper, ddgs, Langfuse, xAI, Codex). Stable,\n"
"non-interactive target the dashboard spawns to drive backend\n"
"setup. Keys: agent_browser, camofox, cua_driver, kittentts,\n"
"piper, ddgs, langfuse, xai_grok, openai_codex.")
tools_postsetup_p.add_argument(
"post_setup_key", metavar="KEY",
help="Post-setup hook key (e.g. agent_browser, camofox, kittentts)")
tools_parser.set_defaults(func=cmd_tools)