github / github/copilot-cli

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

オープン
#4,837 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

triage
主要言語
Shell
スター
11.2k
フォーク
1.9k
平均マージ
14時間 16分
マージ済み PR(30日)
6

説明

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:

  1. Device/MDM%ProgramFiles%\GitHubCopilot\managed-settings.json (source=mdm)
  2. Repository/folder-level.github/copilot/settings.json in 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 version1.0.83).

Steps to reproduce the behavior
  1. Create %ProgramFiles%\GitHubCopilot\managed-settings.json, owned by BUILTIN\Administrators:

    {
      "extraKnownMarketplaces": {
        "example-marketplace": {
          "source": { "source": "github", "repo": "org-name/marketplace-repo" },
          "autoUpdate": true
        }
      },
      "enabledPlugins": {
        "example-plugin@example-marketplace": true
      }
    }
    

    org-name/marketplace-repo is a private repository the signed-in user has access to. example-plugin is not installed and does not appear in ~/.copilot/settings.json.

  2. Start an interactive session from a folder listed in trustedFolders in ~/.copilot/config.json (auto-install does not fire in -p mode, cf. #4507):

    copilot --log-level debug --log-dir <dir>
    
  3. 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, ...
    
  4. Exit the session, then inspect the install directory and ~/.copilot/config.json.

  5. 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 list and is not active in-session.
  • A second interactive start leaves enabled: false unchanged.
  • Plugins that appear in the user's own settings.json show "enabled": true in the same config.json, so only the policy-driven entry is affected.
  • copilot plugins update --all reports Processed 8 installed plugins and does not consider the policy-named plugin.
Additional context
  • The same policy file's model key 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 enabled flag in config.json has 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.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、managed-settings.json と .github/copilot/settings.json を使ってポリシーフローを再現し、次にインタラクティブな起動パスと、その結果生成される ~/.copilot/config.json を調査します。ポリシーによって設定されたエントリとユーザー設定のエントリを比較し、copilot plugins list と copilot plugins update --all を使って動作を検証します。完了条件は、enabled: true を持つ enabledPlugins エントリがインストールされ、その skills が後続のインタラクティブな起動で有効になっていることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
shell
領域
cli, tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
48/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。