mirror of
https://github.com/github/spec-kit
synced 2026-06-21 13:51:39 +00:00
fix(skills): preserve non-ASCII characters in skill frontmatter (#2917)
* fix(skills): preserve non-ASCII chars in skill frontmatter Skill SKILL.md frontmatter descriptions containing non-ASCII characters were escaped to \uXXXX / \xXX sequences because yaml.safe_dump() was called without allow_unicode=True. - Add allow_unicode=True to the 7 skill/command frontmatter safe_dump sites (extensions, presets, claude integration) - Add regression tests for the render and extension-install paths Follows the approach of #1936; encoding="utf-8" is already set on the affected write paths, so no encoding change is needed here. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(_utils): add dump_frontmatter helper Centralize skill/command frontmatter YAML serialization into a single _utils.dump_frontmatter helper so no call site can drop allow_unicode or diverge on formatting. Route the 7 existing sites through it and drop a now-unused local yaml import. Switch the extension test fixtures to yaml.safe_dump for parity with the production safe-dump/safe-load codepaths. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ from packaging.specifiers import SpecifierSet, InvalidSpecifier
|
||||
from ..extensions import REINSTALL_COMMAND, ExtensionRegistry, normalize_priority
|
||||
from .._init_options import is_ai_skills_enabled
|
||||
from ..integrations.base import IntegrationBase
|
||||
from .._utils import dump_frontmatter
|
||||
|
||||
|
||||
def _substitute_core_template(
|
||||
@@ -1068,7 +1069,7 @@ class PresetManager:
|
||||
skill_name, desc,
|
||||
f"override:{cmd_name}",
|
||||
)
|
||||
fm_text = yaml.safe_dump(fm_data, sort_keys=False).strip()
|
||||
fm_text = dump_frontmatter(fm_data)
|
||||
skill_title = self._skill_title_from_command(cmd_name)
|
||||
skill_content = (
|
||||
f"---\n{fm_text}\n---\n\n"
|
||||
@@ -1345,7 +1346,7 @@ class PresetManager:
|
||||
enhanced_desc,
|
||||
f"preset:{manifest.id}",
|
||||
)
|
||||
frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
|
||||
frontmatter_text = dump_frontmatter(frontmatter_data)
|
||||
skill_content = (
|
||||
f"---\n"
|
||||
f"{frontmatter_text}\n"
|
||||
@@ -1441,7 +1442,7 @@ class PresetManager:
|
||||
enhanced_desc,
|
||||
f"templates/commands/{short_name}.md",
|
||||
)
|
||||
frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
|
||||
frontmatter_text = dump_frontmatter(frontmatter_data)
|
||||
skill_title = self._skill_title_from_command(short_name)
|
||||
skill_content = (
|
||||
f"---\n"
|
||||
@@ -1478,7 +1479,7 @@ class PresetManager:
|
||||
frontmatter.get("description", f"Extension command: {command_name}"),
|
||||
extension_restore["source"],
|
||||
)
|
||||
frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
|
||||
frontmatter_text = dump_frontmatter(frontmatter_data)
|
||||
skill_content = (
|
||||
f"---\n"
|
||||
f"{frontmatter_text}\n"
|
||||
@@ -3276,7 +3277,7 @@ class PresetResolver:
|
||||
if top_fm:
|
||||
top_frontmatter_text = (
|
||||
"---\n"
|
||||
+ yaml.safe_dump(top_fm, sort_keys=False).strip()
|
||||
+ dump_frontmatter(top_fm)
|
||||
+ "\n---"
|
||||
)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user