Feature: CLI Module Coverage As a developer I want to test all functionality in the CLI module So that we achieve 90%+ code coverage for the cli.py file Background: Given I have a clean test environment for CLI # Main command group tests Scenario: Test main command group initialization Given I have the CLI command group When I initialize the main command group Then the main command group should be available And the version option should be available # Run command tests Scenario: Test run command - successful execution Given I have a valid configuration file And I have a prompt for the agent When I run the run command with valid parameters Then the command should execute successfully And the result should be output Scenario: Test run command - with output file Given I have a valid configuration file And I have a prompt for the agent And I have an output file path When I run the run command with output file Then the command should execute successfully And the result should be written to the output file And a confirmation message should be displayed Scenario: Test run command - with verbose flag Given I have a valid configuration file And I have a prompt for the agent When I run the run command with verbose flag Then the command should execute successfully with verbose output And the result should be output Scenario: Test run command - with unsafe flag Given I have a valid configuration file And I have a prompt for the agent When I run the run command with unsafe flag Then the command should execute successfully with unsafe mode And the result should be output Scenario: Test run command - UnsafeConfigurationError Given I have a configuration file that triggers unsafe error And I have a prompt for the agent When I run the run command and get unsafe error Then the command should exit with code 1 And an unsafe error message should be displayed Scenario: Test run command - CleverAgentsException Given I have a configuration file that triggers agent error And I have a prompt for the agent When I run the run command and get agent error Then the command should exit with code 1 And an agent error message should be displayed Scenario: Test run command - FileNotFoundError Given I have a nonexistent configuration file And I have a prompt for the agent When I run the run command with missing config Then the command should exit with code 2 And a file not found error message should be displayed Scenario: Test run command - generic Exception Given I have a configuration file that triggers generic error And I have a prompt for the agent When I run the run command and get generic error Then the command should exit with code 1 And a generic error message should be displayed Scenario: Test run command - early validation called Given I have multiple configuration files And I have a prompt for the agent When I run the run command with multiple configs Then early validation should be called And the command should execute successfully # Interactive command tests Scenario: Test interactive command - successful execution Given I have a valid configuration file for interactive When I run the interactive command Then the interactive session should start successfully Scenario: Test interactive command - with history file Given I have a valid configuration file for interactive And I have a history file path When I run the interactive command with history Then the interactive session should start with history And the history file should be used Scenario: Test interactive command - with verbose flag Given I have a valid configuration file for interactive When I run the interactive command with verbose flag Then the interactive session should start with verbose output Scenario: Test interactive command - with unsafe flag Given I have a valid configuration file for interactive When I run the interactive command with unsafe flag Then the interactive session should start with unsafe mode Scenario: Test interactive command - UnsafeConfigurationError Given I have a configuration file that triggers unsafe error for interactive When I run the interactive command and get unsafe error Then the command should exit with code 1 And an unsafe error message should be displayed for interactive Scenario: Test interactive command - CleverAgentsException Given I have a configuration file that triggers agent error for interactive When I run the interactive command and get agent error Then the command should exit with code 1 And an agent error message should be displayed for interactive # Generate examples command tests Scenario: Test generate_examples command - default output directory When I run the generate_examples command Then example files should be created in the default directory And basic_reactive.yaml should be created And advanced_reactive.yaml should be created And collaboration_reactive.yaml should be created And success messages should be displayed Scenario: Test generate_examples command - custom output directory Given I have a custom output directory When I run the generate_examples command with custom output Then example files should be created in the custom directory And basic_reactive.yaml should be created in custom directory And advanced_reactive.yaml should be created in custom directory And collaboration_reactive.yaml should be created in custom directory And success messages should be displayed for custom directory Scenario: Test generate_examples command - directory creation Given I have a nonexistent output directory When I run the generate_examples command with nonexistent directory Then the output directory should be created And example files should be created in the new directory # Visualize command tests Scenario: Test visualize command - mermaid format to stdout Given I have a valid configuration file for visualization When I run the visualize command with mermaid format Then a mermaid diagram should be generated And the diagram should be output to stdout Scenario: Test visualize command - mermaid format to file Given I have a valid configuration file for visualization And I have an output file for diagram When I run the visualize command with mermaid format and output file Then a mermaid diagram should be generated And the diagram should be written to the output file And a success message should be displayed for diagram Scenario: Test visualize command - dot format Given I have a valid configuration file for visualization When I run the visualize command with dot format Then a dot diagram should be generated And the diagram should be output to stdout Scenario: Test visualize command - ascii format Given I have a valid configuration file for visualization When I run the visualize command with ascii format Then an ascii diagram should be generated And the diagram should be output to stdout Scenario: Test visualize command - no configuration loaded Given I have a configuration file with no config loaded When I run the visualize command with no config Then the command should exit with code 1 And a no configuration error should be displayed Scenario: Test visualize command - CleverAgentsException Given I have a configuration file that triggers visualization error When I run the visualize command and get error Then the command should exit with code 1 And a visualization error message should be displayed # Mermaid diagram generation tests Scenario: Test _generate_mermaid_diagram - basic structure Given I have a config with agents and routes When I generate a mermaid diagram Then the diagram should contain graph TD header And the diagram should contain agent nodes And the diagram should contain route nodes Scenario: Test _generate_mermaid_diagram - stream routes with agents Given I have a config with stream routes and connected agents When I generate a mermaid diagram for streams Then the diagram should contain stream nodes with proper shapes And the diagram should contain agent to stream connections Scenario: Test _generate_mermaid_diagram - graph routes Given I have a config with graph routes When I generate a mermaid diagram for graphs Then the diagram should contain graph nodes with proper shapes Scenario: Test _generate_mermaid_diagram - merges Given I have a config with merge configurations When I generate a mermaid diagram with merges Then the diagram should contain merge connections Scenario: Test _generate_mermaid_diagram - splits with dict targets Given I have a config with split configurations using dict targets When I generate a mermaid diagram with dict splits Then the diagram should contain split connections from dict targets Scenario: Test _generate_mermaid_diagram - splits with string targets Given I have a config with split configurations using string targets When I generate a mermaid diagram with string splits Then the diagram should contain split connections from string targets Scenario: Test _generate_mermaid_diagram - splits with list targets Given I have a config with split configurations using list targets When I generate a mermaid diagram with list splits Then the diagram should contain split connections from list targets Scenario: Test _generate_mermaid_diagram - splits with other targets Given I have a config with split configurations using other targets When I generate a mermaid diagram with other splits Then the diagram should handle other target types gracefully # DOT diagram generation tests Scenario: Test _generate_dot_diagram - basic structure Given I have a config with agents and routes for dot When I generate a dot diagram Then the diagram should contain digraph header And the diagram should contain agent nodes with box shapes And the diagram should contain route nodes Scenario: Test _generate_dot_diagram - stream routes with agents Given I have a config with stream routes and agents for dot When I generate a dot diagram for streams Then the diagram should contain stream nodes with proper shapes And the diagram should contain agent to stream connections for dot Scenario: Test _generate_dot_diagram - graph routes Given I have a config with graph routes for dot When I generate a dot diagram for graphs Then the diagram should contain graph nodes with hexagon shapes Scenario: Test _generate_dot_diagram - merges and splits Given I have a config with merges and splits for dot When I generate a dot diagram with connections Then the diagram should contain merge and split connections And the diagram should end with closing brace Scenario: Test _generate_dot_diagram - split target type handling Given I have a config with various split target types for dot When I generate a dot diagram with various splits Then the diagram should handle all target types correctly for dot # ASCII diagram generation tests Scenario: Test _generate_ascii_diagram - basic structure Given I have a config with agents and routes for ascii When I generate an ascii diagram Then the diagram should contain header and separators And the diagram should list agents with types And the diagram should list routes with types Scenario: Test _generate_ascii_diagram - stream routes with details Given I have a config with stream routes with agents and operators When I generate an ascii diagram for detailed streams Then the diagram should show stream details And the diagram should show connected agents And the diagram should show operator counts Scenario: Test _generate_ascii_diagram - graph routes with details Given I have a config with graph routes with nodes and edges When I generate an ascii diagram for detailed graphs Then the diagram should show graph details And the diagram should show node counts And the diagram should show edge counts Scenario: Test _generate_ascii_diagram - merges section Given I have a config with merges for ascii When I generate an ascii diagram with merges Then the diagram should contain merges section And the diagram should show merge connections Scenario: Test _generate_ascii_diagram - splits section Given I have a config with splits for ascii When I generate an ascii diagram with splits Then the diagram should contain splits section And the diagram should show split connections Scenario: Test _generate_ascii_diagram - split target type handling Given I have a config with various split types for ascii When I generate an ascii diagram with various split types Then the diagram should handle all split target types for ascii # Configuration validation tests Scenario: Test _validate_config_files - no config files provided Given I have no configuration files When I validate the configuration files Then a CleverAgentsException should be raised about no files Scenario: Test _validate_config_files - nonexistent file Given I have a nonexistent configuration file for validation When I validate the nonexistent configuration file Then a FileNotFoundError should be raised Scenario: Test _validate_config_files - empty file Given I have an empty configuration file When I validate the empty configuration file Then a CleverAgentsException should be raised about empty file Scenario: Test _validate_config_files - dev null file Given I have a dev null configuration file When I validate the dev null configuration file Then a CleverAgentsException should be raised about invalid file Scenario: Test _validate_config_files - null named file Given I have a null named configuration file When I validate the null named configuration file Then a CleverAgentsException should be raised about null file Scenario: Test _validate_config_files - NUL named file Given I have a NUL named configuration file When I validate the NUL named configuration file Then a CleverAgentsException should be raised about NUL file Scenario: Test _validate_config_files - whitespace only file Given I have a whitespace only configuration file When I validate the whitespace only configuration file Then a CleverAgentsException should be raised about whitespace file Scenario: Test _validate_config_files - unreadable file Given I have an unreadable configuration file When I validate the unreadable configuration file Then a CleverAgentsException should be raised about unreadable file Scenario: Test _validate_config_files - valid files Given I have valid configuration files for validation When I validate the valid configuration files Then the validation should pass successfully # Main entry point test Scenario: Test main entry point When the CLI module is run as main Then the main function should be called