* feat: migrate plugins and extensions to Agent Plugins v1.0.0 spec - Add \ to all 69 curated plugin manifests - Migrate all 18 extension manifests: add \, move logo into xtensions.com.github.copilot.logo namespace, remove top-level logo and string xtensions: '.' - Update eng/validate-plugins.mjs: require \, validate namespace-keyed extensions object for canvas extensions, widen name pattern to allow dots (spec §5.5, max 64 chars) - Update eng/materialize-plugins.mjs: emit spec-clean served manifests (only spec fields: \, name, version, description, author, homepage, repository, license, keywords, extensions) - Update eng/generate-website-data.mjs: read logo from namespace with fallback to top-level logo for compatibility - Update eng/create-plugin.mjs: scaffold emits \ - Add .github/workflows/validate-plugins.yml: blocking CI for PRs touching plugins/** or extensions/** - Add spec compliance check to external plugin quality gates: non-blocking warnings with ✅/⚠️/🛑 emoji legend - Update AGENTS.md: document new extension manifest shape, add \ to plugin checklist Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * refactor: consolidate canvas extension plugins - Move all extension plugin manifests from extensions/<name> to plugins/<name> - Keep extensions/<name> as reusable source only - Remove standalone extension discovery from marketplace and website plugin catalogs - Auto-bundle same-name extension sources during materialization - Add build-only extensions.json references for sharing extensions across plugins - Remove x-awesome-copilot extension metadata support - Update validation and contributor documentation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * feat: add canvas extension scaffolding skill - Add repo-local skill for creating canvas extension sources - Generate spec-compliant plugin manifests under plugins/ - Support registering reusable extensions with multiple plugins - Remove guidance for extension-local plugin manifests and custom fields Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * fix: align extension namespaces with current guidance - Use each extension ID as its manifest namespace key - Update validation and website generation to resolve extension-specific namespaces - Upsert plugin validation PR comments using the existing repository pattern Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * fix: use Copilot extension namespace - Adopt com.github.copilot for all canvas extension manifests - Require the namespace during validation and website generation - Update extension scaffolding guidance Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * docs: regenerate plugin catalog after merge Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * refactor(plugins): move manifests to plugin roots Use root plugin.json manifests and namespaced extension directories throughout local tooling, validation, generation, and contributor documentation. Restore materialize-plugins.mjs line breaks so the source remains readable in GitHub. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * feat(plugins): migrate manifests to namespaced composition Move repository composition metadata under com.github.awesome-copilot, materialize reusable extensions into the plugin extensions directory, and improve contributor and PR validation guidance. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * fix(validation): address plugin review findings Restore executable build scripts, validate namespaced manifests and hook directories, improve README item counts, and manage validation comments across reruns. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76 * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Copilot-Session: 8f3a88cb-e01e-4760-8125-460490dc1a76
BackRooms Canvas
A GitHub Copilot canvas that opens an endless first-person backrooms in the side panel. Yellow-wallpapered halls under humming fluorescent panels, drop-tile ceilings, and worn office carpet, filmed through the shake and grain of a 1990-era handheld camcorder. Somewhere past the fog, something else walks the same halls.
It is a canvas port of the BackViews VSCode extension. The world is powered by cmd-backedges, a procedural infinite maze engine, so every wall, room, and prop is a pure function of the seed: the same seed always rebuilds the same rooms, forever, in every direction.
While an agent works in the session, the halls start writing back. Its status and streaming responses are scrawled onto the walls in a messy ink script, and a camcorder-style token counter runs under the HUD battery.
Files
extension.mjs— canvas declaration, loopback game server, static asset handling, and agent actions.game/— the prebuilt game bundle (webview.js) and theindex.htmlhost shim served inside the canvas.materials/— photo textures (wallpaper.jpg,ceiling.jpg,carpet.jpg) tiled over the procedural atlas.assets/— app icon andpreview.pngfor the extensions gallery.package.json— declares the Copilot SDK dependency and ESM entry point.copilot-extension.json— Copilot extension name/version metadata.
Prerequisites
- Node.js 20.19 or newer, because the Copilot SDK requires
node ^20.19.0 || >=22.12.0. - A WebGL-capable canvas surface (the renderer is raw WebGL).
- The GitHub Copilot app canvas / UI-extensions experiment enabled.
Install
Drop this folder at ~/.copilot/extensions/backrooms-canvas/ for user scope, or in a repository at .github/extensions/backrooms-canvas/ for project scope. Then install dependencies from inside the copied folder:
# User scope
cd ~/.copilot/extensions/backrooms-canvas
# Or project scope, from the repository root
cd .github/extensions/backrooms-canvas
npm install
Reload extensions in the GitHub Copilot app, then open the backrooms-canvas canvas. Click the view to capture the mouse and start walking.
The canvas accepts optional open inputs:
| Input | Type | Description |
|---|---|---|
seed |
number | Maze seed. The same seed always rebuilds the same halls. 0 rolls a random seed. |
materialPreset |
string | Wall material set: classic, office, pool, concrete, or panel. |
monsterEnabled |
boolean | Whether something else walks the halls. |
Controls
| Input | Action |
|---|---|
W / S or Up / Down |
Walk forward / back |
A / D |
Strafe left / right |
Left / Right or Q / E |
Turn |
Shift |
Hurry |
| Mouse (after clicking the view) | Look around |
M or Esc |
Open the in-game menu |
The in-game menu has Resume, Relocate, Settings, and Help, plus live stats. Settings changed there persist in the canvas via localStorage, so your choices survive a reload.
Agent actions
The agent drives the game and feeds the ghost-writer through three actions. They are the canvas equivalent of the original extension's backviews_reportJob tool and chat-session mirror.
report_job { status, tokens?, done? }— report the current job step. The status text is scrawled on the walls and the token count drives the HUD counter. Call it when work starts, again on each new step, and once more withdone: truewhen finished.ghost_write { text, tokens?, done? }— ghost-write a block of text onto the wall ahead, character by character as it grows, like a streaming response. Send the growing text on each call, then once withdone: trueto settle it in place.relocate— drop the wanderer into a fresh random seed, wiping any writing already on the walls.
To have the agent narrate itself automatically, reference these actions from a .github/copilot-instructions.md so it calls report_job on each step of a chat request.
How the port works
The game itself is unchanged: game/webview.js is the same self-contained bundle the VSCode extension ships (WebGL renderer, maze engine, camcorder overlay, and wall-writing subsystem in one esbuild IIFE). The bundle was written to talk to a VSCode webview host through acquireVsCodeApi() and window.postMessage.
game/index.html shims that host:
acquireVsCodeApi()is backed bylocalStoragefor state (seed and player position) and settings persistence.- The canvas server (
extension.mjs) runs a loopback HTTP server that serves the bundle and streams agent activity over Server-Sent Events at/events. The shim translates those events into the exactjobStatus,chatSession, andrelocatemessages the bundle already listens for. - Agent actions broadcast onto that SSE stream, so
report_jobwrites on the walls andghost_writestreams text just as the VSCode chat mirror did.
This mirrors the arcade-canvas architecture: a static frontend served from a loopback server, with the agent driving it through canvas actions.
Credits
- Maze generation: cmd-backedges by John Haugabook.
- Original extension: vscode-backviews.
License
MIT