From 6361e81915ef46610d9d7f87736953ae40fb3575 Mon Sep 17 00:00:00 2001 From: Julian lechner Date: Wed, 30 Sep 2026 12:44:35 +0200 Subject: [PATCH] fix(plugins): update installed QMD without reinstalling --- scripts/lib/managed-extensions.py | 2 +- scripts/tests/test-managed-extensions.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/lib/managed-extensions.py b/scripts/lib/managed-extensions.py index 6bd49f9..e5f3b86 100644 --- a/scripts/lib/managed-extensions.py +++ b/scripts/lib/managed-extensions.py @@ -429,7 +429,7 @@ class Manager: if record is None and installed and not self.summary: print(f'PASS Preserving pre-existing global package: {package}') if (record is not None or not installed) and (not installed or (self.update and package not in self.updated_packages)): - self.command(['npm', 'install', '--global', package]) + self.command(['npm', 'update' if installed else 'install', '--global', package]) self.global_packages().add(package) self.updated_packages.add(package) if record is None: diff --git a/scripts/tests/test-managed-extensions.py b/scripts/tests/test-managed-extensions.py index 3b1d54c..31c1e92 100644 --- a/scripts/tests/test-managed-extensions.py +++ b/scripts/tests/test-managed-extensions.py @@ -274,6 +274,14 @@ class ManagedExtensionTests(unittest.TestCase): self.assertIn(['claude', 'plugin', 'install', 'qmd@qmd', '--scope', 'user'], self.commands) self.assertNotIn(['codex', 'mcp', 'add', 'qmd', '--', 'qmd', 'mcp'], self.commands) + def test_owned_qmd_uses_npm_update_instead_of_reinstalling(self): + entry = dict(name='QMD', codex_method='qmd', codex_source='@tobilu/qmd', codex_skill='qmd', codex_plugin='-', codex_marketplace='-', claude_plugin='qmd@qmd', claude_marketplace='tobi/qmd') + self.manager().sync([entry], ['codex'], {'QMD'}) + self.commands.clear() + with patch.object(extensions.Manager, 'global_packages', return_value={'@tobilu/qmd'}): + self.manager(update=True).sync([entry], ['codex'], {'QMD'}) + self.assertEqual([['npm', 'update', '--global', '@tobilu/qmd']], self.commands) + def test_managed_mcporter_updates_when_requested(self): self.manager().sync([mcporter()], ['codex'], {'MCPorter'}) self.commands.clear()