From a9d16c40c7d80ec5b7a55717954a3fb99ecce2bb Mon Sep 17 00:00:00 2001 From: Teknium Date: Mon, 23 Feb 2026 23:38:33 +0000 Subject: [PATCH] refactor: streamline API key prompt in setup wizard - Introduced a new helper function to handle API key prompts, improving code organization and readability. - Enhanced user experience by providing a formatted display for API key input, including tool descriptions and URLs. - Simplified the setup wizard by replacing inline API key handling with the new helper function, ensuring consistent messaging and feedback during configuration. --- hermes_cli/setup.py | 58 ++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/hermes_cli/setup.py b/hermes_cli/setup.py index 3d541ff13..2bb8ee343 100644 --- a/hermes_cli/setup.py +++ b/hermes_cli/setup.py @@ -232,6 +232,34 @@ def prompt_checklist(title: str, items: list, pre_selected: list = None) -> list return sorted(selected) +def _prompt_api_key(var: dict): + """Display a nicely formatted API key input screen for a single env var.""" + tools = var.get("tools", []) + tools_str = ", ".join(tools[:3]) + if len(tools) > 3: + tools_str += f", +{len(tools) - 3} more" + + print() + print(color(f" ─── {var.get('description', var['name'])} ───", Colors.CYAN)) + print() + if tools_str: + print_info(f" Enables: {tools_str}") + if var.get("url"): + print_info(f" Get your key at: {var['url']}") + print() + + if var.get("password"): + value = prompt(f" {var.get('prompt', var['name'])}", password=True) + else: + value = prompt(f" {var.get('prompt', var['name'])}") + + if value: + save_env_value(var["name"], value) + print_success(f" ✓ Saved") + else: + print_warning(f" Skipped (configure later with 'hermes setup')") + + def _print_setup_summary(config: dict, hermes_home): """Print the setup completion summary.""" # Tool availability summary @@ -495,19 +523,7 @@ def run_setup_wizard(args): for idx in selected_indices: var = missing_tools[idx] - print() - print(color(f" {var['name']}", Colors.CYAN)) - if var.get("url"): - print_info(f" Get key at: {var['url']}") - - if var.get("password"): - value = prompt(f" {var.get('prompt', var['name'])}", password=True) - else: - value = prompt(f" {var.get('prompt', var['name'])}") - - if value: - save_env_value(var["name"], value) - print_success(f" Saved {var['name']}") + _prompt_api_key(var) # ── Messaging platforms (checklist then prompt for selected) ── if missing_messaging: @@ -546,16 +562,24 @@ def run_setup_wizard(args): for idx in selected_indices: plat = platform_order[idx] vars_list = platforms[plat] + emoji = {"Telegram": "📱", "Discord": "💬", "Slack": "💼"}.get(plat, "") + print() + print(color(f" ─── {emoji} {plat} ───", Colors.CYAN)) print() - print(color(f" ─── {plat} ───", Colors.CYAN)) for var in vars_list: + print_info(f" {var.get('description', '')}") + if var.get("url"): + print_info(f" {var['url']}") if var.get("password"): - value = prompt(f" {var.get('prompt', var['name'])}", password=True) + value = prompt(f" {var.get('prompt', var['name'])}", password=True) else: - value = prompt(f" {var.get('prompt', var['name'])}") + value = prompt(f" {var.get('prompt', var['name'])}") if value: save_env_value(var["name"], value) - print_success(f" Saved {var['name']}") + print_success(f" ✓ Saved") + else: + print_warning(f" Skipped") + print() # Handle missing config fields if missing_config: