Skip to main content

Posts

Showing posts with the label AI

Using GitHub Copilot Spaces from VS Code

In my previous post , I covered what Copilot Spaces are and how to set one up. Spaces live on github.com by default, but you don't have to leave your editor to use one. The GitHub MCP server exposes your Spaces as tools, so you can pull that curated context straight into VS Code. Prerequisites You'll need the remote GitHub MCP server configured for VS Code, and the copilot_spaces toolset explicitly enabled. It's not part of the default toolset. The easiest way is to install the GitHub extension in VS Code. This will also add the GitHub MCP server. But as I mentioned above, you will not find the copilot_spaces toolset out-of-the-box. You need to open up the MCP configuration and explicitly add it there. Add this to your .vscode/mcp.json (or your global MCP configuration): { "servers": { "github": { "type": "http", "url": "https://api.githubcopilot.com/mcp/", "headers"...

Getting started with GitHub Copilot Spaces

A lot of developers are using GitHub Copilot as their day-to-day agent harness. But most of them seem to be unaware that with a GitHub Copilot license comes more than a CLI and Visual Studio (Code) plugins. One thing you get access to are GitHub Copilot Spaces. GitHub Copilot what? Let me first explain what Spaces are and why they are useful. Why GitHub Copilot Spaces? If you've used Copilot Chat for a while, you recognize the pattern: you paste in the same background information for the third time this week. The same coding conventions, the same architecture decisions, the same "no, we don't use that library anymore" context. Close the conversation, and Copilot forgets all of it. Remark: Part of the answer can be found in building up your CONTEXT.md file and using the GitHub Memory feature but it’s not always the right solution. That's because source code lives in your repositories, requirements live in issues and pull requests, and team conventions o...

Cutting tool output tokens in Microsoft Agent Framework with TOON

If you've built anything with the Microsoft Agent Framework (MAF), you'll notice that your tool calls can fill up the context window quite fast. A function that returns a list of 50 orders as JSON easily costs you a few hundred tokens on braces, quotes and repeated field names alone. That cost hits you twice: once on the way into the model as tool output, and again on every subsequent turn where that history gets replayed. That's where TOON (Token-Oriented Object Notation) comes in. Let's explore this. What TOON actually is TOON is a line-oriented, indentation-based encoding of the same data model JSON uses. It borrows YAML's indentation for nested objects and CSV's tabular layout for arrays of uniform objects. The trick is in that last part: if you have a list of objects that all share the same fields, TOON declares the field list once and then just streams the values, row by row, instead of repeating every key for every item. Take a small object like t...

Monitoring Claude Code usage with the Aspire Dashboard

Note: this is a follow-up to my post on monitoring GitHub Copilot Chat with the Aspire Dashboard. Same idea, different agent. Some developers on the team have switched (part-time) from Copilot Chat to Claude Code for their agentic work. Same question came up again: how much are we actually using it, what does it cost, and where does the time go in a session? Claude Code has its own OTel support, separate from Copilot's, so it needs its own setup — but it plugs into the exact same Aspire Dashboard we already had running. What Claude Code exports Claude Code emits three kinds of OTel signals: Metrics — session counts, token usage, cost, lines of code changed, active time Events — one event per prompt, per API call, per tool result, per permission decision Traces (beta) — a claude_code.interaction span per prompt, with claude_code.llm_request and claude_code.tool spans nested underneath Remark: traces are still beta. Metrics and events are the stable path ...

Setting up GitHub Copilot budget policies without GitHub Enterprise Cloud

If you search for "GitHub Copilot budget policy", most posts point you to cost centers: assign a budget to a cost center, map the cost center to a team or business unit, done. Clean story, except for one detail nobody mentions upfront — cost centers require a GitHub Enterprise Cloud account. That's not the same thing as being on the Copilot Enterprise plan; user-level budgets already work fine on Copilot Business. It's about the account type; a standalone Organization account doesn't have cost centers, and neither does GitHub Enterprise Server if you're self-hosted. If you're not on Enterprise Cloud, cost centers are off the table. We ran into exactly this. No Enterprise Cloud account, no cost centers, but still a real need to keep Copilot spend under control across a growing user base. Remark: if you do have GitHub Enterprise Cloud, cost centers are probably still the better fit. This post is for the rest of us. The starting point We have two...

Turning a single work session into a reusable Skill with Microsoft's Skill Recorder

In my effort to adopt an 'AI first' philosophy, I spend a lot of time automating my day-to-day activities and transforming them to skills. It's not the most exciting activity: I know exactly how to do a task, I've done it a dozen times by hand, but writing it down as a clean SKILL.md for an agent takes almost as long as just doing the task again. Microsoft created an open-source a tool that skips that step entirely: Skill Recorder . The idea is simple: you record yourself doing the task once, and it generates the skill for you. Sounds good? Let’s give it a try… What it actually does Skill Recorder is a desktop app (Electron, macOS-first with Windows 11 support) that captures a real work session on your screen: clicks, app and window switches, the pages you visit, clipboard snippets, and optionally your spoken narration. Nothing leaves your machine while you're recording. Capture, storage, frame extraction, and narration transcription all happen locally. T...

