Skip to content

feat: integrate azd extensions into awesome-azd gallery#749

Merged
jongio merged 16 commits intoAzure:mainfrom
jongio:addextensions
Feb 26, 2026
Merged

feat: integrate azd extensions into awesome-azd gallery#749
jongio merged 16 commits intoAzure:mainfrom
jongio:addextensions

Conversation

@jongio
Copy link
Copy Markdown
Member

@jongio jongio commented Feb 25, 2026

Summary

Integrates azd extensions into the awesome-azd gallery as a first-class content type alongside templates. Closes #748.

Screenshots

Templates Gallery (default view with toggle)

Templates Gallery

Extensions Gallery

Extensions Gallery

Contextual Sidebar Filters (Extensions View)

Contextual Filters

Extensions Documentation

Extensions Docs

Updated Contribute Page

Contribute Page

Extension Submission Flow

flowchart TD
    A[Developer builds azd extension] --> B[Creates registry.json<br/>via azd x publish]
    B --> C{Choose submission method}
    
    C -->|GitHub Issue| D[Opens 'Submit an azd Extension' issue]
    C -->|Manual Trigger| E[Runs workflow_dispatch<br/>from Actions tab]
    
    D --> F[Fills form:<br/>Registry URL, Source Repo,<br/>Author, Website]
    F --> G[Issue created with<br/>extension-submission label]
    G --> H[GitHub Actions workflow triggers]
    
    E --> H
    
    H --> I[Checkout repo + Setup Node.js]
    I --> J[Parse submission fields]
    J --> K[validate-extension.js<br/>fetches registry.json]
    
    K --> L{Validation passes?}
    
    L -->|No| M[❌ Comment on issue<br/>with error details]
    M --> N[Developer fixes and<br/>resubmits]
    N --> D
    
    L -->|Yes| O[Extract extension metadata:<br/>id, displayName, description,<br/>capabilities, version, platforms]
    O --> P[Update extensions.json<br/>add/update entries]
    P --> Q[peter-evans/create-pull-request<br/>creates PR automatically]
    Q --> R[✅ Comment on issue:<br/>PR created successfully]
    
    R --> S[Maintainer reviews PR]
    S --> T{Approved?}
    T -->|Yes| U[PR merged → Extension<br/>appears in gallery]
    T -->|No| V[Request changes]
    V --> S
    
    style A fill:#e1f5fe
    style U fill:#c8e6c9
    style M fill:#ffcdd2
    style H fill:#fff3e0
    style Q fill:#fff3e0
Loading

What's Changed

Gallery UI

  • Templates | Extensions toggle to switch between content types
  • Extension cards with capability badges (Commands, Lifecycle, MCP, etc.), version display, website/source links, and one-click install command copy
  • Filtering by extension capabilities via left sidebar
  • Search across extension name, description, author, namespace, id, and website
  • Dynamic hero Γò¼├┤Γö£├ºΓö£Γòó title, description, and search placeholder adapt to content type
  • Contextual CTA Γò¼├┤Γö£├ºΓö£Γòó "Built an extension? Submit it here Γò¼├┤Γö£├æΓö£├Ñ" when viewing extensions
  • Pagination works across both content types

Data Layer

  • website/static/extensions.json Γò¼├┤Γö£├ºΓö£Γòó Seed data for 5 extensions
  • website/src/data/extensionTypes.ts Γò¼├┤Γö£├ºΓö£Γòó TypeScript types
  • website/src/data/extensions.ts Γò¼├┤Γö£├ºΓö£Γòó Data loader with sorting
  • website/src/data/tags.tsx Γò¼├┤Γö£├ºΓö£Γòó 6 new extension capability tags

Automated Submission Pipeline

  • .github/ISSUE_TEMPLATE/extension-submission.yml Γò¼├┤Γö£├ºΓö£Γòó Issue form for submissions
  • .github/workflows/extension-submission.yml Γò¼├┤Γö£├ºΓö£Γòó Validates registry.json, updates extensions.json, creates PR automatically
  • website/scripts/validate-extension.js Γò¼├┤Γö£├ºΓö£Γòó Registry validation (structure, capabilities, semver, platforms)
  • Supports both issue-triggered and workflow_dispatch triggers

Documentation

  • website/docs/extensions.md Γò¼├┤Γö£├ºΓö£Γòó Extensions overview and submission guide
  • website/docs/contribute.md Γò¼├┤Γö£├ºΓö£Γòó Added "Submit an azd Extension" section

Security

  • Workflow uses process.env for all user-controlled inputs (prevents script injection)
  • React hooks called unconditionally (Rules of Hooks compliance)
  • Proper semver comparison (stable versions beat pre-release)
  • Accessibility: aria-labels on interactive elements

Testing

  • All 15 tests pass (12 existing + 3 new extension tests)
  • Build succeeds
  • Validation script tested against real registries (azd-app, azd-copilot)

Seed Extensions

Extension Capabilities
jongio.azd.app Commands, Lifecycle, Metadata
jongio.azd.copilot Commands, Lifecycle, MCP, Metadata
jongio.azd.exec Commands, Lifecycle
jongio.azd.rest Commands, Lifecycle, MCP, Metadata
microsoft.azd.demo Commands, Lifecycle, MCP, Service Target, Framework

