Skip to content

Adopt Agent Plugins 1.0 for the winapp plugin - #784

Merged
Nikola Metulev (nmetulev) merged 4 commits into
mainfrom
jay/agent-plugins
Aug 25, 2026
Merged

Nikola Metulev (nmetulev) merged 4 commits into
mainfrom
jay/agent-plugins

Conversation

@Jaylyn-Barbee

@Jaylyn-Barbee Jaylyn Barbee (Jaylyn-Barbee) commented Aug 25, 2026 •

Copy link
Copy Markdown
Contributor

Description

Makes the shipped plugin at plugins/winapp/ conform to the Agent Plugins 1.0 specification, so it can be discovered and loaded consistently across GitHub Copilot (CLI, VS Code, Copilot app), Codex, Cursor, and other compatible clients without client-specific repackaging.

The plugin was already close: plugin.json and skills/ were at the plugin root. The remaining work was manifest conformance and moving the Copilot-specific agent into the com.github.copilot/ namespace.

plugins/winapp/plugin.json — added the canonical $schema and aligned with the spec's closed manifest schema:

Change Reason
+ $schema Required by §5.3; selects Agent Plugins semantics
+ homepage, repository Permitted metadata, previously only in the Claude manifest
− category, tags Not portable fields. Not documented under extensions["com.github.copilot"] either, so they were not relocated. Still carried in .claude-plugin/marketplace.json
− agents, skills Component paths are auto-discovered from fixed locations; §6.1 forbids manifest overrides

Layout — agents/winapp.agent.md moved to com.github.copilot/agents/winapp.agent.md, the namespace Copilot reads client-specific components from:

plugins/winapp/
├── plugin.json                 # portable Agent Plugins 1.0 manifest
├── skills/<skill>/SKILL.md     # portable Agent Skills (unchanged)
├── com.github.copilot/
│   └── agents/winapp.agent.md  # Copilot-specific component
└── .claude-plugin/plugin.json  # Claude Code manifest

Compatibility decisions:

  • Claude Code is not an Agent Plugins client, so .claude-plugin/plugin.json is retained. Rather than duplicating the agent, its optional agents field now points at ./com.github.copilot/agents/winapp.agent.md, keeping a single copy. Claude already discovers skills at plugin-root skills/, so that needed no change.
  • Repo-root plugin.json is deliberately left in the legacy Copilot format (no $schema), with only its agents path updated. It is the shim that keeps copilot plugin install microsoft/WinAppCli and the awesome-copilot listing resolving the repo as a plugin. Adding $schema there would opt it into the closed schema, turning its nested skills/agents paths into unknown fields that clients must ignore — which would break installation. The Agent Plugins migration guide explicitly recommends retaining a legacy manifest where a client still requires one.
  • No mcp.json — the plugin ships no MCP servers, and §6.2 states an absent fixed location is not an error.

Usage Example

Unchanged for users; installation commands are the same:

copilot plugin install microsoft/WinAppCli

Related Issue

Fixes #742

Type of Change

  • 🔧 Config/build
  • 📝 Documentation

Checklist

  • Tested locally on Windows
  • Main README.md updated

Additional Notes

No CLI, npm, or NuGet code was touched — the change is JSON manifests, one file move, and docs.

Verification performed:

  1. Schema validation. Validated plugins/winapp/plugin.json against the published https://agent-plugins.org/schemas/1.0.0/plugin.schema.json with ajv --spec=draft2020 → valid. Ran a negative control (re-adding "agents": "agents/") to confirm the check genuinely enforces additionalProperties: false → correctly rejected.

  2. Live plugin load. Loaded the migrated package with copilot --plugin-dir (copied to a temp dir under a unique name, since the name collides with the already-installed winappcli):

    • All 10 skills auto-discovered without the removed skills declaration: winapp-find-ui, winapp-frameworks, winapp-identity, winapp-manifest, winapp-maui, winapp-package, winapp-setup, winapp-signing, winapp-troubleshoot, winapp-ui-automation
    • The relocated agent resolves from its new path, confirmed by the CLI reporting it as an available agent (winappcli-migrationtest:winapp).
  3. Repo validation. scripts/validate-llm-docs.ps1 passes; the regenerated docs/cli-schema.json is byte-identical.

Docs updated: README.md, AGENTS.md (new plugin-layout section documenting the closed-schema constraint), llms.txt, and .github/skills/pr-review/dimensions/ship-surfaces.md.

Make plugins/winapp/ conform to the Agent Plugins 1.0 specification so the
plugin loads consistently across Copilot CLI, VS Code, the Copilot app, and
other compatible clients without client-specific repackaging.

- plugin.json: add the canonical $schema and align with the closed manifest
  schema. Drop the non-portable top-level fields (category, tags, agents,
  skills); skills/ and mcp.json are auto-discovered from fixed locations.
  Add homepage and repository, which the schema does permit.
- Move agents/winapp.agent.md to com.github.copilot/agents/winapp.agent.md,
  the Copilot extension namespace for client-specific components.
- Point the Claude Code manifest's agents field at the relocated file so the
  agent stays a single copy. Claude is not an Agent Plugins client, so
  .claude-plugin/plugin.json is retained.
