You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Duplicate skills load from repository and installed plugin #4430
Copilot CLI loads the same skill twice when a repository contains a project skill and an enabled user plugin contributes the identical skill. This doubles the skill description surface in repositories that develop their own plugin.
Observed with Copilot CLI 1.0.79-9 in rjmurillo/ai-agents, where .claude/skills is the canonical source for the installed project-toolkit plugin.
Reproduction
cd<repo-that-contains-the-plugin-source>
copilot plugins list --json | jq -r '\n[.plugins[] | select(.kind=="skill") | {name,scope,source,description:(.description // "")}]\n| group_by(.name)[]\n| select((map(.scope)|index("repository")) and (map(.scope)|index("plugin")))\n| [. [0].name, (length|tostring), ([.[].scope+":"+.[].source]|join(","))]\n| @tsv'\n```\n\nMeasured result:\n\n```text\nduplicate_names=97\nidentical_descriptions=97\nduplicate_description_bytes=40624\n```\n\nExample name:\n\n```text\ncontext-optimizer plugin plugin\ncontext-optimizer repository project\n```\n\nThe installed plugin is enabled at user scope. No repository-scoped setting was found to disable that one plugin only in its source repository.\n\n## Expected\n\nWhen a repository skill and plugin skill have the same canonical name and identical content, load one entry. Project scope could take precedence, or the CLI could deduplicate by name plus content hash. A repository-scoped plugin-disable override would also provide a workaround.\n\n## Control\n\nThis is specific to skills. A canary placed in `plugin/instructions/*.instructions.md` did not load through `--plugin-dir`, while a repository `.github/instructions` canary did load.\n
The same repository without the override produced the same output. So the repository override does not disable the already user-enabled plugin in this version, despite the documented same-key precedence. This leaves no working repository-scoped escape for source repositories that also install their own plugin.
Adding a data point: this also happens with instructions and agents, at least in VS Code's Copilot harness (runtime 1.0.103-unstable on macOS). I work in the repo that builds the hve-core plugin and also have the plugin installed. Most instruction files show up twice in the instruction list, once from the repo and once from the plugin's copy under agentPlugins. Most agents show up twice too (Code Review Accessibility and hve-core:code-review-accessibility), and that's before VS Code's own forwarded vscode-agent-<sha1> copies, which I filed separately (microsoft/vscode#345479).
As an example, one session's instruction table had 106 rows, 56 from the repo and 50 from the plugin, about 40,700 characters. The three instruction files without applyTo were inlined twice each.
Activity
rjmurillo commentedon Aug 11, 2026
Repository override also fails to suppress the duplicate
The official repository-settings reference documents:
I tested the documented workaround in a committed temporary repository:
{ "enabledPlugins": { "project-toolkit@ai-agents": false } }User settings contain the same key with
true. On Copilot CLI 1.0.79-9,copilot plugins list --jsonstill reported:The same repository without the override produced the same output. So the repository override does not disable the already user-enabled plugin in this version, despite the documented same-key precedence. This leaves no working repository-scoped escape for source repositories that also install their own plugin.
docs: record how each Copilot surface handles a skill in two loader f…
docs: record how each Copilot surface handles a skill in two loader f…
feat: one CLI-neutral source for every agent and skill, generated for…
agreaves-ms commentedon Nov 2, 2026
Adding a data point: this also happens with instructions and agents, at least in VS Code's Copilot harness (runtime 1.0.103-unstable on macOS). I work in the repo that builds the hve-core plugin and also have the plugin installed. Most instruction files show up twice in the instruction list, once from the repo and once from the plugin's copy under
agentPlugins. Most agents show up twice too (Code Review Accessibilityandhve-core:code-review-accessibility), and that's before VS Code's own forwardedvscode-agent-<sha1>copies, which I filed separately (microsoft/vscode#345479).As an example, one session's instruction table had 106 rows, 56 from the repo and 50 from the plugin, about 40,700 characters. The three instruction files without
applyTowere inlined twice each.feat(agents): migrate HVE Core to the Copilot agent harness (microsof…