From 16416022474a64aacd06fee11c558bd1f7eb4ccf Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Wed, 29 Apr 2026 18:17:08 +0300 Subject: [PATCH 1/2] fix: default non-interactive init integration --- src/specify_cli/__init__.py | 2 ++ tests/integrations/test_cli.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index f5e117beef..948749b4a1 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -1164,6 +1164,8 @@ def init( console.print(f"[red]Error:[/red] Invalid AI assistant '{ai_assistant}'. Choose from: {', '.join(AGENT_CONFIG.keys())}") raise typer.Exit(1) selected_ai = ai_assistant + elif not sys.stdin.isatty(): + selected_ai = "copilot" else: # Create options dict for selection (agent_key: display_name) ai_choices = {key: config["name"] for key, config in AGENT_CONFIG.items()} diff --git a/tests/integrations/test_cli.py b/tests/integrations/test_cli.py index 60e51a5fb9..9faa0b29c2 100644 --- a/tests/integrations/test_cli.py +++ b/tests/integrations/test_cli.py @@ -73,6 +73,28 @@ def test_integration_copilot_creates_files(self, tmp_path): shared_manifest = project / ".specify" / "integrations" / "speckit.manifest.json" assert shared_manifest.exists() + def test_noninteractive_init_defaults_to_copilot(self, tmp_path, monkeypatch): + from typer.testing import CliRunner + from specify_cli import app + import specify_cli + + def fail_select(*_args, **_kwargs): + raise AssertionError("non-interactive init should not open the integration picker") + + monkeypatch.setattr(specify_cli, "select_with_arrows", fail_select) + + runner = CliRunner() + project = tmp_path / "noninteractive" + result = runner.invoke(app, [ + "init", str(project), "--script", "sh", "--no-git", "--ignore-agent-tools", + ], catch_exceptions=False) + + assert result.exit_code == 0, result.output + assert (project / ".github" / "agents" / "speckit.plan.agent.md").exists() + + data = json.loads((project / ".specify" / "integration.json").read_text(encoding="utf-8")) + assert data["integration"] == "copilot" + def test_ai_copilot_auto_promotes(self, tmp_path): from typer.testing import CliRunner from specify_cli import app From 10ebaf0da9075168830153b53b8d64f2ade20afd Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Wed, 29 Apr 2026 18:22:00 +0300 Subject: [PATCH 2/2] chore: clarify non-interactive init default integration --- src/specify_cli/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 948749b4a1..25ec76508d 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -1165,6 +1165,7 @@ def init( raise typer.Exit(1) selected_ai = ai_assistant elif not sys.stdin.isatty(): + console.print("[dim]Non-interactive session detected: defaulting to 'copilot'. Use --integration to choose a different agent.[/dim]") selected_ai = "copilot" else: # Create options dict for selection (agent_key: display_name)