- Repo-root plugin.json stays in the legacy Copilot format (no $schema) so
  `copilot plugin install microsoft/WinAppCli` keeps working; only its agents
  path is updated. Adding $schema there would turn its nested skills/agents
  paths into unknown fields that clients must ignore.
- No mcp.json: the plugin ships no MCP servers, and an absent fixed location
  is not an error under the spec.

Verified plugin.json against the published 1.0.0 schema with ajv, and loaded
the package via `copilot --plugin-dir`: all 10 skills are auto-discovered and
the relocated agent resolves.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings August 25, 2026 18:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adopts Agent Plugins 1.0 while preserving GitHub Copilot and Claude Code compatibility.

Changes:

  • Adds the portable, closed-schema manifest.
  • Relocates the Copilot agent and updates host-specific references.
  • Documents the new plugin layout and review guidance.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
README.md Documents Agent Plugins 1.0 support.
plugins/winapp/plugin.json Conforms to the portable manifest schema.
plugins/winapp/com.github.copilot/agents/winapp.agent.md Relocates the Copilot-specific agent.
plugins/winapp/.claude-plugin/plugin.json References the relocated agent for Claude Code.
plugin.json Updates the legacy Copilot agent path.
llms.txt Updates the published agent link.
AGENTS.md Documents layout and schema constraints.
.github/skills/pr-review/dimensions/ship-surfaces.md Updates plugin review guidance.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Nothing prevented a future change from re-adding non-portable fields to
plugins/winapp/plugin.json or moving the agent back out of the Copilot
namespace. validate-llm-docs.ps1 only checked JSON validity and version
equality, so a conformance regression would have passed CI silently.

Add scripts/validate-plugin-package.ps1, which checks:
- the closed manifest schema ($schema, allowed top-level fields, field types,
  author/keywords/extensions shapes) and the plugin name constraints
- skills/ exists and every immediate child has a SKILL.md with name and
  description frontmatter, plus a guard for SKILL.md nested too deep to load
- mcp.json conformance if one is ever added
- the Copilot agent under com.github.copilot/agents/
- the Claude agents pointer resolving to a real file, so a rename cannot break
  Claude users silently while Copilot keeps working
- the repo-root shim staying legacy, since adding $schema there would break
  `copilot plugin install microsoft/WinAppCli`

The rules are encoded rather than fetched: the spec requires clients to
validate without retrieving the schema, and it keeps CI offline-safe.

validate-llm-docs.ps1 invokes it and folds the exit code into its existing
drift handling, so -FailOnDrift keeps blocking PRs and warning on main. The
script needs no build output and can be run standalone.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two gaps in scripts/validate-plugin-package.ps1 let non-conformant
manifests pass, both confirmed against the official schema with ajv:

- A scalar `keywords` string passed the "array of strings" check, because
  piping a scalar through Where-Object yields a single [string] and an
  empty filter result. Now requires [array] first.
- The closed-field-set check used -notcontains, which is case-insensitive
  in PowerShell while JSON keys are not, so `"Name"` was accepted as a
  known field even though the schema requires lowercase `name`. Switched
  this and the three other case-insensitive comparisons (author fields,
  SKILL.md frontmatter keys, mcp.json top-level fields) to their
  case-sensitive -c forms, matching the name-pattern check that already
  used -cnotmatch.

Verified: valid manifest still passes, single-element and multi-element
keywords arrays still pass, and scalar keywords, top-level `Name`, and
`author.Name` now each fail with a specific error.

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

Copy link
Copy Markdown
Contributor

Build Metrics Report

Binary Sizes

Artifact Baseline Current Delta
CLI (ARM64) 38.63 MB 38.63 MB ✅ 0.0 KB (0.00%)
CLI (x64) 38.74 MB 38.74 MB ✅ 0.0 KB (0.00%)
MSIX (ARM64) 16.02 MB 16.02 MB 📈 +0.0 KB (+0.00%)
MSIX (x64) 17.02 MB 17.02 MB 📈 +0.3 KB (+0.00%)
NPM Package 33.43 MB 33.43 MB 📉 -0.2 KB (-0.00%)
NuGet Package 33.47 MB 33.47 MB 📉 -0.2 KB (-0.00%)

Test Results

✅ 4599 passed, 5 skipped out of 4604 tests in 973.3s (+376.7s vs. baseline)

Test Coverage

✅ 89.1% line coverage, 82.4% branch coverage · ✅ no change vs. baseline

CLI Startup Time

36ms median (x64, winapp --version) · 📉 -11ms vs. baseline

Try This Build

Installs the MSIX for your architecture, replacing any previously installed build. Needs the GitHub CLI — the command offers to install it and sign you in if it is missing.

& ([scriptblock]::Create((irm https://raw.githubusercontent.com/microsoft/winappCli/main/scripts/winapp-pr.ps1))) 784
Switching between builds often?

Put the tool on your PATH once:

& ([scriptblock]::Create((irm https://raw.githubusercontent.com/microsoft/winappCli/main/scripts/winapp-pr.ps1))) -AddToPath

Then this build is just:

winapp-pr 784

Run winapp-pr with no arguments to pick from a list of open PRs.


Updated 2026-08-25 20:16:50 UTC · commit 14e0653 · 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.

Adopt Agent Plugins 1.0

3 participants