fix: write customization JSON as UTF-8 (#2414)

Co-authored-by: cyphercodes <cyphercodes@users.noreply.github.com>
Co-authored-by: Brian <bmadcode@gmail.com>
This commit is contained in:
Rayan Salhab 2026-05-24 22:42:45 +03:00 committed by GitHub
parent aa6dece05d
commit f28d04a92a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 59 additions and 1 deletions

View File

@ -177,6 +177,14 @@ def extract_key(data, dotted_key: str):
return current return current
def write_json_stdout(output):
"""Write JSON as UTF-8 so Windows cp1252 stdout can carry emoji icons."""
reconfigure = getattr(sys.stdout, "reconfigure", None)
if reconfigure is not None:
reconfigure(encoding="utf-8")
sys.stdout.write(json.dumps(output, indent=2, ensure_ascii=False) + "\n")
def main(): def main():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Resolve customization for a BMad skill using three-layer TOML merge.", description="Resolve customization for a BMad skill using three-layer TOML merge.",
@ -223,7 +231,7 @@ def main():
else: else:
output = merged output = merged
sys.stdout.write(json.dumps(output, indent=2, ensure_ascii=False) + "\n") write_json_stdout(output)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -0,0 +1,50 @@
import json
import os
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
SCRIPT = Path(__file__).resolve().parents[1] / "resolve_customization.py"
class ResolveCustomizationStdoutTests(unittest.TestCase):
def test_writes_emoji_json_when_stdout_encoding_is_cp1252(self):
with tempfile.TemporaryDirectory() as temp_dir:
skill_dir = Path(temp_dir) / "emoji-agent"
skill_dir.mkdir()
(skill_dir / "customize.toml").write_text(
'[agent]\nname = "Emoji Agent"\nicon = "🧭"\n',
encoding="utf-8",
)
env = os.environ.copy()
env["PYTHONIOENCODING"] = "cp1252"
result = subprocess.run(
[
sys.executable,
str(SCRIPT),
"--skill",
str(skill_dir),
"--key",
"agent",
],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env,
check=False,
)
stderr = result.stderr.decode("utf-8", errors="replace")
self.assertEqual(result.returncode, 0, msg=stderr)
output = result.stdout.decode("utf-8")
self.assertIn("🧭", output)
resolved = json.loads(output)
self.assertEqual(resolved["agent"]["icon"], "🧭")
if __name__ == "__main__":
unittest.main()