Files
awesome-copilot/extensions/backrooms-canvas
Aaron Powell a7fdcd5006 Migrate plugins and canvas extensions to Agent Plugins spec (#2546)
* 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
2026-08-06 22:29:31 +10:00
..
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00
2026-07-23 10:51:06 -07:00

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 the index.html host shim served inside the canvas.
  • materials/ — photo textures (wallpaper.jpg, ceiling.jpg, carpet.jpg) tiled over the procedural atlas.
  • assets/ — app icon and preview.png for 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 with done: true when 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 with done: true to 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 by localStorage for 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 exact jobStatus, chatSession, and relocate messages the bundle already listens for.
  • Agent actions broadcast onto that SSE stream, so report_job writes on the walls and ghost_write streams 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

License

MIT