Skip to content

Migrate extension metadata to plugin.json and enforce conventions#2177

Open
aaronpowell wants to merge 5 commits into
mainfrom
aaronpowell-extension-install-strategy
Open

Migrate extension metadata to plugin.json and enforce conventions#2177
aaronpowell wants to merge 5 commits into
mainfrom
aaronpowell-extension-install-strategy

Conversation

@aaronpowell

Copy link
Copy Markdown
Contributor

Pull Request Checklist

  • I have read and followed the CONTRIBUTING.md guidelines.
  • I have read and followed the Guidance for submissions involving paid services.
  • My contribution adds a new instruction, prompt, agent, skill, workflow, or canvas extension file in the correct directory.
  • The file follows the required naming convention.
  • The content is clearly structured and follows the example format.
  • I have tested my instructions, prompt, agent, skill, workflow, or canvas extension with GitHub Copilot.
  • I have run npm start and verified that README.md is up to date.
  • I am targeting the main branch for this pull request.

Description

This updates the extension install strategy to align with plugin-based extension shipping in copilot-agent-runtime and simplify extension authoring.

Key changes:

  • Migrates extension metadata from canvas.json to .github/plugin/plugin.json for all extensions.
  • Adds plugin-shipped extension declaration ("extensions": ".") so extension loading matches github/copilot-agent-runtime#9929 behavior.
  • Standardizes visuals on a convention-based rule ("logo": "assets/preview.png") and removes x-awesome-copilot screenshot overrides.
  • Updates marketplace generation and website extension install UX to prioritize plugin install commands.
  • Removes unused pluginRoots from .github/plugin/marketplace.json.
  • Updates extension validation workflow and eng/validate-plugins.mjs to enforce the new extension conventions.
  • Updates docs (AGENTS.md, CONTRIBUTING.md) with the new extension metadata and validation requirements.

Type of Contribution

  • New instruction file.
  • New prompt file.
  • New agent file.
  • New plugin.
  • New skill file.
  • New agentic workflow.
  • New canvas extension.
  • Update to existing instruction, prompt, agent, plugin, skill, workflow, or canvas extension.
  • Other (please specify): Extension metadata model and validation/website pipeline updates.

Additional Notes

  • Branch was synced with latest main before finalizing.
  • Validation checks run successfully with updated conventions (npm run plugin:validate).

By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.

aaronpowell and others added 5 commits July 1, 2026 11:43
The pluginRoots property is not used by install tooling and was only
informational about the extension/plugin source directories. Removing it
simplifies the marketplace.json structure while maintaining all functionality.

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

- Create .github/plugin/plugin.json for java-modernization-studio extension
- Remove legacy canvas.json from java-modernization-studio
- Update validate-canvas-extensions.yml workflow to check for plugin.json instead of canvas.json
- Update workflow to trigger on .schemas/plugin.schema.json changes (instead of canvas.schema.json)
- Remove schema validation logic that relied on canvas.schema.json
- All 12 extensions now use plugin.json for metadata

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Per github/copilot-agent-runtime#9929, plugins that ship
extensions need to include an extensions field specifying where the extension code
is located. All 12 extensions now have extensions set to '.' to reference the
current directory where extension.mjs is located.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- Remove x-awesome-copilot.screenshots from all extension plugin.json files
- Enforce logo=assets/preview.png convention for all extensions
- Enforce extensions=. per copilot-agent-runtime#9929
- Update validate-plugins.mjs to enforce conventions
- Update validate-canvas-extensions.yml workflow with convention checks
- Update AGENTS.md and CONTRIBUTING.md documentation

All 12 extensions validated successfully.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 1, 2026 05:56
@github-actions github-actions Bot added canvas-extension PR touches canvas extensions website-update PR touches website content or code workflow PR touches workflow automation labels Jul 1, 2026
GitHub Advanced Security started work on behalf of aaronpowell July 1, 2026 05:56 View session
GitHub Advanced Security finished work on behalf of aaronpowell July 1, 2026 05:56

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

This pull request migrates canvas extension metadata to plugin manifests and updates the validation + website/marketplace pipelines so extensions are installed via copilot plugin install ...@awesome-copilot rather than URL-based installs.

Changes:

  • Updates website extension UI to copy a plugin install command by default (with URL copy as fallback).
  • Standardizes extension plugin manifests (e.g., logo: assets/preview.png, extensions: ".") and publishes extension manifests into .github/plugin/marketplace.json.
  • Extends build/validation scripts to treat extensions as plugin sources, enforce new extension conventions, and materialize curated plugin extension references.
Show a summary per file
File Description
website/src/scripts/pages/extensions.ts Updates extension details modal + click handlers to copy install command and/or install URL.
website/src/scripts/pages/extensions-render.ts Renders “Copy Install” and “Copy URL” buttons with data-install-command support.
website/src/pages/extensions.astro Updates install instructions to prefer plugin install commands.
extensions/where-was-i/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/site-studio/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/release-notes-showcase/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/java-modernization-studio/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/gesture-review/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/feedback-themes/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/diagram-viewer/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/color-orb/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/chromium-control-canvas/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/backlog-swipe-triage/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/arcade-canvas/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
extensions/accessibility-kanban/.github/plugin/plugin.json Migrates extension metadata to plugin conventions (logo, extensions, slugged name).
eng/validate-plugins.mjs Adds extension manifest validation and curated plugin extension reference validation.
eng/materialize-plugins.mjs Adds support for copying extension sources into materialized plugins via x-awesome-copilot.extensions.
eng/generate-website-data.mjs Generates extension install commands and reads extension metadata from .github/plugin/plugin.json.
eng/generate-marketplace.mjs Generates marketplace entries from both plugins/ and extensions/ (as plugin sources).
CONTRIBUTING.md Documents new extension metadata requirements and validation expectations.
AGENTS.md Documents extension metadata conventions and contribution steps.
.github/workflows/validate-canvas-extensions.yml Updates extension validation workflow to require .github/plugin/plugin.json and enforce new conventions.
.github/plugin/marketplace.json Updates generated marketplace output to include extension plugin sources and updated local plugin source paths.

Review details

Comments suppressed due to low confidence (1)

eng/validate-plugins.mjs:209

  • validatePlugin now sometimes returns an array (early return when plugin.json is missing), but callers always destructure an object (const { errors, plugin } = validatePlugin(dir)). This will make errors undefined and then throw when accessing errors.length, breaking validation instead of reporting a clean error list.
  // Rule 1: Must have .github/plugin/plugin.json
  const pluginJsonPath = path.join(pluginDir, ".github/plugin", "plugin.json");
  if (!fs.existsSync(pluginJsonPath)) {
    errors.push("missing required file: .github/plugin/plugin.json");
    return errors;
  }
  • Files reviewed: 23/23 changed files
  • Comments generated: 1
  • Review effort level: Low
Comment thread AGENTS.md
Comment on lines +179 to +183
1. Create/update the extension in `extensions/<extension-id>/` with `extension.mjs`
2. Add `.github/plugin/plugin.json` metadata (name/description/version and optional logo/keywords/author)
3. Add screenshots to `assets/` using convention-based names, or use `x-awesome-copilot.screenshots` for explicit overrides
4. Run `npm run plugin:validate` to validate plugin and extension metadata
5. Run `npm run build` to regenerate website data and marketplace output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

canvas-extension PR touches canvas extensions website-update PR touches website content or code workflow PR touches workflow automation

2 participants