diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index a45535aee..8509db7ef 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -2576,6 +2576,7 @@ def extension_list( status_color = "green" if ext["enabled"] else "red" console.print(f" [{status_color}]{status_icon}[/{status_color}] [bold]{ext['name']}[/bold] (v{ext['version']})") + console.print(f" [dim]{ext['id']}[/dim]") console.print(f" {ext['description']}") console.print(f" Commands: {ext['command_count']} | Hooks: {ext['hook_count']} | Status: {'Enabled' if ext['enabled'] else 'Disabled'}") console.print() diff --git a/tests/test_extensions.py b/tests/test_extensions.py index 6299abbb8..61a3e1c98 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -2337,3 +2337,29 @@ def test_update_failure_rolls_back_registry_hooks_and_commands(self, tmp_path): for cmd_file in command_files: assert cmd_file.exists(), f"Expected command file to be restored after rollback: {cmd_file}" + + +class TestExtensionListCLI: + """Test extension list CLI output format.""" + + def test_list_shows_extension_id(self, extension_dir, project_dir): + """extension list should display the extension ID.""" + from typer.testing import CliRunner + from unittest.mock import patch + from specify_cli import app + + runner = CliRunner() + + # Install the extension using the manager + manager = ExtensionManager(project_dir) + manager.install_from_directory(extension_dir, "0.1.0", register_commands=False) + + with patch.object(Path, "cwd", return_value=project_dir): + result = runner.invoke(app, ["extension", "list"]) + + assert result.exit_code == 0, result.output + # Verify the extension ID is shown in the output + assert "test-ext" in result.output + # Verify name and version are also shown + assert "Test Extension" in result.output + assert "1.0.0" in result.output