From 14ac43ba41642740b61982a2816e2abf05a89345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Den=20Delimarsky=20=F0=9F=8C=BA?= <53200638+localden@users.noreply.github.com> Date: Sun, 21 Sep 2025 13:12:49 -0700 Subject: [PATCH] Update error messages --- CHANGELOG.md | 6 +++++ pyproject.toml | 2 +- src/specify_cli/__init__.py | 50 ++++++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e469e53..b46247b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to the Specify CLI will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.0.14] - 2025-09-21 + +### Changed + +- Error messages are now shown consistently. + ## [0.0.13] - 2025-09-21 ### Added diff --git a/pyproject.toml b/pyproject.toml index 4b5f73c..1754fe9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "specify-cli" -version = "0.0.13" +version = "0.0.14" description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)." requires-python = ">=3.11" dependencies = [ diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index a70a1ae..8025dae 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -382,8 +382,6 @@ def check_tool(tool: str, install_hint: str) -> bool: if shutil.which(tool): return True else: - console.print(f"[yellow]⚠️ {tool} not found[/yellow]") - console.print(f" Install with: [cyan]{install_hint}[/cyan]") return False @@ -817,7 +815,15 @@ def init( project_path = Path(project_name).resolve() # Check if project directory already exists if project_path.exists(): - console.print(f"[red]Error:[/red] Directory '{project_name}' already exists") + error_panel = Panel( + f"Directory '[cyan]{project_name}[/cyan]' already exists\n" + "Please choose a different project name or remove the existing directory.", + title="[red]Directory Conflict[/red]", + border_style="red", + padding=(1, 2) + ) + console.print() + console.print(error_panel) raise typer.Exit(1) # Create formatted setup info with column alignment @@ -861,35 +867,45 @@ def init( # Check agent tools unless ignored if not ignore_agent_tools: agent_tool_missing = False + install_url = "" if selected_ai == "claude": - if not check_tool("claude", "Install from: https://docs.anthropic.com/en/docs/claude-code/setup"): - console.print("[red]Error:[/red] Claude CLI is required for Claude Code projects") + if not check_tool("claude", "https://docs.anthropic.com/en/docs/claude-code/setup"): + install_url = "https://docs.anthropic.com/en/docs/claude-code/setup" agent_tool_missing = True elif selected_ai == "gemini": - if not check_tool("gemini", "Install from: https://github.com/google-gemini/gemini-cli"): - console.print("[red]Error:[/red] Gemini CLI is required for Gemini projects") + if not check_tool("gemini", "https://github.com/google-gemini/gemini-cli"): + install_url = "https://github.com/google-gemini/gemini-cli" agent_tool_missing = True elif selected_ai == "qwen": - if not check_tool("qwen", "Install from: https://github.com/QwenLM/qwen-code"): - console.print("[red]Error:[/red] Qwen CLI is required for Qwen Code projects") + if not check_tool("qwen", "https://github.com/QwenLM/qwen-code"): + install_url = "https://github.com/QwenLM/qwen-code" agent_tool_missing = True elif selected_ai == "opencode": - if not check_tool("opencode", "Install from: https://opencode.ai"): - console.print("[red]Error:[/red] opencode CLI is required for opencode projects") + if not check_tool("opencode", "https://opencode.ai"): + install_url = "https://opencode.ai" agent_tool_missing = True elif selected_ai == "codex": - if not check_tool("codex", "Install from: https://github.com/openai/codex"): - console.print("[red]Error:[/red] Codex CLI is required for Codex projects") + if not check_tool("codex", "https://github.com/openai/codex"): + install_url = "https://github.com/openai/codex" agent_tool_missing = True elif selected_ai == "auggie": - if not check_tool("auggie", "Install from: https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"): - console.print("[red]Error:[/red] Auggie CLI is required for Auggie CLI projects") + if not check_tool("auggie", "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"): + install_url = "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli" agent_tool_missing = True # GitHub Copilot and Cursor checks are not needed as they're typically available in supported IDEs if agent_tool_missing: - console.print("\n[red]Required AI tool is missing![/red]") - console.print("[yellow]Tip:[/yellow] Use --ignore-agent-tools to skip this check") + error_panel = Panel( + f"[cyan]{selected_ai}[/cyan] not found\n" + f"Install with: [cyan]{install_url}[/cyan]\n" + f"{AI_CHOICES[selected_ai]} is required to continue with this project type.\n\n" + "Tip: Use [cyan]--ignore-agent-tools[/cyan] to skip this check", + title="[red]Agent Detection Error[/red]", + border_style="red", + padding=(1, 2) + ) + console.print() + console.print(error_panel) raise typer.Exit(1) # Determine script type (explicit, interactive, or OS default)