Add first-class support for azd extensions with:
- Templates | Extensions toggle on gallery page
- Extension cards with capability badges, version, install copy
- Filtering by extension capabilities
- Search across extension fields
- Dynamic hero (title, description, placeholder)
- Automated submission pipeline (issue template + workflow)
- Validation script for registry.json
- Extensions documentation and contributor guide update
- 5 seed extensions (app, copilot, exec, rest, demo)

Closes Azure#748

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 integrates azd extensions into the awesome-azd gallery as a first-class content type alongside templates. The PR adds a comprehensive extension discovery and submission system that parallels the existing template infrastructure.

Changes:

  • Adds a toggle UI to switch between Templates and Extensions views in the gallery with dynamic hero text, search placeholders, and contextual CTAs
  • Implements extension data layer with JSON seed data for 5 extensions, TypeScript types, data loaders, and 6 new capability tags for filtering
  • Creates an automated submission pipeline with GitHub issue template, validation workflow, and registry.json validator that automatically creates PRs for new extensions

Reviewed changes

Copilot reviewed 16 out of 22 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
website/static/extensions.json Seed data for 5 initial extensions (4 community, 1 Microsoft)
website/src/data/extensionTypes.ts TypeScript type definitions for Extension, ExtensionCapability, and ExtensionPlatform
website/src/data/extensions.ts Data loader with sorting logic mirroring the template pattern
website/src/data/tags.tsx Added 6 extension capability tag types (ext-custom-commands, ext-lifecycle-events, etc.)
website/src/pages/ShowcaseCardPage.tsx Content type toggle, extension filtering, pagination support for both content types
website/src/pages/ShowcaseExtensionCards.tsx Container component for rendering extension card grid
website/src/components/gallery/ShowcaseExtensionCard/index.tsx Extension card component with capability badges, version info, install command copy
website/src/components/gallery/ShowcaseExtensionCard/styles.module.css Styling for extension cards with light/dark theme support
website/src/components/gallery/ShowcaseTemplateSearch/index.tsx Dynamic title, description, and placeholder based on content type
website/src/components/gallery/ShowcaseLeftFilters/index.tsx Added Extension Capabilities filter section
.github/workflows/extension-submission.yml Automated workflow to validate registries and create PRs from issue submissions
.github/ISSUE_TEMPLATE/extension-submission.yml GitHub issue form for extension submissions
website/scripts/validate-extension.js Node.js script to validate registry.json structure, capabilities, semver, and platforms
website/docs/extensions.md New documentation page about azd extensions with installation and submission guides
website/docs/contribute.md Added "Submit an azd Extension" section with submission workflow
website/test/tags_match.test.ts Added 3 test cases for extension validation (tags exist, unique IDs, required fields)

