From 0ae451f697aa837c4dce3d573b0c8c51f86dea30 Mon Sep 17 00:00:00 2001 From: LahkLeKey Date: Tue, 26 May 2026 08:25:15 -0500 Subject: [PATCH] Add util for windows sub-process (#2598) * Add util for windows sub-process * Use platform-aware Copilot executable in subprocess calls * Update test_workflows.py --- src/specify_cli/integrations/copilot/__init__.py | 14 ++++++++++++-- tests/test_workflows.py | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/specify_cli/integrations/copilot/__init__.py b/src/specify_cli/integrations/copilot/__init__.py index c7456ce7f..4e8f6e16b 100644 --- a/src/specify_cli/integrations/copilot/__init__.py +++ b/src/specify_cli/integrations/copilot/__init__.py @@ -24,6 +24,16 @@ from ..base import IntegrationBase, IntegrationOption, SkillsIntegration from ..manifest import IntegrationManifest +def _copilot_executable() -> str: + """Return the executable name for Copilot CLI on this platform. + + On Windows, subprocess invocation is reliable with `copilot.cmd`. + """ + if os.name == "nt": + return "copilot.cmd" + return "copilot" + + def _allow_all() -> bool: """Return True if the Copilot CLI should run with full permissions. @@ -138,7 +148,7 @@ class CopilotIntegration(IntegrationBase): # Controlled by SPECKIT_COPILOT_ALLOW_ALL_TOOLS env var # (default: enabled). The deprecated SPECKIT_ALLOW_ALL_TOOLS # is also honoured as a fallback. - args = ["copilot", "-p", prompt] + args = [_copilot_executable(), "-p", prompt] if _allow_all(): args.append("--yolo") if model: @@ -206,7 +216,7 @@ class CopilotIntegration(IntegrationBase): agent_name = f"speckit.{stem}" prompt = args or "" - cli_args = ["copilot", "-p", prompt] + cli_args = [_copilot_executable(), "-p", prompt] if not skills_mode: cli_args.extend(["--agent", agent_name]) if _allow_all(): diff --git a/tests/test_workflows.py b/tests/test_workflows.py index f340e9c0d..bfd83a0de 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -13,6 +13,7 @@ Covers: from __future__ import annotations import json +import os import shutil import tempfile from pathlib import Path @@ -373,7 +374,8 @@ class TestBuildExecArgs: from specify_cli.integrations.copilot import CopilotIntegration impl = CopilotIntegration() args = impl.build_exec_args("do stuff", model="claude-sonnet-4-20250514") - assert args[0] == "copilot" + expected_exec = "copilot.cmd" if os.name == "nt" else "copilot" + assert args[0] == expected_exec assert "-p" in args assert "--yolo" in args assert "--model" in args