Repository navigation
Plugin skill silently dropped from /skills list despite "Installed N skills" confirming load #3546
Description
Describe the bug
Installing my plugin shinyay/tokopt-skills (9 skills + 2 agents) reports Installed 9 skills, and copilot plugin list confirms registration, but /skills list consistently shows only 8 of the 9 skills. The missing skill is exactly the same one every time: slim-apply. The other 8 (antipattern-scan, heavy-tail, hygiene-coach, prompt-anatomy, prompt-optimizer, slim-rewind, slim-suggest, token-audit) appear correctly.
Verified:
- ✅ On disk:
~/.copilot/installed-plugins/_direct/shinyay--tokopt-skills/skills/slim-apply/SKILL.mdexists, well-formed (3452 B, ASCII frontmatter, no BOM) - ✅ Install log says
Installed 9 skills→ loader sees it - ❌
/skills listshows 8/9 → display/filter layer drops one - ❌ Cwd-shadowing ruled out — same result from
/tmp(outside repo) and from inside the repo - ❌ Description length ruled out — slim-apply is 346 chars, well within range of visible skills (233–357 chars)
- ❌ Frontmatter formatting ruled out — identical structure (just
name:+description:) to the 8 visible skills
Repro repo: https://github.com/shinyay/tokopt-skills (public, v0.1.0)
Affected version
GitHub Copilot CLI 1.0.55-6.
Steps to reproduce the behavior
copilot plugin install shinyay/tokopt-skills
# → "Plugin "tokopt-skills" installed successfully. Installed 9 skills."
copilot plugin list | grep tokopt
# → " • tokopt-skills (v0.1.0)"
ls ~/.copilot/installed-plugins/_direct/shinyay--tokopt-skills/skills/
# → 9 entries including slim-apply/Then in an interactive copilot session:
/skills list
Count entries in the plugin: section that belong to tokopt-skills. Result: 8 entries, slim-apply missing.
Expected behavior
/skills list should show all 9 skills from the plugin, including slim-apply, matching the loader's Installed 9 skills count.
Additional context
Workarounds attempted (none worked):
- Uninstall + reinstall — same 8/9
- Edited SKILL.md to rename
## DO NOT→## GuardrailsandDestructive.→Note:(in case a safety-keyword filter was matching) — still 8/9 - Cleared a stale duplicate directory
_direct/tokopt-skills/left over from an earlier local-path install — caused all 9 to disappear; re-established via symlink to recover the 8/9 state (separate-but-related quirk: the loader appears to resolve plugin dir by plugin-manifestname, not by<org>--<repo>directory name)
Description content of slim-apply (in case the filter is keyword-based):
Apply tokopt slim's compression IN-PLACE after the user has reviewed a slim-suggest preview AND explicitly approved. Writes compressed output back to disk with full safety: requires clean git tree, refuses symlinks, detects races. Use ONLY when the prior turn ran slim-suggest for the SAME single file. Never for first-pass analysis.
It is the only skill in the plugin whose description references another skill by name (slim-suggest, twice). Could /skills list be deduplicating or filtering based on cross-references in descriptions?
Environment:
- OS: Linux (WSL2, kernel 6.6.114.1-microsoft-standard)
- Arch: x86_64
- Node: v22.22.0
- Shell: bash
- Terminal: VS Code Insiders integrated terminal
Related quirk (separate finding from the same investigation):
When a plugin is installed from a GitHub repo shorthand (e.g., copilot plugin install shinyay/tokopt-skills), the plugin is unpacked to ~/.copilot/installed-plugins/_direct/shinyay--tokopt-skills/, but /skills list only sees the skills if a _direct/<plugin-manifest-name>/ directory (without the <org>-- prefix) is also present. Removing the orphan unprefixed directory leaves only the prefixed one, and the loader then loads 0 skills from the plugin, even though copilot plugin list still reports it as installed. A symlink _direct/tokopt-skills -> shinyay--tokopt-skills restores the loader. This suggests the plugin-name → directory resolution may not be handling the gh-shorthand naming convention consistently.
Activity
docs(README): document known Copilot CLI loader limitations
shinyay commentedon May 31, 2026
Follow-up on CLI 1.0.57-2 (re-tested 2026-05-31)
Re-tested on a fresh CLI build (
GitHub Copilot CLI 1.0.57-2) using the sameshinyay/tokopt-skillsv0.1.0 plugin. Half the symptoms are fixed, half persist. Sharing data to help triage.Re-test matrix
copilot plugin install shinyay/tokopt-skills_direct/shinyay--tokopt-skills/_direct/<bare-name>symlink_direct/tokopt-skills -> shinyay--tokopt-skillssymlinkslim-apply(always the same one)slim-apply(always the same one)So:
copilot -p '…list skills…'query — 8 of 9 still loaded. Looking at the loader code path (installFromRepo→getDirectSourceId→ storescache_path: '…/_direct/<owner>--<repo>'→getInstalledPluginSkillDirsreadso.cache_pathfirst), the resolution is nowcache_path-based and works correctly.slim-applybeing silently dropped from/skills listdespiteInstalled 9 skillsconfirming load — still reproduces in 1.0.57-2, identically. All 8 non-slim-applyskills appear;slim-applydoes not. Re-confirmed~/.copilot/installed-plugins/_direct/shinyay--tokopt-skills/skills/slim-apply/SKILL.mdis present, well-formed, frontmatter intact.Repro on 1.0.57-2
Adjacent concern: namespace collision in
/skills listWhile re-verifying, a related design gap surfaced. The loader now keeps
_direct/<owner>--<repo>/as the install dir (good — namespace-safe at the filesystem level), but/skills listdisplays skills by bare name (prompt-optimizer), with no<plugin>:or<owner>/<repo>:prefix. Agents already render as<plugin-name>:<agent-name>(e.g.,tokopt-skills:prompt-optimizer); skills do not. So if two plugins each ship a skill namedprompt-optimizer, users would see two identical rows with no way to disambiguate which one is being invoked.Suggested follow-on (separate issue if preferred):
<plugin-name>:in/skills list, matching the agent convention, orSuggested next steps
SKILL.mddescription text —slim-applyis the only one in the plugin whose description references another skill by name (slim-suggest, twice), uses strongly directive language (IN-PLACE,ONLY,Never), and has destructive-operation framing. Happy to construct a reduced test corpus.Environment for re-test: Linux (WSL2), Node v22.22.0, GitHub Copilot CLI 1.0.57-2.
patniko commentedon Oct 26, 2026
Thanks for the thorough investigation and follow-up. The plugin directory-resolution problem was fixed in v1.0.57 (as your re-test confirmed), and the missing
slim-applyskill turned out to be a YAML parse error in its frontmatter (the unquoted:in the description), which you've since fixed in the plugin; to keep failures like this from being silent,copilot skill listhas surfaced skill loading errors and warnings since Copilot CLI v1.0.69. On naming, skills that collide across plugins are listed as<plugin>:<skill>, and #5249 covers resolving the qualified form for uniquely named plugin skills. If a valid skill still goes missing on the latest version, feel free to reopen.Triaged as part of a Copilot SDK backlog review, with help from GitHub Copilot.