Moves create-plugin, marketplace-architect, write-skill, and write-eval from canonical .agents/skills/ into plugins/kyberforge/skills/, along with all bundled sub-files, evals, and the plugin-marketplace-architecture research doc. Bundles templates/plugin/ into create-plugin/assets/plugin-template/ so the skill is self-contained after install-time caching. Removes templates/plugin/ and docs/research/plugin-marketplace-architecture.md from the repo root as they are now exclusively in the plugin. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.9 KiB
GitHub Copilot CLI Plugin Reference
Verified against docs.github.com as of June 2026.
Directory structure
plugin-root/
├── plugin.json # at plugin root (NOT in .claude-plugin/)
├── skills/ # skill directories: <name>/SKILL.md (same as Claude Code)
├── agents/ # agent files: <name>.agent.md (differs from Claude Code)
├── hooks.json # at plugin root (differs from Claude Code: hooks/hooks.json)
└── .mcp.json # at plugin root (same as Claude Code)
plugin.json schema (Copilot)
{
"name": "my-plugin",
"description": "What it does",
"version": "1.0.0",
"author": { "name": "Name", "email": "you@example.com" },
"license": "MIT",
"keywords": [],
"agents": "agents/",
"skills": ["skills/"],
"hooks": "hooks.json",
"mcpServers": ".mcp.json"
}
Key difference from Claude Code: Copilot expects component path declarations inside
plugin.json ("skills": "skills/", "agents": "agents/", etc.). Claude Code instead
defaults to standard dirs and takes path overrides only via the marketplace entry.
This means the same plugin.json may need these fields for Copilot but not for Claude.
marketplace.json schema (Copilot)
{
"name": "my-ai-marketplace",
"owner": { "name": "Your Name", "email": "you@example.com" },
"metadata": { "description": "Agents, skills and workflows", "version": "1.0.0" },
"plugins": [
{
"name": "startup-cto",
"source": "./plugins/startup-cto",
"description": "...",
"version": "1.0.0"
}
]
}
Copilot's primary marketplace manifest path is .github/plugin/marketplace.json.
It also reads .claude-plugin/marketplace.json as a fallback.
Relative source paths: ./x and x are both valid (Claude requires ./).
Agent file format
Copilot agents use .agent.md extension with frontmatter:
---
name: my-agent
description: What this agent does
tools:
- read_file
- run_command
---
Agent instructions here.
Claude Code agents use .md extension without the .agent.md suffix.
If shipping agents for both tools, create both files:
agents/my-agent.md— Claude Codeagents/my-agent.agent.md— Copilot CLI
CLI commands
# Install plugin locally (development)
copilot plugin install ./my-plugin
# List installed plugins
copilot plugin list
# In interactive mode
/plugin list
/skills list
/agent
# Reload after changes
/reload-plugins
# Uninstall (uses bare plugin name, not @marketplace form)
copilot plugin uninstall <name>
# Marketplace
copilot plugin marketplace add owner/repo
⚠️ UNVERIFIED: Copilot marketplace install command. The
update/uninstallcommands take a bare<name>. Whether install from a marketplace uses<name>@<marketplace>(Claude Code's form) or a bare<name>is not confirmed in docs. Runcopilot plugin install --helpbefore documenting the install command anywhere.
Validation
Copilot has no documented plugin validate command. For Copilot-side validation, run manual checks:
- Valid JSON in
plugin.jsonandmarketplace.json - Required fields:
name,description - Unique plugin names across marketplace
- Kebab-case plugin names
- All
sourcepaths resolve to existing directories .agent.mdfiles have valid YAML frontmatter withname,description,tools
Key differences from Claude Code (summary)
| What | Claude Code | Copilot CLI |
|---|---|---|
| Plugin manifest location | .claude-plugin/plugin.json |
plugin.json at plugin root |
| Agent files | agents/<name>.md |
agents/<name>.agent.md |
| Hooks file | hooks/hooks.json |
hooks.json at plugin root |
| Component paths | Declared in marketplace entry | Declared in plugin.json |
| Validate command | claude plugin validate |
None — manual checks only |
Relative source ./ |
Required | Optional (x also valid) |