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
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Shell
- Star
- 11.2k
- Fork
- 1.9k
- Merge trung bình
- 14 giờ 16 phút
- Pull request đã merge (30 ngày)
- 6
Mô tả
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.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện luồng policy với managed-settings.json và .github/copilot/settings.json, sau đó kiểm tra đường dẫn khởi động tương tác và ~/.copilot/config.json được tạo ra. So sánh các mục do policy điều khiển với các mục trong cài đặt người dùng, đồng thời sử dụng copilot plugins list và copilot plugins update --all để xác minh hành vi. Được xem là hoàn tất khi một mục enabledPlugins được cài đặt với enabled: true và các skills của mục đó hoạt động trong lần khởi động tương tác tiếp theo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- shell
- Lĩnh vực
- cli, tooling
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Sôi nổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100