From 2066a8c9757ae81ba276178574fe79809dd17120 Mon Sep 17 00:00:00 2001 From: marcelsafin <179933638+marcelsafin@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:25:45 +0200 Subject: [PATCH] fix(kimi): preserve non-UTF-8 user skills Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/specify_cli/integrations/kimi/__init__.py | 2 +- tests/integrations/test_integration_kimi.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/specify_cli/integrations/kimi/__init__.py b/src/specify_cli/integrations/kimi/__init__.py index 2b3d409b6f..4517fac037 100644 --- a/src/specify_cli/integrations/kimi/__init__.py +++ b/src/specify_cli/integrations/kimi/__init__.py @@ -317,7 +317,7 @@ def _is_speckit_generated_skill(skill_dir: Path) -> bool: try: content = skill_file.read_text(encoding="utf-8") - except OSError: + except (OSError, UnicodeError): return False if not content.startswith("---"): diff --git a/tests/integrations/test_integration_kimi.py b/tests/integrations/test_integration_kimi.py index 48e4daa553..36cb30a15b 100644 --- a/tests/integrations/test_integration_kimi.py +++ b/tests/integrations/test_integration_kimi.py @@ -199,6 +199,24 @@ def test_teardown_preserves_user_skills_in_legacy_dir(self, tmp_path): assert user_skill.exists() + def test_teardown_preserves_non_utf8_user_skill(self, tmp_path): + i = get_integration("kimi") + + user_skill = ( + tmp_path + / ".kimi" + / "skills" + / "speckit-user-owned" + / "SKILL.md" + ) + user_skill.parent.mkdir(parents=True) + user_skill.write_bytes(b"\xff\xfe") + + m = IntegrationManifest("kimi", tmp_path) + i.teardown(tmp_path, m) + + assert user_skill.read_bytes() == b"\xff\xfe" + class TestKimiCommandInvocation: """Kimi dispatch must use the native ``/skill:`` slash command."""