Repository navigation
Conversation
<!-- canvas-release:containers-7b8c7ff-95ffca6b:5bb2ced47f20a620433b8db7b2c1fc8ad97ac704f57f517c2664d184a4042a01 --> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
🔒 PR Risk Scan ResultsScanned 15 changed file(s).
✅ No matching risk patterns were detected in changed files. Skipped non-text or missing files
|
🚦 Submission status: 🛠️ Requires submitter fixesRisk tier: Why this tier
Automated checks
Action needed
Review
Commands
Updated for |
✅ External plugin PR checks passed
Per-plugin quality summary
Gate output detailscontainers - spec compliance (✅ pass)containers - vally lint (✅ pass)containers - install smoke test (✅ pass)containers - version match (pass)containers - ref/sha consistency (pass)containers - canvas structure (pass) |
There was a problem hiding this comment.
🟡 Changes recommended
The regression script hard-codes Containers’ image dimensions and caption requirements, causing valid galleries with other dimensions or no captions to fail or time out.
1 open issue
What changed in this PR
Updates Containers to version 0.1.2 and improves external extension pages with screenshot galleries and pinned upstream README content.
Changes:
- Updates the Containers listing and marketplace entry to the pinned 0.1.2 release.
- Adds validated gallery metadata, captions, and a separate small plugin icon.
- Reuses sanitized plugin READMEs on extension detail pages while excluding raw Markdown from catalog hydration.
| File | Description |
|---|---|
website/src/pages/extension/[id].astro |
Renders external READMEs and separates gallery images from icons. |
website/src/lib/site-data.ts |
Omits extension READMEs from catalog records. |
website/src/components/brand/styles/extension-detail.module.css |
Styles icons and screenshot captions. |
website/src/components/brand/ExtensionDetail.tsx |
Displays separate icons and gallery captions. |
website/scripts/external-plugin-readme.test.mjs |
Adds README, gallery, and hydration checks. |
website/scripts/external-extension-regression.mjs |
Adds browser checks for external extension pages. |
website/README.md |
Documents gallery configuration and validation. |
plugins/external.json |
Updates Containers metadata and release pin. |
extensions/external.json |
Declares the Containers screenshot gallery. |
eng/lib/external-canvas-presentation.test.mjs |
Tests gallery validation and asset resolution. |
eng/lib/external-canvas-presentation.mjs |
Validates galleries and generates revision-pinned asset URLs. |
eng/generate-website-data.mjs |
Attaches galleries and owning-plugin READMEs to extension data. |
.github/plugin/marketplace.json |
Reflects the Containers release update. |
Review effort: Balanced (auto)
| await page.waitForFunction(() => [...document.querySelectorAll("#preview img")] | ||
| .every(image => image.complete && image.naturalWidth === 1280 && image.naturalHeight === 720)); | ||
| assert.ok(await preview.locator("figcaption").count() > 0); |
Keep gallery PNGs out of runtime extension discovery and normalize contribution text to LF. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
| for (const entry of entries) { | ||
| if (!entry?.pluginName) continue; | ||
| const name = entry.pluginName; | ||
| assert.ok(canvases.has(name), `Gallery owner is not a registered canvas plugin: ${name}`); |
| assert.ok(fs.readFileSync(file).subarray(0, PNG_HEADER.length).equals(PNG_HEADER), | ||
| `${name}: gallery image is not a PNG`); |
| await page.waitForFunction(() => [...document.querySelectorAll("#preview img")] | ||
| .every(image => image.complete && image.naturalWidth === 1280 && image.naturalHeight === 720)); | ||
| assert.ok(await preview.locator("figcaption").count() > 0); |
aaronpowell
left a comment
There was a problem hiding this comment.
I'm a little apprehensive about combining the two different things within this one PR, as the update to the Containers extension shouldn't be blocked by the following comments/feedback.
I'll be honest that I forgot we had the extensions/external.json file still in the repo, and in reality it should be removed as it's a holdover from a time before we used Plugins as the distribution method for extensions (canvases). Also, as you can probably see, there's only two items in there so it's not really used.
I don't think that putting the screenshots required for the gallery for external canvases in the Awesome Copilot repo is the best workflow. It means that there are now two places that assets for a canvas (well, plugin really) need to live, rather than Awesome Copilot acting as a pointer to the upstream.
We could expand the plugins/external.json to have support for providing screenshots, and make it work relative to the ref/sha and path provided for that plugin, or we could have the website build query the upstream plugin.json and look in its extensions property for maybe a com.github.awesome-copilot folder in which we have that structure for images with their descriptions.
There's pros and cons for both, putting the gallery info in the external.json means that the PR has the potential for requiring a bit more complexity in authoring, whereas reading the upstream plugin.json increases website build time. As an author who wants to expand their canvases gallery feature, what would you prefer?


Pull Request Checklist
npm startand verified thatREADME.mdis up to date.mainbranch for this pull request.Description
Update the approved Containers listing to 0.1.2 and replace its icon-only extension preview with real app screenshots. The summary now covers Docker, Podman, and Compose. External extension pages render the owning plugin's pinned README, so the page includes features, quickstart, requirements, and usage-data information.
Registered external canvas plugins can declare a gallery in
extensions/external.jsonwithout duplicating their version, source, or install identity. The logo remains a small icon instead of an enlarged gallery image. README retrieval and sanitization reuse the existing plugin-page implementation; raw Markdown stays out of catalog hydration.Preview asset: native Containers 0.1.2 with sample containers.
Type of Contribution
Additional Notes
Release qualification limit: native testing is incomplete. A real Podman qualification stalled during provider startup. Two live
run_imageoperations created their containers but did not return before interruption. The source suite, browser regressions, and installed behavior/CSP checks passed, but this PR does not claim that those live-call hangs are fixed or that native qualification is complete.Local website build limit: Astro emitted 1,599 pages and reported completion. The enclosing Windows build command did not exit before its four-minute deadline and was stopped. Focused generated-page, browser, and accessibility checks passed against the emitted site.
Release provenance and focused validation
source.sha:79f3fa46520ceaefa1c9c863c92f05912c1f2f0f.containers-v0-1-2-7b8c7ff.6eb9c200ace685a8522315f183c3866d96b6ae7ab5e92dde83eb5d04ba4b9834. The package was not rebuilt or changed for this submission.SHA256SUMSreceipt; that mismatch remains unresolved.By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.