Repository navigation
ISSUE-450: Install plugins per scope and let the Claude CLI own enablement - #452
Merged
Merged
Conversation
…ement - Stop writing enabledPlugins; Claude Code ignored the bare-name key, and project settings now keep what the CLI wrote - Install by name@marketplace at the sync's scope (local in a project, user globally), recording only installs mcs made - Doctor reads the CLI's plugin list, once per run, listing the global scope from the home directory
…d doctor --fix - Uninstall a plugin a pack stops declaring; a kept plugin moves to the pack still claiming it - Treat an uninstall as done when the plugin is no longer listed at the scope, and never claim an install made blind - Doctor re-lists plugins after a re-sync and warns on disabled ones; global sync saves stripped legacy keys
bguidolim
force-pushed
the
bruno/ISSUE-450-plugin-scope
branch
from
October 8, 2026 15:55
caf3e2f to
3b81e5d
Compare
- A disabled copy at another scope no longer turns a missing install into a warning, so doctor --fix reinstalls it - Another project's project-scope install no longer counts for this project
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
enabledPluginsentry mcs wrote used a key Claude Code ignores, so plugins only worked becauseclaude plugin installenabled them for every project, and doctor could pass for a disabled plugin. Plugins now install at the sync's own scope and the Claude CLI alone manages enablement.Closes #450
Release note
mcs doctorreports whether a plugin actually loads, instead of passing on a settings key Claude Code ignores. A plugin you disabled is a warning with the command to enable itChanges
name@marketplaceid at the sync's scope; a plugin whose marketplace can't be found is skipped with a warningenabledPlugins, and project sync keeps what the CLI wrote theremcs doctor --fixre-reads the plugin list after the re-sync, so a reinstalled plugin is reported fixedsettings.jsonwhenever it stripped a pack's old keys, so legacy bareenabledPluginsentries are removedTest plan
swift testpasses locallyswiftformat --lint .andswiftlintpass without violationsAffected commands verified with a real pack (e.g.
mcs sync,mcs doctor)mcs synca pack with aplugin:in a project → expectinstalled (scope: local), andclaude plugin list --jsonshows it enabled only inside that projectmcs doctorthere → expectenabled (project)mcs pack remove <pack>→ expect the local install removed, any user-scope copy untouchedChecklist for engine changes
LifecycleIntegrationTestsorDoctorRunnerIntegrationTests)CLAUDE.md,docs/,techpack.yamlschema inExternalPackManifest.swift)