Skip to content

Commit 1dfd32c

Browse files
marcelsafinCopilot
andcommitted
fix: preserve dashed-description skill tracking
Use the shared frontmatter parser when verifying surviving extension skill mirrors so delimiter substrings cannot hide provenance metadata. Assisted-by: GitHub Copilot (model: GPT-5.6 Sol, autonomous) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 7bf0b67 commit 1dfd32c

2 files changed

Lines changed: 49 additions & 11 deletions

File tree

‎src/specify_cli/extensions/__init__.py‎

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,19 +1657,15 @@ def _extension_owned_skill_names(
16571657
if not skill_md.is_file():
16581658
continue
16591659
try:
1660-
import yaml as _yaml
1660+
from ..agents import CommandRegistrar as _Registrar
16611661

16621662
raw = skill_md.read_text(encoding="utf-8")
1663-
source = ""
1664-
if raw.startswith("---"):
1665-
parts = raw.split("---", 2)
1666-
if len(parts) >= 3:
1667-
fm = _yaml.safe_load(parts[1]) or {}
1668-
source = (
1669-
fm.get("metadata", {}).get("source", "")
1670-
if isinstance(fm, dict)
1671-
else ""
1672-
)
1663+
fm, _ = _Registrar.parse_frontmatter(raw)
1664+
source = (
1665+
fm.get("metadata", {}).get("source", "")
1666+
if isinstance(fm, dict)
1667+
else ""
1668+
)
16731669
except (OSError, UnicodeDecodeError, Exception):
16741670
continue
16751671
if source == marker:

‎tests/test_extension_skills.py‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,6 +2364,48 @@ def test_unregister_agent_artifacts_preserves_tracking_for_other_agent_mirror(
23642364
"dropped by the earlier auggie-scoped unregister call (#2948)"
23652365
)
23662366

2367+
def test_unregister_agent_artifacts_preserves_dashed_description_mirror_tracking(
2368+
self, project_dir, temp_dir
2369+
):
2370+
"""A ``---`` substring in frontmatter must not hide mirror ownership."""
2371+
extension_id = "dash-mirror-ext"
2372+
skill_name = f"speckit-{extension_id}-hello"
2373+
2374+
_create_init_options(project_dir, ai="auggie", ai_skills=True)
2375+
manager = ExtensionManager(project_dir)
2376+
manager.install_from_directory(
2377+
_create_dashed_description_extension_dir(
2378+
temp_dir, ext_id=extension_id
2379+
),
2380+
"0.1.0",
2381+
register_commands=False,
2382+
)
2383+
manager.register_enabled_extensions_for_agent("auggie")
2384+
2385+
_create_init_options(project_dir, ai="copilot", ai_skills=True)
2386+
manager.register_enabled_extensions_for_agent("copilot")
2387+
2388+
auggie_skill = (
2389+
project_dir / ".augment" / "skills" / skill_name / "SKILL.md"
2390+
)
2391+
copilot_skill = (
2392+
project_dir / ".github" / "skills" / skill_name / "SKILL.md"
2393+
)
2394+
assert auggie_skill.exists() and copilot_skill.exists()
2395+
assert "--- markers" in copilot_skill.read_text(encoding="utf-8")
2396+
2397+
manager.unregister_agent_artifacts("auggie")
2398+
2399+
assert not auggie_skill.exists()
2400+
assert copilot_skill.exists()
2401+
metadata = manager.registry.get(extension_id)
2402+
assert skill_name in metadata.get("registered_skills", []), (
2403+
"tracking must survive while another marker-owned mirror exists"
2404+
)
2405+
2406+
assert manager.remove(extension_id) is True
2407+
assert not copilot_skill.exists()
2408+
23672409
def test_extension_owned_skill_names_rejects_symlinked_candidate_directory(
23682410
self, project_dir, temp_dir
23692411
):

0 commit comments

Comments
 (0)