diff --git a/src/ouroboros/cli/commands/pm.py b/src/ouroboros/cli/commands/pm.py index 4d2f8ec2..c3549bdb 100644 --- a/src/ouroboros/cli/commands/pm.py +++ b/src/ouroboros/cli/commands/pm.py @@ -19,6 +19,7 @@ from ouroboros.bigbang.interview import InterviewRound from ouroboros.cli.formatters import console from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning +from ouroboros.config import get_clarification_model from ouroboros.core.types import Result app = typer.Typer( @@ -49,13 +50,13 @@ def pm_command( ), ] = None, model: Annotated[ - str, + str | None, typer.Option( "--model", "-m", help="LLM model to use for the PM interview.", ), - ] = "anthropic/claude-sonnet-4-20250514", + ] = None, debug: Annotated[ bool, typer.Option( @@ -82,6 +83,9 @@ def pm_command( if ctx.invoked_subcommand is not None: return + if model is None: + model = get_clarification_model() + console.print("\n[bold cyan]Ouroboros PM Generator[/] - Product Requirements Document\n") if resume: diff --git a/tests/unit/cli/test_pm.py b/tests/unit/cli/test_pm.py new file mode 100644 index 00000000..e7cddc5e --- /dev/null +++ b/tests/unit/cli/test_pm.py @@ -0,0 +1,39 @@ +"""Tests for the PM CLI command.""" + +from unittest.mock import patch + +from typer.testing import CliRunner + +from ouroboros.cli.main import app + +runner = CliRunner() + + +@patch("ouroboros.cli.commands.pm._run_pm_interview") +@patch("ouroboros.cli.commands.pm.get_clarification_model", return_value="default") +def test_pm_uses_configured_clarification_model_when_option_omitted( + mock_get_clarification_model, mock_run_pm_interview +) -> None: + """The bare `pm` command should resolve its model from config.""" + result = runner.invoke(app, ["pm"], input="n\n") + + assert result.exit_code == 0 + mock_get_clarification_model.assert_called_once_with() + mock_run_pm_interview.assert_called_once() + assert mock_run_pm_interview.call_args.kwargs["model"] == "default" + assert "Model:" in result.output + assert "default" in result.output + + +@patch("ouroboros.cli.commands.pm._run_pm_interview") +@patch("ouroboros.cli.commands.pm.get_clarification_model") +def test_pm_preserves_explicit_model_override( + mock_get_clarification_model, mock_run_pm_interview +) -> None: + """An explicit --model value should bypass config lookup.""" + result = runner.invoke(app, ["pm", "--model", "openai/gpt-5.2"], input="n\n") + + assert result.exit_code == 0 + mock_get_clarification_model.assert_not_called() + mock_run_pm_interview.assert_called_once() + assert mock_run_pm_interview.call_args.kwargs["model"] == "openai/gpt-5.2"