Skip to content

Unify Copilot and Claude skills into a single shared plugin#631

Draft
nmetulev wants to merge 1 commit into
mainfrom
nmetulev-unify-copilot-claude-skills
Draft

Unify Copilot and Claude skills into a single shared plugin#631
nmetulev wants to merge 1 commit into
mainfrom
nmetulev-unify-copilot-claude-skills

Conversation

@nmetulev

Copy link
Copy Markdown
Member

Why

We currently maintain two skill trees: the hand-authored GitHub Copilot plugin under .github/plugin/ and a generated byte-identical Claude Code mirror under .claude/ (produced by scripts/sync-claude-plugin.ps1). That's duplicate content to keep in sync for no real benefit.

This PR follows the model already proven in the sibling repo microsoft/win-dev-skills: serve one plugin source to both hosts via per-host manifests and marketplaces. No more mirror, no more sync script.

What changed

Single plugin source — everything lives under plugins/winapp/:

  • Moved the agent + all 8 skills from .github/plugin/plugins/winapp/ (pure git mv, zero content change).
  • Skill directories are named winapp-<name> so both Copilot and Claude load them with no transform step (Claude requires dir == frontmatter name; Copilot tolerates it).

Per-host manifests (convention-based, like win-dev-skills):

  • plugins/winapp/plugin.json — Copilot manifest (agents/, skills: ["skills/"])
  • plugins/winapp/.claude-plugin/plugin.json — Claude manifest (no agents/skills fields; adds homepage/repository)

Per-host marketplaces, both sourcing ./plugins/winapp:

  • .github/plugin/marketplace.json (Copilot)
  • .claude-plugin/marketplace.json (Claude)

Root plugin.json shim kept (load-bearing) — repointed at plugins/winapp/. This keeps copilot plugin install microsoft/WinAppCli and the awesome-copilot listing (plugins/external.json resolves the repo root as a plugin) working with no external coordination and no breakage window.

Removed duplication:

  • Deleted the entire .claude/ mirror
  • Deleted scripts/sync-claude-plugin.ps1

Tooling & docs:

  • generate-llm-docs.ps1 now writes skills to plugins/winapp/skills/winapp-<name>/ and syncs the version field across all 5 manifests (surgical regex replace, preserves hand-authored formatting; guarded so validator temp-dir runs don't mutate committed files).
  • validate-llm-docs.ps1 paths updated.
  • .gitattributes, README.md, llms.txt, AGENTS.md, and internal pr-review dev-skill docs updated.

Install (after merge)

GitHub Copilot CLI — unchanged:

copilot plugin install microsoft/WinAppCli

Claude Code — new:

claude plugin marketplace add microsoft/WinAppCli
claude plugin install winappcli@winappcli

⚠️ Decision to confirm: agent activation

The agent frontmatter keeps its existing infer: true (automatic activation). win-dev-skills instead uses user-invocable: true (explicit-only). I preserved current behavior to avoid a regression; Claude tolerates the unknown infer: key. If we'd rather match win-dev-skills' explicit-invocation model, say so and I'll switch it.

Verification

  • Built the CLI and ran generate-llm-docs.ps1: 8 skills regenerate into plugins/winapp/skills/, manifest versions sync to 0.4.1.
  • validate-llm-docs.ps1 -FailOnDriftpasses (schema + all skills up-to-date, exit 0).
  • All 5 manifest/marketplace JSON files parse; the shipped Copilot skill/agent content is a byte-identical rename (no behavior change for existing users).

Note (untested): the exact Claude install syntax (winappcli@winappcli) and Claude's tolerance of the infer: key are reasoned from win-dev-skills + docs, not runtime-verified here. Worth a quick manual claude plugin install sanity check before/after merge.

Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com

Serve one plugin source (plugins/winapp/) to both GitHub Copilot and
Claude Code via per-host manifests and marketplaces, eliminating the
generated .claude/ mirror and its sync script.

- Move the agent + 8 skills from .github/plugin/ into plugins/winapp/
  (skill dirs renamed to winapp-<name> so both hosts load them with no
  transform step)
- Add per-host plugin manifests: plugins/winapp/plugin.json (Copilot) and
  plugins/winapp/.claude-plugin/plugin.json (Claude)
- Add per-host marketplaces: .github/plugin/marketplace.json (Copilot) and
  .claude-plugin/marketplace.json (Claude), both sourcing ./plugins/winapp
- Keep the repo-root plugin.json as a thin shim so
  "copilot plugin install microsoft/WinAppCli" and the awesome-copilot
  listing keep resolving the repo as a plugin with no external change
- Delete the .claude/ mirror and scripts/sync-claude-plugin.ps1
- Update generate-llm-docs.ps1 to write skills to plugins/winapp/skills/
  and sync the version field across all 5 manifests; update
  validate-llm-docs.ps1 paths
- Update .gitattributes and docs (README, llms.txt, AGENTS.md, internal
  pr-review dev skills)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Build Metrics Report

Binary Sizes

Artifact Baseline Current Delta
CLI (ARM64) 31.90 MB 31.90 MB ✅ 0.0 KB (0.00%)
CLI (x64) 32.22 MB 32.22 MB ✅ 0.0 KB (0.00%)
MSIX (ARM64) 13.39 MB 13.39 MB 📈 +0.1 KB (+0.00%)
MSIX (x64) 14.23 MB 14.23 MB 📈 +0.4 KB (+0.00%)
NPM Package 27.93 MB 27.93 MB 📈 +0.4 KB (+0.00%)
NuGet Package 27.95 MB 27.96 MB 📈 +0.7 KB (+0.00%)

Test Results

1637 passed, 1 skipped out of 1638 tests in 449.3s (+37.3s vs. baseline)

Test Coverage

18.1% line coverage, 37.4% branch coverage · ✅ no change vs. baseline

CLI Startup Time

38ms median (x64, winapp --version) · ✅ -6ms vs. baseline


Updated 2026-07-15 05:00:18 UTC · commit 51f01bc · workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant