Policy-driven enabledPlugins installs the plugin but persists "enabled": false, so it never activates (1.0.83) — reproduces via device/MDM and repo-level settings
Nessuno ha ancora preso questa issue.
- Lingua principale
- Shell
- Stelle
- 11.2k
- Fork
- 1.9k
- Merge medio
- 14h 16m
- PR unite (30g)
- 6
Descrizione
Describe the bug
A policy/configuration-driven enabledPlugins entry installs the named plugin to disk, but records it in ~/.copilot/config.json as "enabled": false. The plugin's skills never activate, and the state does not self-correct on subsequent interactive starts. There is no error or warning.
This reproduces via two independent delivery channels, which suggests the defect is in the shared policy-install path rather than in any one channel:
- Device/MDM —
%ProgramFiles%\GitHubCopilot\managed-settings.json(source=mdm) - Repository/folder-level —
.github/copilot/settings.jsonin a trusted folder, with no managed policy present at all (effective policy resolved: source=none)
In both cases the plugin is fetched and written to disk correctly and then left inert.
This is the same symptom as #4283 (closed as completed on 2026-09-03, no fix version stated), which was reported against the server-managed channel. It is distinct from #4039: there the plugin was marked installed/enabled but never synced to disk — here the sync to disk succeeds and the enablement flag is the thing that is wrong.
Affected version
GitHub Copilot CLI 1.0.83 (Windows, x86_64). Latest published at time of writing (npm view @github/copilot version → 1.0.83).
Steps to reproduce the behavior
-
Create
%ProgramFiles%\GitHubCopilot\managed-settings.json, owned byBUILTIN\Administrators:{ "extraKnownMarketplaces": { "example-marketplace": { "source": { "source": "github", "repo": "org-name/marketplace-repo" }, "autoUpdate": true } }, "enabledPlugins": { "example-plugin@example-marketplace": true } }org-name/marketplace-repois a private repository the signed-in user has access to.example-pluginis not installed and does not appear in~/.copilot/settings.json. -
Start an interactive session from a folder listed in
trustedFoldersin~/.copilot/config.json(auto-install does not fire in-pmode, cf. #4507):copilot --log-level debug --log-dir <dir> -
Confirm from the log that the policy loaded:
[managedSettings] device MDM policy loaded: bypassDisabled=false, keys=[enabledPlugins,extraKnownMarketplaces] [managedSettings] effective policy resolved: source=mdm, bypassDisabled=false, serverFetchFailed=false, ... -
Exit the session, then inspect the install directory and
~/.copilot/config.json. -
Start a second interactive session in the same folder and re-inspect.
Expected behavior
example-plugin@example-marketplace is installed and enabled, and the skills it contributes are available.
Actual behavior
The plugin is installed, with its skills present on disk:
~/.copilot/installed-plugins/example-marketplace/example-plugin/
├── .claude-plugin/plugin.json
└── skills/<skill-name>
But ~/.copilot/config.json records it as disabled:
{
"name": "example-plugin",
"marketplace": "example-marketplace",
"installed_at": "...",
"cache_path": "...",
"source_sha": "...",
"enabled": false
}
Consequences observed:
- The skill it contributes does not appear in
copilot plugins listand is not active in-session. - A second interactive start leaves
enabled: falseunchanged. - Plugins that appear in the user's own
settings.jsonshow"enabled": truein the sameconfig.json, so only the policy-driven entry is affected. copilot plugins update --allreportsProcessed 8 installed pluginsand does not consider the policy-named plugin.
Additional context
- The same policy file's
modelkey is enforced — the session switched to the model named in policy — so the device channel is being honoured and parsed correctly (keys=[enabledPlugins,extraKnownMarketplaces,model]). The defect is specific to the enablement flag for policy-installed plugins. - Practical impact for an enterprise rollout: a policy can place a plugin on every machine and leave it inert. Plugins whose value is in the hooks they contribute silently never run, so presence on disk is not a usable success signal — the
enabledflag inconfig.jsonhas to be checked instead. That makes the failure easy to mistake for a successful deployment. - The documented semantics for the key are "Defines plugins that are automatically installed or blocked for all enterprise users", which reads as covering enablement as well as installation.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo il flusso delle policy con managed-settings.json e .github/copilot/settings.json, quindi esamina il percorso di avvio interattivo e il ~/.copilot/config.json risultante. Confronta le voci gestite dalle policy con le voci delle impostazioni dell'utente e usa copilot plugins list e copilot plugins update --all per verificare il comportamento. Il lavoro è completato quando una voce enabledPlugins è installata con enabled: true e i relativi skills sono attivi in un successivo avvio interattivo.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- shell
- Ambito
- cli, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Attiva
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 48/100