Comment thread .github/workflows/extension-submission.yml Outdated
Comment thread website/src/pages/ShowcaseCardPage.tsx
Comment thread website/scripts/validate-extension.js Outdated
Comment thread website/static/extensions.json Outdated
Comment thread website/static/extensions.json Outdated
Comment thread website/static/extensions.json Outdated
Comment thread website/static/extensions.json Outdated
Comment thread .github/workflows/extension-submission.yml Outdated
jongio and others added 2 commits February 25, 2026 11:34
- Add rel=noopener noreferrer to all target=_blank links in extension card
- Fix star icon to be decorative (alt='', aria-hidden)
- Add width attributes to images to prevent CLS
- Add aria-live=polite to copy confirmation popover
- Add focus-visible style for copy button keyboard navigation
- Add dark mode support for 'New' badge green color
- Remove dead toggleTag function (hooks violation)
- Remove unused useCallback import
- Fix operator precedence in filter condition
- Replace div.clearAll with semantic button element
- Add button reset styles (background:none, border:none)
- Fix implicit any types on location and clearAll props
- Use proper ellipsis character (…) instead of three dots
- Remove redundant placeholder on install command input

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add step id 'update' to Update extensions.json step and fix output refs (thread Azure#1)
- Add aria-labels to Templates/Extensions toggle buttons (thread Azure#2)
- Tighten SEMVER_REGEX to reject trailing dashes in pre-release (thread Azure#3)
- Add missing 'community' tag to 4 community extensions (threads Azure#4-7)
- Use heredoc syntax for multi-line GITHUB_OUTPUT (thread Azure#8)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@wbreza wbreza left a comment

Choose a reason for hiding this comment

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

This is solid but I do have some questions on the validations and whether we can build those directly into the x extension or somewhere else.

We also likely have a little more work to do before accepting 3rd party contributions.

  • CELA review
  • Security review
  • Indepth code scanning

Comment thread website/scripts/validate-extension.js
Copy link
Copy Markdown
Contributor

@hemarina hemarina left a comment

Choose a reason for hiding this comment

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

Thank you very much for adding the extension to the gallery. This is awesome! I'm looking forward to seeing it go live.

Comment thread website/src/components/gallery/ShowcaseLeftFilters/index.tsx Outdated
Comment thread screenshots/01-templates-gallery.png Outdated
Comment thread website/static/extensions.json
jongio and others added 4 commits February 25, 2026 14:46
- Filter sidebar now shows only relevant filters per content type:
  Templates view: Language, Framework, Services, Database, IaC, Tools, Topic, Authors
  Extensions view: New/Community/MSFT checkboxes + Extension Capabilities
- Removed screenshots/ folder (only needed for PR description)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds sync-extension-versions.js script and a scheduled GitHub Action
that runs daily at 6 AM UTC. Fetches each extension's registry.json,
compares versions, and auto-creates a PR if any changed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Also picks up microsoft.azd.demo version bump 0.4.0 → 0.5.0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
jongio added a commit to jongio/awesome-azd that referenced this pull request Feb 25, 2026
@jongio jongio added the documentation Improvements or additions to documentation label Feb 25, 2026
jongio added a commit to jongio/awesome-azd that referenced this pull request Feb 25, 2026
jongio added a commit to jongio/awesome-azd that referenced this pull request Feb 25, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 20 out of 21 changed files in this pull request and generated 10 comments.

Comment thread website/scripts/validate-extension.js
Comment thread website/scripts/validate-extension.js Outdated
Comment thread website/scripts/validate-extension.js Outdated
Comment thread website/scripts/sync-extension-versions.js Outdated
Comment thread website/scripts/sync-extension-versions.js Outdated
Comment thread website/src/components/gallery/ShowcaseTemplateSearch/index.tsx Outdated
Comment thread test-results/.last-run.json Outdated
Comment thread .github/workflows/extension-submission.yml
Comment thread .github/workflows/extension-submission.yml Outdated
Comment thread website/src/components/gallery/ShowcaseExtensionCard/index.tsx Outdated
jongio added a commit to jongio/awesome-azd that referenced this pull request Feb 25, 2026
Copy link
Copy Markdown
Contributor

@hemarina hemarina left a comment

Choose a reason for hiding this comment

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

Could we also add author filter in extension's filter?

jongio and others added 3 commits February 25, 2026 15:26
- Add concurrency limit (5) for registry fetches in sync script
- Use Record<string, string> for type-safe content-type indexing
- Remove test-results from tracking, add .gitignore
- Add URL validation (http/https only) for user-submitted URLs
- Bump peter-evans/create-pull-request from v6 to v7
- Use JSON.stringify for analytics content (prevents quote injection)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Extract getLatestVersion to shared semver-utils.js module
- Add pre-release lexicographic comparison for same numeric base
- Guard ext.versions iteration with Array.isArray check
- Validate data.extensions is array before iterating

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jongio jongio requested review from Copilot and hemarina February 25, 2026 23:33
- Add author filtering to filterExtensions() function
- Show Authors sidebar section for both templates and extensions
- Compute extension authors dynamically from extensions data
- Author filter clears properly when switching content types

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Member Author

@jongio jongio left a comment

Choose a reason for hiding this comment

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

Added! The Authors filter now appears in the extensions sidebar too, populated with extension authors. It also supports filtering — selecting an author filters extension cards to only show that author's extensions. Pushed in 808db66.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 20 out of 23 changed files in this pull request and generated 3 comments.

Comment thread website/src/pages/ShowcaseCardPage.tsx Outdated
Comment thread website/scripts/validate-extension.js Outdated
Comment thread website/src/pages/ShowcaseCardPage.tsx Outdated
- Use explicit Location type import from history package
- Remove stale getLatestVersion from validate-extension.js exports
- Fix extension author filter: pass selectedAuthors (string[]) not selectedUsers (User[])

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jongio jongio requested a review from Copilot February 25, 2026 23:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 20 out of 23 changed files in this pull request and generated no new comments.

jongio and others added 2 commits February 25, 2026 15:56
- Fix CRITICAL: isExtensions used before declaration in ShowcaseLeftFilters (TDZ crash)
- Fix HIGH: Add SSRF protection with URL protocol validation in validate-extension.js
- Fix MEDIUM: Add 30s fetch timeouts via AbortController in both scripts
- Fix MEDIUM: Handle first version entry without .version in getLatestVersion
- Add URL protocol validation to sync-extension-versions.js
- Add role=group with aria-label to content type toggle
- Remove stray tracked files (02-extensions-gallery.png, node_modules/.package-lock.json)
- Add *.png to .gitignore

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add role=button, tabIndex, onKeyDown to filter Badge chips for keyboard accessibility
- Add aria-label to filter removal badges for screen readers
- Add missing width attribute to copy icon img (prevent CLS)
- Remove redundant role=button from Fluent UI Button component

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Both jongio.azd.exec and jongio.azd.rest have live GitHub Pages sites
but were missing the website field in extensions.json.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jongio jongio enabled auto-merge (squash) February 26, 2026 01:24
Copy link
Copy Markdown
Contributor

@hemarina hemarina left a comment

Choose a reason for hiding this comment

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

LGTM

@jongio jongio merged commit d8e2fcf into Azure:main Feb 26, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Integrate azd extensions into awesome-azd gallery

5 participants