Skip to content

rajbos/ai-fluency-canvas

v0.1.1MIT

AI Engineering Fluency canvas for the GitHub Copilot app: token usage, cost, sessions, charts and fluency score from local session logs.

AI Engineering Fluency canvas β€” Copilot plugin

This folder is the root of the ai-fluency-canvas Copilot plugin: a GitHub Copilot app canvas that shows your AI Engineering Fluency stats (token usage, cost, sessions, charts, fluency score) from local session logs.

πŸ“– Install and usage docs for users: docs/copilot-app/README.md

Layout

copilot-app/                                  <- plugin root (marketplace "source": "./copilot-app")
β”œβ”€β”€ plugin.json                               <- Agent Plugins 1.0 manifest (closed schema)
β”œβ”€β”€ skills/ai-fluency/SKILL.md                <- tells the agent when/how to open the canvas
β”œβ”€β”€ com.github.copilot/extensions/ai-fluency/ <- the canvas extension (canvasId "ai-fluency")
β”‚   β”œβ”€β”€ extension.mjs                         <- entry point: hands the Copilot SDK to canvas.mjs
β”‚   β”œβ”€β”€ canvas.mjs                            <- registers the canvas and its agent actions
β”‚   β”œβ”€β”€ cli.mjs  refresher.mjs  store.mjs  server.mjs  panels.mjs
β”‚   β”œβ”€β”€ assets/                               <- UI served on 127.0.0.1 (index.html, app.js, style.css)
β”‚   β”œβ”€β”€ copilot-extension.json                <- only for the app's manual "Install extension" flow
β”‚   β”œβ”€β”€ test/                                 <- canvas unit tests (synthetic fixtures)
β”‚   └── README.md                             <- how the canvas works
└── test/manifest.test.mjs                    <- plugin.json / marketplace.json / no-personal-data checks

The marketplace catalog lives at .github/plugin/marketplace.json (marketplace name ai-engineering-fluency).

The extension folder keeps the name ai-fluency so the canvasId and the snapshot location ($COPILOT_HOME/extensions/ai-fluency/artifacts/) stay the same whether the canvas is installed as a plugin or copied by hand. Snapshots are never written inside this folder; .gitignore and test/manifest.test.mjs both guard against committing an artifacts/ directory, snapshot.json or refresh.lock* files.

Tests

No dependencies β€” plain node --test (Node.js 22+). From the repository root:

node --test "copilot-app/**/*.test.mjs"

CI runs the same command in .github/workflows/copilot-app.yml.

Versioning and releasing

  1. Bump version in both copilot-app/plugin.json and the ai-fluency-canvas entry in .github/plugin/marketplace.json (semver). test/manifest.test.mjs fails if they differ.
  2. Merge to main. The marketplace is read straight from the repository, so there is no separate publish step.
  3. Users pick up the new version with copilot plugin marketplace update followed by copilot plugin update ai-fluency-canvas (or the Update action in the app).

Trying a branch before it is merged

Use a fresh, isolated config directory so nothing is installed into your real ~/.copilot. The finally block restores your previous COPILOT_HOME and deletes only the folder this run created:

$testHome = Join-Path ([IO.Path]::GetTempPath()) "copilot-plugin-test-$([guid]::NewGuid())"
$previousHome = $env:COPILOT_HOME
try {
    $env:COPILOT_HOME = $testHome
    copilot plugin marketplace add rajbos/ai-engineering-fluency#<branch>
    copilot plugin install ai-fluency-canvas@ai-engineering-fluency
    copilot plugin list
} finally {
    $env:COPILOT_HOME = $previousHome
    Remove-Item -LiteralPath $testHome -Recurse -Force -ErrorAction SilentlyContinue
}

To try it in the Copilot app itself, install into your real config instead (after removing any manually installed copy β€” see "Migrating" in the user docs).