Packaging skills in a plugin, this time for GitHub Copilot CLI

Note: this post is part of a series. Part one covered packaging a skill in a plugin for Claude Code . Same idea, different tool, this time focussing on GitHub Copilot. After writing that first post I got the obvious follow-up question: does this also work for GitHub Copilot? Short version: yes, SKILL.md itself is portable, but the plugin wrapper isn't. Copilot CLI has its own plugin format, laid out slightly differently from Claude Code's. What's the same? A skill is still just a folder with a SKILL.md inside: YAML frontmatter ( name , description , optionally license ), then a Markdown body with instructions. Copy that file as-is between tools — nothing about the skill content needs to change. What's different? Where Claude Code wants the manifest tucked inside .claude-plugin/plugin.json , Copilot CLI puts plugin.json straight at the plugin root: api-testing-plugin/ ├── plugin.json # Required manifest, at the root ├── agents/ #...

Packaging skills into a plugin

It didn't take long until skills became a key element in our agentic development workflow. At that moment a skill stopped being "that SKILL.md I keep in one project" and became something we want on every machine, for every teammate, without copy-pasting a folder around. That's the point where you package it into a plugin. A plugin is a container: it bundles one or more skills plus optionally commands, agents, hooks, and MCP servers into a single installable unit with a manifest. Skills are the "what to do", plugins are the "how you get it onto someone else's machine". Our first approach: using git submodules Our first approach was through centralizing all our skills in a separate Git repo and share it between projects by using git submodules. That approach worked but felt more like a hack than a final solution. The better approach: wrap it in a plugin A plugin is just a directory with a manifest and a conventional layout: my-plugin/...

Remote control: steering your AI coding session from your phone

There's a moment when you're deep into an agentic coding session and you have to leave your desk (time to catch my train!). Normally that means the session just sits there, waiting, until you're back at your keyboard. Both Claude Code and GitHub Copilot CLI recently shipped a feature that fixes exactly this: you keep the session running locally, but you can check in, approve tool calls, and keep steering it from your phone or any browser. Let's look at how each one works. Claude Code: /remote-control In Claude Code, you enable this with a slash command inside a running session: /remote-control or the short form: /rc You can also start a session already remote-enabled: claude --remote-control or run a dedicated server process that can host multiple concurrent sessions: claude remote-control Whichever way you start it, Claude Code prints a session URL (and lets you press spacebar to show a QR code) that connects to claude.ai/code or the Claude app. ...

Why "AI is just the next compiler" doesn't hold up

At a recent talk I compared AI adoption to the introduction of compilers: a new layer of abstraction that lets us work at a higher level, the same way compilers let us stop writing assembly by hand. In the hallway afterwards, a few people pushed back on that comparison. They were right to. Here's the point I should have made from the stage: agents are not deterministic, and that single difference breaks the analogy. Compilers follow rules A compiler is not a magical black box. You give it code, and it gives you a binary, following a fixed set of rules. Given the same input, a compiler will reliably produce the same output, every time. You don't hope the binary does what you wrote. You trust the compiler, because the transformation is deterministic. That determinism is exactly what let us move up the abstraction ladder in the first place. We stopped worrying about registers and memory addresses because we could trust the layer below us to behave the same way twice....

Talking to Copilot like a caveman

  I think that everyone who uses AI recognizes the following pattern; you ask an LLM a simple question and it answers like it's writing a blog post: introduction, context, three examples, a closing summary. Fine for a first read, expensive when you're chaining calls or running an agent loop all day. The trick to avoid this is called "caveman prompting". You tell the model to drop articles, pleasantries and filler, and answer in short, blunt fragments. It sounds silly. But it works up to a point. A first attempt: just say "be concise" Most people's first instinct is a one-line system prompt: Be concise. No fluff. This already gets you a good chunk of the savings. In benchmarks I've seen floating around, a plain "be concise, return structured output" instruction accounts can already give you a nice reduction. It's the cheapest fix and most people stop here, which is reasonable. The caveman approach The caveman skill takes...

Combining Google Stitch with the GitHub Copilot Coding Agent

UI generation and background coding agents are two of the "AI" tools that really changed my way of working. Together, they close a gap that's been annoying me for a while: the coding agent still needs someone to describe what the UI should look like, and that someone is usually me, typing a wall of text into an issue and hoping for the best. Google Stitch generates UI screens (HTML/CSS, Tailwind, Flutter, SwiftUI, whatever…) from a prompt or a sketch. The GitHub Copilot coding agent picks up an issue and produces a pull request in the background, without you sitting in the editor. In this post we look at how to connect the two through MCP, so the coding agent stops guessing at layout, spacing and colors, and starts reading an actual design spec. Here's how to wire it up, and where it still needs a human in the loop. My first approach: screenshots in the issue body My first attempt was to design something in Stitch, paste a screenshot into a GitHub issue, and ...