Skip to content

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

Merged
aaronpowell merged 10 commits into
mainfrom
aaronpowell-extension-install-strategy
Jul 3, 2026
Merged

Migrate extension metadata to plugin.json and enforce conventions#2177
aaronpowell merged 10 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
aaronpowell and others added 2 commits July 2, 2026 10:53
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 2, 2026 04:33
GitHub Advanced Security started work on behalf of aaronpowell July 2, 2026 04:33 View session
GitHub Advanced Security finished work on behalf of aaronpowell July 2, 2026 04:34

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.

Review details

Comments suppressed due to low confidence (1)

eng/validate-plugins.mjs:209

  • validatePlugin() sometimes returns an array (when plugin.json is missing) but callers now destructure it as an object (const { errors, plugin } = validatePlugin(dir)). That makes errors undefined and will crash when accessing errors.length, breaking npm run plugin:validate and CI validation.
  // 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 on lines 36 to 41
# Note: We're still using canvas.schema.json for now to validate the structure,
# but in future we may migrate to using plugin.schema.json.
# For now, plugin.json will be validated against plugin specs separately.
if ! node ./eng/validate-json-schema.mjs --schema .schemas/plugin.schema.json 2>/dev/null || ! [ -f .schemas/plugin.schema.json ]; then
echo "Note: plugin.schema.json not yet in use for extension validation. Using plugin validation only."
fi
GitHub Advanced Security started work on behalf of aaronpowell July 2, 2026 06:09 View session
GitHub Advanced Security finished work on behalf of aaronpowell July 2, 2026 06:09
…-install-strategy

# Conflicts:
#	.github/plugin/marketplace.json
Copilot AI review requested due to automatic review settings July 3, 2026 01:55
GitHub Advanced Security started work on behalf of aaronpowell July 3, 2026 01:56 View session
GitHub Advanced Security finished work on behalf of aaronpowell July 3, 2026 01: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.

Review details

Comments suppressed due to low confidence (1)

eng/validate-plugins.mjs:209

  • validatePlugin now returns an array when plugin.json is missing, but validatePlugins destructures the result as { errors, plugin }. If a plugin folder is missing .github/plugin/plugin.json, this will throw at runtime (errors is undefined) and stop validation entirely. Return a consistent object shape here.
  // 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: 24/24 changed files
  • Comments generated: 3
  • Review effort level: Low

Comment thread .github/workflows/validate-canvas-extensions.yml
Comment thread .github/workflows/validate-canvas-extensions.yml Outdated
Comment thread .github/workflows/validate-canvas-extensions.yml Outdated
Remove the custom extension schema and schema validation helper, and
validate extension plugin.json files through the existing plugin validator
instead. Update workflows to stop depending on the removed schema.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
GitHub Advanced Security started work on behalf of aaronpowell July 3, 2026 02:15 View session
GitHub Advanced Security finished work on behalf of aaronpowell July 3, 2026 02:16
@aaronpowell aaronpowell merged commit e986f49 into main Jul 3, 2026
17 of 18 checks passed
@aaronpowell aaronpowell deleted the aaronpowell-extension-install-strategy branch July 3, 2026 02:24
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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants