Skip to content

Commit dec29f8

Browse files
marcelsafinCopilot
andcommitted
fix(presets): clean reconciled agent skills
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 20223a2 commit dec29f8

2 files changed

Lines changed: 65 additions & 1 deletion

File tree

src/specify_cli/presets/__init__.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2886,6 +2886,23 @@ def _delete_agent_preset_skills(
28862886

28872887
registrar = CommandRegistrar()
28882888
marker = f"preset:{pack_id}"
2889+
override_sources: Dict[str, str] = {}
2890+
manifest = PresetResolver(self.project_root)._get_manifest(
2891+
self.presets_dir / pack_id
2892+
)
2893+
if manifest is not None:
2894+
for template in manifest.templates:
2895+
command_name = template.get("name")
2896+
if (
2897+
template.get("type") == "command"
2898+
and isinstance(command_name, str)
2899+
):
2900+
for skill_name in self._skill_names_for_command(
2901+
command_name
2902+
):
2903+
override_sources[skill_name] = (
2904+
f"override:{command_name}"
2905+
)
28892906
for skill_name in skill_names:
28902907
if not self._is_safe_registry_skill_name(skill_name):
28912908
continue
@@ -2908,7 +2925,11 @@ def _delete_agent_preset_skills(
29082925
if isinstance(metadata, dict)
29092926
else None
29102927
)
2911-
if source == marker:
2928+
owned_sources = {marker}
2929+
override_source = override_sources.get(skill_name)
2930+
if override_source:
2931+
owned_sources.add(override_source)
2932+
if source in owned_sources:
29122933
shutil.rmtree(skill_subdir)
29132934

29142935
def _unregister_skills_in_dir(

tests/test_presets.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7820,6 +7820,49 @@ def test_unregister_agent_artifacts_deletes_marker_owned_skill(
78207820

78217821
assert not skill_dir.exists()
78227822

7823+
def test_unregister_agent_artifacts_deletes_reconciled_override_skill(
7824+
self, project_dir, temp_dir
7825+
):
7826+
self._write_init_options(project_dir, ai="copilot", ai_skills=True)
7827+
skills_dir = project_dir / ".github" / "skills"
7828+
self._create_skill(skills_dir, "speckit-specify")
7829+
preset_dir = self._create_command_preset(
7830+
temp_dir,
7831+
"deactivated-override-preset",
7832+
"speckit.specify",
7833+
"Deactivation override cleanup",
7834+
"preset body",
7835+
)
7836+
manager = PresetManager(project_dir)
7837+
manager.install_from_directory(preset_dir, "0.1.5")
7838+
7839+
overrides_dir = (
7840+
project_dir / ".specify" / "templates" / "overrides"
7841+
)
7842+
overrides_dir.mkdir(parents=True)
7843+
(overrides_dir / "speckit.specify.md").write_text(
7844+
"---\ndescription: Project override\n---\n\nOverride body\n",
7845+
encoding="utf-8",
7846+
)
7847+
(
7848+
manager.presets_dir
7849+
/ "deactivated-override-preset"
7850+
/ "commands"
7851+
/ "speckit.specify.md"
7852+
).unlink()
7853+
manager.register_enabled_presets_for_agent("copilot")
7854+
7855+
skill_dir = skills_dir / "speckit-specify"
7856+
assert "override:speckit.specify" in (
7857+
skill_dir / "SKILL.md"
7858+
).read_text(encoding="utf-8")
7859+
7860+
manager.unregister_agent_artifacts("copilot")
7861+
7862+
assert not skill_dir.exists()
7863+
metadata = manager.registry.get("deactivated-override-preset")
7864+
assert "copilot" not in metadata.get("registered_skills", {})
7865+
78237866
def test_unregister_native_agent_persists_skills_metadata_pop(
78247867
self, project_dir, temp_dir
78257868
):

0 commit comments

Comments
 (0)