From de9e20242839d93a5a2ac7ae0aff77cf98cf1178 Mon Sep 17 00:00:00 2001 From: Julian Lechner Date: Fri, 18 Sep 2026 14:03:48 +0200 Subject: [PATCH] fix(extensions): remove MCPs before MCPorter --- scripts/lib/managed-extensions.py | 2 +- scripts/tests/test-managed-extensions.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/lib/managed-extensions.py b/scripts/lib/managed-extensions.py index 906b21d..d37e46f 100644 --- a/scripts/lib/managed-extensions.py +++ b/scripts/lib/managed-extensions.py @@ -438,7 +438,7 @@ class Manager: use_mcporter = 'MCPorter' in desired mcporter_entries = {name: entry for name, entry in desired.items() if use_mcporter and entry.get('mcporter_name') and entry.get('mcporter_url') not in ('', '-')} direct_entries = {name: entry for name, entry in desired.items() if name not in mcporter_entries} - for record in list(self.state['resources']): + for record in sorted(self.state['resources'], key=lambda record: record['kind'] != 'mcp'): if record['client'] != 'shared' and record['client'] not in clients: continue selected_entries = mcporter_entries if record['client'] == 'shared' else direct_entries diff --git a/scripts/tests/test-managed-extensions.py b/scripts/tests/test-managed-extensions.py index 0e8ac0c..690ef66 100644 --- a/scripts/tests/test-managed-extensions.py +++ b/scripts/tests/test-managed-extensions.py @@ -202,6 +202,16 @@ class ManagedExtensionTests(unittest.TestCase): self.assertIn(['mcporter', '--config', config, 'config', 'add', 'context7', 'https://mcp.context7.com/mcp'], self.commands) self.assertNotIn(['codex', 'plugin', 'add', 'context7@test'], self.commands) + def test_removes_mcporter_managed_mcp_before_mcporter(self): + self.manager().sync([mcp(), mcporter()], ['codex'], {'Context7', 'MCPorter'}) + self.commands.clear() + self.manager().sync([], ['codex'], set()) + config = str(self.home / '.mcporter/mcporter.json') + self.assertEqual([ + ['mcporter', '--config', config, 'config', 'remove', 'context7'], + ['npm', 'uninstall', '--global', 'mcporter'], + ], self.commands) + def test_foreign_empty_directory_survives_skill_removal(self): self.manager().sync([skill()], ['codex'], {'Humanizer'}) foreign = self.home / '.agents/skills/humanizer/foreign-empty'