<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcel.L</title>
    <description>The latest articles on DEV Community by Marcel.L (@pwd9000).</description>
    <link>https://dev.to/pwd9000</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg</url>
      <title>DEV Community: Marcel.L</title>
      <link>https://dev.to/pwd9000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pwd9000"/>
    <language>en</language>
    <item>
      <title>Mastering Code Reviews with GitHub Copilot: The Definitive Guide</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Fri, 13 Mar 2026 09:46:56 +0000</pubDate>
      <link>https://dev.to/pwd9000/mastering-code-reviews-with-github-copilot-the-definitive-guide-3nfp</link>
      <guid>https://dev.to/pwd9000/mastering-code-reviews-with-github-copilot-the-definitive-guide-3nfp</guid>
      <description>&lt;h2&gt;
  
  
  Mastering Code Reviews with GitHub Copilot: The Definitive Guide
&lt;/h2&gt;

&lt;p&gt;Pull requests keep piling up. Your team reviews dozens a week, and each one needs careful attention to security, performance, style, and correctness. Human reviewers catch domain-specific issues that machines miss, but they also miss the mechanical things that machines are brilliant at, such as spotting unhandled edge cases, flagging deprecated API calls, or enforcing naming conventions across hundreds of files.&lt;/p&gt;

&lt;p&gt;What if you could get an AI-powered first pass on every pull request before a human even looks at it? Better still, what if that AI reviewer lived in your editor, your terminal, your GitHub.com workflow, and your custom automation, all at once?&lt;/p&gt;

&lt;p&gt;GitHub Copilot offers not one but &lt;strong&gt;eight distinct surfaces&lt;/strong&gt; for AI-assisted code review. This guide maps every one of them, shows you how to configure each for maximum value, and walks through a real end-to-end review workflow that combines several surfaces together.&lt;/p&gt;

&lt;p&gt;If you have been following the &lt;a href="https://dev.to/pwd9000/series/34048"&gt;GitHub Copilot series&lt;/a&gt;, you have already seen individual pieces of this puzzle across previous posts on &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-instructions-and-prompt-files-2p5e"&gt;custom instructions&lt;/a&gt;, &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;MCP&lt;/a&gt;, &lt;a href="https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43"&gt;the coding agent&lt;/a&gt;, and the &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;customisation guide&lt;/a&gt;. This post brings everything together through the lens of code review.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8 Surfaces of AI-Assisted Code Review
&lt;/h2&gt;

&lt;p&gt;Before we dive into each method, here is the landscape at a glance. Every surface serves a different context in your workflow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Where It Runs&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Setup Required&lt;/th&gt;
&lt;th&gt;Automation Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitHub.com Native Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser (github.com)&lt;/td&gt;
&lt;td&gt;PR reviews at scale&lt;/td&gt;
&lt;td&gt;Org/repo settings&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VS Code Review Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editor (VS Code)&lt;/td&gt;
&lt;td&gt;In-flight code review&lt;/td&gt;
&lt;td&gt;Settings toggle&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code + GitHub.com&lt;/td&gt;
&lt;td&gt;Team review standards&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.github/&lt;/code&gt; config files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Repeatable review workflows&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.prompt.md&lt;/code&gt; files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Specialised review roles&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.agent.md&lt;/code&gt; files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MCP-Powered PR Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Deep PR analysis with live context&lt;/td&gt;
&lt;td&gt;MCP server config&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Coding Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;Fully automated review tasks&lt;/td&gt;
&lt;td&gt;Coding agent enabled&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Copilot CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Pre-commit local checks&lt;/td&gt;
&lt;td&gt;Copilot CLI installed&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this guide walks through each surface in detail, then ties them together in a worked example.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GitHub.com Native Copilot Code Review
&lt;/h2&gt;

&lt;p&gt;This is the highest-leverage surface for teams. Copilot acts as an automated reviewer directly on your pull requests in the browser, no editor or CLI needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to any pull request on github.com.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Reviewers&lt;/strong&gt; in the sidebar and select &lt;strong&gt;Copilot&lt;/strong&gt; from the reviewer list.&lt;/li&gt;
&lt;li&gt;Copilot analyses the diff and posts inline review comments, just like a human reviewer would.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also configure Copilot to &lt;strong&gt;automatically review every PR&lt;/strong&gt; when it is opened or updated, so you never have to remember to request it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13fdh7tsphq95di363k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13fdh7tsphq95di363k7.png" alt="Selecting Copilot as a reviewer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Feedback Looks Like
&lt;/h3&gt;

&lt;p&gt;Copilot's review comments appear inline on the PR diff. Each comment includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A description of the issue found.&lt;/li&gt;
&lt;li&gt;A suggested fix (where applicable) that you can accept with one click.&lt;/li&gt;
&lt;li&gt;Severity context so you can prioritise critical issues over style nits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comments cover categories such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bugs and logic errors&lt;/strong&gt; (off-by-one, null dereferences, race conditions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security concerns&lt;/strong&gt; (injection risks, hardcoded secrets, missing input validation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt; (unnecessary allocations, N+1 queries, blocking calls in async code).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best practice violations&lt;/strong&gt; (deprecated APIs, missing error handling, inconsistent patterns).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4oqmwmrdjk9uycppljy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4oqmwmrdjk9uycppljy.png" alt="Copilot inline review comment with suggested fix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Coding Guidelines
&lt;/h3&gt;

&lt;p&gt;By default, Copilot reviews against general best practices. To tailor feedback to your team's standards, create a &lt;strong&gt;coding guidelines file&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;.github/copilot-code-review-instructions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This file contains natural language descriptions of your team's review standards. For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Security&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All database queries must use parameterised queries, never string concatenation.
&lt;span class="p"&gt;-&lt;/span&gt; Secrets must be loaded from environment variables or a vault, never hardcoded.
&lt;span class="p"&gt;-&lt;/span&gt; All public endpoints must validate and sanitise input.

&lt;span class="gu"&gt;## Naming&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use PascalCase for public methods, camelCase for private methods.
&lt;span class="p"&gt;-&lt;/span&gt; Infrastructure resources must follow the pattern: {env}-{region}-{service}-{resource}.

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Every public method must have at least one unit test.
&lt;span class="p"&gt;-&lt;/span&gt; Integration tests must clean up after themselves.

&lt;span class="gu"&gt;## Error Handling&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Never swallow exceptions silently. Log at minimum.
&lt;span class="p"&gt;-&lt;/span&gt; Use typed errors rather than generic Error objects.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When Copilot reviews a PR in your repository, it reads these guidelines and incorporates them into its analysis. This is how you move from generic AI feedback to feedback that matches your team's actual standards.&lt;/p&gt;
&lt;h3&gt;
  
  
  Enabling at Organisation and Repository Level
&lt;/h3&gt;

&lt;p&gt;Repository administrators can configure Copilot code review under &lt;strong&gt;Settings &amp;gt; Copilot &amp;gt; Code review&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enable/disable&lt;/strong&gt; Copilot as an available reviewer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-review&lt;/strong&gt;: Automatically request Copilot review on every new or updated PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom coding guidelines&lt;/strong&gt;: Point to your &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the &lt;strong&gt;organisation level&lt;/strong&gt;, administrators can enable or enforce code review settings across all repositories, ensuring consistent review coverage.&lt;/p&gt;
&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language support&lt;/strong&gt;: Copilot code review works best with widely-used languages (JavaScript, TypeScript, Python, Go, Java, C#, Ruby, etc.). Less common languages may receive less detailed feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window&lt;/strong&gt;: Very large PRs may exceed the context window. Copilot reviews what it can and notes when it could not review all files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a replacement for human review&lt;/strong&gt;: Copilot catches mechanical issues brilliantly but does not understand your business domain. It is a first pass, not the final word.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can work around the language support limitation by pairing Copilot with an advanced reasoning model (such as &lt;code&gt;Claude Opus&lt;/code&gt; or &lt;code&gt;Gemini 3 Pro&lt;/code&gt; in extended thinking mode) or a custom agent that has access to online sources via MCP web tooling or Playwright. For example, create a &lt;code&gt;.agent.md&lt;/code&gt; reviewer that uses a web search tool to look up the latest best practices, idioms, or security advisories for a less common language. The agent can research real time strategies, verify its findings against up to date documentation, and cite the references it used so you can check them yourself. This is especially useful for newer frameworks or niche languages where the model's training data may be limited. See Section 5: Custom Agents and Section 6: MCP-Powered PR Review later in this guide for setup details.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/code-review/using-copilot-code-review" rel="noopener noreferrer"&gt;GitHub Copilot code review&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  2. VS Code Review Selection
&lt;/h2&gt;

&lt;p&gt;If GitHub.com native review is the "PR-level" surface, VS Code review selection is the "code-level" surface. It lets you review any block of code in the editor, at any time, not just when a PR is open.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Trigger It
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select code&lt;/strong&gt; in the editor (a function, a class, a block, whatever you want reviewed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right-click&lt;/strong&gt; and choose &lt;strong&gt;Copilot &amp;gt; Review and Comment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Alternatively, open the Command Palette (&lt;code&gt;Ctrl+Shift+P&lt;/code&gt;) and run &lt;strong&gt;GitHub Copilot: Review and Comment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot analyses the selected code and posts its findings directly as editor comments, inline in your code.&lt;/p&gt;

&lt;p&gt;You can also trigger a review of all uncommitted changes directly from the &lt;strong&gt;Source Control&lt;/strong&gt; panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gmadpdv6ta68l35irsz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gmadpdv6ta68l35irsz.png" alt="VS Code Source Control review button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copilot posts its findings as inline comments with suggested changes that you can apply or discard with a single click.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1et1ogixr46a943ll23d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1et1ogixr46a943ll23d.png" alt="VS Code Copilot review comment with suggested change"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuring Review Instructions
&lt;/h3&gt;

&lt;p&gt;You can customise what Copilot looks for during VS Code reviews using two settings. These live in your VS Code &lt;code&gt;settings.json&lt;/code&gt; file. To open it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; (or &lt;code&gt;Cmd+Shift+P&lt;/code&gt; on macOS) and run &lt;strong&gt;Preferences: Open Settings (JSON)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For workspace-level settings shared with your team, create &lt;code&gt;.vscode/settings.json&lt;/code&gt; in your repository root.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add or update the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// Enable the review selection feature&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.reviewSelection.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Define what Copilot should focus on during reviews&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.reviewSelection.instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Check for security vulnerabilities including injection attacks, hardcoded secrets, and missing input validation."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Flag any functions longer than 50 lines and suggest decomposition."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify error handling covers all failure paths."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also point to an external file for review instructions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.reviewSelection.instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".github/review-instructions.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This keeps your review criteria version-controlled and consistent across the team.&lt;/p&gt;
&lt;h3&gt;
  
  
  When to Use This Surface
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;During development&lt;/strong&gt;: Review your own code before you even commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pair programming&lt;/strong&gt;: Get an instant second opinion on a tricky function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning&lt;/strong&gt;: Understand unfamiliar code by asking Copilot to review and explain it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-PR polish&lt;/strong&gt;: Catch issues before they reach the formal review stage.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deeper dive into VS Code Copilot settings, see my earlier post: &lt;a href="https://dev.to/pwd9000/tune-github-copilot-settings-in-vs-code-32kp"&gt;Tune GitHub Copilot Settings in VS Code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  3. Custom Instructions for Code Reviews
&lt;/h2&gt;

&lt;p&gt;Custom instructions shape how Copilot behaves across your workspace. For code review, they let you embed your team's review standards so that every interaction, whether in chat, inline completion, or review, reflects your agreed-upon practices.&lt;/p&gt;
&lt;h3&gt;
  
  
  Where to Define Review Instructions
&lt;/h3&gt;

&lt;p&gt;You have three options, each with a different scope:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Use When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every Copilot interaction&lt;/td&gt;
&lt;td&gt;You want review standards applied everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/instructions/code-review.instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pattern-matched files&lt;/td&gt;
&lt;td&gt;You want review rules for specific file types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-agent workflows&lt;/td&gt;
&lt;td&gt;You use multiple AI tools, not just Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Example: A Code Review Instructions File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/instructions/code-review.instructions.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;applyTo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/*.{ts,js,py,go,cs}'&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Code Review Standards&lt;/span&gt;

When reviewing code, always check:

&lt;span class="gu"&gt;## Security&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; No hardcoded secrets, tokens, or connection strings.
&lt;span class="p"&gt;-&lt;/span&gt; All user input is validated and sanitised before use.
&lt;span class="p"&gt;-&lt;/span&gt; SQL queries use parameterised statements.
&lt;span class="p"&gt;-&lt;/span&gt; No sensitive data logged at INFO level or above.

&lt;span class="gu"&gt;## Reliability&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All async operations have proper error handling.
&lt;span class="p"&gt;-&lt;/span&gt; Network calls include timeouts and retry logic.
&lt;span class="p"&gt;-&lt;/span&gt; Resource cleanup is handled in finally blocks or using statements.

&lt;span class="gu"&gt;## Maintainability&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Functions do one thing and are under 40 lines where practical.
&lt;span class="p"&gt;-&lt;/span&gt; Variable names are descriptive and follow project conventions.
&lt;span class="p"&gt;-&lt;/span&gt; No commented-out code left in place. Use version control instead.

&lt;span class="gu"&gt;## Performance&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; No unnecessary allocations in hot paths.
&lt;span class="p"&gt;-&lt;/span&gt; Database queries are indexed and avoid N+1 patterns.
&lt;span class="p"&gt;-&lt;/span&gt; Large collections use streaming or pagination rather than loading everything into memory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;applyTo&lt;/code&gt; glob ensures these instructions activate whenever Copilot works with source code files, without cluttering interactions with documentation or configuration files.&lt;/p&gt;
&lt;h3&gt;
  
  
  How Instructions Shape Review Output
&lt;/h3&gt;

&lt;p&gt;When you use Copilot to review code, either via VS Code review selection, chat, or GitHub.com, it reads these instructions and adjusts its analysis accordingly. The instructions act as a persistent checklist that Copilot applies without you having to repeat it every time.&lt;/p&gt;

&lt;p&gt;This is the foundation layer. The other surfaces (prompt files, agents, MCP) build on top of it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a full walkthrough, see: &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-instructions-and-prompt-files-2p5e"&gt;Instructions and Prompt Files to supercharge VS Code with GitHub Copilot&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  4. Prompt Files for Structured Reviews
&lt;/h2&gt;

&lt;p&gt;While instructions define standards, prompt files create &lt;strong&gt;repeatable review workflows&lt;/strong&gt; that you invoke on demand. Think of them as named review commands.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a Review Prompt File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/prompts/security-review.prompt.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security-focused&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;selected&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code'&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ask'&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;codebase'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Perform a thorough security review of the current code. For each issue found, provide:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical / High / Medium / Low
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Location**&lt;/span&gt;: File and line reference
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Issue**&lt;/span&gt;: What the problem is
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Risk**&lt;/span&gt;: What could go wrong if left unfixed
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Fix**&lt;/span&gt;: Specific code change to resolve it

Check for:
&lt;span class="p"&gt;
-&lt;/span&gt; Injection vulnerabilities (SQL, XSS, command injection)
&lt;span class="p"&gt;-&lt;/span&gt; Authentication and authorisation gaps
&lt;span class="p"&gt;-&lt;/span&gt; Hardcoded secrets or credentials
&lt;span class="p"&gt;-&lt;/span&gt; Missing input validation
&lt;span class="p"&gt;-&lt;/span&gt; Insecure cryptographic usage
&lt;span class="p"&gt;-&lt;/span&gt; Sensitive data exposure in logs or error messages
&lt;span class="p"&gt;-&lt;/span&gt; Missing rate limiting on public endpoints

Format output as a table sorted by severity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using It
&lt;/h3&gt;

&lt;p&gt;In VS Code chat, type &lt;code&gt;/security-review&lt;/code&gt; and Copilot runs the review following your exact template. The output is structured, consistent, and actionable every time.&lt;/p&gt;
&lt;h3&gt;
  
  
  More Review Prompt Ideas
&lt;/h3&gt;

&lt;p&gt;Here are additional prompt files you might create:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;performance-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyse code for performance bottlenecks, memory leaks, and scaling concerns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test-coverage-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identify untested code paths and suggest test cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;accessibility-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check UI code for accessibility compliance (WCAG)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iac-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review Terraform/Bicep for security, cost, and best practices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;api-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review API endpoints for consistency, versioning, and documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each prompt file becomes a slash command in VS Code chat. Your team builds a library of review plays that anyone can run.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For more on prompt files, see: &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  5. Custom Agents for Code Reviews
&lt;/h2&gt;

&lt;p&gt;Custom agents take things further by creating a &lt;strong&gt;dedicated reviewer persona&lt;/strong&gt; with specific tool access and boundaries. Instead of a general-purpose assistant that also reviews code, you build a specialist.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Use a Custom Agent for Reviews?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role clarity&lt;/strong&gt;: The agent only reviews. It does not generate new code, refactor, or make changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool restrictions&lt;/strong&gt;: You can limit the agent to read-only tools so it cannot accidentally modify files during review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent voice&lt;/strong&gt;: The agent's system prompt defines its review personality, checklist, and output format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team alignment&lt;/strong&gt;: Everyone uses the same reviewer agent, so feedback is consistent regardless of who runs it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Example: Security Review Agent
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/agents/security-reviewer.agent.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security-focused&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reviewer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;that&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;analyses&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vulnerabilities&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;compliance&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues'&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;codebase'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a senior security engineer performing code review. Your role is strictly read-only. You analyse code but never modify it.

&lt;span class="gu"&gt;## Review Process&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Examine the code provided or referenced in the conversation.
&lt;span class="p"&gt;2.&lt;/span&gt; Check against the OWASP Top 10, CWE Top 25, and project-specific security policies.
&lt;span class="p"&gt;3.&lt;/span&gt; For each finding, provide severity, location, description, risk, and remediation guidance.

&lt;span class="gu"&gt;## Output Format&lt;/span&gt;

Present findings in a structured report:

&lt;span class="gu"&gt;### Summary&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Total issues found: X
&lt;span class="p"&gt;-&lt;/span&gt; Critical: X | High: X | Medium: X | Low: X

&lt;span class="gu"&gt;### Findings&lt;/span&gt;

For each finding:
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**ID**&lt;/span&gt;: SEC-001
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical/High/Medium/Low
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Category**&lt;/span&gt;: (e.g., Injection, Auth, Crypto)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Location**&lt;/span&gt;: File and line
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Description**&lt;/span&gt;: What the issue is
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Risk**&lt;/span&gt;: Impact if exploited
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Remediation**&lt;/span&gt;: How to fix it

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Never suggest "it looks fine" without evidence of thorough checking.
&lt;span class="p"&gt;-&lt;/span&gt; Always check for hardcoded secrets, even in test files.
&lt;span class="p"&gt;-&lt;/span&gt; Flag any use of deprecated cryptographic algorithms.
&lt;span class="p"&gt;-&lt;/span&gt; If you cannot determine security posture from the available context, say so explicitly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using It
&lt;/h3&gt;

&lt;p&gt;Switch to the &lt;code&gt;security-reviewer&lt;/code&gt; agent in VS Code chat. Everything you ask is filtered through the security reviewer's lens. Ask it to review a file, a diff, or a PR, and you get structured security feedback every time.&lt;/p&gt;

&lt;p&gt;You can create different review agents for different concerns: &lt;code&gt;architecture-reviewer.agent.md&lt;/code&gt;, &lt;code&gt;performance-reviewer.agent.md&lt;/code&gt;, &lt;code&gt;accessibility-reviewer.agent.md&lt;/code&gt;, each with its own checklist and tool set.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deeper look at custom agents: &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  6. MCP-Powered PR Reviews
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.github.com/en/copilot/customizing-copilot/using-model-context-protocol" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; lets Copilot connect to external tools and data sources. For code review, the GitHub MCP server is the key enabler. It gives Copilot live access to pull request data: diffs, comments, linked issues, CI status, and more.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up the GitHub MCP Server
&lt;/h3&gt;

&lt;p&gt;If you followed my earlier post on &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;MCP setup&lt;/a&gt;, you already have this configured. The GitHub MCP server provides tools such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_pull_request&lt;/code&gt; to fetch PR metadata and description.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_pull_request_diff&lt;/code&gt; to retrieve the actual code changes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_pull_request_comments&lt;/code&gt; to see existing review feedback.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_issue&lt;/code&gt; to pull in linked issue context.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_pull_request_files&lt;/code&gt; to see which files changed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_pull_request_review_comment&lt;/code&gt; to post review comments back.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Review Workflow with MCP
&lt;/h3&gt;

&lt;p&gt;Here is how you can run a PR review entirely from VS Code chat using MCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Fetch the PR context&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Look at PR #42 in my repository. Fetch the diff, the PR description, and any linked issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot uses the MCP tools to pull all the context it needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Analyse the changes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review the changes in PR #42 for security issues, bug risks, and adherence to our coding standards.
Cross-reference with the linked issue to ensure all requirements are addressed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3: Post feedback&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Post your review findings as inline comments on PR #42, grouped by severity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot can post review comments directly on the PR via MCP, so the feedback appears on github.com where the rest of the team can see it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why MCP Changes the Game
&lt;/h3&gt;

&lt;p&gt;Without MCP, Copilot in VS Code only sees the files open in your editor. With MCP, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull in the full PR diff, even files you have not opened.&lt;/li&gt;
&lt;li&gt;Read existing review comments so it does not duplicate feedback.&lt;/li&gt;
&lt;li&gt;Check CI status to correlate test failures with code changes.&lt;/li&gt;
&lt;li&gt;Follow linked issues to understand the intent behind the changes.&lt;/li&gt;
&lt;li&gt;Post comments back to the PR so everything stays in one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns VS Code chat into a full PR review workstation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For MCP setup details, see: &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;Supercharge VSCode GitHub Copilot using MCP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  7. Coding Agent for Automated Reviews
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent" rel="noopener noreferrer"&gt;GitHub Copilot coding agent&lt;/a&gt; is an autonomous AI that runs in a GitHub Actions environment. While it is primarily designed for coding tasks, you can use it for review-adjacent automation.&lt;/p&gt;
&lt;h3&gt;
  
  
  How It Applies to Code Review
&lt;/h3&gt;

&lt;p&gt;The coding agent works through GitHub Issues. You describe a task, assign it to Copilot, and it opens a PR with the result. For review workflows, consider these patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: Fix issues found in review&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Address review feedback on PR #42

Review the comments on PR #42 and implement the requested changes:
- Fix the SQL injection vulnerability in UserService.cs
- Add input validation to the CreateUser endpoint
- Add unit tests for the new validation logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Assign this issue to Copilot, and it will create a new PR addressing the review feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: Review-driven refactoring&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Refactor authentication module per review guidelines

The authentication module in src/auth/ has accumulated technical debt.
Apply our coding standards from .github/copilot-code-review-instructions.md:
- Extract duplicated validation logic into shared utilities
- Add proper error handling to all OAuth flows
- Ensure all endpoints validate JWT tokens consistently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pattern 3: Pre-review preparation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Add missing tests before review

Before PR #42 is reviewed, ensure:
- All new public methods have unit tests
- Integration tests cover the new API endpoints
- Test coverage for the changed files is above 80%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The coding agent handles the mechanical work so that human reviewers can focus on design decisions and domain logic.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The coding agent cannot approve or merge PRs. It always produces a PR for human review.&lt;/li&gt;
&lt;li&gt;Every PR it creates is scanned by CodeQL and secret scanning.&lt;/li&gt;
&lt;li&gt;It runs in an isolated container, so it cannot affect your production environment.&lt;/li&gt;
&lt;li&gt;One task, one PR. Complex reviews may need to be broken into separate issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For full setup and use cases, see: &lt;a href="https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43"&gt;Using GitHub Copilot Coding Agent for DevOps Automation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  8. Copilot CLI for Local Reviews
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt; is a standalone terminal agent that replaces the retired &lt;code&gt;gh copilot&lt;/code&gt; extension. You invoke it with the &lt;code&gt;copilot&lt;/code&gt; command. It can read files, run shell commands, and interact with GitHub, making it ideal for reviewing changes before you commit or push.&lt;/p&gt;
&lt;h3&gt;
  
  
  Quick Local Review
&lt;/h3&gt;

&lt;p&gt;Start an interactive session and ask Copilot to review your staged changes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then type your review prompt:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review my staged changes for bugs, security issues, and style problems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or use the programmatic interface for a one-shot review:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review my staged changes for bugs, security issues, and style problems"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Targeted Reviews
&lt;/h3&gt;

&lt;p&gt;Review a specific file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review src/auth/login.ts for security vulnerabilities"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(cat)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Review changes between branches:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review the changes between main and feature/auth-refactor, focusing on authentication security"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check the changes in a pull request directly from the terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Check the changes made in PR #42. Report any serious errors you find"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(gh)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use CLI Reviews
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-commit check&lt;/strong&gt;: Catch issues before they enter version control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick sanity check&lt;/strong&gt;: Get a fast opinion on a small change without opening an editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI integration&lt;/strong&gt;: Add a review step to your pipeline that flags issues early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote work&lt;/strong&gt;: Review code on a server where you only have terminal access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI is a full agentic experience. It can read your codebase, run shell commands, and even create pull requests. For review purposes, use &lt;code&gt;--allow-tool='shell(git)'&lt;/code&gt; to give it read access to your Git history without granting broader permissions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For CLI setup and more examples, see: &lt;a href="https://dev.to/pwd9000/github-copilot-cli-a-devops-engineers-practical-guide-to-ai-powered-terminal-automation-1jh0"&gt;GitHub Copilot CLI: A DevOps Engineer's Practical Guide&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The Comparison Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Use this table to pick the right review surface for your situation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Setup Effort&lt;/th&gt;
&lt;th&gt;Automation&lt;/th&gt;
&lt;th&gt;Team Visibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub.com Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;PR reviews at scale&lt;/td&gt;
&lt;td&gt;Low (org setting)&lt;/td&gt;
&lt;td&gt;High (auto-review)&lt;/td&gt;
&lt;td&gt;High (comments on PR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VS Code Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;td&gt;In-flight code&lt;/td&gt;
&lt;td&gt;Minimal (built-in)&lt;/td&gt;
&lt;td&gt;Manual trigger&lt;/td&gt;
&lt;td&gt;Low (local only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Team standards&lt;/td&gt;
&lt;td&gt;Low (one file)&lt;/td&gt;
&lt;td&gt;Passive (always-on)&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Repeatable plays&lt;/td&gt;
&lt;td&gt;Low (per prompt)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Specialised roles&lt;/td&gt;
&lt;td&gt;Medium (agent config)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP PR Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Deep PR analysis&lt;/td&gt;
&lt;td&gt;Medium (server setup)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;High (can post to PR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coding Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Automated fixes&lt;/td&gt;
&lt;td&gt;Low (already enabled)&lt;/td&gt;
&lt;td&gt;High (issue-driven)&lt;/td&gt;
&lt;td&gt;High (creates PRs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copilot CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Pre-commit checks&lt;/td&gt;
&lt;td&gt;Low (install &lt;code&gt;copilot&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Manual/scriptable&lt;/td&gt;
&lt;td&gt;Low (local only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Choosing Your Starting Point
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team just getting started?&lt;/strong&gt; Enable GitHub.com native review. It requires no editor changes and covers every PR automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual developer wanting better habits?&lt;/strong&gt; Start with VS Code review selection. It is built in and instant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team with established coding standards?&lt;/strong&gt; Add custom instructions. Your standards become Copilot's standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mature team wanting structured workflows?&lt;/strong&gt; Build prompt files and agents. Create a library of review plays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dealing with complex PRs and cross-references?&lt;/strong&gt; Set up MCP. Live context makes reviews dramatically better.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Worked Example: End-to-End PR Review
&lt;/h2&gt;

&lt;p&gt;Let us walk through a realistic review workflow that combines multiple surfaces. Imagine you have a teammate's PR that adds a new user registration endpoint with database access and email notifications.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Pre-Push Local Check (CLI)
&lt;/h3&gt;

&lt;p&gt;Before the PR even exists, the developer reviews their own changes locally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review my staged changes for security issues, particularly around user input handling and database access"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot flags that the email field is not validated and the SQL query uses string interpolation. The developer fixes both before pushing.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: PR Created, Copilot Auto-Reviews (GitHub.com)
&lt;/h3&gt;

&lt;p&gt;The developer pushes and creates a PR. Copilot automatically reviews it (auto-review is enabled) and posts inline comments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High&lt;/strong&gt;: Missing rate limiting on the registration endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt;: The error response leaks internal database column names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low&lt;/strong&gt;: Variable &lt;code&gt;usr&lt;/code&gt; should be &lt;code&gt;user&lt;/code&gt; per naming conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team's &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt; includes rate limiting and error handling standards, so Copilot catches these against the team's own rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Deep Dive in VS Code (Review Selection + MCP)
&lt;/h3&gt;

&lt;p&gt;You open the PR branch in VS Code. You select the registration handler function and use &lt;strong&gt;Copilot &amp;gt; Review and Comment&lt;/strong&gt; for a focused analysis.&lt;/p&gt;

&lt;p&gt;Then you use MCP to pull in broader context:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fetch PR #87, including the diff, linked issue #156, and any existing review comments.
Review the entire PR for security compliance. Consider the requirements in issue #156
and check that all acceptance criteria are met.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot correlates the PR changes with the issue requirements and identifies that one acceptance criterion (email verification flow) is missing from the implementation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Structured Security Review (Prompt File)
&lt;/h3&gt;

&lt;p&gt;You run &lt;code&gt;/security-review&lt;/code&gt; in VS Code chat. The prompt file produces a structured table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:45&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No rate limiting&lt;/td&gt;
&lt;td&gt;Add express-rate-limit middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:62&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQL string interpolation&lt;/td&gt;
&lt;td&gt;Use parameterised query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:78&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error leaks DB schema&lt;/td&gt;
&lt;td&gt;Return generic error message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;code&gt;email.ts:12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SMTP credentials in env check&lt;/td&gt;
&lt;td&gt;Add startup validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Step 5: Automated Fix (Coding Agent)
&lt;/h3&gt;

&lt;p&gt;For the mechanical fixes, you create a GitHub Issue:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Address security review findings on PR #87

Fix the following issues found during code review:
1. Add rate limiting middleware to POST /api/register (max 5 requests per minute per IP)
2. Convert SQL query on line 62 to use parameterised statements
3. Replace detailed error responses with generic messages
4. Add SMTP credential validation at startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The coding agent picks up the issue, implements the fixes, and opens a follow-up PR.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Human Review
&lt;/h3&gt;

&lt;p&gt;With the mechanical issues resolved, the human reviewer focuses on what matters most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the registration flow make business sense?&lt;/li&gt;
&lt;li&gt;Is the email notification content appropriate?&lt;/li&gt;
&lt;li&gt;Does the database schema support future requirements?&lt;/li&gt;
&lt;li&gt;Are the architectural decisions sound?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI handled the mechanical first pass. The human focuses on design, domain, and judgement.&lt;/p&gt;


&lt;h2&gt;
  
  
  Tips and Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Layer your review surfaces.&lt;/strong&gt; No single surface catches everything. Use GitHub.com auto-review as your always-on baseline, prompt files for structured deep dives, and MCP for complex PRs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write clear review instructions.&lt;/strong&gt; Whether in &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt;, VS Code settings, or agent definitions, specific instructions produce specific feedback. "Check for security issues" is vague. "Ensure all user input is sanitised, all queries are parameterised, and no secrets are hardcoded" is actionable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Treat AI review as a first pass, not the final word.&lt;/strong&gt; Copilot is exceptional at catching mechanical issues (bugs, security patterns, style violations) but does not understand your business domain. Human reviewers should always have the last say on design, architecture, and domain logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep review instructions version-controlled.&lt;/strong&gt; Store them in &lt;code&gt;.github/&lt;/code&gt; so they evolve with your codebase and are reviewed like any other code change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start small, expand gradually.&lt;/strong&gt; Enable GitHub.com auto-review today. Add custom instructions next week. Build your first prompt file next month. You do not need all eight surfaces on day one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use different agents for different review concerns.&lt;/strong&gt; A security review agent should not worry about variable naming. A style review agent should not flag architectural choices. Specialised agents give focused, high-quality feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Combine MCP with prompt files for maximum context.&lt;/strong&gt; A prompt file defines the review structure. MCP provides the live data (PR diff, comments, issues). Together, they produce the most thorough reviews.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review the reviewer.&lt;/strong&gt; Periodically check Copilot's review output against your team's actual standards. If it is flagging too many false positives or missing real issues, update your instructions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Code review is one of the highest-value activities in software engineering, and also one of the most time-consuming. GitHub Copilot provides eight distinct surfaces for AI-assisted review, each suited to a different moment in your workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub.com&lt;/strong&gt; catches issues at the PR level, automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; catches issues at the code level, on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom instructions&lt;/strong&gt; make your team's standards automatic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt files&lt;/strong&gt; turn review workflows into repeatable commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom agents&lt;/strong&gt; create dedicated reviewer personas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; connects reviews to live PR data and project context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The coding agent&lt;/strong&gt; automates fixes for review findings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The CLI&lt;/strong&gt; enables fast local checks before code leaves your machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real power comes from combining them. Start with GitHub.com auto-review as your baseline, layer on custom instructions for your team's standards, and add prompt files and agents as your review workflows mature.&lt;/p&gt;

&lt;p&gt;Your reviewers will thank you. Your codebase will thank you. And the bugs that never make it to production? They will never know what hit them.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 13-03-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Evaluating LLM Models in GitHub Copilot. A Practical Scoring and Assessment Guide</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Fri, 06 Mar 2026 18:12:20 +0000</pubDate>
      <link>https://dev.to/pwd9000/evaluating-llm-models-in-github-copilot-a-practical-scoring-and-assessment-guide-1f23</link>
      <guid>https://dev.to/pwd9000/evaluating-llm-models-in-github-copilot-a-practical-scoring-and-assessment-guide-1f23</guid>
      <description>&lt;h2&gt;
  
  
  Evaluating LLM Models in GitHub Copilot. A Practical Scoring and Assessment Guide
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot gives us access to a fast-moving set of LLMs from multiple providers. That is great for innovation, but it also creates a practical problem for teams. Which model should you use for a specific task, and how do you justify that decision with evidence instead of gut feel?&lt;/p&gt;

&lt;p&gt;This guide is a practical framework you can use with your own network and team. We will cover how model evaluation works, how to build your own scoring approach, and how to run repeatable comparisons so you can choose models with confidence as new releases arrive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Model Evaluation Matters
&lt;/h2&gt;

&lt;p&gt;Choosing a model is no longer a one-time decision.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models are specialised&lt;/strong&gt;: some are better for fast lightweight tasks, others for deeper reasoning and debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost matters&lt;/strong&gt;: different models have different premium request multipliers in Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model catalogues change frequently&lt;/strong&gt;: new models are added, and older ones are retired.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams need consistency&lt;/strong&gt;: shared evaluation criteria helps avoid random model switching and uneven output quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you do not evaluate, you usually optimise for what feels fastest in the moment. That often creates hidden costs later in rework, review cycles, and reliability issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Models Available in GitHub Copilot Today
&lt;/h2&gt;

&lt;p&gt;GitHub maintains a live reference of supported AI models. The most important point is this. Treat the docs as the source of truth because availability can vary by client, plan, and release cycle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported models: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/supported-models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Model comparison: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the time of writing, Copilot includes models from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; (for example GPT family and Codex variants)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; (Claude family)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt; (Gemini family)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xAI&lt;/strong&gt; (for example Grok Code Fast 1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copilot-tuned options&lt;/strong&gt; in preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical way to think about model choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast/simple tasks&lt;/strong&gt;: quick syntax help, small edits, repetitive transformations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General coding/writing&lt;/strong&gt;: day-to-day coding, docs, refactoring support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep reasoning/debugging&lt;/strong&gt;: multi-step investigations, architecture-level decisions, complex defect analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic workflows&lt;/strong&gt;: long-running coding tasks in chat/agent modes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto model selection&lt;/strong&gt; is available in supported IDE chat experiences, and can choose a model automatically.&lt;/li&gt;
&lt;li&gt;You can still &lt;strong&gt;override manually&lt;/strong&gt; when you have evidence from your own evaluation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How LLMs Are Evaluated in Industry
&lt;/h2&gt;

&lt;p&gt;Public benchmark scores are useful signals, but they are not the whole story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Benchmark Families
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;Broad knowledge and reasoning&lt;/td&gt;
&lt;td&gt;General model capability checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval / MBPP&lt;/td&gt;
&lt;td&gt;Code generation correctness&lt;/td&gt;
&lt;td&gt;Coding assistant comparisons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-bench&lt;/td&gt;
&lt;td&gt;Real software issue resolution&lt;/td&gt;
&lt;td&gt;Engineering task realism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K / MATH&lt;/td&gt;
&lt;td&gt;Mathematical reasoning&lt;/td&gt;
&lt;td&gt;Structured reasoning quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC / HellaSwag&lt;/td&gt;
&lt;td&gt;Commonsense and reasoning&lt;/td&gt;
&lt;td&gt;General reasoning robustness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TruthfulQA&lt;/td&gt;
&lt;td&gt;Truthfulness and hallucination tendency&lt;/td&gt;
&lt;td&gt;Reliability risk checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MT-Bench / Arena-style pairwise&lt;/td&gt;
&lt;td&gt;Conversational quality and preference&lt;/td&gt;
&lt;td&gt;Human preference alignment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Useful references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MMLU paper: &lt;a href="https://arxiv.org/abs/2009.03300" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2009.03300&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;HumanEval repo: &lt;a href="https://github.com/openai/human-eval" rel="noopener noreferrer"&gt;https://github.com/openai/human-eval&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SWE-bench: &lt;a href="https://www.swebench.com/" rel="noopener noreferrer"&gt;https://www.swebench.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chatbot Arena: &lt;a href="https://lmarena.ai/" rel="noopener noreferrer"&gt;https://lmarena.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hugging Face leaderboard: &lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Benchmarks Alone Are Not Enough
&lt;/h3&gt;

&lt;p&gt;Benchmarks can miss your local context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your coding standards&lt;/li&gt;
&lt;li&gt;your cloud/platform stack&lt;/li&gt;
&lt;li&gt;your repo structure&lt;/li&gt;
&lt;li&gt;your incident patterns&lt;/li&gt;
&lt;li&gt;your definition of acceptable risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A model can rank highly and still underperform on your real workloads. That is why self-assessment is essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Evaluation Framework You Can Run Yourself
&lt;/h2&gt;

&lt;p&gt;Use a lightweight internal framework you can rerun monthly or quarterly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define Evaluation Scenarios
&lt;/h3&gt;

&lt;p&gt;Create 10 to 20 prompts based on real work. Keep them representative and repeatable.&lt;/p&gt;

&lt;p&gt;Examples for DevOps/platform teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix a failing GitHub Actions workflow from logs&lt;/li&gt;
&lt;li&gt;Refactor a Terraform module and preserve backwards compatibility&lt;/li&gt;
&lt;li&gt;Generate tests for a PowerShell script with edge cases&lt;/li&gt;
&lt;li&gt;Write an incident summary from deployment telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Define a Scoring Rubric
&lt;/h3&gt;

&lt;p&gt;Score each response against the same dimensions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;1 (Poor)&lt;/th&gt;
&lt;th&gt;3 (Acceptable)&lt;/th&gt;
&lt;th&gt;5 (Excellent)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;Wrong or unusable output&lt;/td&gt;
&lt;td&gt;Works with fixes&lt;/td&gt;
&lt;td&gt;Works first time, production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning quality&lt;/td&gt;
&lt;td&gt;No clear logic&lt;/td&gt;
&lt;td&gt;Basic explanation&lt;/td&gt;
&lt;td&gt;Clear reasoning with trade-offs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction adherence&lt;/td&gt;
&lt;td&gt;Misses key constraints&lt;/td&gt;
&lt;td&gt;Follows most constraints&lt;/td&gt;
&lt;td&gt;Follows all constraints precisely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security and safety&lt;/td&gt;
&lt;td&gt;Introduces risky patterns&lt;/td&gt;
&lt;td&gt;Neutral/safe enough&lt;/td&gt;
&lt;td&gt;Proactively applies safer patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintainability&lt;/td&gt;
&lt;td&gt;Hard to read/operate&lt;/td&gt;
&lt;td&gt;Adequate quality&lt;/td&gt;
&lt;td&gt;Clear, testable, maintainable output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency usefulness&lt;/td&gt;
&lt;td&gt;Too slow for value&lt;/td&gt;
&lt;td&gt;Acceptable speed&lt;/td&gt;
&lt;td&gt;Fast with strong quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Run Blind Comparisons
&lt;/h3&gt;

&lt;p&gt;Do not show model names to reviewers during scoring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the same prompt set for each model.&lt;/li&gt;
&lt;li&gt;Randomise response order.&lt;/li&gt;
&lt;li&gt;Have at least two reviewers score each output.&lt;/li&gt;
&lt;li&gt;Average the scores to reduce individual bias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Add Cost-Performance Scoring
&lt;/h3&gt;

&lt;p&gt;Quality alone is not enough to pick a model. A model that scores slightly higher but costs several times more per request may not be worth it for everyday tasks. Adding a cost dimension keeps your evaluation grounded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to find cost data.&lt;/strong&gt; GitHub publishes premium request multipliers for each model in the Copilot docs. These multipliers tell you how many premium requests a single interaction with that model consumes relative to the baseline. Use this as your cost proxy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Premium request costs: &lt;a href="https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Calculate a value score.&lt;/strong&gt; Divide your average quality score by the model's premium multiplier:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Value Score = Average Quality Score / Premium Multiplier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worked example.&lt;/strong&gt; Suppose three models score as follows after your blind evaluation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Avg quality (1-5)&lt;/th&gt;
&lt;th&gt;Premium multiplier&lt;/th&gt;
&lt;th&gt;Value score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model A&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;td&gt;4.4 / 1 = &lt;strong&gt;4.4&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model B&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;td&gt;4.7 / 3 = &lt;strong&gt;1.57&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model C&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;0.33x&lt;/td&gt;
&lt;td&gt;4.1 / 0.33 = &lt;strong&gt;12.42&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Model B scores highest on raw quality, but its value score is the lowest because each request costs three times the baseline. Model C delivers almost the same quality at a fraction of the cost, making it the best value pick for lightweight tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to ignore the value score.&lt;/strong&gt; Cost efficiency matters most for high-volume, routine tasks. For critical debugging or architecture decisions where correctness has outsized impact, pick the highest quality model regardless of cost. Use the value score as a guide, not a rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Ways to Run Your Own Evaluation
&lt;/h2&gt;

&lt;p&gt;There are several free approaches you can use depending on your team size and automation needs. Here are two that work well with GitHub Copilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Manual Side-by-Side Comparison in Copilot Chat
&lt;/h3&gt;

&lt;p&gt;The simplest method is to use GitHub Copilot Chat directly. No extra tooling required.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Copilot Chat in VS Code and select your first model.&lt;/li&gt;
&lt;li&gt;Run a prompt from your evaluation set and capture the response.&lt;/li&gt;
&lt;li&gt;Switch to the next model using the model picker and run the same prompt.&lt;/li&gt;
&lt;li&gt;Score each response using your rubric and record the results.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple markdown table works well for tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Prompt | Model A | Model B | Model C | Notes |
| --- | --- | --- | --- | --- |
| Fix failing workflow | 4 | 5 | 3 | B caught root cause immediately |
| Refactor Terraform | 3 | 4 | 4 | A missed a variable dependency |
| Generate Pester tests | 5 | 4 | 3 | A covered more edge cases |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This approach works best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual contributors evaluating models for their own workflow.&lt;/li&gt;
&lt;li&gt;Small teams running a quick monthly check.&lt;/li&gt;
&lt;li&gt;Getting started before investing in automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tips for a fair manual comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the exact same prompt text for each model.&lt;/li&gt;
&lt;li&gt;Do not reveal the model name to the scorer if more than one person is reviewing.&lt;/li&gt;
&lt;li&gt;Record latency (how long you waited) alongside quality scores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Option B: Automated Evaluation with DeepEval
&lt;/h3&gt;

&lt;p&gt;If you want repeatable, scriptable evaluation that integrates with CI/CD, DeepEval is a practical open-source choice. It uses pytest-style test cases and supports custom scoring criteria via an LLM-as-a-judge approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://deepeval.com/" rel="noopener noreferrer"&gt;https://deepeval.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/confident-ai/deepeval" rel="noopener noreferrer"&gt;https://github.com/confident-ai/deepeval&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  1. Install
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; deepeval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Create a test file
&lt;/h4&gt;

&lt;p&gt;Create &lt;code&gt;test_copilot_eval.py&lt;/code&gt; with test cases that match your evaluation scenarios:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;assert_test&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GEval&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval.test_case&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;


&lt;span class="n"&gt;correctness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GEval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Correctness&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The response must correctly identify the root cause and provide a secure, working fix.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACTUAL_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EXPECTED_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;maintainability&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GEval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Maintainability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The response must produce clear, readable, and well-structured code.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACTUAL_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_workflow_fix&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;test_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Given this GitHub Actions error: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OIDC token audience invalid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, identify root cause and fix.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;actual_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;paste model response here&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The OIDC token audience must match the value configured in your identity provider. Update the audience field in your federated identity settings.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;correctness&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_terraform_refactor&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;test_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refactor this Terraform snippet to reduce duplication while preserving behaviour.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;actual_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;paste model response here&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;maintainability&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Run the evaluation
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepeval &lt;span class="nb"&gt;test &lt;/span&gt;run test_copilot_eval.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Interpret results
&lt;/h4&gt;

&lt;p&gt;When you run the evaluation, DeepEval produces terminal output similar to the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 2 test(s)...

  test_workflow_fix
    ✅ Correctness (score: 0.82, threshold: 0.5, passed: True)

  test_terraform_refactor
    ✅ Maintainability (score: 0.71, threshold: 0.5, passed: True)

======================= Results =======================
Tests run: 2, Passed: 2, Failed: 0
Overall pass rate: 100.0%

Metric scores:
  Correctness       avg: 0.82   min: 0.82   max: 0.82
  Maintainability   avg: 0.71   min: 0.71   max: 0.71
=======================================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each test case is scored on a 0 to 1 scale against your criteria. A score above the threshold you set counts as a pass. If a test fails, the output shows the reason so you can see where the model response fell short:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  test_workflow_fix
    ❌ Correctness (score: 0.34, threshold: 0.5, passed: False)
       Reason: The response did not identify the OIDC audience
       mismatch as the root cause and suggested unrelated
       permission changes instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To compare models, run the same test file once per model (swapping in each model's responses for &lt;code&gt;actual_output&lt;/code&gt;) and record the results side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test case&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Model A&lt;/th&gt;
&lt;th&gt;Model B&lt;/th&gt;
&lt;th&gt;Model C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;test_workflow_fix&lt;/td&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;0.82&lt;/td&gt;
&lt;td&gt;0.91&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test_terraform_refactor&lt;/td&gt;
&lt;td&gt;Maintainability&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall pass rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives you a quantitative basis for model comparison that you can track over time. You can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add multiple metrics per test (correctness, security, maintainability).&lt;/li&gt;
&lt;li&gt;Integrate tests into your CI/CD pipeline for regression checks when new models are released.&lt;/li&gt;
&lt;li&gt;Export results to JSON for further analysis or dashboard reporting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Define custom &lt;code&gt;GEval&lt;/code&gt; metrics for each dimension in your scoring rubric to get automated scoring that aligns with your team's specific criteria.&lt;/p&gt;
&lt;h3&gt;
  
  
  Other Free Tools Worth Knowing
&lt;/h3&gt;

&lt;p&gt;A few other open-source options are available if you want to explore further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Evals&lt;/strong&gt; (&lt;a href="https://github.com/openai/evals" rel="noopener noreferrer"&gt;https://github.com/openai/evals&lt;/a&gt;): a framework and registry of benchmarks for evaluating LLMs and LLM systems. Good for standardised benchmark testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Evaluation Harness&lt;/strong&gt; (&lt;a href="https://github.com/EleutherAI/lm-evaluation-harness" rel="noopener noreferrer"&gt;https://github.com/EleutherAI/lm-evaluation-harness&lt;/a&gt;): the backend behind the Hugging Face Open LLM Leaderboard. Supports 60+ academic benchmarks with API model support. Best suited for formal benchmark comparisons.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Recommended Team Operating Model
&lt;/h2&gt;

&lt;p&gt;Use this cadence so your model decisions stay current:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run a small benchmark set every month.&lt;/li&gt;
&lt;li&gt;Run a fuller evaluation set each quarter.&lt;/li&gt;
&lt;li&gt;Re-run when GitHub adds or retires major models.&lt;/li&gt;
&lt;li&gt;Publish a one-page internal scorecard for your team.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple scorecard format:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Avg quality&lt;/th&gt;
&lt;th&gt;Avg latency&lt;/th&gt;
&lt;th&gt;Cost proxy&lt;/th&gt;
&lt;th&gt;Value score&lt;/th&gt;
&lt;th&gt;Best-fit tasks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model A&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;General coding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model B&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;td&gt;1.57&lt;/td&gt;
&lt;td&gt;Deep debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model C&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;0.9s&lt;/td&gt;
&lt;td&gt;0.33x&lt;/td&gt;
&lt;td&gt;12.42&lt;/td&gt;
&lt;td&gt;Fast lightweight edits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This makes model selection transparent and easier to defend in architecture and governance reviews.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The model landscape in GitHub Copilot will keep moving. That is a feature, not a problem, if your team has a repeatable evaluation method.&lt;/p&gt;

&lt;p&gt;Start with a small prompt set, apply a consistent scoring rubric, and review quality, latency, and cost together. Once your network sees the method in action, model choice becomes a practical engineering decision instead of a subjective debate.&lt;/p&gt;
&lt;h3&gt;
  
  
  Additional Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supported AI models in Copilot: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/supported-models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI model comparison in Copilot: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changing model in Copilot Chat: &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepEval docs: &lt;a href="https://deepeval.com/docs/getting-started" rel="noopener noreferrer"&gt;https://deepeval.com/docs/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepEval GitHub: &lt;a href="https://github.com/confident-ai/deepeval" rel="noopener noreferrer"&gt;https://github.com/confident-ai/deepeval&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI Evals: &lt;a href="https://github.com/openai/evals" rel="noopener noreferrer"&gt;https://github.com/openai/evals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LM Evaluation Harness: &lt;a href="https://github.com/EleutherAI/lm-evaluation-harness" rel="noopener noreferrer"&gt;https://github.com/EleutherAI/lm-evaluation-harness&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 06-03-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Thu, 26 Feb 2026 09:09:32 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l</link>
      <guid>https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?
&lt;/h2&gt;

&lt;p&gt;If you have been following my recent GitHub Copilot posts, you might have noticed a pattern. We have covered instructions, prompt files, skills, MCP, coding agents, and more. Each feature is powerful on its own. The confusing part is deciding which one to use for a specific problem.&lt;/p&gt;

&lt;p&gt;This post is your practical decision guide.&lt;/p&gt;

&lt;p&gt;We will compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The 60-Second Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;th&gt;Typical location&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;When not to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;, &lt;code&gt;.github/instructions/*.instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Always-on or pattern-based&lt;/td&gt;
&lt;td&gt;Team standards and default behaviour&lt;/td&gt;
&lt;td&gt;One-off tasks or named workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/prompts/*.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual, on-demand slash command&lt;/td&gt;
&lt;td&gt;Repeatable one-shot tasks&lt;/td&gt;
&lt;td&gt;Multi-step runbooks with assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/agents/*.agent.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selected agent mode/persona&lt;/td&gt;
&lt;td&gt;Specialised role plus tool control&lt;/td&gt;
&lt;td&gt;General coding help or tiny tweaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;On-demand and auto-discovered&lt;/td&gt;
&lt;td&gt;Reusable multi-step workflows with resources&lt;/td&gt;
&lt;td&gt;Simple standards or hard policy enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.vscode/mcp.json&lt;/code&gt; or user &lt;code&gt;mcp.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Tool and data connectivity&lt;/td&gt;
&lt;td&gt;Live access to external systems and APIs&lt;/td&gt;
&lt;td&gt;Static guidance that does not need external context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/hooks/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent workflow lifecycle events&lt;/td&gt;
&lt;td&gt;Hard policy gates and safety controls&lt;/td&gt;
&lt;td&gt;Soft guidance or stylistic preferences&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you remember one thing, remember this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; for always-on guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt; for named one-off tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; for reusable workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Agents&lt;/strong&gt; for role and tool boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; for external live context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; for hard stop enforcement.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1) Custom Instructions: "Always apply these rules"
&lt;/h2&gt;

&lt;p&gt;Use custom instructions when you want Copilot to behave consistently without repeating yourself in every chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Markdown instructions that are automatically added to context.&lt;/li&gt;
&lt;li&gt;Three flavours:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global&lt;/strong&gt;: &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; applies to every chat request in the workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File/task-targeted&lt;/strong&gt;: &lt;code&gt;*.instructions.md&lt;/code&gt; files with an &lt;code&gt;applyTo&lt;/code&gt; glob pattern or task description match. Store them in &lt;code&gt;.github/instructions/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent compatible&lt;/strong&gt;: &lt;code&gt;AGENTS.md&lt;/code&gt; in the workspace root is recognised by multiple AI agents (not only Copilot). Supports subfolder-level scoping for monorepos (experimental).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Instructions can also be shared at GitHub &lt;strong&gt;organisation level&lt;/strong&gt;, so every repository in the org inherits a common baseline. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level instructions require a Copilot Business or Enterprise plan.)&lt;/li&gt;

&lt;li&gt;Priority order when conflicts occur: personal (user-level) &amp;gt; repository &amp;gt; organisation.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want all IaC suggestions to follow your team's naming and tagging conventions, e.g. every resource must include &lt;code&gt;environment&lt;/code&gt; and &lt;code&gt;cost-centre&lt;/code&gt; tags.&lt;/li&gt;
&lt;li&gt;You want consistent code style across the repo, e.g. British English in comments, four-space indentation, or a preferred import order.&lt;/li&gt;
&lt;li&gt;You want secure defaults baked into every suggestion, e.g. private endpoints by default, no public IPs without justification, secrets always pulled from a vault.&lt;/li&gt;
&lt;li&gt;You work with multiple AI agents and want a single &lt;code&gt;AGENTS.md&lt;/code&gt; recognised by all of them, so rules are defined once and shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You only need a task once.&lt;/li&gt;
&lt;li&gt;You need a named slash command.&lt;/li&gt;
&lt;li&gt;You need a full runbook that includes extra scripts and templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick guide: which instruction type?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;When to reach for it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Single project, Copilot-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.instructions.md&lt;/code&gt; + &lt;code&gt;applyTo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Different rules for different file types or frameworks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-agent workflows, or subfolder-level monorepo rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organisation instructions&lt;/td&gt;
&lt;td&gt;Shared baseline across all repos in a GitHub org&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;"For all cloud IaC, always use least privilege, avoid hardcoded secrets, and follow approved resource naming conventions."&lt;/p&gt;

&lt;p&gt;For a deeper walkthrough, see my earlier post: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2025/DevAIOps-Inst-GitHub/DevAIOps-Inst-GitHub.md" rel="noopener noreferrer"&gt;Instructions and Prompt Files to supercharge VS Code with GitHub Copilot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions" rel="noopener noreferrer"&gt;Use custom instructions in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Prompt Files: "Run this specific play"
&lt;/h2&gt;

&lt;p&gt;Prompt files are reusable slash commands for recurring tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Markdown prompt files, usually in &lt;code&gt;.github/prompts/*.prompt.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Invoked with &lt;code&gt;/&lt;/code&gt; in chat, just like slash commands.&lt;/li&gt;
&lt;li&gt;YAML frontmatter can define the &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, and &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Support built-in variables such as &lt;code&gt;${selection}&lt;/code&gt;, &lt;code&gt;${file}&lt;/code&gt;, and &lt;code&gt;${input:variableName}&lt;/code&gt; for dynamic context.&lt;/li&gt;
&lt;li&gt;Can reference a custom agent via the &lt;code&gt;agent&lt;/code&gt; field, inheriting that agent's tool set.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a quick &lt;code&gt;/security-review&lt;/code&gt; command that scans the current file for common misconfigurations such as open ports or missing encryption.&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;/generate-module&lt;/code&gt; to scaffold a new IaC module with consistent structure, inputs, outputs, and documentation every time.&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;/release-notes&lt;/code&gt; that always follows a fixed changelog format, pulling context from recent commits.&lt;/li&gt;
&lt;li&gt;You want to override the default agent for a specific task by setting &lt;code&gt;agent: plan&lt;/code&gt; in the frontmatter, e.g. a &lt;code&gt;/design-review&lt;/code&gt; prompt that runs inside a planning-only agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need always-on behavioural standards.&lt;/li&gt;
&lt;li&gt;You need automatic discovery of a rich workflow with supporting resources.&lt;/li&gt;
&lt;li&gt;You need deterministic enforcement logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;/pipeline-hardening&lt;/code&gt; that checks secrets handling, approval gates, artifact integrity, and rollback readiness. Use &lt;code&gt;${input:environment}&lt;/code&gt; to let the user specify which environment to review.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/prompt-files" rel="noopener noreferrer"&gt;Use prompt files in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Custom Agents: "Use this specialist persona and tool set"
&lt;/h2&gt;

&lt;p&gt;Custom Agents were previously known as custom chat modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Agent definition files in &lt;code&gt;.github/agents/*.agent.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define a specialist persona, instructions, allowed tools, and optional &lt;strong&gt;handoffs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Designed for role-specific flows such as planning, review, or implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handoffs&lt;/strong&gt; let you chain agents into guided workflows. After one agent finishes, a handoff button appears to transition to the next agent with pre-filled context. For example: Plan &amp;gt; Implement &amp;gt; Review.&lt;/li&gt;
&lt;li&gt;Can run as &lt;strong&gt;subagents&lt;/strong&gt; and can also be reused in &lt;strong&gt;background agents&lt;/strong&gt; and &lt;strong&gt;cloud agents&lt;/strong&gt;. (&lt;strong&gt;Note:&lt;/strong&gt; The coding agent requires a Copilot Pro+, Business, or Enterprise plan.)&lt;/li&gt;
&lt;li&gt;Can be shared at &lt;strong&gt;GitHub organisation level&lt;/strong&gt;, so every repo in the org gets the same agent definitions. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level agent sharing requires a Copilot Business or Enterprise plan.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a &lt;strong&gt;Security Reviewer&lt;/strong&gt; agent that can only read code and run linters but never edit files, e.g. a pre-merge review step that flags risks without changing anything.&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;Planner&lt;/strong&gt; agent that outputs a structured implementation plan and then hands off to an &lt;strong&gt;Implementation&lt;/strong&gt; agent, giving the team a review checkpoint before code is written.&lt;/li&gt;
&lt;li&gt;You want strict tool boundaries, e.g. an &lt;strong&gt;Auditor&lt;/strong&gt; agent with access to cloud cost APIs and read-only file tools, but no ability to execute commands or apply changes.&lt;/li&gt;
&lt;li&gt;You need a guided multi-step workflow where each stage has a different persona and tool set, such as Design &amp;gt; Build &amp;gt; Test.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You just need a short reusable prompt.&lt;/li&gt;
&lt;li&gt;You only need default team standards.&lt;/li&gt;
&lt;li&gt;You are trying to solve external data access without MCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;cost-optimiser.agent.md&lt;/code&gt; that only has read-only cloud and repo tools, then &lt;strong&gt;hands off&lt;/strong&gt; to a separate implementation agent for approved changes. The handoff button appears automatically after the cost analysis completes.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-agents" rel="noopener noreferrer"&gt;Custom agents in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Skills: "Package a reusable runbook"
&lt;/h2&gt;

&lt;p&gt;Skills are where things get interesting for SRE and DevOps teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Folder-based capability packages with a required &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stored in &lt;code&gt;.github/skills/&amp;lt;skill-name&amp;gt;/&lt;/code&gt; (workspace) or &lt;code&gt;~/.copilot/skills/&lt;/code&gt; (personal, available across all workspaces).&lt;/li&gt;
&lt;li&gt;Can include scripts, templates, references, and examples alongside the instructions.&lt;/li&gt;
&lt;li&gt;Loaded progressively: Copilot reads name and description first, loads full instructions only when relevant, and accesses bundled resources on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: Skills follow the open &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skills standard&lt;/a&gt;. The same skill works across VS Code, GitHub Copilot CLI, and the GitHub Copilot coding agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a repeatable incident triage workflow that walks through impact assessment, timeline capture, and owner assignment using a bundled template.&lt;/li&gt;
&lt;li&gt;You want a postmortem assistant that generates a structured report with root-cause analysis, action items, and SLA impact, pulling from scripts and examples in the skill folder.&lt;/li&gt;
&lt;li&gt;You want a CI/CD troubleshooting playbook the whole team can invoke, e.g. a skill that runs diagnostic scripts against a failed pipeline and suggests fixes.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;cross-tool portability&lt;/strong&gt; so the same workflow works in VS Code, the CLI, and the coding agent without maintaining separate definitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You only need a global coding rule.&lt;/li&gt;
&lt;li&gt;You only need a tiny slash command with no supporting resources.&lt;/li&gt;
&lt;li&gt;You need hard policy blocking behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;incident-triage&lt;/code&gt; skill that collects service impact, timeline, likely root causes, next actions, and owner assignments using a consistent template. The same skill can be invoked from the CLI during on-call triage and from VS Code during post-incident review.&lt;/p&gt;

&lt;p&gt;My practical Skills deep dive: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2026/GitHub-Copilot-Skills-DevOps/GitHub-Copilot-Skills-DevOps.md" rel="noopener noreferrer"&gt;GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/agent-skills" rel="noopener noreferrer"&gt;Use Agent Skills in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5) MCP Servers: "Connect Copilot to live systems"
&lt;/h2&gt;

&lt;p&gt;MCP is often the missing piece when people expect Copilot to access live external context.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it is
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MCP (Model Context Protocol) is an open standard for connecting AI models to external tools and services.&lt;/li&gt;
&lt;li&gt;Configured in &lt;code&gt;.vscode/mcp.json&lt;/code&gt; (workspace) or user profile &lt;code&gt;mcp.json&lt;/code&gt;. Can also be installed from the VS Code MCP server gallery.&lt;/li&gt;
&lt;li&gt;MCP servers can provide four categories of capability:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Actions the agent can invoke (e.g. create an issue, query a database).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resources&lt;/strong&gt;: Data the agent can pull into context (e.g. files, API responses, database rows).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt;: Pre-configured prompt templates contributed by the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Apps&lt;/strong&gt;: Interactive UI components such as forms and visualisations rendered directly in chat.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Organisations can centrally manage MCP server access via GitHub policies. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level MCP policy management requires a Copilot Business or Enterprise plan.)&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need live GitHub data inside chat, e.g. listing open issues, checking workflow run status, or creating a PR directly from a conversation.&lt;/li&gt;
&lt;li&gt;You need live cloud metadata, e.g. pulling resource tags, SKU availability, or cost estimates from Azure, AWS, or GCP during an architecture review.&lt;/li&gt;
&lt;li&gt;You need external system context such as querying a database, pulling monitoring dashboards, or fetching ticket details from a service management tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static instructions are enough.&lt;/li&gt;
&lt;li&gt;The task is purely local code guidance.&lt;/li&gt;
&lt;li&gt;You have not reviewed trust and security implications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;Use GitHub MCP to create issues and inspect workflow runs, then use a cloud-compatible MCP server to pull environment metadata for triage context.&lt;/p&gt;

&lt;p&gt;My earlier MCP setup guide: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2025/DevAIOps-MCP-GitHub/DevAIOps-MCP-GitHub.md" rel="noopener noreferrer"&gt;Supercharge VSCode GitHub Copilot using Model Context Protocol (MCP) - Easy Setup Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/mcp-servers" rel="noopener noreferrer"&gt;Add and manage MCP servers in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6) Hooks: "Enforce policy at execution time"
&lt;/h2&gt;

&lt;p&gt;If instructions are advice, hooks are enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic shell commands that run at key strategic points in an agent's workflow.&lt;/li&gt;
&lt;li&gt;Configured as JSON files in &lt;code&gt;.github/hooks/*.json&lt;/code&gt; in your repository.&lt;/li&gt;
&lt;li&gt;Available hook types include: &lt;code&gt;sessionStart&lt;/code&gt;, &lt;code&gt;sessionEnd&lt;/code&gt;, &lt;code&gt;userPromptSubmitted&lt;/code&gt;, &lt;code&gt;preToolUse&lt;/code&gt;, &lt;code&gt;postToolUse&lt;/code&gt;, &lt;code&gt;agentStop&lt;/code&gt;, &lt;code&gt;subagentStop&lt;/code&gt;, and &lt;code&gt;errorOccurred&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;preToolUse&lt;/code&gt; hook is the most powerful because it can &lt;strong&gt;approve or deny&lt;/strong&gt; tool executions before they happen.&lt;/li&gt;
&lt;li&gt;Hooks receive detailed JSON input about the agent's actions, enabling context-aware automation.&lt;/li&gt;
&lt;li&gt;Work with both the &lt;strong&gt;Copilot coding agent&lt;/strong&gt; on GitHub and &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt;. (&lt;strong&gt;Note:&lt;/strong&gt; The coding agent and CLI require a Copilot Pro+, Business, or Enterprise plan.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need a hard control, not a recommendation, e.g. blocking any file edit that adds a public IP to IaC without an approved exception.&lt;/li&gt;
&lt;li&gt;You must block risky operations unless a condition passes, e.g. deny &lt;code&gt;bash&lt;/code&gt; commands that target production databases or delete cloud resource groups.&lt;/li&gt;
&lt;li&gt;You need consistent compliance checks before agent actions proceed, e.g. validating that every new service deployment includes a required cost tag.&lt;/li&gt;
&lt;li&gt;You want immutable audit logging of every tool invocation for regulatory or internal compliance, e.g. recording who ran what command and when.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A style guide or prompt convention is enough.&lt;/li&gt;
&lt;li&gt;You do not need strict allow or deny behaviour.&lt;/li&gt;
&lt;li&gt;You only need static behavioural guidance (use instructions instead).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;preToolUse&lt;/code&gt; hook that runs a security check script before any &lt;code&gt;bash&lt;/code&gt; or &lt;code&gt;edit&lt;/code&gt; tool call, blocking risky infrastructure changes in production unless required checks pass.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-hooks" rel="noopener noreferrer"&gt;About hooks for Copilot coding agent&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  So, Why This Many Primitives?
&lt;/h2&gt;

&lt;p&gt;Because they solve different control layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Behaviour layer&lt;/strong&gt;: Instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task invocation layer&lt;/strong&gt;: Prompt files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persona and tool boundary layer&lt;/strong&gt;: Custom agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow packaging layer&lt;/strong&gt;: Skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External connectivity layer&lt;/strong&gt;: MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy enforcement layer&lt;/strong&gt;: Hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not feature overlap. This is a composable system. You can mix and match:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;custom agent&lt;/strong&gt; can reference &lt;strong&gt;instructions files&lt;/strong&gt; via Markdown links so you do not duplicate rules.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;prompt file&lt;/strong&gt; can set &lt;code&gt;agent:&lt;/code&gt; to run inside a specific &lt;strong&gt;custom agent&lt;/strong&gt;, inheriting its tool set.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;skill&lt;/strong&gt; can bundle scripts that a &lt;strong&gt;custom agent&lt;/strong&gt; or &lt;strong&gt;prompt file&lt;/strong&gt; invokes.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;MCP server&lt;/strong&gt; provides tools that any agent, prompt, or skill can call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; sit underneath everything, enforcing policy regardless of which primitive triggered the action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight is that each primitive has a different &lt;strong&gt;lifetime&lt;/strong&gt; and &lt;strong&gt;trigger&lt;/strong&gt;. Instructions are always on. Prompts are invoked manually. Skills are discovered automatically or by slash command. Agents set a persistent persona for a session. MCP provides live external data. Hooks enforce hard gates at execution time.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical "When to Use What" Decision Flow
&lt;/h2&gt;

&lt;p&gt;Walk through these questions in order. Pick the &lt;strong&gt;first&lt;/strong&gt; match:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do you need a rule applied to &lt;strong&gt;every&lt;/strong&gt; chat request without anyone remembering to activate it? &lt;strong&gt;Instructions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;named, repeatable&lt;/strong&gt; task that people invoke on demand? &lt;strong&gt;Prompt File&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;specialist persona&lt;/strong&gt; with a limited set of tools, or a &lt;strong&gt;multi-step handoff&lt;/strong&gt; workflow? &lt;strong&gt;Custom Agent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;reusable multi-step runbook&lt;/strong&gt; with scripts, templates, or reference files bundled together? &lt;strong&gt;Skill&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Does the task require &lt;strong&gt;live data from an external system&lt;/strong&gt; (GitHub API, cloud metadata, databases)? Add &lt;strong&gt;MCP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Must a policy be &lt;strong&gt;enforced deterministically&lt;/strong&gt; with no chance the model ignores it? Add a &lt;strong&gt;Hook&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that 1 to 4 are "pick one" decisions, while 5 and 6 are additive layers you stack on top.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Mature DevOps Setup Looks Like
&lt;/h2&gt;

&lt;p&gt;A practical stack for a platform engineering team might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt;: Workspace-level &lt;code&gt;copilot-instructions.md&lt;/code&gt; for coding and security defaults. Scoped &lt;code&gt;*.instructions.md&lt;/code&gt; files for IaC, pipeline YAML, and language-specific conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt files&lt;/strong&gt;: 5 to 10 prompt files for common operational tasks such as &lt;code&gt;/security-review&lt;/code&gt;, &lt;code&gt;/release-notes&lt;/code&gt;, &lt;code&gt;/changelog&lt;/code&gt;, and &lt;code&gt;/generate-module&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom agents&lt;/strong&gt;: 2 to 3 agents (planning, implementation, security review) connected via handoffs so the team flows from plan to code to review in one conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: 3 to 6 skills for triage, postmortems, runbook generation, and IaC change risk analysis. These work the same in VS Code, the CLI, and the coding agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt;: GitHub MCP for issue and PR management, plus cloud-context MCP servers for pulling live environment metadata during triage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt;: &lt;code&gt;preToolUse&lt;/code&gt; hooks to block dangerous commands and &lt;code&gt;postToolUse&lt;/code&gt; hooks for audit logging in autonomous coding agent workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combination gives you speed, consistency, and safety without forcing everything into one mechanism.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you have ever asked "Should I use instructions, prompts, agents, or skills?", the answer is usually: &lt;strong&gt;use the smallest primitive that solves the actual problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add instructions first for always-on standards.&lt;/li&gt;
&lt;li&gt;Add prompt files when you catch yourself typing the same prompt repeatedly.&lt;/li&gt;
&lt;li&gt;Add skills when a workflow needs bundled scripts and templates.&lt;/li&gt;
&lt;li&gt;Add custom agents when you need role boundaries and handoff workflows.&lt;/li&gt;
&lt;li&gt;Add MCP when the task requires live external data.&lt;/li&gt;
&lt;li&gt;Add hooks where policy must be enforced, not suggested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between experimenting with Copilot and operationalising Copilot. Each primitive has a clear purpose, and together they form a composable customisation system.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 26-02-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Tue, 24 Feb 2026 16:35:29 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-skills-reusable-ai-workflows-for-devops-and-sres-caf</link>
      <guid>https://dev.to/pwd9000/github-copilot-skills-reusable-ai-workflows-for-devops-and-sres-caf</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs
&lt;/h2&gt;

&lt;p&gt;If you're a DevOps engineer or SRE, you probably have a handful of repeatable tasks that keep coming back: triaging failed pipelines, checking for risky Terraform changes, writing runbooks, and turning messy incident notes into something your team can actually use.&lt;/p&gt;

&lt;p&gt;Until recently, you could get part of the way there with &lt;strong&gt;custom instructions&lt;/strong&gt; and &lt;strong&gt;prompt files&lt;/strong&gt;. They are both great, but they do not fully solve the same problem: packaging a repeatable, multi-step workflow with its own supporting assets.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Agent Skills&lt;/strong&gt; comes in. Agent Skills is an open standard (see &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt;) that works with GitHub Copilot in VS Code, Copilot CLI, and the Copilot coding agent.&lt;/p&gt;

&lt;p&gt;In this post we will cover what Skills are, how to set them up in VS Code, and how to use them from beginner scenarios to more advanced DevOps and SRE use cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are GitHub Copilot Skills?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Skill&lt;/strong&gt; is an on-demand, reusable workflow for Copilot. A Skill lives in a folder, has a required &lt;code&gt;SKILL.md&lt;/code&gt;, and can include supporting resources such as scripts, references, and templates.&lt;/p&gt;

&lt;p&gt;At a high level, it is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable workflows&lt;/strong&gt; you want to reuse across a team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-step procedures&lt;/strong&gt; that benefit from checklists and branching logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled assets&lt;/strong&gt; such as scripts, templates, and short reference docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea is &lt;strong&gt;progressive loading&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copilot first uses the Skill &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; for discovery.&lt;/li&gt;
&lt;li&gt;If the request matches, it loads the Skill instructions.&lt;/li&gt;
&lt;li&gt;It only loads extra resources when the Skill references them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes Skills a good fit for DevOps because you can keep the default Copilot experience lean, then load a specialised runbook only when you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skills vs Prompts vs Instructions vs Agents vs Hooks
&lt;/h2&gt;

&lt;p&gt;Skills sit in the same overall customisation system as instructions, prompt files, custom agents, and hooks. They are not a replacement. They are a different primitive.&lt;/p&gt;

&lt;p&gt;Here is a practical DevOps-oriented way to think about them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;DevOps example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workspace instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always-on standards&lt;/td&gt;
&lt;td&gt;"Tag every Azure resource with &lt;code&gt;owner&lt;/code&gt; and &lt;code&gt;env&lt;/code&gt;"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standards for certain files&lt;/td&gt;
&lt;td&gt;Helm chart defaults for &lt;code&gt;**/values.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-shot tasks&lt;/td&gt;
&lt;td&gt;"Summarise this sprint's deployment changelog"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reusable workflows with assets&lt;/td&gt;
&lt;td&gt;Kubernetes rollback playbook + kubectl scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specialised role and tool limits&lt;/td&gt;
&lt;td&gt;Cost-optimisation advisor (read-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deterministic enforcement&lt;/td&gt;
&lt;td&gt;Reject Terraform plans that drop deletion protection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're new to Copilot customisation, my rule of thumb is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;instructions&lt;/strong&gt; when you want Copilot to behave consistently all the time.&lt;/li&gt;
&lt;li&gt;Use a &lt;strong&gt;prompt file&lt;/strong&gt; when you want a reusable one-off command.&lt;/li&gt;
&lt;li&gt;Use a &lt;strong&gt;Skill&lt;/strong&gt; when you want a repeatable workflow that feels like a runbook.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To use Skills effectively, you will want:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; with GitHub Copilot enabled&lt;/li&gt;
&lt;li&gt;A repo (or workspace) where you can commit the Skill folder so your team can share it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In VS Code chat, type &lt;code&gt;/skills&lt;/code&gt; to open the &lt;strong&gt;Configure Skills&lt;/strong&gt; menu and confirm VS Code can see your workspace Skills.&lt;/p&gt;

&lt;p&gt;Skills can be stored in a few locations. For team usage, the simplest is the repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.github/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VS Code also recognises &lt;code&gt;.claude/skills/&lt;/code&gt; and &lt;code&gt;.agents/skills/&lt;/code&gt; as project skill directories. For personal skills that follow you across workspaces, use &lt;code&gt;~/.copilot/skills/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you want to share Skills across multiple repos, VS Code also supports additional search locations via the &lt;code&gt;chat.agentSkillsLocations&lt;/code&gt; setting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your First Skill (Beginner Setup)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Create the folder
&lt;/h3&gt;

&lt;p&gt;Create this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/skills/incident-triage/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2) Add SKILL.md
&lt;/h3&gt;

&lt;p&gt;The front matter must match the folder name.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;incident-triage&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Triage&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incidents&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployments.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipeline&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fails,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;alert&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fires,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;you&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;need&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incident&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stakeholders.'&lt;/span&gt;
&lt;span class="na"&gt;argument-hint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Optional:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;environment,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;alert&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;link'&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Incident Triage&lt;/span&gt;

&lt;span class="gu"&gt;## When to Use&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Pipeline failed in &lt;span class="sb"&gt;`prod`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Pager/alert fired and you need a first response
&lt;span class="p"&gt;-&lt;/span&gt; You need a status update for stakeholders

&lt;span class="gu"&gt;## Procedure&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Confirm the affected service, environment, and impact
&lt;span class="p"&gt;2.&lt;/span&gt; Collect signal: alerts, recent deploys, logs, and error budgets
&lt;span class="p"&gt;3.&lt;/span&gt; Identify likely root cause categories (deploy, dependency, infra, config)
&lt;span class="p"&gt;4.&lt;/span&gt; Recommend next actions: rollback, mitigation, escalation
&lt;span class="p"&gt;5.&lt;/span&gt; Write an incident update in a consistent format

&lt;span class="gu"&gt;## Output Format&lt;/span&gt;

Return:
&lt;span class="p"&gt;
-&lt;/span&gt; Impact summary
&lt;span class="p"&gt;-&lt;/span&gt; Timeline
&lt;span class="p"&gt;-&lt;/span&gt; Suspected causes
&lt;span class="p"&gt;-&lt;/span&gt; Next actions
&lt;span class="p"&gt;-&lt;/span&gt; Owner assignments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is enough to get started. The Skill is now discoverable based on the description.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using Skills in Chat
&lt;/h2&gt;

&lt;p&gt;There are two ways Skills help you day-to-day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manual invocation&lt;/strong&gt;: you can run the Skill as a slash command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic discovery&lt;/strong&gt;: Copilot can decide to load the Skill when the request matches the description.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To invoke a Skill manually, type &lt;code&gt;/&lt;/code&gt; in the chat input, pick the Skill, and then add any extra context. For example: &lt;code&gt;/incident-triage payments-api prod https://alert-link&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can control this with optional front matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;user-invokable: false&lt;/code&gt; hides it from &lt;code&gt;/&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disable-model-invocation: true&lt;/code&gt; prevents automatic loading, but keeps slash use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters for teams. Some Skills are safe to auto-load. Others might be better as explicit, opt-in runbooks.&lt;/p&gt;


&lt;h2&gt;
  
  
  DevOps and SRE Use Cases (Practical)
&lt;/h2&gt;

&lt;p&gt;Here are a few Skills that are genuinely useful in real operations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Case 1: CI/CD Failure Triage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Standardise how you investigate failures and what you record.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask for the workflow URL and failing job name&lt;/li&gt;
&lt;li&gt;Require you to record whether it looks transient or deterministic&lt;/li&gt;
&lt;li&gt;Produce a consistent issue template for follow-up&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 2: Terraform Change Risk Review
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Make IaC reviews consistent across a team.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require you to list affected environments&lt;/li&gt;
&lt;li&gt;Check for risky patterns (public exposure, identity changes, state migration)&lt;/li&gt;
&lt;li&gt;Output a simple go/no-go summary and required approvals&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 3: Runbook Generator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Turn tribal knowledge into a maintained operational runbook.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enforce sections (Symptoms, Checks, Rollback, Escalation)&lt;/li&gt;
&lt;li&gt;Add a "Safety" section (blast radius, data loss risk)&lt;/li&gt;
&lt;li&gt;Produce a markdown runbook that matches your house style&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 4: Postmortem Assistant
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Reduce the time from incident to learning.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert incident notes into a timeline&lt;/li&gt;
&lt;li&gt;Extract contributing factors and remediation items&lt;/li&gt;
&lt;li&gt;Enforce blameless language and clear action items&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Advanced Patterns (Where Skills Get Interesting)
&lt;/h2&gt;

&lt;p&gt;Once the basics work, Skills shine when you treat them like reusable operational modules.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Bundle references and templates
&lt;/h3&gt;

&lt;p&gt;Keep &lt;code&gt;SKILL.md&lt;/code&gt; short and link out to extra files in the same folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;references/&lt;/code&gt; for short docs you want to load on demand&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;assets/&lt;/code&gt; for templates (issue templates, runbook templates)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/&lt;/code&gt; for small utilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2) Keep descriptions keyword-rich
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; is the discovery surface. If you want the Skill to load for DevOps/SRE workflows, include words like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incident, outage, on-call, pipeline, deployment, rollback&lt;/li&gt;
&lt;li&gt;terraform, kubernetes, azure, aws, gcp&lt;/li&gt;
&lt;li&gt;security review, compliance, audit&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3) Decide which Skills auto-load
&lt;/h3&gt;

&lt;p&gt;For teams, I recommend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-load for safe, low-risk guidance Skills (triage checklists)&lt;/li&gt;
&lt;li&gt;Manual-only for high-impact Skills that might lead to edits or deployments&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Real Examples You Can Explore
&lt;/h2&gt;

&lt;p&gt;This repo already contains a working Skill you can inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.github/skills/new-blog-post/SKILL.md&lt;/code&gt; in this repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want ready-made public examples to learn from (without relying on GitHub code search), start here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;https://github.com/github/awesome-copilot&lt;/a&gt; (community collection)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;https://github.com/anthropics/skills&lt;/a&gt; (reference skills)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy any skill folder into &lt;code&gt;.github/skills/&lt;/code&gt;, then tweak the wording and guardrails until it matches how your team works.&lt;/p&gt;

&lt;p&gt;If you want to find more public examples on GitHub, search for the folder pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;path:.github/skills SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that GitHub code search may require you to sign in.&lt;/p&gt;

&lt;p&gt;For the authoritative reference, see the VS Code documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/customization/agent-skills" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/copilot/customization/agent-skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Tips for Adoption in DevOps Teams
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with one runbook&lt;/strong&gt;: pick a repetitive task (CI triage) and ship one Skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat Skills as code&lt;/strong&gt;: version them, review changes, keep them short and intentional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure outcomes&lt;/strong&gt;: shorter time to triage, fewer repeated mistakes, better incident updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it safe&lt;/strong&gt;: do not turn every Skill into an autonomous actor. Default to guidance and checklists.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot Skills are a practical way to turn the workflows in your head into something your whole team can reuse. For DevOps and SREs, that means more consistent triage, better runbooks, and faster, calmer incident response.&lt;/p&gt;

&lt;p&gt;If you want, I can also turn the example &lt;code&gt;incident-triage&lt;/code&gt; Skill into a full folder with templates and a lightweight script so you can drop it straight into &lt;code&gt;.github/skills/&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 24-02-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>GitHub Copilot SDK - Build AI-Powered DevOps Agents for Your Own Apps</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Tue, 17 Feb 2026 22:01:27 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-sdk-build-ai-powered-devops-agents-for-your-own-apps-3d05</link>
      <guid>https://dev.to/pwd9000/github-copilot-sdk-build-ai-powered-devops-agents-for-your-own-apps-3d05</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot SDK: Build AI-Powered DevOps Agents for Your Own Apps
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot has steadily evolved from an in-editor autocomplete tool into a full-blown agentic platform. The latest step in that journey is the &lt;strong&gt;GitHub Copilot SDK&lt;/strong&gt;, now available in &lt;strong&gt;Technical Preview&lt;/strong&gt;. It lets you embed the same agent runtime that powers Copilot CLI directly into your own applications, scripts, and services using &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;TypeScript/Node.js&lt;/strong&gt;, &lt;strong&gt;Go&lt;/strong&gt;, or &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For DevOps engineers, this opens up a powerful new pattern: instead of relying solely on Copilot inside your IDE or through GitHub Issues, you can now build &lt;strong&gt;custom AI agents&lt;/strong&gt; that plug into your existing operational tooling. Think incident response bots, infrastructure validators, deployment assistants, and compliance checkers, all powered by the Copilot engine and your own custom tools.&lt;/p&gt;

&lt;p&gt;In this post we will cover what the SDK is, how it works, how to get started, and walk through six practical DevOps use cases, several drawn from real open-source projects you can explore today.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is the GitHub Copilot SDK?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/github/copilot-sdk" rel="noopener noreferrer"&gt;GitHub Copilot SDK&lt;/a&gt; is a set of multi-platform libraries that expose the &lt;strong&gt;Copilot CLI agent runtime&lt;/strong&gt; as a programmable interface. Rather than building your own LLM orchestration layer, you get the same production-tested engine that handles planning, tool invocation, file edits, and multi-turn conversations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Facts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repository&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/copilot-sdk" rel="noopener noreferrer"&gt;github/copilot-sdk&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Technical Preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Languages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript/Node.js, Python, Go, .NET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub OAuth, environment variables (&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;), or BYOK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Billing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Counts against your Copilot premium request quota&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;All four SDKs share the same communication model. Your application talks to the SDK client, which communicates with the Copilot CLI running in server mode over &lt;strong&gt;JSON-RPC&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Application
       ↓
  SDK Client
       ↓  JSON-RPC
  Copilot CLI (server mode)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The SDK &lt;strong&gt;manages the CLI process lifecycle automatically&lt;/strong&gt; by default. You can also run the CLI externally in headless server mode and point multiple SDK clients at it, which is useful for shared development environments or debugging.&lt;/p&gt;
&lt;h3&gt;
  
  
  What You Can Do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send prompts&lt;/strong&gt; and receive responses (streaming or complete).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define custom tools&lt;/strong&gt; that the agent can call, with typed parameters and handler functions you control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect to MCP servers&lt;/strong&gt; (Model Context Protocol) to give the agent access to external services like the GitHub API, databases, or cloud provider tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create custom agents&lt;/strong&gt; with specialised personas, system messages, and tool sets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use any supported model&lt;/strong&gt;, including those available through Copilot or your own keys via BYOK (Bring Your Own Key) from providers like OpenAI, Azure AI Foundry, and Anthropic.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot subscription&lt;/strong&gt; (Free tier with limited usage, or Pro/Pro+/Business/Enterprise). If using BYOK, no GitHub auth is required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copilot CLI&lt;/strong&gt; installed and authenticated. Follow the &lt;a href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli" rel="noopener noreferrer"&gt;Copilot CLI installation guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Your preferred language runtime: &lt;strong&gt;Node.js 18+&lt;/strong&gt;, &lt;strong&gt;Python 3.8+&lt;/strong&gt;, &lt;strong&gt;Go 1.21+&lt;/strong&gt;, or &lt;strong&gt;.NET 8.0+&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify the CLI is working:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Install the SDK
&lt;/h3&gt;

&lt;p&gt;Pick your language:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node.js / TypeScript&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @github/copilot-sdk

&lt;span class="c"&gt;# Python&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;github-copilot-sdk

&lt;span class="c"&gt;# Go&lt;/span&gt;
go get github.com/github/copilot-sdk/go

&lt;span class="c"&gt;# .NET&lt;/span&gt;
dotnet add package GitHub.Copilot.SDK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Your First Five Lines
&lt;/h3&gt;

&lt;p&gt;Here is the simplest possible example in TypeScript. It creates a client, opens a session, sends a prompt, and prints the response:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;What is 2 + 2?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And the Python equivalent:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;github_copilot_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CopilotClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_and_wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is 2 + 2?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is it. Five lines to get a Copilot-powered response in your own application.&lt;/p&gt;


&lt;h2&gt;
  
  
  Adding Streaming and Custom Tools
&lt;/h2&gt;

&lt;p&gt;The real power of the SDK emerges when you add &lt;strong&gt;streaming responses&lt;/strong&gt; and &lt;strong&gt;custom tools&lt;/strong&gt;. Streaming gives your users real-time feedback while the agent works. Custom tools let the agent call functions you define, bridging the gap between the LLM and your operational systems.&lt;/p&gt;
&lt;h3&gt;
  
  
  Streaming Example (TypeScript)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streaming&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant.message_delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deltaContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;session.idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Explain blue-green deployments in three sentences.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Custom Tool Example (TypeScript)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkPodStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;check_pod_status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Check the status of Kubernetes pods in a namespace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Kubernetes namespace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;namespace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// In a real scenario, call kubectl or the Kubernetes API here&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;pods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api-server-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Running&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;restarts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api-server-2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CrashLoopBackOff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;restarts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Running&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;restarts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When the agent receives a question like "Are there any unhealthy pods in the production namespace?", it decides to call your &lt;code&gt;check_pod_status&lt;/code&gt; tool, receives the result, and incorporates it into a natural-language response.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connecting to MCP Servers
&lt;/h2&gt;

&lt;p&gt;The SDK supports &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; servers out of the box. MCP provides a standardised way for AI agents to interact with external tools and data sources. This is especially relevant for DevOps because you can connect the agent to GitHub, cloud providers, databases, and monitoring APIs without writing custom tool handlers for each one.&lt;/p&gt;

&lt;p&gt;For example, connecting to GitHub's MCP server gives the agent access to repositories, issues, pull requests, and more:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;mcpServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.githubcopilot.com/mcp/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also connect to local MCP servers. For example, an Azure Bicep schema server:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"AzureBicep"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@azure/mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--namespace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"bicepschema"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--read-only"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;MCP Servers Directory&lt;/a&gt; maintains a growing catalogue of community servers, including integrations for Terraform, Docker, Prometheus, and many other DevOps-adjacent tools.&lt;/p&gt;


&lt;h2&gt;
  
  
  DevOps Use Cases
&lt;/h2&gt;

&lt;p&gt;The SDK is still young, but the community is already building real tools with it. Here are six use cases, several drawn from actual open-source projects and the official cookbook, that show what is possible for DevOps teams.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Case 1: Autonomous SRE Agent for GitHub Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Real project&lt;/strong&gt;: &lt;a href="https://github.com/htekdev/github-sre-agent" rel="noopener noreferrer"&gt;htekdev/github-sre-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This open-source project is a fully autonomous SRE agent built with the Copilot SDK. It listens for GitHub Actions webhook events and, when a workflow fails, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetches and analyses logs&lt;/strong&gt; via the GitHub MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks GitHub system status&lt;/strong&gt; to rule out platform outages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searches the web&lt;/strong&gt; for known fixes using the Exa AI MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Makes an intelligent decision&lt;/strong&gt;: retry a transient failure, create a detailed issue for a genuine bug, or skip if the failure is expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracks resolution&lt;/strong&gt;: when a previously failed workflow succeeds, it automatically closes the related issue.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The architecture is clean and worth studying. It uses the Copilot SDK's &lt;code&gt;createSession&lt;/code&gt; with two MCP servers (GitHub and Exa AI) plus custom tools for status checking, note-taking, and workflow tracking. Repository-level configuration lives in &lt;code&gt;.github/sre-agent.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;- This repo uses pnpm, not npm&lt;/span&gt;
  &lt;span class="s"&gt;- Always check if tests pass before suggesting retry&lt;/span&gt;
  &lt;span class="s"&gt;- Create issues with label "ci-failure" for tracking&lt;/span&gt;
&lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;maxAttempts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;createIssue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sre-agent&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;automated&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ci-failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is a strong example of how the SDK can replace manual on-call triage for CI/CD failures.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 2: Repository Health Analysis (RepoCheckAI)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Real project&lt;/strong&gt;: &lt;a href="https://github.com/glaucia86/repocheckai" rel="noopener noreferrer"&gt;glaucia86/repocheckai&lt;/a&gt; (70+ stars)&lt;/p&gt;

&lt;p&gt;RepoCheckAI (formerly Repo Doctor) is an agentic CLI tool built with the Copilot SDK that performs comprehensive health checks across six areas: &lt;strong&gt;documentation&lt;/strong&gt;, &lt;strong&gt;developer experience&lt;/strong&gt;, &lt;strong&gt;CI/CD&lt;/strong&gt;, &lt;strong&gt;testing&lt;/strong&gt;, &lt;strong&gt;governance&lt;/strong&gt;, and &lt;strong&gt;security&lt;/strong&gt;. It delivers a health score (0-100%), prioritised findings (P0/P1/P2), and actionable remediation steps with code snippets.&lt;/p&gt;

&lt;p&gt;It offers two analysis modes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quick Scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analyses via GitHub API (up to 20 file reads)&lt;/td&gt;
&lt;td&gt;Governance review, quick checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deep Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full source scan using Repomix&lt;/td&gt;
&lt;td&gt;Code quality, architecture review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The killer feature for DevOps teams is the &lt;code&gt;--issue&lt;/code&gt; flag. After analysis, it automatically creates structured GitHub Issues for each problem found, complete with priority labels, impact assessments, and fix instructions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;repocheck analyze your-org/your-repo &lt;span class="nt"&gt;--issue&lt;/span&gt;

&lt;span class="c"&gt;# Creates:&lt;/span&gt;
&lt;span class="c"&gt;# 🔴 [RepoCheckAI] docs: Missing README&lt;/span&gt;
&lt;span class="c"&gt;# 🟠 [RepoCheckAI] ci: No CI/CD Pipeline&lt;/span&gt;
&lt;span class="c"&gt;# 🟡 [RepoCheckAI] dx: Code Quality Issues&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This pattern, using the SDK to audit repositories and create actionable issues, is directly applicable to platform engineering teams managing dozens of microservice repos.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 3: Autonomous Coding Loops (Ralph Loop Pattern)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/github/awesome-copilot/blob/main/cookbook/copilot-sdk/nodejs/ralph-loop.md" rel="noopener noreferrer"&gt;Official Copilot SDK Cookbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Ralph Loop is an autonomous development pattern from the SDK cookbook that is particularly powerful for DevOps automation. The concept: an AI agent iterates through tasks in isolated context windows, with state persisted on disk between iterations. Each loop creates a &lt;strong&gt;fresh session&lt;/strong&gt;, reads the current state, does one task, writes results back, and exits.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ralphLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promptFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxIterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promptFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;maxIterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`\n=== Iteration &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;maxIterations&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ===`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Fresh session each iteration. Context isolation is the point&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;workingDirectory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;onPermissionRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Iteration &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; complete.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;ralphLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PROMPT.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For DevOps, imagine pointing this at an &lt;code&gt;IMPLEMENTATION_PLAN.md&lt;/code&gt; that lists infrastructure tasks: "add monitoring to service X", "update Terraform module Y to v2", "write integration tests for pipeline Z". The agent picks the next task, implements it, runs tests, commits, and moves on. The key principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fresh context per iteration&lt;/strong&gt; prevents context window degradation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk as shared state&lt;/strong&gt; (&lt;code&gt;IMPLEMENTATION_PLAN.md&lt;/code&gt;) coordinates between iterations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backpressure&lt;/strong&gt; (tests, builds, lints) ensures quality, the agent must pass them before committing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is ideal for burning down infrastructure debt or implementing a batch of related IaC changes unattended.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 4: Incident Response with PagerDuty and Datadog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/copilot-sdk-samples" rel="noopener noreferrer"&gt;microsoft/copilot-sdk-samples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft's official sample repository includes dedicated &lt;strong&gt;PagerDuty&lt;/strong&gt; and &lt;strong&gt;Datadog&lt;/strong&gt; connector samples that demonstrate how to build incident management and monitoring agents. All connectors support a &lt;strong&gt;mock-first&lt;/strong&gt; design, so you can develop and test without live credentials.&lt;/p&gt;

&lt;p&gt;Here is how you might wire up an incident response agent that combines both:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Tools backed by your PagerDuty and Datadog connectors&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getActiveIncidents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_active_incidents&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;List active PagerDuty incidents for a service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Service name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// In production, call PagerDuty API&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;incidents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PD-4521&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;High error rate on payments-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;triggered&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-02-15T14:32:00Z&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;assignee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on-call-team&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queryMonitoring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;query_monitoring&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Query Datadog metrics and logs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Datadog query string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;timeRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Time range (e.g. last_1h)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;timeRange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;timeRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// In production, call Datadog API&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;errorRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.4%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;p99Latency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2340ms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;requestsPerSecond&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;recentLogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ERROR: Connection pool exhausted for database replica-02&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;WARN: Retry limit exceeded for downstream service auth-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streaming&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;getActiveIncidents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;queryMonitoring&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;systemMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are an incident response assistant. When asked about an incident, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gather data from PagerDuty and Datadog, then provide: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1) Incident timeline, 2) Affected services and metrics, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3) Likely root cause, 4) Recommended remediation steps.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant.message_delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deltaContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;We have a P1 incident on payments-api. Pull the PagerDuty details and check Datadog for the last hour.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You could deploy this as a Slack bot, a Teams webhook, or a CLI tool for your on-call team. The agent correlates PagerDuty incident metadata with Datadog metrics and logs, then produces a structured summary with remediation steps.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 5: PR Age Visualisation and Repository Insights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/github/awesome-copilot/blob/main/cookbook/copilot-sdk/nodejs/pr-visualization.md" rel="noopener noreferrer"&gt;Official Copilot SDK Cookbook: PR Visualization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This cookbook recipe demonstrates a powerful pattern: using the SDK with &lt;strong&gt;zero custom tools&lt;/strong&gt;. Instead, it relies entirely on the Copilot CLI's built-in capabilities, the GitHub MCP server for fetching PR data, file tools for saving charts, and code execution for generating visualisations.&lt;/p&gt;

&lt;p&gt;The core setup is refreshingly simple. No &lt;code&gt;defineTool&lt;/code&gt; calls, just a session with a system message and a prompt:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;logLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;systemMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are analyzing pull requests for the GitHub repository: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.
Use the GitHub MCP Server tools to fetch PR data.
Use your file and code execution tools to generate charts.
Save any generated images to the current working directory.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Fetch the open pull requests for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; from the last week.
Calculate the age of each PR in days.
Generate a bar chart showing the distribution of PR ages.
Save the chart as "pr-age-chart.png".
Summarise the PR health - average age, oldest PR, and how many might be stale.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent uses the GitHub MCP server to list PRs, then generates a chart using Python/matplotlib. The interactive session lets you ask follow-up questions like "expand to the last month" or "group by author instead of age".&lt;/p&gt;

&lt;p&gt;For DevOps leads, this pattern is gold. Build a scheduled job that runs this weekly and posts the chart to a Slack channel. No API integration code to maintain, just prompts.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 6: Infrastructure as Code Validation Agent
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Your team maintains dozens of Terraform modules. Reviewing them for best practices, security compliance, and naming conventions is time-consuming and inconsistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution&lt;/strong&gt;: Build a CLI tool that reads a Terraform directory and asks the Copilot agent to validate it against your organisation's policies.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@github/copilot-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;readTerraformFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read_terraform_files&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Read all .tf files from a directory&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Path to the Terraform module directory&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;directory&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readdirSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.tf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streaming&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;readTerraformFiles&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;systemMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are an infrastructure validation agent. When given a Terraform directory, read the files and check for:
1. All resources must include tags: Environment, Owner, CostCentre
2. No hardcoded secrets or credentials
3. Backend configuration must use remote state (azurerm or s3)
4. All variables must have descriptions and type constraints
5. Module sources must use version pinning
Report findings as a structured checklist with pass/fail for each rule.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant.message_delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deltaContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendAndWait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please validate the Terraform module at ./modules/networking&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You could run this as a pre-commit hook, a CI step, or a standalone CLI that your platform team uses during module reviews. Combine it with the Ralph Loop pattern from Use Case 3 to validate and fix an entire library of modules autonomously.&lt;/p&gt;


&lt;h2&gt;
  
  
  Authentication Options
&lt;/h2&gt;

&lt;p&gt;The SDK supports several authentication methods, giving you flexibility for different environments:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub signed-in user&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local development; uses stored OAuth credentials from &lt;code&gt;copilot&lt;/code&gt; CLI login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth GitHub App&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web applications; pass user tokens from your GitHub OAuth app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment variables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CI/CD pipelines; set &lt;code&gt;COPILOT_GITHUB_TOKEN&lt;/code&gt;, &lt;code&gt;GH_TOKEN&lt;/code&gt;, or &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BYOK (Bring Your Own Key)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Air-gapped or custom environments; use your own API keys from OpenAI, Azure AI Foundry, or Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For CI/CD integration, environment variables are the most practical. For internal tools, the GitHub OAuth flow gives you per-user billing and audit trails.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: BYOK uses key-based authentication only. Microsoft Entra ID (Azure AD), managed identities, and third-party identity providers are not supported at this time.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Tips for DevOps Teams
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with a well-defined problem.&lt;/strong&gt; The SDK is not a magic box. It works best when you give the agent a clear task, the right tools, and a focused system message. "Analyse these logs and find errors" will outperform "do DevOps stuff."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use system messages to encode your standards.&lt;/strong&gt; The &lt;code&gt;systemMessage&lt;/code&gt; field is your equivalent of a runbook. Tell the agent about your naming conventions, required tags, preferred tools, and escalation procedures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combine custom tools with MCP servers.&lt;/strong&gt; Use MCP for standard integrations (GitHub API, cloud providers) and custom tools for your organisation-specific logic (internal APIs, proprietary systems).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep tools focused.&lt;/strong&gt; Each tool should do one thing well. An agent with ten small, focused tools will perform better than one with three large, multi-purpose tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review and validate.&lt;/strong&gt; The SDK is in Technical Preview. Always review agent outputs before acting on them in production, especially for infrastructure changes or incident response recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be mindful of billing.&lt;/strong&gt; Each prompt counts against your Copilot premium request quota. For high-volume automation, consider batching requests and caching responses where appropriate.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;GitHub Copilot SDK&lt;/strong&gt; brings agentic AI out of the IDE and into your operational tooling. For DevOps engineers, this means you can build custom agents that understand your infrastructure, your workflows, and your conventions, and embed them wherever they are most useful: CLI tools, chatbots, CI pipelines, or internal platforms.&lt;/p&gt;

&lt;p&gt;The community is already proving the concept. Projects like &lt;a href="https://github.com/htekdev/github-sre-agent" rel="noopener noreferrer"&gt;github-sre-agent&lt;/a&gt; (autonomous CI/CD failure triage), &lt;a href="https://github.com/glaucia86/repocheckai" rel="noopener noreferrer"&gt;RepoCheckAI&lt;/a&gt; (repository health analysis), and Microsoft's &lt;a href="https://github.com/microsoft/copilot-sdk-samples" rel="noopener noreferrer"&gt;copilot-sdk-samples&lt;/a&gt; (PagerDuty and Datadog integrations) show that this is not theoretical. The official &lt;a href="https://github.com/github/awesome-copilot/blob/main/cookbook/copilot-sdk" rel="noopener noreferrer"&gt;cookbook&lt;/a&gt; adds patterns like Ralph Loops for autonomous task iteration and PR visualisation using zero custom tools.&lt;/p&gt;

&lt;p&gt;The SDK is currently in &lt;strong&gt;Technical Preview&lt;/strong&gt; with support for &lt;strong&gt;Python, TypeScript, Go, and .NET&lt;/strong&gt;, an MIT licence, and a growing ecosystem of MCP integrations. Whether you want to automate SRE workflows, audit repositories, triage incidents, or visualise PR health, the building blocks are ready.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/github/copilot-sdk" rel="noopener noreferrer"&gt;GitHub Copilot SDK repository&lt;/a&gt; and the &lt;a href="https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; to begin experimenting.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 17-02-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>githubcopilot</category>
      <category>ai</category>
    </item>
    <item>
      <title>Using GitHub Copilot Coding Agent for DevOps Automation</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Sat, 14 Feb 2026 14:27:20 +0000</pubDate>
      <link>https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43</link>
      <guid>https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43</guid>
      <description>&lt;h2&gt;
  
  
  Using GitHub Copilot Coding Agent for DevOps Automation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.azurespringclean.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6nsrhayy8allul9lzc8.png" alt="As featured in Azure Spring Clean 2026"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;As featured in &lt;a href="https://www.azurespringclean.com/" rel="noopener noreferrer"&gt;Azure Spring Clean 2026&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What if you could assign a GitHub Issue to an AI teammate and come back to a ready-to-review pull request? That is exactly what &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent" rel="noopener noreferrer"&gt;GitHub Copilot Coding Agent&lt;/a&gt; does. It works autonomously inside an ephemeral GitHub Actions environment, analyses your codebase, makes changes, runs tests, and opens a PR for your approval.&lt;/p&gt;

&lt;p&gt;In this post we will look at how the coding agent works, how to set it up for a DevOps repository, and walk through six practical use cases you can try straight away.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is GitHub Copilot Coding Agent?
&lt;/h2&gt;

&lt;p&gt;Think of the coding agent as an async, pull-request-oriented developer. You describe the work, it does the coding in the background, and you review the result. Here is the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assign the task&lt;/strong&gt; via a GitHub Issue, PR comment, VS Code, or the GitHub CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent spins up&lt;/strong&gt; in an isolated GitHub Actions container with your setup workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It explores, codes, and iterates&lt;/strong&gt;, running builds, linters, and tests along the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A pull request appears&lt;/strong&gt; with all changes, ready for your review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You approve and merge.&lt;/strong&gt; The agent can never merge its own work.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Security at a Glance
&lt;/h3&gt;

&lt;p&gt;The agent is locked down by design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs in &lt;strong&gt;ephemeral containers&lt;/strong&gt; destroyed after each session.&lt;/li&gt;
&lt;li&gt;Can only push to branches prefixed with &lt;code&gt;copilot/&lt;/code&gt;, never to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;master&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every PR is scanned by &lt;strong&gt;CodeQL&lt;/strong&gt; for security issues, &lt;strong&gt;secret scanning&lt;/strong&gt; for leaked credentials, and &lt;strong&gt;dependency checks&lt;/strong&gt; against the GitHub Advisory Database.&lt;/li&gt;
&lt;li&gt;The person who triggered the agent &lt;strong&gt;cannot approve&lt;/strong&gt; the resulting PR, guaranteeing independent review.&lt;/li&gt;
&lt;li&gt;Internet access is controlled by a &lt;strong&gt;default firewall&lt;/strong&gt;. External services require explicit allow-listing.&lt;/li&gt;
&lt;li&gt;Full &lt;strong&gt;audit trails&lt;/strong&gt; of every action the agent took.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Limitations
&lt;/h3&gt;

&lt;p&gt;Keep these in mind when planning tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One repository, one PR per task.&lt;/strong&gt; The agent cannot span multiple repos or open multiple PRs from a single issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux runners only&lt;/strong&gt; (Ubuntu x64 GitHub Actions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only repo access&lt;/strong&gt; within its sandbox. It writes to its &lt;code&gt;copilot/&lt;/code&gt; branch only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No signed commits&lt;/strong&gt; without a ruleset bypass for the agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For the full list of capabilities and constraints, see the &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Getting Set Up
&lt;/h2&gt;

&lt;p&gt;You need a &lt;strong&gt;GitHub Copilot Pro, Pro+, Business, or Enterprise&lt;/strong&gt; plan, &lt;strong&gt;write access&lt;/strong&gt; to the repository, and &lt;strong&gt;GitHub Actions&lt;/strong&gt; enabled. For organisations, an admin must enable the coding agent under &lt;strong&gt;Copilot&lt;/strong&gt; settings.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The coding agent uses both GitHub Actions minutes and Copilot premium requests. Keep an eye on usage through your billing settings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Create the Setup Workflow
&lt;/h3&gt;

&lt;p&gt;This workflow runs before the agent starts coding. It installs your project's dependencies so the agent can build and test. The job &lt;strong&gt;must&lt;/strong&gt; be named &lt;code&gt;copilot-setup-steps&lt;/code&gt; and live on your default branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/copilot-setup-steps.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copilot Setup Steps&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;workflow_dispatch&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;copilot-setup-steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm install&lt;/span&gt;
          &lt;span class="s"&gt;# or: pip install -r requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Only &lt;code&gt;steps&lt;/code&gt;, &lt;code&gt;permissions&lt;/code&gt;, &lt;code&gt;runs-on&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;, &lt;code&gt;snapshot&lt;/code&gt;, and &lt;code&gt;timeout-minutes&lt;/code&gt; are honoured inside this job. Everything else is ignored.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your workflows need secrets, add them through the &lt;strong&gt;&lt;code&gt;copilot&lt;/code&gt; environment&lt;/strong&gt; in repository &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Environments&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Add Custom Instructions
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; file to teach the agent your team's conventions. This is the single biggest lever for improving output quality:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Copilot Instructions&lt;/span&gt;

&lt;span class="gu"&gt;## Code Standards&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use Terraform 1.6+ syntax
&lt;span class="p"&gt;-&lt;/span&gt; All infrastructure must include tags: Environment, Owner, CostCentre

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Terraform modules require terratest validation
&lt;span class="p"&gt;-&lt;/span&gt; CI/CD changes need a dry-run in dev first

&lt;span class="gu"&gt;## Documentation&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Update CHANGELOG.md for infrastructure changes
&lt;span class="p"&gt;-&lt;/span&gt; Include deployment runbooks for new services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also create &lt;strong&gt;scoped instruction files&lt;/strong&gt; under &lt;code&gt;.github/instructions/&lt;/code&gt; with an &lt;code&gt;applyTo&lt;/code&gt; glob, so rules only activate for matching files (for example, &lt;code&gt;applyTo: "terraform/**"&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Assign Your First Task
&lt;/h3&gt;

&lt;p&gt;The simplest method: create a GitHub Issue, add &lt;code&gt;@copilot&lt;/code&gt; as the assignee, and wait. The agent picks it up, works autonomously, and opens a PR when finished.&lt;/p&gt;

&lt;p&gt;Other options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PR comments&lt;/strong&gt;: &lt;code&gt;@copilot please add unit tests for this new module.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub CLI&lt;/strong&gt;: &lt;code&gt;gh issue edit 42 --add-assignee @copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt;: Use the Copilot Chat panel or the GitHub sidebar to assign issues directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can track progress through the &lt;strong&gt;Copilot Agents Panel&lt;/strong&gt; on GitHub, which gives a real-time view of the session, including full logs of what the agent explored and changed.&lt;/p&gt;


&lt;h2&gt;
  
  
  DevOps Use Cases
&lt;/h2&gt;

&lt;p&gt;Here is where things get interesting. These six scenarios show how the coding agent fits naturally into DevOps workflows.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Case 1: Fix a Broken CI/CD Pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Your production deployment workflow failed overnight. Engineers are blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without the agent&lt;/strong&gt;: Someone opens GitHub Actions, scrolls through hundreds of log lines, spots a missing environment variable, edits the YAML, pushes, waits for CI. Thirty to forty-five minutes gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With the agent&lt;/strong&gt;: Create an issue like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Title: Fix failing production deployment workflow

Our deploy workflow failed on run #2847. The error appears to be in the AWS authentication step. Please investigate the logs, fix the workflow configuration, and validate the fix passes.

Assignee: @copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent analyses the logs, finds the missing &lt;code&gt;AWS_DEPLOYMENT_ROLE&lt;/code&gt; reference, checks similar workflows for the correct pattern, updates the YAML, runs a validation build, and opens a PR with the fix. Your involvement? A five-minute code review.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 2: Enhance Infrastructure as Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: You need to add cluster auto-scaling to your EKS infrastructure across dev, staging, and prod.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With the agent&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Title: Add cluster auto-scaling to EKS infrastructure

Add Kubernetes Cluster Autoscaler to all three environments.

Acceptance criteria:
&lt;span class="p"&gt;
-&lt;/span&gt; Update Terraform modules with autoscaler config
&lt;span class="p"&gt;-&lt;/span&gt; Set appropriate min/max node counts per environment
&lt;span class="p"&gt;-&lt;/span&gt; Add CloudWatch alarms for scaling events
&lt;span class="p"&gt;-&lt;/span&gt; Update IAM roles with required permissions
&lt;span class="p"&gt;-&lt;/span&gt; Add terratest validation
&lt;span class="p"&gt;-&lt;/span&gt; Document the scaling policies

Assignee: @copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent reads your existing modules, adds the autoscaler following AWS best practices, wires up environment-specific variables, writes tests, updates docs, and delivers one clean PR. You review, run &lt;code&gt;terraform plan&lt;/code&gt; in your pipeline, and merge.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 3: Remediate Security Vulnerabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Dependabot flagged 15 vulnerabilities in your Node.js dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With the agent&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Title: Remediate active Dependabot security alerts

Please review all active security vulnerabilities, update dependencies to patched versions, and ensure all tests pass. Handle any breaking API changes from major version bumps and note them in the PR description.

Assignee: @copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent analyses each alert, updates &lt;code&gt;package.json&lt;/code&gt;, runs &lt;code&gt;npm audit&lt;/code&gt; and the full test suite, fixes any breakage from API changes, and opens a single PR with a clear summary of what changed and why.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Because the agent opens exactly one PR per task, consider creating separate issues for "safe patch updates" and "major version bumps with breaking changes" if you want to review them independently.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Use Case 4: Keep Documentation in Sync
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Your docs drift out of date every time infrastructure changes land.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Trigger a documentation update automatically after infrastructure PRs merge:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/doc-update.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update Documentation&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;closed&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;kubernetes/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.github/workflows/**'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;update-docs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.event.pull_request.merged == &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create Documentation Issue&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;gh issue create \&lt;/span&gt;
            &lt;span class="s"&gt;--title "Update docs for PR #${{ github.event.pull_request.number }}" \&lt;/span&gt;
            &lt;span class="s"&gt;--body "PR #${{ github.event.pull_request.number }} modified infrastructure. Please review and update relevant documentation, architecture diagrams, and deployment runbooks." \&lt;/span&gt;
            &lt;span class="s"&gt;--assignee @copilot \&lt;/span&gt;
            &lt;span class="s"&gt;--label "documentation"&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every merged infrastructure PR spawns a documentation task that the agent handles. Your docs stay fresh without anyone having to remember.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 5: Boost Test Coverage on Autopilot
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Your team knows test coverage is low, but writing tests for existing modules never makes it to the sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With the agent&lt;/strong&gt;: Create targeted issues for each area that needs coverage:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Title: Add unit tests for authentication module

The auth module at src/auth/ currently has minimal test coverage. Please:
&lt;span class="p"&gt;
1.&lt;/span&gt; Analyse the existing code and identify untested paths
&lt;span class="p"&gt;2.&lt;/span&gt; Write comprehensive unit tests covering happy paths and edge cases
&lt;span class="p"&gt;3.&lt;/span&gt; Ensure all tests pass and document any discovered bugs
&lt;span class="p"&gt;4.&lt;/span&gt; Report the before/after coverage in the PR description

Assignee: @copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent reads the module, generates tests that exercise both success and failure paths, runs them to confirm they pass, and opens a PR with a coverage summary. Repeat across modules with separate issues and you can steadily burn down test debt in the background.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: GitHub's own experiments with this pattern took test coverage from roughly 5% to near 100% across 45 days, producing over 1,400 tests. Small, daily PRs kept reviews manageable. See the &lt;a href="https://github.blog/ai-and-ml/generative-ai/continuous-ai-in-practice-what-developers-can-automate-today-with-agentic-ci/" rel="noopener noreferrer"&gt;Continuous AI blog post&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Use Case 6: Remediate Security Alerts via Campaigns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Your organisation runs &lt;a href="https://docs.github.com/en/code-security/code-scanning/managing-code-scanning-alerts/fixing-alerts-in-security-campaign" rel="noopener noreferrer"&gt;security campaigns&lt;/a&gt; to address CodeQL or Dependabot findings at scale, but engineers struggle to find time for the fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With the agent&lt;/strong&gt;: From the &lt;strong&gt;Security&lt;/strong&gt; tab on GitHub, select alerts and assign them directly to Copilot as part of a campaign. The agent receives the alert context, analyses the vulnerable code path, applies a fix, validates the change passes your test suite, and opens a PR, all without anyone filing a separate issue.&lt;/p&gt;

&lt;p&gt;This is a first-class integration, not a workaround. The coding agent understands the alert metadata (CVE, severity, affected file and line) and uses it to produce targeted patches. For large campaigns spanning dozens of alerts, you can assign batches to Copilot and review the resulting PRs as they arrive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Security campaigns require &lt;strong&gt;GitHub Advanced Security&lt;/strong&gt; or &lt;strong&gt;GitHub Code Security&lt;/strong&gt;. The coding agent's own built-in security scanning (CodeQL, secret scanning, dependency checks) does not require these licences.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Tips for Getting the Best Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Write clear issues.&lt;/strong&gt; The quality of the PR directly reflects the quality of the issue. Include a problem statement, acceptance criteria, relevant file paths, and any constraints. A vague "make it faster" will produce vague results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iterate via PR comments.&lt;/strong&gt; If the first attempt is not quite right, leave a review comment:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;@copilot please use SSM Parameter Store instead of environment variables and add retry logic with exponential backoff.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent will push follow-up commits to the same PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use custom instructions and scoped instruction files.&lt;/strong&gt; The more context the agent has about your conventions (naming, tagging, testing patterns, preferred libraries), the better its output. This pays dividends across every task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always review thoroughly.&lt;/strong&gt; The agent is a capable first-drafter, not an infallible engineer. Test changes in a non-production environment, verify security implications, and check for unintended side effects before merging.&lt;/p&gt;


&lt;h2&gt;
  
  
  Extending the Agent
&lt;/h2&gt;
&lt;h3&gt;
  
  
  MCP Servers
&lt;/h3&gt;

&lt;p&gt;The coding agent ships with &lt;strong&gt;GitHub&lt;/strong&gt; and &lt;strong&gt;Playwright&lt;/strong&gt; MCP servers by default. You can add more through your repository settings or a &lt;code&gt;.vscode/mcp.json&lt;/code&gt; file. For example, connecting an Azure MCP server gives the agent access to Bicep schema lookups:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"AzureBicep"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@azure/mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--namespace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"bicepschema"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--read-only"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Custom Agents, Hooks, and Skills
&lt;/h3&gt;

&lt;p&gt;Beyond custom instructions, you can create &lt;strong&gt;custom agents&lt;/strong&gt; specialised for different tasks (frontend, docs, testing), define &lt;strong&gt;hooks&lt;/strong&gt; that run shell commands at key points during execution, and package reusable &lt;strong&gt;skills&lt;/strong&gt; with instructions and scripts. See the &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent#customizing-copilot-coding-agent" rel="noopener noreferrer"&gt;official docs on customising the coding agent&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scheduled Maintenance
&lt;/h3&gt;

&lt;p&gt;Automate recurring toil with a cron workflow:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/weekly-maintenance.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Weekly Maintenance&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;5'&lt;/span&gt; &lt;span class="c1"&gt;# Friday 10 AM&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;maintenance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Weekly dependency updates&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;gh issue create \&lt;/span&gt;
            &lt;span class="s"&gt;--title "Weekly dependency updates" \&lt;/span&gt;
            &lt;span class="s"&gt;--body "Review and update all dependencies. Run full test suite." \&lt;/span&gt;
            &lt;span class="s"&gt;--assignee @copilot&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try It Today
&lt;/h2&gt;

&lt;p&gt;Pick one pain point in your current workflow and assign it to &lt;code&gt;@copilot&lt;/code&gt;. Here is a template to get you started:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Title: Analyse and optimise CI/CD pipeline performance

@copilot please review our GitHub Actions workflows and:
&lt;span class="p"&gt;
1.&lt;/span&gt; Identify performance bottlenecks
&lt;span class="p"&gt;2.&lt;/span&gt; Suggest and implement caching strategies
&lt;span class="p"&gt;3.&lt;/span&gt; Add parallel job execution where possible
&lt;span class="p"&gt;4.&lt;/span&gt; Summarise the improvements in the PR description

Assignee: @copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Start small, review the PR carefully, and build trust over time. As your team sees the results, you will naturally expand to more complex tasks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Additional Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent" rel="noopener noreferrer"&gt;Official Coding Agent Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/ai-and-ml/github-copilot/onboarding-your-ai-peer-programmer-setting-up-github-copilot-coding-agent-for-success/" rel="noopener noreferrer"&gt;GitHub Blog: Setting Up for Success&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/github-copilot-code-agent/" rel="noopener noreferrer"&gt;Microsoft Learn: Copilot Coding Agent Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/orgs/community/discussions/categories/copilot" rel="noopener noreferrer"&gt;GitHub Community Discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>githubcopilot</category>
      <category>automation</category>
    </item>
    <item>
      <title>GitHub Copilot Bootcamp: A Free Training Curriculum to Master AI-Powered Development</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Tue, 10 Feb 2026 11:33:29 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-bootcamp-a-free-4-week-training-curriculum-to-master-ai-powered-development-h5b</link>
      <guid>https://dev.to/pwd9000/github-copilot-bootcamp-a-free-4-week-training-curriculum-to-master-ai-powered-development-h5b</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot Bootcamp: A Free Training Curriculum to Master AI-Powered Development
&lt;/h2&gt;

&lt;p&gt;If you've ever felt overwhelmed by all the features GitHub Copilot offers, or wanted a structured, progressive path to go from "I've heard of Copilot" to "I use it to ship production code faster every single day," then this is for you.&lt;/p&gt;

&lt;p&gt;I'm excited to share the &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;GitHub Copilot Bootcamp&lt;/a&gt;&lt;/strong&gt;, a comprehensive, open-source, training curriculum I've designed and curated to help developers at any experience level master GitHub Copilot through &lt;strong&gt;hands-on labs, real-world exercises, prompt examples, and weekly reflections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The programme is completely free, self-paced, and publicly available as a GitHub template repository so you can fork it, adapt it for your team, or simply work through it on your own.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built This Bootcamp
&lt;/h2&gt;

&lt;p&gt;Over the past year, through conference talks, workshops, and community sessions, I noticed a recurring pattern: developers were excited about GitHub Copilot but struggled to move beyond basic code completions. Many didn't know about the different interaction modes (Ask, Edit, Agent, Plan), prompt engineering techniques, or how Copilot can transform DevOps workflows and testing.&lt;/p&gt;

&lt;p&gt;I wanted to create something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Starts from the fundamentals&lt;/strong&gt; and progressively builds to advanced techniques&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritises doing over reading&lt;/strong&gt;. Every week includes dedicated hands-on labs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Covers the full developer lifecycle&lt;/strong&gt;, not just code generation, but testing, DevOps, refactoring, security, and ethics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is easy for teams to adopt&lt;/strong&gt;. The repo is a template with a facilitator guide, participant quickstart, and built-in feedback mechanisms&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What You'll Learn: The Curriculum
&lt;/h2&gt;

&lt;p&gt;The bootcamp is structured as a progressive learning journey. Each week builds on the previous one, so by the end you'll have a well-rounded mastery of GitHub Copilot across your entire development workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  📗 Week 1: Introduction and Developer Workflow Essentials
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt;: 2–2.5 hours | &lt;strong&gt;Objective&lt;/strong&gt;: Build a solid foundation&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;What You'll Cover&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Understanding GitHub Copilot&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Architecture, supported languages, real-world use cases, value proposition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup and Configuration&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;IDE installation, authentication, preferences, troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interaction Modes&lt;/td&gt;
&lt;td&gt;15 min&lt;/td&gt;
&lt;td&gt;Ask, Edit, Agent, and Plan modes, covering when and how to use each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hands-On Lab&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45–60 min&lt;/td&gt;
&lt;td&gt;Explain, write, debug, and develop code by updating a real web application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Examples&lt;/td&gt;
&lt;td&gt;Self-study&lt;/td&gt;
&lt;td&gt;Inline completions, debugging, documentation generation patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab highlight&lt;/strong&gt;: You'll work on a practical project, updating the "Mergington High School" extracurricular activities website, using all four interaction modes to solve real problems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📘 Week 2: Advanced Development and Support Use Cases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt;: 2–4 hours | &lt;strong&gt;Objective&lt;/strong&gt;: Level up with prompt engineering and customisation&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;What You'll Cover&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Engineering Best Practices&lt;/td&gt;
&lt;td&gt;45–60 min&lt;/td&gt;
&lt;td&gt;The CRAFT framework, organisational standards, security recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Developer Workflow&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;Documentation generation, Review-Refine-Iterate cycle, progressive refinement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hands-On Lab&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;Set up custom instructions, build reusable prompt templates, configure custom agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Examples&lt;/td&gt;
&lt;td&gt;Self-study&lt;/td&gt;
&lt;td&gt;Scaffolding, code generation with constraints, unit test generation, SQL patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab highlight&lt;/strong&gt;: You'll customise your Copilot experience with repository-wide instruction files, targeted rules for specific file types, and reusable prompt templates. These are skills that pay dividends in every future session.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📙 Week 3: DevOps and Testing with Copilot
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt;: 2–2.5 hours | &lt;strong&gt;Objective&lt;/strong&gt;: Streamline delivery and improve code reliability&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;What You'll Cover&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DevOps Automation&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;CI/CD pipeline generation, Infrastructure as Code (Docker, Kubernetes, Terraform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing and Quality Assurance&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;Unit test generation, repeatable coverage, test optimisation and conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hands-On Lab&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60–90 min&lt;/td&gt;
&lt;td&gt;Create CI/CD pipelines, generate Docker/K8s configs, build test suites with coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Examples&lt;/td&gt;
&lt;td&gt;Self-study&lt;/td&gt;
&lt;td&gt;GitHub Actions, GitLab CI, IaC prompts, security scanning, framework conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab highlight&lt;/strong&gt;: This is where DevOps engineers will feel right at home. You'll use Copilot to generate real CI/CD pipelines, containerisation configs, and comprehensive test suites from scratch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📕 Week 4: Refactoring, Optimisation, and Ethical Practices
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt;: 2–2.5 hours | &lt;strong&gt;Objective&lt;/strong&gt;: Enhance code quality and adopt responsible AI practices&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;What You'll Cover&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Refactoring Large Codebases&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;Legacy code navigation, incremental refactoring, prompting patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality Refinements and Standards&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;Enforcing standards via Copilot, instruction files, automated quality checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ethical and Security Considerations&lt;/td&gt;
&lt;td&gt;30–45 min&lt;/td&gt;
&lt;td&gt;IP concerns, security vulnerabilities, responsible AI, organisational compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hands-On Lab&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45–60 min&lt;/td&gt;
&lt;td&gt;Legacy code assessment, incremental refactoring with tests, pair refactoring exercises&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Examples&lt;/td&gt;
&lt;td&gt;Self-study&lt;/td&gt;
&lt;td&gt;Security audit prompts, SOLID principles, bias detection, complete workflow patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab highlight&lt;/strong&gt;: You'll tackle real legacy code, assessing it, documenting it, refactoring it incrementally with test coverage, and running security audits, all guided by Copilot.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How the Bootcamp Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Self-Paced and Flexible
&lt;/h3&gt;

&lt;p&gt;Work through the material at your own pace. Each week is designed as a standalone session of 2–4 hours, but you can split it across multiple sittings. The content is available 24/7 in the GitHub repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-In Feedback Loop
&lt;/h3&gt;

&lt;p&gt;Every week includes structured reflection mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lab Reflections&lt;/strong&gt;: Submit your lab experience via GitHub Issue templates built into the repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly Reflections&lt;/strong&gt;: Capture key takeaways and areas for improvement through dedicated issue templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just busywork. The reflections help solidify your learning and create a personal record of your Copilot journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template Repository: Fork and Customise
&lt;/h3&gt;

&lt;p&gt;The repository is set up as a &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;GitHub template&lt;/a&gt;&lt;/strong&gt;. If you're a team lead, trainer, or community organiser, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Use this template"&lt;/strong&gt; to create your own copy&lt;/li&gt;
&lt;li&gt;Customise the content for your organisation or audience&lt;/li&gt;
&lt;li&gt;Use the included &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp/blob/master/FAQ/facilitator-guide.md" rel="noopener noreferrer"&gt;Facilitator Guide&lt;/a&gt;&lt;/strong&gt; to deliver the training&lt;/li&gt;
&lt;li&gt;Track participant progress through the built-in feedback issue templates&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Companion Resources
&lt;/h3&gt;

&lt;p&gt;The repo also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp/blob/master/FAQ/IDE-support.md" rel="noopener noreferrer"&gt;IDE Support Guide&lt;/a&gt;&lt;/strong&gt;, detailed information on Copilot features per IDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp/blob/master/FAQ/participant-quickstart.md" rel="noopener noreferrer"&gt;Participant Quickstart&lt;/a&gt;&lt;/strong&gt;, a quick reference card to get started immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly Prompt Libraries&lt;/strong&gt;, curated prompt examples for each topic area, serving as reference guides for self-study&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;This bootcamp is designed for &lt;strong&gt;developers at any experience level&lt;/strong&gt; looking to accelerate their workflow with AI-assisted coding. Whether you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;junior developer&lt;/strong&gt; wanting to learn Copilot from scratch&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;senior engineer&lt;/strong&gt; looking to formalise and deepen your Copilot usage&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;DevOps engineer&lt;/strong&gt; interested in AI-powered pipeline and infrastructure automation&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;team lead&lt;/strong&gt; searching for structured training material for your squad&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;community organiser&lt;/strong&gt; planning a Copilot workshop or meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…there's something here for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You'll need an active &lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;GitHub Copilot subscription&lt;/a&gt; (Pro, Pro+, Business, or Enterprise) to complete the hands-on labs. Copilot features vary by IDE and version. The bootcamp references the &lt;a href="https://docs.github.com/en/copilot/reference/copilot-feature-matrix" rel="noopener noreferrer"&gt;Copilot feature matrix&lt;/a&gt; as the source of truth.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Get Started Today
&lt;/h2&gt;

&lt;p&gt;Ready to level up your GitHub Copilot skills? Here's how to begin:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visit the repository&lt;/strong&gt;: &lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Star the repo&lt;/strong&gt; ⭐ to bookmark it and show your support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the README&lt;/strong&gt; to understand the full curriculum structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jump into Week 1&lt;/strong&gt; and start with "Understanding GitHub Copilot"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete the hands-on labs&lt;/strong&gt; and submit your reflections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share your progress&lt;/strong&gt;, tag me on &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; or &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. I'd love to hear how it's going!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're a trainer or facilitator, check out the &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp/blob/master/FAQ/facilitator-guide.md" rel="noopener noreferrer"&gt;Facilitator Guide&lt;/a&gt;&lt;/strong&gt; and use the template to spin up your own customised version.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;This bootcamp is open source under the MIT licence. If you spot improvements, have ideas for additional labs, or want to contribute prompt examples, check out the &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt;&lt;/strong&gt; and submit a pull request. Community contributions make this resource better for everyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The best way to learn GitHub Copilot isn't by reading about it. It's by using it. The &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;GitHub Copilot Bootcamp&lt;/a&gt;&lt;/strong&gt; gives you a structured, hands-on path to go from foundational understanding to advanced mastery across the entire development lifecycle: code generation, prompt engineering, DevOps automation, testing, refactoring, and responsible AI practices.&lt;/p&gt;

&lt;p&gt;I've poured months of real-world experience from conferences, workshops, and production usage into this curriculum. I truly hope it accelerates your journey and makes AI-assisted development accessible and enjoyable.&lt;/p&gt;

&lt;p&gt;Give it a try, and let me know what you think! 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 10-02-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>GitHub Copilot CLI: A DevOps Engineer's Practical Guide to AI-Powered Terminal Automation</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Tue, 27 Jan 2026 18:43:53 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-cli-a-devops-engineers-practical-guide-to-ai-powered-terminal-automation-1jh0</link>
      <guid>https://dev.to/pwd9000/github-copilot-cli-a-devops-engineers-practical-guide-to-ai-powered-terminal-automation-1jh0</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot CLI: A DevOps Engineer's Practical Guide to AI-Powered Terminal Automation
&lt;/h2&gt;

&lt;p&gt;As DevOps engineers, we live in the terminal, deploying infrastructure, debugging production issues, managing CI/CD pipelines, and orchestrating complex workflows. What if you could have an AI assistant directly in your command line that understands your context, writes scripts, debugs issues, and even interacts with GitHub.com on your behalf? Enter &lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;, a powerful AI agent that brings GitHub Copilot's intelligence to your terminal, enabling you to automate DevOps tasks faster and more efficiently than ever before.&lt;/p&gt;

&lt;p&gt;In this hands-on guide, we'll explore how to set up and leverage Copilot CLI to supercharge your DevOps workflows, from infrastructure automation to incident response and everything in between.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Copilot CLI Matters for DevOps Engineers
&lt;/h2&gt;

&lt;p&gt;The traditional DevOps workflow involves context switching between documentation, Stack Overflow, man pages, and your terminal. Copilot CLI eliminates this friction by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contextual AI assistance&lt;/strong&gt;: Copilot understands your project structure, Git history, and working directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code generation and modification&lt;/strong&gt;: Create scripts, modify configuration files, and refactor code without leaving your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub integration&lt;/strong&gt;: Manage issues, pull requests, workflows, and releases directly from the CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent troubleshooting&lt;/strong&gt;: Debug failed builds, analyse logs, and suggest fixes based on error messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe execution&lt;/strong&gt;: Built-in permission system for file operations, shell commands, and network access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterative workflows&lt;/strong&gt;: Work back-and-forth with the AI to refine solutions progressively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For DevOps teams, this means faster incident response, reduced context switching, consistent automation patterns, and the ability to handle complex multi-step tasks with simple natural language prompts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started: Installation and Configuration
&lt;/h2&gt;

&lt;p&gt;Before diving into practical use cases, let's get Copilot CLI set up properly. The tool is currently in public preview with &lt;a href="https://gh.io/dpa" rel="noopener noreferrer"&gt;data protection&lt;/a&gt; guarantees.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Active GitHub Copilot subscription&lt;/strong&gt; (&lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;Pro, Pro+, Business, or Enterprise&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell v6+&lt;/strong&gt; (Windows users)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization policy enabled&lt;/strong&gt; (if using Copilot through an organization)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important Note&lt;/strong&gt;: This guide focuses on &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; (&lt;code&gt;copilot&lt;/code&gt; command), which is distinct from the GitHub CLI (&lt;code&gt;gh&lt;/code&gt;). Copilot CLI is the AI-powered terminal assistant, whilst GitHub CLI is for general GitHub API operations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Installation Methods
&lt;/h3&gt;

&lt;p&gt;Choose the installation method that fits your platform:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Windows (WinGet)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stable version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GitHub.Copilot&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Prerelease version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GitHub.Copilot.Prerelease&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;macOS/Linux (Homebrew)&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stable version&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;copilot-cli

&lt;span class="c"&gt;# Prerelease version&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;copilot-cli@prerelease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;All Platforms (npm - requires Node.js 22+)&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stable version&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @github/copilot

&lt;span class="c"&gt;# Prerelease version&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @github/copilot@prerelease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;macOS/Linux (Install Script)&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Standard installation&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gh.io/copilot-install | bash

&lt;span class="c"&gt;# Or using wget&lt;/span&gt;
wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://gh.io/copilot-install | bash

&lt;span class="c"&gt;# Install as root to /usr/local/bin&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gh.io/copilot-install | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash

&lt;span class="c"&gt;# Custom directory installation&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gh.io/copilot-install | &lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local"&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Initial Authentication
&lt;/h3&gt;

&lt;p&gt;After installation, authenticate with GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Copilot CLI&lt;/span&gt;
copilot

&lt;span class="c"&gt;# On first launch, you'll be prompted to login&lt;/span&gt;
/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Follow the on-screen instructions to authenticate via your browser. Alternatively, you can use a &lt;a href="https://github.com/settings/personal-access-tokens/new" rel="noopener noreferrer"&gt;fine-grained personal access token&lt;/a&gt; with the "Copilot Requests" permission:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set the token in your environment (GH_TOKEN takes precedence over GITHUB_TOKEN)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;
&lt;span class="c"&gt;# Or use GITHUB_TOKEN&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;

&lt;span class="c"&gt;# Or add to your shell profile (.bashrc, .zshrc, etc.)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export GH_TOKEN="your_token_here"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Verify your installation:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You're now ready to start using Copilot CLI! For comprehensive documentation, refer to the official &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI documentation&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Understanding Copilot CLI Modes
&lt;/h2&gt;

&lt;p&gt;Copilot CLI operates in two distinct modes, each suited for different DevOps workflows:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Interactive Mode (Default)
&lt;/h3&gt;

&lt;p&gt;Start an interactive session where you can work iteratively with Copilot:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This mode is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exploratory tasks and troubleshooting&lt;/li&gt;
&lt;li&gt;Multi-step workflows requiring feedback&lt;/li&gt;
&lt;li&gt;Learning and experimentation&lt;/li&gt;
&lt;li&gt;Complex tasks where you need to review each step&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Programmatic Mode
&lt;/h3&gt;

&lt;p&gt;Execute single prompts directly from the command line:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Show me this week's Git commits and summarize them"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt; &lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;

&lt;span class="c"&gt;# Pipe output from scripts&lt;/span&gt;
./generate-prompt.sh | copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This mode is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD pipeline integration&lt;/li&gt;
&lt;li&gt;Scripted automation&lt;/li&gt;
&lt;li&gt;One-off tasks in scripts&lt;/li&gt;
&lt;li&gt;Batch operations&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Note&lt;/strong&gt;: When using automatic approval flags like &lt;code&gt;--allow-all-tools&lt;/code&gt;, Copilot has the same access as your user account. Use with caution in production environments.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Practical DevOps Use Cases: Step-by-Step
&lt;/h2&gt;

&lt;p&gt;Let's explore real-world scenarios where Copilot CLI shines in DevOps workflows.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Case 1: Infrastructure as Code (IaC) Development
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: You need to create a Terraform module for an Azure Kubernetes Service (AKS) cluster with monitoring and security best practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Start Copilot CLI in your project directory&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/terraform-azure-aks
copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Trust the directory when prompted (choose option 2 if you trust this directory for future sessions)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Provide a natural language prompt&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a Terraform module in the modules/aks directory that provisions an Azure Kubernetes Service cluster with the following requirements:
- Use Azure CNI networking
- Enable Azure Monitor Container Insights
- Configure Azure Active Directory integration
- Use managed identity
- Enable node auto-scaling (1-5 nodes)
- Include proper variable definitions and outputs
- Follow Terraform best practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Review the files Copilot creates and approve operations&lt;/p&gt;

&lt;p&gt;Copilot will ask permission to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create directory structure&lt;/li&gt;
&lt;li&gt;Write &lt;code&gt;.tf&lt;/code&gt; files (main.tf, variables.tf, outputs.tf)&lt;/li&gt;
&lt;li&gt;Set file permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Iterate and refine&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a locals.tf file with common tags for all resources, including environment, managed-by, and cost-center tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: Validate the configuration&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run terraform init and terraform validate in the modules/aks directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot will execute the commands and report any issues, which you can then ask it to fix.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 2: CI/CD Pipeline Creation and Debugging
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Create a GitHub Actions workflow that runs tests, builds a Docker image, and deploys to Azure Container Apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Generate the workflow&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a GitHub Actions workflow file that:
1. Triggers on push to main and pull requests
2. Runs unit tests with pytest
3. Builds a Docker image
4. Pushes to Azure Container Registry
5. Deploys to Azure Container Apps
6. Uses GitHub secrets for Azure credentials
7. Includes proper caching for dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Copilot creates &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Review and approve the file creation. Copilot will structure the workflow with proper jobs, steps, and best practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Debug a failing workflow&lt;/p&gt;

&lt;p&gt;When your workflow fails, analyse it with Copilot:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check the last failed run of the deploy workflow and explain what went wrong
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot fetches the workflow run logs, analyses the failure, and suggests fixes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The workflow failed because the Azure Container Registry login step is missing the registry name. Fix this in the workflow file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Automatically fix and commit&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix the workflow file and create a pull request with the fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot makes the changes and creates a PR on GitHub.com for you to review.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use Case 3: Incident Response and Log Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: You're responding to a production incident and need to analyse application logs quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Aggregate and analyse logs&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read the last 500 lines from /var/log/app/application.log, filter for ERROR level messages from the last hour, group them by error type, and show the top 5 most frequent errors with their counts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Investigate a specific error pattern&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I see "Database connection timeout" errors. Check the database connection configuration in @config/database.yml and suggest fixes based on the error pattern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Generate a runbook entry&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a markdown runbook entry in docs/runbooks/database-timeouts.md documenting this issue, the investigation steps, and the solution. Include the commands used for diagnosis.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Create a monitoring alert&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Based on this incident, create a GitHub Actions workflow that monitors the application log for database connection timeouts and creates an issue if the error rate exceeds 10 per hour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 4: Managing GitHub Operations at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Manage multiple repositories, issues, and pull requests across your organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Audit open pull requests&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List all open pull requests across my-org/infrastructure-* repositories that have been open for more than 7 days and haven't been updated in the last 3 days
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Batch operations&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each PR in the list, add a comment asking the author for an update and assign the "needs-attention" label
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Repository maintenance&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;In my-org/terraform-modules, check if there are any open dependabot PRs. If they pass CI and are patch or minor version updates, merge them automatically.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Issue triaging&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a report showing all critical severity issues across my-org repositories that are unassigned. Save it as triage-report-2026-01-27.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 5: Script Generation and Automation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Generate operational scripts for common DevOps tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Create a backup script&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a bash script called backup-postgres.sh that:
- Takes database name, host, and output directory as arguments
- Uses pg_dump to create a backup
- Compresses the backup with gzip
- Names the file with a timestamp
- Rotates backups (keeps only the last 7 days)
- Logs operations to /var/log/backup.log
- Includes error handling and exit codes
- Has usage instructions in comments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Create a deployment script&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a Python script deploy-app.py that:
- Accepts environment (dev/staging/prod) as argument
- Validates the environment configuration
- Builds the Docker image
- Tags it appropriately
- Pushes to the registry
- Updates the Kubernetes deployment
- Waits for rollout to complete
- Rolls back if health checks fail
- Includes comprehensive logging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Generate monitoring checks&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a health-check script that tests our microservices (API, database, Redis, message queue) and outputs results in JSON format suitable for Prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Case 6: Documentation and Knowledge Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Maintain up-to-date documentation for your infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Generate architecture documentation&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyse the Terraform files in the infrastructure/ directory and create a comprehensive architecture.md document describing our cloud infrastructure, including diagrams in Mermaid format, resource dependencies, and data flows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Update README files&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review all README.md files in this repository and update them to include current setup instructions, dependencies, and examples based on the actual code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Create API documentation&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyse the FastAPI application in src/api/ and generate OpenAPI documentation with examples for each endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Tips and Best Practices
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Use File References
&lt;/h3&gt;

&lt;p&gt;Include specific files in your prompts using &lt;code&gt;@&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explain the pipeline configuration in @.github/workflows/ci.yml and suggest optimizations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Manage Working Directories
&lt;/h3&gt;

&lt;p&gt;Switch directories without leaving your session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/cwd ~/projects/kubernetes-configs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Add additional trusted directories:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/add-dir /home/user/shared-scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Direct Shell Commands
&lt;/h3&gt;

&lt;p&gt;Run shell commands directly with &lt;code&gt;!&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!kubectl get pods -n production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Custom Instructions
&lt;/h3&gt;

&lt;p&gt;Enhance Copilot's understanding by adding custom instructions to your repository. Copilot CLI supports multiple instruction formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository-wide instructions&lt;/strong&gt;: &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path-specific instructions&lt;/strong&gt;: &lt;code&gt;.github/instructions/**/*.instructions.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent files&lt;/strong&gt;: &lt;code&gt;AGENTS.md&lt;/code&gt; in your repository root&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# DevOps Team Instructions&lt;/span&gt;

&lt;span class="gu"&gt;## Our Stack&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Cloud: Azure (Primary), AWS (Legacy)
&lt;span class="p"&gt;-&lt;/span&gt; Orchestration: Kubernetes (AKS)
&lt;span class="p"&gt;-&lt;/span&gt; IaC: Terraform
&lt;span class="p"&gt;-&lt;/span&gt; CI/CD: GitHub Actions
&lt;span class="p"&gt;-&lt;/span&gt; Monitoring: Prometheus, Grafana, Azure Monitor

&lt;span class="gu"&gt;## Conventions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All Terraform modules use semantic versioning
&lt;span class="p"&gt;-&lt;/span&gt; Kubernetes manifests use Kustomize overlays
&lt;span class="p"&gt;-&lt;/span&gt; Scripts must include error handling and logging
&lt;span class="p"&gt;-&lt;/span&gt; Follow the repository's existing naming conventions

&lt;span class="gu"&gt;## Best Practices&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Always include resource tags: environment, cost-center, managed-by
&lt;span class="p"&gt;-&lt;/span&gt; Use managed identities instead of service principals
&lt;span class="p"&gt;-&lt;/span&gt; Enable diagnostic settings on all Azure resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Session Management
&lt;/h3&gt;

&lt;p&gt;Resume previous sessions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Resume the most recent session&lt;/span&gt;
copilot &lt;span class="nt"&gt;--continue&lt;/span&gt;

&lt;span class="c"&gt;# Browse and select from available sessions&lt;/span&gt;
copilot &lt;span class="nt"&gt;--resume&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  6. Delegate to Copilot Coding Agent
&lt;/h3&gt;

&lt;p&gt;For complex multi-file changes, delegate to the more powerful Copilot coding agent:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/delegate Refactor the Terraform modules to use Azure Verified Modules (AVM) standards and update all references
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a draft PR where Copilot coding agent works in the background and requests your review when complete.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Security Permissions
&lt;/h3&gt;

&lt;p&gt;Control what Copilot can access:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow all paths (use with caution)&lt;/span&gt;
copilot &lt;span class="nt"&gt;--allow-all-paths&lt;/span&gt;

&lt;span class="c"&gt;# Allow all URLs (use with caution)&lt;/span&gt;
copilot &lt;span class="nt"&gt;--allow-all-urls&lt;/span&gt;

&lt;span class="c"&gt;# Pre-approve specific domains&lt;/span&gt;
copilot &lt;span class="nt"&gt;--allow-url&lt;/span&gt; github.com &lt;span class="nt"&gt;--allow-url&lt;/span&gt; api.github.com

&lt;span class="c"&gt;# Allow specific tools without confirmation&lt;/span&gt;
copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Backup the database"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt; &lt;span class="s1"&gt;'shell(pg_dump)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  8. Context Management Commands
&lt;/h3&gt;

&lt;p&gt;Copilot CLI provides slash commands to monitor and manage your context window:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/usage&lt;/code&gt; - View session statistics (premium requests used, duration, lines edited, token breakdown)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/context&lt;/code&gt; - Visual overview of current token usage&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/compact&lt;/code&gt; - Manually compress conversation history to free up context space&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Copilot CLI automatically compresses history when approaching 95% of the token limit and warns you when less than 20% remains.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  9. Model Selection
&lt;/h3&gt;

&lt;p&gt;Switch models during your session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Select from the available models. Each submission reduces your monthly premium request quota by the multiplier shown (e.g., &lt;code&gt;Claude Sonnet 4.5 (1x)&lt;/code&gt; = 1 premium request per prompt).&lt;/p&gt;
&lt;h3&gt;
  
  
  10. Built-in Custom Agents
&lt;/h3&gt;

&lt;p&gt;Copilot CLI includes specialised agents for common tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick codebase analysis without adding to main context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execute commands (tests, builds) with brief summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analyse dependencies and create implementation plans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code-review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Review changes, surfacing only genuine issues&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use them with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or call them directly in prompts: &lt;code&gt;Use the Plan agent to analyse how to refactor the authentication module&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  11. Extend with MCP Servers
&lt;/h3&gt;

&lt;p&gt;Copilot CLI comes with the GitHub MCP server pre-configured. Add more MCP servers to extend functionality:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mcp add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Fill in the server details and press &lt;code&gt;Ctrl+S&lt;/code&gt; to save. Server configurations are stored in &lt;code&gt;~/.copilot/mcp-config.json&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real-World DevOps Workflow Integration
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Morning Standup Prep
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Summarise my work from yesterday: show commits, closed PRs, and completed issues from all my-org repositories"&lt;/span&gt; &lt;span class="nt"&gt;--allow-all-urls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Deployment Checklist
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a deployment checklist for the v2.3.0 release:
1. Verify all tests pass in CI
2. Check database migration scripts
3. Review open security issues
4. Confirm rollback procedure is documented
5. List all changed configuration values
6. Generate release notes from PR descriptions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Post-Incident Review
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Based on the incident timeline in docs/incidents/2026-01-27-outage.md:
1. Create a root cause analysis document
2. Generate corrective action items as GitHub issues
3. Update the runbook with new procedures
4. Create a monitoring alert to prevent recurrence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Infrastructure Audit
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit our Terraform state files and list:
- Resources without required tags
- Resources in non-compliant regions
- Unencrypted storage accounts
- Public IP addresses
Generate a compliance report in CSV format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Pitfalls and How to Avoid Them
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Over-Trusting Automatic Approval
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Using &lt;code&gt;--allow-all-tools&lt;/code&gt; without understanding the risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Use granular approval flags in scripts:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Deploy to staging"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-tool&lt;/span&gt; &lt;span class="s1"&gt;'shell(kubectl)'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-tool&lt;/span&gt; &lt;span class="s1"&gt;'shell(helm)'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-url&lt;/span&gt; &lt;span class="s1"&gt;'staging.example.com'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Not Using Custom Instructions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Copilot generates solutions that don't match your team's conventions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Maintain &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; with your standards and update it regularly.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Forgetting to Review Generated Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Blindly accepting generated scripts without understanding them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Always ask Copilot to explain complex code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explain the script you just created line by line, especially the error handling logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Not Leveraging Iteration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Expecting perfect results on the first attempt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Work iteratively with Copilot:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Good start, but modify the script to:
- Use jq for JSON parsing instead of grep
- Add progress indicators
- Exit with non-zero code on failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Measuring the Impact
&lt;/h2&gt;

&lt;p&gt;Track how Copilot CLI improves your DevOps workflows:&lt;/p&gt;
&lt;h3&gt;
  
  
  Time Savings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: 30 minutes to write a deployment script with proper error handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: 5 minutes to generate, review, and test with Copilot CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Error Reduction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: Manual script writing leads to missed edge cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: Copilot suggests best practices and error handling patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Knowledge Sharing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: Tribal knowledge in senior engineers' heads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: Captured in prompts, custom instructions, and generated runbooks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Consistency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: Each engineer writes scripts differently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: Standardised patterns through custom instructions&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI represents a paradigm shift in how DevOps engineers interact with their terminal. By bringing AI assistance directly into your workflow, it enables you to work faster, make fewer mistakes, and spend more time on strategic work rather than repetitive tasks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Your Action Plan
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Copilot CLI&lt;/strong&gt; today using your preferred method&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start small&lt;/strong&gt;: Use it for simple tasks like generating scripts or analysing logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add custom instructions&lt;/strong&gt; to align Copilot with your team's practices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate into daily workflows&lt;/strong&gt;: Make Copilot CLI part of your standup, deployment, and incident response processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share learnings&lt;/strong&gt;: Document effective prompts and patterns for your team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure impact&lt;/strong&gt;: Track time saved and productivity improvements&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Resources for Further Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli" rel="noopener noreferrer"&gt;Official Copilot CLI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli" rel="noopener noreferrer"&gt;About GitHub Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli" rel="noopener noreferrer"&gt;Installing GitHub Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions" rel="noopener noreferrer"&gt;Custom Instructions Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;GitHub Copilot Plans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Use the &lt;code&gt;/feedback&lt;/code&gt; slash command in an interactive session to submit feedback, report bugs, or suggest new features directly to GitHub.&lt;/p&gt;

&lt;p&gt;The future of DevOps is conversational, start the conversation with Copilot CLI today!&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>githubcopilot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GitHub Skills: Your Complete Learning Path to AI-Powered Development</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Fri, 23 Jan 2026 00:19:05 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-skills-your-complete-learning-path-to-ai-powered-development-ieo</link>
      <guid>https://dev.to/pwd9000/github-skills-your-complete-learning-path-to-ai-powered-development-ieo</guid>
      <description>&lt;h2&gt;
  
  
  Unlock Your Development Potential with GitHub Skills
&lt;/h2&gt;

&lt;p&gt;Are you ready to transform your development journey? Whether you're just starting out with Git and GitHub, or looking to master AI-powered development with GitHub Copilot, &lt;strong&gt;&lt;a href="https://skills.github.com/" rel="noopener noreferrer"&gt;GitHub Skills&lt;/a&gt;&lt;/strong&gt; is your free, hands-on learning platform that will guide you every step of the way.&lt;/p&gt;

&lt;p&gt;In this comprehensive guide, I'll walk you through everything you need to know about GitHub Skills, show you exactly where to start, and reveal the certification paths that can validate your expertise in AI-assisted development. Let's embark on this exciting learning adventure together!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GitHub Skills Matters for Your Career
&lt;/h2&gt;

&lt;p&gt;In today's rapidly evolving tech landscape, understanding GitHub and AI-powered development tools isn't just an advantage, it's becoming essential. Consider this: GitHub serves over &lt;strong&gt;100 million developers worldwide&lt;/strong&gt;, and companies like Shopify, Stripe, Coca-Cola, and General Motors are using GitHub Copilot to accelerate their development. Here's why GitHub Skills should be your go-to learning resource:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hands-on Learning&lt;/strong&gt;: No more passive video watching. GitHub Skills provides interactive, practical courses where you learn by doing real work in actual repositories. As the platform says: &lt;em&gt;"Learning should be fun, there are no simulations or boring tutorials here, just hands-on lessons created by GitHub and taught with GitHub Actions."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free and Accessible&lt;/strong&gt;: All courses are completely free and available to anyone with a GitHub account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Paced&lt;/strong&gt;: Learn at your own speed, on your own schedule, without pressure or deadlines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Workflow Experience&lt;/strong&gt;: Everything happens with real GitHub features, Issues, Actions, Codespaces, and Pull Requests, giving you genuine experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry-Standard Tools&lt;/strong&gt;: Master the same tools and workflows used by millions of developers worldwide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Ready Skills&lt;/strong&gt;: Get ahead of the curve with courses specifically designed for GitHub Copilot and AI-assisted development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Your Learning Journey: Where to Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Absolute Beginners: Master the Fundamentals
&lt;/h3&gt;

&lt;p&gt;If you're new to GitHub or version control, start here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/introduction-to-github" rel="noopener noreferrer"&gt;Introduction to GitHub&lt;/a&gt;&lt;/strong&gt; - Learn the basics of GitHub, repositories, branches, commits, and pull requests. This is your foundation!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/communicate-using-markdown" rel="noopener noreferrer"&gt;Communicate using Markdown&lt;/a&gt;&lt;/strong&gt; - Master the formatting language that powers README files, issues, and documentation across GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/github-pages" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;&lt;/strong&gt; - Build and host your first website directly from a GitHub repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/review-pull-requests" rel="noopener noreferrer"&gt;Review Pull Requests&lt;/a&gt;&lt;/strong&gt; - Learn the collaborative review process that's central to team development.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Intermediate Learners: Level Up Your Skills
&lt;/h3&gt;

&lt;p&gt;Once you're comfortable with the basics, tackle these courses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/introduction-to-git" rel="noopener noreferrer"&gt;Introduction to Git&lt;/a&gt;&lt;/strong&gt; - Deep dive into Git version control using the command line (CLI) and VS Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/resolve-merge-conflicts" rel="noopener noreferrer"&gt;Resolve Merge Conflicts&lt;/a&gt;&lt;/strong&gt; - Handle one of the most common challenges in collaborative development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/release-based-workflow" rel="noopener noreferrer"&gt;Release-based Workflow&lt;/a&gt;&lt;/strong&gt; - Learn how to manage software releases professionally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/connect-the-dots" rel="noopener noreferrer"&gt;Connect the Dots&lt;/a&gt;&lt;/strong&gt; - Understand how to link issues, pull requests, and conversations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/hello-github-actions" rel="noopener noreferrer"&gt;GitHub Actions: Hello World&lt;/a&gt;&lt;/strong&gt; - Begin your automation journey with CI/CD pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/test-with-actions" rel="noopener noreferrer"&gt;Test with Actions&lt;/a&gt;&lt;/strong&gt; - Create workflows that enable Continuous Integration (CI) for your projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/skills/secure-code-game" rel="noopener noreferrer"&gt;Secure Code Game&lt;/a&gt;&lt;/strong&gt; - A GitHub Security Lab initiative where you secure intentionally vulnerable code. Gamified learning at its best!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mastering GitHub Copilot: The AI Revolution
&lt;/h2&gt;

&lt;p&gt;Now for the exciting part! AI-powered development! GitHub Copilot is transforming how we write code, and GitHub Skills has &lt;strong&gt;four dedicated courses&lt;/strong&gt; to help you harness its full power:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://github.com/skills/getting-started-with-github-copilot" rel="noopener noreferrer"&gt;Getting Started with GitHub Copilot&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This essential foundation course (428+ stars!) teaches you how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up and configure GitHub Copilot in VS Code&lt;/li&gt;
&lt;li&gt;Use AI suggestions effectively to accelerate your coding&lt;/li&gt;
&lt;li&gt;Understand Copilot's capabilities and limitations&lt;/li&gt;
&lt;li&gt;Write better prompts to get more accurate code suggestions&lt;/li&gt;
&lt;li&gt;Integrate AI assistance into your daily workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://github.com/skills/customize-your-github-copilot-experience" rel="noopener noreferrer"&gt;Customize Your GitHub Copilot Experience&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Take Copilot to the next level in under 30 minutes! Learn to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up repository-wide custom instructions for project context&lt;/li&gt;
&lt;li&gt;Create targeted custom instructions for specific file types and directories&lt;/li&gt;
&lt;li&gt;Build reusable prompt templates for common tasks&lt;/li&gt;
&lt;li&gt;Configure custom agents for specialised workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://github.com/skills/integrate-mcp-with-copilot" rel="noopener noreferrer"&gt;Integrate MCP with GitHub Copilot&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Expand Copilot's capabilities with the Model Context Protocol (MCP):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a GitHub MCP server with Copilot&lt;/li&gt;
&lt;li&gt;Delegate Copilot to research projects and manage issues&lt;/li&gt;
&lt;li&gt;Create pull requests from idea to implementation&lt;/li&gt;
&lt;li&gt;Unlock advanced AI-assisted workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. &lt;a href="https://github.com/skills/expand-your-team-with-copilot" rel="noopener noreferrer"&gt;Expand Your Team with Copilot Coding Agent&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The most cutting-edge course! Let Copilot tackle issues directly on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assign issues to Copilot and let it autonomously write code&lt;/li&gt;
&lt;li&gt;Review and collaborate on Copilot's work&lt;/li&gt;
&lt;li&gt;Provide feedback and iterate with your AI teammate&lt;/li&gt;
&lt;li&gt;Work on multiple issues in parallel&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This course requires GitHub Copilot Pro or higher subscription.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Skills You'll Develop:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Learn how to communicate your intent clearly to get the best AI-generated code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Review with AI&lt;/strong&gt;: Understand how to review and validate AI-suggested code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity Acceleration&lt;/strong&gt;: Discover workflows that can dramatically accelerate development. Companies like Grupo Boticário report &lt;strong&gt;94% increased developer productivity&lt;/strong&gt; with Copilot!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Practices&lt;/strong&gt;: Learn when to use Copilot and when to rely on your own expertise&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Want a structured, hands-on deep dive?&lt;/strong&gt; Check out the &lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;GitHub Copilot Bootcamp&lt;/a&gt;&lt;/strong&gt;, a free, open-source 4-week training curriculum I created that takes you from setup to advanced prompt engineering, DevOps automation, refactoring, and ethical AI practices, complete with labs and exercises. Read more about it in my blog post: &lt;strong&gt;&lt;a href="https://dev.to/pwd9000/github-copilot-bootcamp-a-free-4-week-training-curriculum-to-master-ai-powered-development-h5b"&gt;GitHub Copilot Bootcamp: A Free Training Curriculum to Master AI-Powered Development&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Certifications: Validate Your AI Development Expertise
&lt;/h2&gt;

&lt;p&gt;GitHub now offers professional certifications that can significantly boost your career prospects. According to the &lt;strong&gt;2025 Pearson VUE Value of IT Certification&lt;/strong&gt; report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;79%&lt;/strong&gt; of certified employees produce higher quality work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;70%&lt;/strong&gt; demonstrated improved productivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;32%&lt;/strong&gt; received salary increases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;82%&lt;/strong&gt; gained confidence to explore new job opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These certifications are recognised industry-wide and demonstrate your proficiency with modern development tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GitHub Certification Path&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub offers five professional certifications, available in English, Portuguese, Spanish, Korean, and Japanese:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.github.com/certification/GHF" rel="noopener noreferrer"&gt;GitHub Foundations Certification&lt;/a&gt;&lt;/strong&gt;: Start with the fundamentals. Prove your knowledge of repositories, collaboration, and GitHub features. Perfect for users who want to validate their foundational understanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.github.com/certification/ACTIONS" rel="noopener noreferrer"&gt;GitHub Actions Certification&lt;/a&gt;&lt;/strong&gt;: Designed for DevOps engineers, software developers, and IT professionals with intermediate experience in workflow creation, automation, and CI/CD pipeline management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.github.com/certification/COPILOT" rel="noopener noreferrer"&gt;GitHub Copilot Certification&lt;/a&gt;&lt;/strong&gt;: This exam evaluates your skill in using the AI-driven code completion tool in various programming languages, certifying your capability to optimise software development workflows efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.github.com/certification/GHAS" rel="noopener noreferrer"&gt;GitHub Advanced Security Certification&lt;/a&gt;&lt;/strong&gt;: For individuals with deep understanding of GitHub security features and hands-on experience securing software development workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.github.com/certification/ADMIN" rel="noopener noreferrer"&gt;GitHub Administration Certification&lt;/a&gt;&lt;/strong&gt;: Designed for system administrators, software developers, and IT professionals with intermediate-level experience in GitHub Enterprise Administration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Microsoft Applied Skills Credentials&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In addition to traditional certifications, Microsoft Learn offers &lt;strong&gt;Applied Skills credentials&lt;/strong&gt; that demonstrate practical abilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.github.com/appliedSkill/accelerate-copilot" rel="noopener noreferrer"&gt;Accelerate app development by using GitHub Copilot&lt;/a&gt;&lt;/strong&gt;: Prove your ability to leverage Copilot for real-world app development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.github.com/appliedSkill/automate-actions" rel="noopener noreferrer"&gt;Automate Azure Load Testing by using GitHub Actions&lt;/a&gt;&lt;/strong&gt;: Demonstrate automation skills in real-world scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Get Certified?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Career Advancement&lt;/strong&gt;: Stand out in job applications and promotions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill Validation&lt;/strong&gt;: Prove your expertise to employers and clients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Recognition&lt;/strong&gt;: Join an elite group of certified GitHub professionals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Learning&lt;/strong&gt;: Stay updated with the latest GitHub features and best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;: Visit the &lt;a href="https://learn.github.com/credentials" rel="noopener noreferrer"&gt;GitHub Certifications page&lt;/a&gt; to explore current certification options. Exams are available via Pearson VUE testing centres or online.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free Access for Students and Educators
&lt;/h2&gt;

&lt;p&gt;If you're a student or educator, GitHub has amazing news for you! &lt;strong&gt;&lt;a href="https://github.com/education" rel="noopener noreferrer"&gt;GitHub Education&lt;/a&gt;&lt;/strong&gt; provides:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;For Students:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free GitHub Copilot Pro&lt;/strong&gt; for verified students. The same tools professionals pay for!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Student Developer Pack&lt;/strong&gt; with free access to premium developer tools&lt;/li&gt;
&lt;li&gt;Join a community of &lt;strong&gt;5+ million students&lt;/strong&gt; worldwide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campus Experts Program&lt;/strong&gt; to develop leadership skills&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;For Educators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Classroom&lt;/strong&gt; to create virtual classrooms, manage assignments, and automate grading&lt;/li&gt;
&lt;li&gt;Connect with &lt;strong&gt;200K+ verified educators&lt;/strong&gt; globally&lt;/li&gt;
&lt;li&gt;Free access to GitHub Enterprise for educational institutions&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"GitHub Education bridges the gap between coding education and a tech career, and is accessible to everyone globally at no cost."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/edu" rel="noopener noreferrer"&gt;Join GitHub Education&lt;/a&gt; to verify your student or educator status and unlock these benefits!&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Copilot Free Tier: Start Today
&lt;/h2&gt;

&lt;p&gt;Not a student? No problem! GitHub now offers a &lt;strong&gt;free tier&lt;/strong&gt; for everyone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50 agent mode or chat requests&lt;/strong&gt; per month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2,000 code completions&lt;/strong&gt; per month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access to Haiku 4.5, GPT-4.1&lt;/strong&gt;, and more AI models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is perfect for getting started and experiencing AI-powered development before deciding if you need the Pro features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/copilot" rel="noopener noreferrer"&gt;Get started with Copilot Free&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Action Plan: Start Learning Today
&lt;/h2&gt;

&lt;p&gt;Ready to begin? Here's your step-by-step action plan:&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1: Foundation Building
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create your GitHub account (if you haven't already)&lt;/li&gt;
&lt;li&gt;Complete &lt;a href="https://github.com/skills/introduction-to-github" rel="noopener noreferrer"&gt;Introduction to GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set up your first repository and make your first commit&lt;/li&gt;
&lt;li&gt;Complete &lt;a href="https://github.com/skills/communicate-using-markdown" rel="noopener noreferrer"&gt;Communicate using Markdown&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 2-3: Intermediate Skills
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Work through 2-3 intermediate courses based on your interests&lt;/li&gt;
&lt;li&gt;Start contributing to open source projects (even small contributions count!)&lt;/li&gt;
&lt;li&gt;Practice what you learn by building a personal project&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Week 4+: AI-Powered Development
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for GitHub Copilot (free trial available for individuals)&lt;/li&gt;
&lt;li&gt;Complete &lt;a href="https://github.com/skills/getting-started-with-github-copilot" rel="noopener noreferrer"&gt;Code with GitHub Copilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Apply Copilot to your daily coding tasks&lt;/li&gt;
&lt;li&gt;Explore advanced GitHub Actions and automation courses&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Long-term: Certification Preparation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Review &lt;a href="https://learn.github.com/credentials" rel="noopener noreferrer"&gt;GitHub's certification offerings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Study recommended materials and complete relevant Skills courses&lt;/li&gt;
&lt;li&gt;Join GitHub community discussions and forums&lt;/li&gt;
&lt;li&gt;Schedule and take your certification exams&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tips for Maximising Your Learning
&lt;/h2&gt;

&lt;p&gt;Here are some battle-tested strategies to get the most out of GitHub Skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set a Schedule&lt;/strong&gt;: Dedicate specific times each week to learning. Consistency beats intensity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Projects&lt;/strong&gt;: Apply what you learn immediately by building real projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join Communities&lt;/strong&gt;: Connect with other learners on GitHub Discussions, Discord, or Reddit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teach Others&lt;/strong&gt;: The best way to solidify your knowledge is to explain it to someone else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't Rush&lt;/strong&gt;: Take time to understand concepts deeply rather than racing through courses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiment Freely&lt;/strong&gt;: GitHub Skills courses are in isolated repositories. Feel free to experiment without fear of breaking anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Microsoft Learn: 185+ GitHub Training Modules
&lt;/h2&gt;

&lt;p&gt;Complement your GitHub Skills journey with &lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/browse/?products=github" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;&lt;/strong&gt;, which offers over 185 GitHub-related training modules! Highlights include:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Recommended Learning Paths:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/paths/copilot/" rel="noopener noreferrer"&gt;GitHub Copilot Fundamentals Part 1&lt;/a&gt;&lt;/strong&gt; (5 hr 11 min) - Comprehensive foundation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/paths/gh-copilot-2/" rel="noopener noreferrer"&gt;GitHub Copilot Fundamentals Part 2&lt;/a&gt;&lt;/strong&gt; (3 hr 19 min) - Advanced concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Language-Specific Copilot Courses:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/introduction-copilot-python/" rel="noopener noreferrer"&gt;Using GitHub Copilot with Python&lt;/a&gt;&lt;/strong&gt; (22 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/introduction-copilot-javascript/" rel="noopener noreferrer"&gt;Using GitHub Copilot with JavaScript&lt;/a&gt;&lt;/strong&gt; (22 min)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Advanced Topics:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/github-copilot-agent-mode/" rel="noopener noreferrer"&gt;Building applications with GitHub Copilot agent mode&lt;/a&gt;&lt;/strong&gt; (50 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/introduction-prompt-engineering-with-github-copilot/" rel="noopener noreferrer"&gt;Introduction to prompt engineering with GitHub Copilot&lt;/a&gt;&lt;/strong&gt; (30 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/responsible-ai-with-github-copilot/" rel="noopener noreferrer"&gt;Responsible AI with GitHub Copilot&lt;/a&gt;&lt;/strong&gt; (15 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/training/modules/develop-unit-tests-using-github-copilot-tools/" rel="noopener noreferrer"&gt;Develop unit tests using GitHub Copilot tools&lt;/a&gt;&lt;/strong&gt; (1 hr 7 min)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional Resources and Next Steps
&lt;/h2&gt;

&lt;p&gt;Once you've completed the core GitHub Skills courses, continue your learning journey with these resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.github.com/" rel="noopener noreferrer"&gt;GitHub Docs&lt;/a&gt;&lt;/strong&gt;: The comprehensive official documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.blog/" rel="noopener noreferrer"&gt;GitHub Blog&lt;/a&gt;&lt;/strong&gt;: Stay updated on new features and best practices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.community/" rel="noopener noreferrer"&gt;GitHub Community&lt;/a&gt;&lt;/strong&gt;: Connect with other developers, ask questions, and share knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.github.com/en/copilot" rel="noopener noreferrer"&gt;GitHub Copilot Documentation&lt;/a&gt;&lt;/strong&gt;: Deep dive into AI-assisted development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://copilot.github.trust.page/" rel="noopener noreferrer"&gt;GitHub Copilot Trust Center&lt;/a&gt;&lt;/strong&gt;: Security, privacy, and responsible AI policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.pluralsight.com/search?q=GitHub" rel="noopener noreferrer"&gt;Pluralsight GitHub Courses&lt;/a&gt;&lt;/strong&gt;: Subscription-based in-depth training&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.linkedin.com/learning/topics/github" rel="noopener noreferrer"&gt;LinkedIn Learning GitHub Courses&lt;/a&gt;&lt;/strong&gt;: Professional development resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Pwd9000-ML/GitHub-Copilot-Bootcamp" rel="noopener noreferrer"&gt;GitHub Copilot Bootcamp&lt;/a&gt;&lt;/strong&gt;: Free hands-on training curriculum for mastering GitHub Copilot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/orgs/community/discussions/categories/github-education" rel="noopener noreferrer"&gt;GitHub Education Community Discussions&lt;/a&gt;&lt;/strong&gt;: Connect with fellow learners&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: Your Journey Starts Now
&lt;/h2&gt;

&lt;p&gt;The future of development is AI-powered, collaborative, and more accessible than ever before. With &lt;strong&gt;44+ courses&lt;/strong&gt; on GitHub Skills, &lt;strong&gt;185+ modules&lt;/strong&gt; on Microsoft Learn, &lt;strong&gt;five professional certifications&lt;/strong&gt;, and a &lt;strong&gt;free tier&lt;/strong&gt; of GitHub Copilot available to everyone, there has never been a better time to start your learning journey.&lt;/p&gt;

&lt;p&gt;GitHub Skills provides you with a clear, structured path from complete beginner to certified expert in modern development practices. And remember, you're not alone on this journey. Join a community of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100+ million developers&lt;/strong&gt; on GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5+ million students&lt;/strong&gt; in GitHub Education&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;200K+ verified educators&lt;/strong&gt; sharing knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Your Action Checklist:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start small&lt;/strong&gt;: Don't try to learn everything at once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice consistently&lt;/strong&gt;: Regular practice beats occasional cramming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply your knowledge&lt;/strong&gt;: Build real projects to solidify your learning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider certification&lt;/strong&gt;: Validate your skills with recognised credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stay curious&lt;/strong&gt;: The tech landscape evolves rapidly, commit to continuous learning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the community&lt;/strong&gt;: Connect with fellow learners and share your progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're aiming to land your first developer job, transition to a new role, or simply enhance your existing skills with AI-powered tools, GitHub Skills is your launchpad. The platform is free, the content is excellent, and the potential is limitless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to begin?&lt;/strong&gt; Head over to &lt;strong&gt;&lt;a href="https://skills.github.com/" rel="noopener noreferrer"&gt;skills.github.com&lt;/a&gt;&lt;/strong&gt; and start your first course today. Your future self will thank you!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Learning should be fun: There are no simulations or boring tutorials here, just hands-on lessons created by GitHub and taught with GitHub Actions."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 23-01-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Microsoft Ignite 2025 for Devs &amp; DevOps: My Top Announcements</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Wed, 19 Nov 2025 17:20:05 +0000</pubDate>
      <link>https://dev.to/pwd9000/microsoft-ignite-2025-for-devs-devops-my-top-announcements-4f6i</link>
      <guid>https://dev.to/pwd9000/microsoft-ignite-2025-for-devs-devops-my-top-announcements-4f6i</guid>
      <description>&lt;h2&gt;
  
  
  Microsoft Ignite 2025 for Devs &amp;amp; DevOps: My Top Announcements
&lt;/h2&gt;

&lt;p&gt;This years &lt;a href="https://ignite.microsoft.com/" rel="noopener noreferrer"&gt;Microsoft Ignite 2025&lt;/a&gt; is very clearly the "agentic AI" edition. &lt;a href="https://news.microsoft.com/ignite-2025-book-of-news/" rel="noopener noreferrer"&gt;The Book of News&lt;/a&gt; is packed with updates about agents, MCP, Copilots and end-to-end lifecycle tooling.&lt;/p&gt;

&lt;p&gt;If you live in the world of &lt;strong&gt;GitHub, Azure, IaC and DevOps&lt;/strong&gt;, there's a &lt;em&gt;lot&lt;/em&gt; to unpack, but you don't need every announcement to understand how your day-to-day work is about to change.&lt;/p&gt;

&lt;p&gt;In this post I'm focusing on the pieces that matter most for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Developers shipping cloud apps on Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps / SRE teams running infra at scale&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teams doubling down on GitHub &amp;amp; GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the quick hit list of the &lt;strong&gt;top announcements&lt;/strong&gt; for this crowd:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Foundry&lt;/strong&gt; as the agentic developer platform, with a unified &lt;strong&gt;MCP tool catalogue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundry Agent Service&lt;/strong&gt; as a hosted, multi agent runtime with built-in memory and integration with Microsoft 365 and Agent 365.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundry Control Plane&lt;/strong&gt; to operate agents with enterprise grade observability, governance and security.&lt;/li&gt;
&lt;li&gt;The next phase of &lt;strong&gt;Azure Copilot&lt;/strong&gt; embedded across portal, PowerShell and CLI for deployment, migration, optimisation and troubleshooting workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native integration between Microsoft Defender for Cloud and GitHub Advanced Security&lt;/strong&gt; for runtime aware DevSecOps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure DocumentDB (GA)&lt;/strong&gt;, &lt;strong&gt;SQL Server 2025 (GA) with GitHub Copilot integration&lt;/strong&gt;, &lt;strong&gt;Azure HorizonDB (PostgreSQL, preview)&lt;/strong&gt; and &lt;strong&gt;Fabric databases (GA)&lt;/strong&gt; as an AI ready data layer.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;Three big themes jump out for engineering teams:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentic dev platforms are now real products, not slideware.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Microsoft Foundry + Foundry Agent Service + Azure Copilot form a stack for building and running AI agents with real governance, observability and runtime guarantees.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The data layer has gone fully "AI ready" for builders.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You get an open Azure DocumentDB service, an AI powered SQL Server 2025, a new Azure HorizonDB (PostgreSQL) for vector workloads and Fabric databases as a unified SaaS database experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security and GitHub are stitched directly into the pipeline.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Microsoft Defender for Cloud now &lt;strong&gt;natively integrates with GitHub Advanced Security&lt;/strong&gt;, connecting code → build → runtime and even using Copilot Autofix/GitHub Copilot to propose fixes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Taken together, this is a pretty major reshape of the &lt;strong&gt;Dev/DevOps toolchain&lt;/strong&gt;: agents and Copilots become first class participants in your pipelines, while GitHub sits at the center of secure SDLC.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Concepts or Pillars
&lt;/h2&gt;

&lt;p&gt;Here are the core building blocks from Ignite that I'd highlight for any Dev/DevOps team.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Microsoft Foundry: the agentic developer platform
&lt;/h3&gt;

&lt;p&gt;Microsoft Foundry is Microsoft's "factory" for AI apps and agents, and Ignite 2025 upgrades it significantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unified MCP tool catalogue (preview).&lt;/strong&gt;
Developers get a single, governed catalogue of &lt;strong&gt;Model Context Protocol (MCP) tools&lt;/strong&gt; – public and private – discoverable and managed from one secure interface in Foundry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep business integration via Logic Apps.&lt;/strong&gt;
Connectors to 1,400+ systems (SAP, Salesforce, HubSpot, etc.) are exposed as MCP tools, so agents can act on &lt;strong&gt;real enterprise data and workflows&lt;/strong&gt; without custom plumbing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prebuilt AI services as MCP servers.&lt;/strong&gt;
Transcription, translation, voice, document processing and more ship as ready made tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom tool extensibility.&lt;/strong&gt;
You can securely expose &lt;em&gt;any&lt;/em&gt; API or function via API Management as MCP tools – perfect for wrapping existing line of business logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that, the &lt;strong&gt;model router&lt;/strong&gt; in Microsoft Foundry is now GA and can auto select from a pool of models (GPT-4.1, GPT-5, DeepSeek, Llama, Grok, etc.), optimising for cost, latency and quality, with reported &lt;em&gt;up to 40% faster responses and 50% lower costs&lt;/em&gt; in early use.&lt;/p&gt;

&lt;p&gt;For developers, this means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Pick the tools and guardrails, not the specific model per prompt."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Foundry Agent Service: hosted, multi agent runtime
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundry Agent Service&lt;/strong&gt; is evolving into an agent native runtime that hides a lot of "yak shaving" for infra and orchestration. New in preview:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosted agents:&lt;/strong&gt; Deploy agents built with Microsoft Agent Framework, LangGraph, CrewAI or OpenAI Agents SDK &lt;strong&gt;without managing containers or infra&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in memory:&lt;/strong&gt; Agents get persistent, secure memory across sessions for context, preferences and history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi agent workflows:&lt;/strong&gt; Coordinate multiple specialised agents across long running processes (onboarding, approvals, supply chain, etc.) with either a visual designer or an API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft 365 + Agent 365 integration:&lt;/strong&gt; Deploy agents directly into Microsoft 365 apps via Agent 365, with governance and enterprise deployment patterns baked in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The new &lt;strong&gt;Microsoft Agent Framework&lt;/strong&gt; unifies previous work like Semantic Kernel + AutoGen into a single open-source SDK, with durable execution for more resilient agents.&lt;/p&gt;

&lt;p&gt;This is &lt;em&gt;very&lt;/em&gt; relevant for DevOps: it's basically &lt;strong&gt;"Kubernetes for agents"&lt;/strong&gt; – but managed for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Foundry Control Plane: DevOps for agents
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundry Control Plane&lt;/strong&gt; (preview) extends Agent 365 so developers get visibility, security and control over agents running in the Microsoft Cloud.&lt;/p&gt;

&lt;p&gt;Key ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One place to see &lt;strong&gt;health, performance, usage and cost&lt;/strong&gt; for agents.&lt;/li&gt;
&lt;li&gt;Behavioural guardrails and policies applied centrally.&lt;/li&gt;
&lt;li&gt;Built on &lt;strong&gt;Entra Agent ID&lt;/strong&gt;, with Defender watching runtime activity and Purview protecting data flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you currently treat microservices as deployable units, expect to treat &lt;strong&gt;agents as another fleet&lt;/strong&gt; you observe, budget and secure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep Dive: Azure Copilot + GitHub in the DevOps Loop
&lt;/h2&gt;

&lt;p&gt;For infrastructure and app modernisation, the &lt;strong&gt;next phase of Azure Copilot&lt;/strong&gt; is a big deal.&lt;/p&gt;

&lt;p&gt;Azure Copilot now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives directly inside the &lt;strong&gt;Azure portal, PowerShell and CLI&lt;/strong&gt; as specialised agents (private preview).&lt;/li&gt;
&lt;li&gt;Evolves chat into a &lt;strong&gt;full screen command centre&lt;/strong&gt;, powered by GPT-5 reasoning, ARM-driven scenarios and artifact generation.&lt;/li&gt;
&lt;li&gt;Respects existing &lt;strong&gt;RBAC, Azure Policy and compliance&lt;/strong&gt; and requires explicit confirmation before changing resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent capabilities are very DevOps flavoured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Generate architectures and deployments aligned with the &lt;strong&gt;Well Architected Framework&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration:&lt;/strong&gt; Discover workloads and generate AI powered IaaS/PaaS recommendations, with &lt;strong&gt;GitHub Copilot integration&lt;/strong&gt; to help modernise .NET and Java apps and turn inventory into actionable code blueprints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimisation:&lt;/strong&gt; Surface cost + carbon aware actions and walk you through execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability &amp;amp; troubleshooting:&lt;/strong&gt; Combine metrics, traces and logs (Azure Monitor / Application Insights) to diagnose fullstack issues and suggest mitigation, auto create support tickets when needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This effectively wires &lt;strong&gt;GitHub Copilot ↔ Azure Copilot ↔ ARM&lt;/strong&gt; into a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GitHub Copilot helps you define and refactor app + infra code.&lt;/li&gt;
&lt;li&gt;Azure Copilot proposes target architectures, migration plans and optimisations.&lt;/li&gt;
&lt;li&gt;Microsoft Foundry / Agent 365 manage agents and automations that keep that environment &lt;strong&gt;continuously modernised&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  GitHub &amp;amp; Security: DevSecOps from Code to Runtime
&lt;/h2&gt;

&lt;p&gt;The most GitHub specific security announcement is:&lt;/p&gt;

&lt;h3&gt;
  
  
  Native integration of Defender for Cloud + GitHub Advanced Security (preview)
&lt;/h3&gt;

&lt;p&gt;Microsoft Defender for Cloud now natively integrates with &lt;strong&gt;GitHub Advanced Security&lt;/strong&gt; to protect cloud native apps across the &lt;strong&gt;full app lifecycle&lt;/strong&gt;, from code to runtime.&lt;/p&gt;

&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runtime context + code linkage.&lt;/strong&gt;
Runtime threats are mapped back to the exact code in GitHub, helping teams prioritise &lt;em&gt;exploitable&lt;/em&gt; issues rather than just noisy findings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real time collaboration.&lt;/strong&gt;
Security teams can create campaigns that notify GitHub repo owners, open GitHub issues directly from Defender, and track remediation status without leaving the security portal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI assisted fixes (Copilot Autofix + GitHub Copilot coding agent).&lt;/strong&gt;
The integration can generate suggested fixes with Copilot, reducing mean-time-to-remediate while keeping developers in familiar GitHub workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For DevOps teams, this is basically &lt;strong&gt;DevSecOps with runtime awareness&lt;/strong&gt;: CI/CD, repos, and runtime all feed a single security picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Data Layer: AI Ready Databases for Builders
&lt;/h2&gt;

&lt;p&gt;Ignite also brings several important updates to the data platform that directly impact developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure DocumentDB (GA)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First managed service built on the &lt;strong&gt;opensource DocumentDB standard&lt;/strong&gt; under the Linux Foundation, compatible with MongoDB.&lt;/li&gt;
&lt;li&gt;Multicloud ready, AI friendly with vector + hybrid search, instant autoscale and independent compute/storage scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SQL Server 2025 (GA) – with GitHub Copilot integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Access to AI models on-prem or in the cloud.&lt;/li&gt;
&lt;li&gt;Native JSON support, REST APIs, and change event streaming.&lt;/li&gt;
&lt;li&gt;Near real time analytics via mirroring data into Microsoft OneLake/Fabric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot integration in VS Code and SQL Server Management Studio 22&lt;/strong&gt;, plus a new cross platform Python driver (&lt;code&gt;mssql-python&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure HorizonDB (PostgreSQL, private preview)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Azure HorizonDB is a new &lt;strong&gt;PostgreSQL cloud database&lt;/strong&gt; optimised for mission critical and AI workloads:&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fabric Databases (GA)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fabric databases merge SQL DB + Cosmos DB into a unified SaaS database in Fabric with &lt;strong&gt;native vector and RAG support&lt;/strong&gt; for real time, intelligent apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  GitHub Copilot in the Wider Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dataverse MCP Server (GA) + SDK for Python (preview).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Copilot migration workflows.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is clear: &lt;strong&gt;GitHub Copilot becomes the coding surface&lt;/strong&gt;, while Microsoft Foundry, Azure Copilot and Dataverse MCP provide the &lt;em&gt;context and tools&lt;/em&gt; around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Insight: How This Changes a Real DevOps Workflow
&lt;/h2&gt;

&lt;p&gt;Imagine a fairly typical scenario:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You have a fleet of legacy .NET apps, some SQL Server workloads and a growing list of "let's build an agent for this" asks from the business.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assess &amp;amp; plan with Azure Copilot.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor with GitHub Copilot + App Service Managed Instance.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modernise data with SQL Server 2025 / Azure HorizonDB / Fabric.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Introduce agents with Foundry Agent Service.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure the pipeline with Defender + GitHub.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operate agents with Foundry Control Plane + Azure Copilot.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Practical Steps or How-To
&lt;/h2&gt;

&lt;p&gt;If you want to start &lt;em&gt;this month&lt;/em&gt;, here's a pragmatic checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get hands-on with Foundry Agent Service (where available).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable GitHub Advanced Security + Defender integration in a pilot repo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trial Azure Copilot in your infra lifecycle.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick one data workload to modernise.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Tips, Tricks, or Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design for MCP from day one.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat agents as production workloads, not "experiments".&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep GitHub as the single source of truth.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start with one or two golden paths.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Microsoft Ignite 2025 signals a major step forward for developers and DevOps teams building on Azure and GitHub. The rise of agentic platforms, AI ready data services, and integrated DevSecOps workflows means that teams can deliver more intelligent, secure, and efficient applications than ever before.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent platforms (Microsoft Foundry, Foundry Agent Service, Agent 365)&lt;/li&gt;
&lt;li&gt;AI-ready infra and data (Azure Copilot, Azure DocumentDB, SQL Server 2025, Azure HorizonDB, Fabric databases)&lt;/li&gt;
&lt;li&gt;A tighter GitHub centric DevSecOps loop (Defender + GitHub Advanced Security + Copilot)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Embracing these tools and concepts will be key to staying competitive in the rapidly evolving landscape of cloud development and operations.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Like, share, follow me on:&lt;br&gt;&lt;br&gt;
🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 19-11-2025&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>github</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Automate Terraform Module Releases on the public registry using GitHub Actions</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Thu, 13 Nov 2025 17:11:59 +0000</pubDate>
      <link>https://dev.to/pwd9000/automate-terraform-module-releases-on-the-public-registry-using-github-actions-26em</link>
      <guid>https://dev.to/pwd9000/automate-terraform-module-releases-on-the-public-registry-using-github-actions-26em</guid>
      <description>&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;This tutorial uses examples from the following GitHub project &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets" rel="noopener noreferrer"&gt;Terraform module repository - Dynamic Subnets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you enjoy creating public terraform modules for the community like I do, and host them on the public terraform registry. You will enjoy todays tutorial. We will be covering how you can automate and maintain your terraform module versioning using &lt;strong&gt;GitHub dependabot&lt;/strong&gt; and also automate your module releases and pushing versioned releases to the public &lt;strong&gt;Terraform registry&lt;/strong&gt; using &lt;strong&gt;GitHub Actions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;Anyone can publish and share modules on the &lt;a href="https://registry.terraform.io/" rel="noopener noreferrer"&gt;Terraform Registry&lt;/a&gt; for free. In this tutorial I wont be going into detail on how to create your account, linking it with your GitHub repository and doing the initial push to the registry.&lt;/p&gt;

&lt;p&gt;This initial process is fairly well documented on HashiCorps tutorial on: &lt;a href="https://www.terraform.io/registry/modules/publish" rel="noopener noreferrer"&gt;How to publish modules to the registry&lt;/a&gt;. It is a fairly easy and frictionless process.&lt;/p&gt;

&lt;p&gt;In this tutorial we are going to focus more on maintaining an existing module and how to automate releasing new versions using &lt;strong&gt;GitHub Actions&lt;/strong&gt;. We will also look at how we can automatically update the provider versions (dependencies) used inside of the terraform module using a great feature of GitHub called &lt;strong&gt;Dependabot&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable Dependabot
&lt;/h3&gt;

&lt;p&gt;Dependabot is a service built into GitHub that helps you update your dependencies automatically, so you can spend less time updating dependencies and more time building. Dependabot even includes checks for version updates for &lt;strong&gt;terraform providers&lt;/strong&gt; inside of your configuration files which we will look at today.&lt;/p&gt;

&lt;p&gt;Check out this list of &lt;strong&gt;&lt;a href="https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#package-ecosystem" rel="noopener noreferrer"&gt;package-ecosystems&lt;/a&gt;&lt;/strong&gt; that's supported.&lt;/p&gt;

&lt;p&gt;One key benefit is that dependency updates might contain security vulnerability fixes, bug fixes etc and manually keeping track of updates or updating them when a newer version is available is a lot of hassle. This is where &lt;strong&gt;Dependabot&lt;/strong&gt; can help by automatically raising a Pull Request whenever there is a newer version of a dependency.&lt;/p&gt;

&lt;p&gt;In my &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets" rel="noopener noreferrer"&gt;Terraform module repository - Dynamic Subnets&lt;/a&gt;, I have a terraform file called &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets/blob/master/versions.tf" rel="noopener noreferrer"&gt;versions.tf&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.0"&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;azurerm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/azurerm"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 3.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Using &lt;code&gt;&amp;gt;=&lt;/code&gt; constraints allows more flexibility for module consumers while ensuring minimum version requirements are met.&lt;/p&gt;

&lt;p&gt;We will set up dependabot by creating a special folder at the root of the repository called &lt;code&gt;.github&lt;/code&gt; and inside that folder create a &lt;code&gt;YAML&lt;/code&gt; file called &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets/blob/master/.github/dependabot.yml" rel="noopener noreferrer"&gt;dependabot.yml&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# To get started with Dependabot version updates, you'll need to specify which&lt;/span&gt;
&lt;span class="c1"&gt;# package ecosystems to update and where the package manifests are located.&lt;/span&gt;
&lt;span class="c1"&gt;# Please see the documentation for all configuration options:&lt;/span&gt;
&lt;span class="c1"&gt;# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference&lt;/span&gt;

&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;updates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;package-ecosystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform'&lt;/span&gt; &lt;span class="c1"&gt;# See documentation for possible values&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/'&lt;/span&gt; &lt;span class="c1"&gt;# Location of package manifests&lt;/span&gt;
    &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;daily'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Limit number of open PRs for version updates&lt;/span&gt;
    &lt;span class="na"&gt;open-pull-requests-limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Add labels to PRs&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dependencies'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Add reviewers&lt;/span&gt;
    &lt;span class="na"&gt;reviewers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pwd9000'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Add assignees&lt;/span&gt;
    &lt;span class="na"&gt;assignees&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pwd9000'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Customise commit message prefix&lt;/span&gt;
    &lt;span class="na"&gt;commit-message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;chore'&lt;/span&gt;
      &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scope'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once the dependabot &lt;code&gt;YAML&lt;/code&gt; file has been created and committed to the repository, you will notice that it automatically opened a Pull-Request for me, showing me that my provider version is out of date:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9ddgtbbb6on20a1siql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9ddgtbbb6on20a1siql.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48opr0zdoq090izez36r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48opr0zdoq090izez36r.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can decide whether we want to accept this version bump or not by either accepting and merging the pull request or cancelling and closing the pull request. As you can also see the schedule interval is set to &lt;code&gt;daily&lt;/code&gt; which means &lt;strong&gt;dependabot&lt;/strong&gt; will check everyday to see if there are any new terraform provider versions released and automatically open a pull request if there is. Pretty neat!&lt;/p&gt;
&lt;h3&gt;
  
  
  Automate Releases - Terraform Registry
&lt;/h3&gt;

&lt;p&gt;Say for example we take this version change (or any changes and improvements on our module), and after testing the changes on our module we want to create a new public release version of our module on the public &lt;strong&gt;&lt;a href="https://registry.terraform.io/" rel="noopener noreferrer"&gt;Terraform Registry&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; I have written a public &lt;strong&gt;GitHub marketplace Action&lt;/strong&gt; called: &lt;a href="https://github.com/marketplace/actions/terraform-tests-for-azure" rel="noopener noreferrer"&gt;Terraform Tests for AZURE&lt;/a&gt; to do automated tests. Check it out.&lt;/p&gt;

&lt;p&gt;After testing to perform a release we will create a &lt;strong&gt;workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Note:&lt;/strong&gt; It's recommended to use minimal permissions for GitHub Actions workflows. We'll add explicit permissions to our workflow.&lt;/p&gt;

&lt;p&gt;Under the &lt;code&gt;.github&lt;/code&gt; directory we will create a new folder called &lt;code&gt;workflows&lt;/code&gt; and in this folder we will create another &lt;code&gt;YAML&lt;/code&gt; file called: &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets/blob/master/.github/workflows/push-tf-registry.yml" rel="noopener noreferrer"&gt;push-tf-registry.yml&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;### This workflow can be used to manually create new release versions from a tag push using e.g. VSCODE ###&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release to terraform public registry&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*.*.*'&lt;/span&gt; &lt;span class="c1"&gt;# More specific pattern for semantic versioning&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt; &lt;span class="c1"&gt;# Required for creating releases&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4.2.2&lt;/span&gt; &lt;span class="c1"&gt;# Updated to latest version&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ncipollo/release-action@v1.14.0&lt;/span&gt; &lt;span class="c1"&gt;# Updated to latest version&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;generateReleaseNotes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;github.ref_name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}'&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This workflow will trigger on a tag push and create a &lt;strong&gt;GitHub Release&lt;/strong&gt;. As per the &lt;a href="https://www.terraform.io/registry/modules/publish#releasing-new-versions" rel="noopener noreferrer"&gt;documented process&lt;/a&gt; for creating a new release on the public terraform registry we have to use a valid semantic version, optionally prefixed with a v.&lt;/p&gt;

&lt;p&gt;Example of valid tags are: v1.0.1 and 0.9.4. To publish a new module, you must already have at least one tag created.&lt;/p&gt;

&lt;p&gt;To release a new version, create and push a new tag with the proper format. The webhook will notify the registry of the new version and it will appear on the registry usually in less than a minute.&lt;/p&gt;

&lt;p&gt;The current version of my public module is &lt;code&gt;version = 1.0.3&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz36ca74dd5lhe7a24xl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz36ca74dd5lhe7a24xl5.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This corresponds with the current release on the &lt;strong&gt;GitHub&lt;/strong&gt; repository hosting the module:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby6ypqtt5ihmr6sqc1q0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby6ypqtt5ihmr6sqc1q0.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the &lt;strong&gt;GitHub workflow&lt;/strong&gt; set up, Let's create a new tag and push that to our repository on GitHub. The workflow will trigger and create a new release for us automatically, so let's try it out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqor9zz9kh2xfjz0gei.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqor9zz9kh2xfjz0gei.gif" alt="image.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating the tag &lt;code&gt;1.0.4&lt;/code&gt; and pushing the tag to the remote repository. Notice that the workflow has triggered and ran, creating a new release automatically using the tag version number:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhawwcntbengb3bb4597.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhawwcntbengb3bb4597.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frn1irfe23j914vaho6r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frn1irfe23j914vaho6r5.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The &lt;strong&gt;GitHub Action&lt;/strong&gt; that creates the release has an input setting: &lt;code&gt;generateReleaseNotes: true&lt;/code&gt;, so the release notes have also been created for us dynamically.&lt;/p&gt;

&lt;p&gt;As you can see the new version is also now published on the &lt;strong&gt;Terraform Registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdm7hif9p1oksh1jqpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdm7hif9p1oksh1jqpx.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it, now we can automatically let &lt;strong&gt;Dependabot&lt;/strong&gt; take care of our terraform provider versioning and create pull requests automatically when new provider versions are released.&lt;/p&gt;

&lt;p&gt;Additionally we also have a really straight forward easy way to create new releases of our own module by simply creating a valid semantic version number as a tag and then push that tag to our remote repository where the &lt;strong&gt;GitHub Workflow&lt;/strong&gt; will create a release for us based on the semantic version tag.&lt;/p&gt;

&lt;p&gt;As an added bonus, I also added another section onto the &lt;strong&gt;Dependabot&lt;/strong&gt; config file to also regularly check the &lt;strong&gt;GitHub Actions&lt;/strong&gt; used in the workflow called: &lt;code&gt;ncipollo/release-action@v1&lt;/code&gt; and &lt;code&gt;actions/checkout@v4&lt;/code&gt; so when new versions of these actions come out, &lt;strong&gt;Dependabot&lt;/strong&gt; will also let me know that I can update my workflow actions (I've also changed my Dependency scans to run on a specific weekday and time as shown below).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;updates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;package-ecosystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform'&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/'&lt;/span&gt; &lt;span class="c1"&gt;# Location of package manifests&lt;/span&gt;
    &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;weekly'&lt;/span&gt;
      &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sunday'&lt;/span&gt;
      &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;09:00'&lt;/span&gt;
      &lt;span class="na"&gt;timezone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Europe/London'&lt;/span&gt;
    &lt;span class="na"&gt;open-pull-requests-limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dependencies'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform'&lt;/span&gt;
    &lt;span class="na"&gt;reviewers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pwd9000'&lt;/span&gt;
    &lt;span class="na"&gt;assignees&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pwd9000'&lt;/span&gt;
    &lt;span class="na"&gt;commit-message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;chore'&lt;/span&gt;
      &lt;span class="na"&gt;prefix-development&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fix'&lt;/span&gt;
      &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scope'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Ignore specific versions or version ranges&lt;/span&gt;
    &lt;span class="na"&gt;ignore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;dependency-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hashicorp/azurerm'&lt;/span&gt;
        &lt;span class="na"&gt;versions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.x'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.0.0'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Allow specific dependency updates&lt;/span&gt;
    &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;dependency-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Target branch for PRs (default is the default branch)&lt;/span&gt;
    &lt;span class="na"&gt;target-branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Milestone to set on PRs&lt;/span&gt;
    &lt;span class="na"&gt;milestone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Prefix for PR branch names&lt;/span&gt;
    &lt;span class="na"&gt;pull-request-branch-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;separator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-'&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;package-ecosystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;github-actions'&lt;/span&gt;
    &lt;span class="c1"&gt;# Workflow files stored in the&lt;/span&gt;
    &lt;span class="c1"&gt;# default location of `.github/workflows`&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/'&lt;/span&gt; &lt;span class="c1"&gt;# Location of package manifests&lt;/span&gt;
    &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;weekly'&lt;/span&gt;
      &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;friday'&lt;/span&gt;
      &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;09:00'&lt;/span&gt;
      &lt;span class="na"&gt;timezone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Europe/London'&lt;/span&gt;
    &lt;span class="na"&gt;open-pull-requests-limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dependencies'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;github-actions'&lt;/span&gt;
    &lt;span class="c1"&gt;# Optional: Group updates together&lt;/span&gt;
    &lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;github-actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;actions/*'&lt;/span&gt;
        &lt;span class="na"&gt;update-types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;minor'&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;patch'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Advanced Dependabot Configuration
&lt;/h3&gt;

&lt;p&gt;For more complex scenarios, you can leverage additional Dependabot features:&lt;/p&gt;
&lt;h4&gt;
  
  
  Grouping Dependencies
&lt;/h4&gt;

&lt;p&gt;Starting with Dependabot version 2, you can group related updates together:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;terraform-providers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hashicorp/*'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;azure/*'&lt;/span&gt;
    &lt;span class="na"&gt;update-types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;minor'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;patch'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Vendor or Cache Dependencies
&lt;/h4&gt;

&lt;p&gt;For ecosystems that support it, you can specify vendoring:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;vendor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# For ecosystems like Go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Rebase Strategy
&lt;/h4&gt;

&lt;p&gt;Control how Dependabot handles rebasing:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rebase-strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;auto'&lt;/span&gt; &lt;span class="c1"&gt;# Options: auto, disabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Versioning Strategy
&lt;/h4&gt;

&lt;p&gt;Specify how to update manifest files:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;versioning-strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;increase'&lt;/span&gt; &lt;span class="c1"&gt;# Options: auto, increase, increase-if-necessary, lockfile-only, widen&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Security Updates Configuration
&lt;/h4&gt;

&lt;p&gt;Enable or disable security updates:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;enable-beta-ecosystems&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# For beta ecosystem support&lt;/span&gt;
&lt;span class="na"&gt;insecure-external-code-execution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deny'&lt;/span&gt; &lt;span class="c1"&gt;# Options: allow, deny&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Custom Registry Configuration
&lt;/h4&gt;

&lt;p&gt;For private registries or custom sources:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;registries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;terraform-private&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;terraform-registry'&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://my-private-registry.com'&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${{secrets.REGISTRY_TOKEN}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note: When using custom registries, ensure the token is properly configured in your repository secrets.&lt;/p&gt;

&lt;p&gt;These additional options provide fine-grained control over how Dependabot manages your dependencies, allowing you to customise the automation to fit your team's workflow perfectly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Troubleshooting Common Issues
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Module Not Appearing on Terraform Registry
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ensure your repository name follows the format: &lt;code&gt;terraform-&amp;lt;PROVIDER&amp;gt;-&amp;lt;NAME&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify the webhook is properly configured in your GitHub repository settings&lt;/li&gt;
&lt;li&gt;Check that your tags follow semantic versioning (e.g., v1.0.0, 1.0.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Dependabot PRs Not Being Created
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Verify the &lt;code&gt;.github/dependabot.yml&lt;/code&gt; file is in the default branch&lt;/li&gt;
&lt;li&gt;Check repository settings to ensure Dependabot is enabled&lt;/li&gt;
&lt;li&gt;Review the Dependabot logs in the repository's Insights &amp;gt; Dependency graph &amp;gt; Dependabot&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Release Workflow Failures
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; has appropriate permissions&lt;/li&gt;
&lt;li&gt;Verify tag format matches the workflow trigger pattern&lt;/li&gt;
&lt;li&gt;Check that previous releases don't have conflicting names&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Version Constraints&lt;/strong&gt;: Use flexible version constraints (&lt;code&gt;&amp;gt;=&lt;/code&gt;) in modules to avoid forcing specific versions on consumers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Always test module changes before creating a new release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Keep your README and examples updated with each release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Regularly review and merge Dependabot security updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Versioning&lt;/strong&gt;: Follow semantic versioning strictly:

&lt;ul&gt;
&lt;li&gt;MAJOR version for incompatible API changes&lt;/li&gt;
&lt;li&gt;MINOR version for backwards-compatible functionality additions&lt;/li&gt;
&lt;li&gt;PATCH version for backwards-compatible bug fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Fully Automated Testing and Release on changes to IaC
&lt;/h3&gt;

&lt;p&gt;Check out the next blog post on this series: &lt;strong&gt;Using Terraform on GitHub&lt;/strong&gt; that shows how to perform fully automated integration test when &lt;strong&gt;Dependabot&lt;/strong&gt; opens a PR. Followed by automatically merging that pull request if all tests have finished successfully and then also as a last step automatically deploy a new release/version and pushing that to the Terraform registry: &lt;a href="https://dev.to/pwd9000/automated-terraform-tests-for-azure-using-github-actions-4349"&gt;Automated Terraform Tests for Azure using GitHub Actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you have enjoyed this post and have learned something new. You can find the code samples used in this blog post on my GitHub project &lt;a href="https://github.com/Pwd9000-ML/terraform-azurerm-dynamic-subnets" rel="noopener noreferrer"&gt;Terraform module repository - Dynamic Subnets&lt;/a&gt;. ❤️&lt;/p&gt;

&lt;p&gt;If you are interested in checking out my public terraform modules for azure, including some cool modules like &lt;strong&gt;OpenAI-Service&lt;/strong&gt;, &lt;strong&gt;OpenAI-Private-ChatGpt&lt;/strong&gt;, &lt;strong&gt;Custom Role Definitions&lt;/strong&gt; and &lt;strong&gt;Sonarqube ACI&lt;/strong&gt;, you can find them on the public terraform registry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/search/modules?namespace=Pwd9000-ML" rel="noopener noreferrer"&gt;Pwd9000-ML - Public Terraform Registry Modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/pwd9000" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.buymeacoffee.com%2Fbutton-api%2F%3Ftext%3DBuy%2520me%2520a%2520coffee%26emoji%3D%26slug%3Dpwd9000%26button_colour%3DFFDD00%26font_colour%3D000000%26font_family%3DCookie%26outline_colour%3D000000%26coffee_colour%3Dffffff"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>terraform</category>
      <category>githubactions</category>
      <category>devops</category>
    </item>
    <item>
      <title>Managing GitHub Copilot &amp; VS Code Settings Across Teams</title>
      <dc:creator>Marcel.L</dc:creator>
      <pubDate>Wed, 12 Nov 2025 16:49:29 +0000</pubDate>
      <link>https://dev.to/pwd9000/managing-github-copilot-vs-code-settings-across-teams-1phj</link>
      <guid>https://dev.to/pwd9000/managing-github-copilot-vs-code-settings-across-teams-1phj</guid>
      <description>&lt;h2&gt;
  
  
  Managing GitHub Copilot &amp;amp; VS Code Settings Across Teams
&lt;/h2&gt;

&lt;p&gt;Ensuring consistent development environments across your team is crucial for productivity and code quality. This guide explores five practical approaches to manage &lt;a href="https://code.visualstudio.com/docs/getstarted/settings" rel="noopener noreferrer"&gt;VS Code settings&lt;/a&gt; and &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/getting-started-with-github-copilot" rel="noopener noreferrer"&gt;GitHub Copilot configurations&lt;/a&gt;: workspace configurations, VS Code profiles, bootstrap scripts, enterprise policies, and a combined strategy that leverages the strengths of each method. For a detailed, complementary walkthrough of every GitHub Copilot and Copilot Chat setting that can be configured in VS Code, see the companion article: &lt;a href="https://dev.to/pwd9000/tune-github-copilot-settings-in-vs-code-32kp"&gt;Tune GitHub Copilot Settings in VS Code&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Repository Workspace Settings (&lt;code&gt;.vscode/settings.json&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;The simplest and most widely adopted approach is to commit &lt;a href="https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings" rel="noopener noreferrer"&gt;VS Code workspace configuration files&lt;/a&gt; directly to your repository. These workspace settings override user preferences when the project folder is open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.vscode/&lt;/code&gt; directory in your repository root with these configuration files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;.vscode/settings.json&lt;/code&gt;&lt;/strong&gt; - &lt;a href="https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings-file" rel="noopener noreferrer"&gt;Project-specific settings&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.tabSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.eol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.trimTrailingWhitespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.preferences.quoteStyle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"single"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;GitHub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Copilot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;settings&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.enable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plaintext"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scminput"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;&lt;code&gt;.vscode/extensions.json&lt;/code&gt;&lt;/strong&gt; - &lt;a href="https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions" rel="noopener noreferrer"&gt;Recommended extensions&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"github.copilot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"github.copilot-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-next"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"unwantedRecommendations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version controlled with code&lt;/li&gt;
&lt;li&gt;Zero configuration for developers&lt;/li&gt;
&lt;li&gt;Project-specific conventions&lt;/li&gt;
&lt;li&gt;Works across all platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not enforced (users can override)&lt;/li&gt;
&lt;li&gt;Limited to workspace scope&lt;/li&gt;
&lt;li&gt;No control over user-level settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; All collaborative projects as a baseline configuration.&lt;/p&gt;


&lt;h2&gt;
  
  
  2) VS Code Profiles (Team Configuration Templates)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/editor/profiles" rel="noopener noreferrer"&gt;VS Code Profiles&lt;/a&gt; bundle settings, extensions, UI layout, and keybindings into shareable configurations. Teams can maintain standard profiles for different roles or tech stacks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating and Sharing Profiles
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Configure VS Code with desired settings and extensions&lt;/li&gt;
&lt;li&gt;Open Command Palette → "Profiles: Export Profile..."&lt;/li&gt;
&lt;li&gt;Choose what to include (settings, extensions, UI state, keybindings, snippets, tasks)&lt;/li&gt;
&lt;li&gt;Export as &lt;code&gt;.code-profile&lt;/code&gt; file (&lt;a href="https://code.visualstudio.com/docs/editor/profiles#_export" rel="noopener noreferrer"&gt;profile export documentation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Share via repository, wiki, or internal documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tip: If you're using VS Code Profiles to standardise settings across teams, the companion article &lt;a href="https://dev.to/pwd9000/tune-github-copilot-settings-in-vs-code-32kp"&gt;Tune GitHub Copilot Settings in VS Code&lt;/a&gt; includes a detailed sample &lt;code&gt;settings.json&lt;/code&gt; and explains Copilot-specific keys you might want to include.&lt;/p&gt;
&lt;h3&gt;
  
  
  Importing a Profile
&lt;/h3&gt;

&lt;p&gt;New team members can &lt;a href="https://code.visualstudio.com/docs/editor/profiles#_import" rel="noopener noreferrer"&gt;import profiles&lt;/a&gt; via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command Palette → "Profiles: Import Profile..."&lt;/li&gt;
&lt;li&gt;Or via URL if hosted: &lt;code&gt;code --profile "Team Profile" --profile-import-url https://example.com/profile.code-profile&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete environment replication&lt;/li&gt;
&lt;li&gt;Includes UI layout and theme&lt;/li&gt;
&lt;li&gt;Multiple profiles for different contexts&lt;/li&gt;
&lt;li&gt;Built-in VS Code feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual import required&lt;/li&gt;
&lt;li&gt;No automatic updates&lt;/li&gt;
&lt;li&gt;Can diverge over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Onboarding new developers, standardising team environments.&lt;/p&gt;


&lt;h2&gt;
  
  
  3) Enterprise Management Policies
&lt;/h2&gt;

&lt;p&gt;For organisations requiring strict compliance, VS Code supports &lt;a href="https://code.visualstudio.com/docs/setup/enterprise" rel="noopener noreferrer"&gt;policy management&lt;/a&gt; through various enterprise tools.&lt;/p&gt;
&lt;h3&gt;
  
  
  Windows Group Policy / Intune Configuration
&lt;/h3&gt;

&lt;p&gt;VS Code respects &lt;a href="https://code.visualstudio.com/docs/setup/enterprise#_group-policy-windows" rel="noopener noreferrer"&gt;policies set via&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows Registry (Group Policy)&lt;/li&gt;
&lt;li&gt;macOS preferences&lt;/li&gt;
&lt;li&gt;Linux policy files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example policy locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows: &lt;code&gt;HKLM\SOFTWARE\Policies\Microsoft\VSCode&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;macOS: &lt;code&gt;/Library/Preferences/com.microsoft.VSCode.plist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Linux: &lt;code&gt;/etc/vscode/policies.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Supported Policy Settings
&lt;/h3&gt;

&lt;p&gt;Learn more about &lt;a href="https://code.visualstudio.com/docs/setup/enterprise#_policy-settings" rel="noopener noreferrer"&gt;available policy settings&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"UpdateMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manual"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"TelemetryLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ExtensionsGallery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://internal-marketplace.company.com"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ExtensionsAllowedList"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"github.copilot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"github.copilot-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-next"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"GitHubCopilotSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"organizationAccess"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allowed"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centrally enforced&lt;/li&gt;
&lt;li&gt;Audit compliance&lt;/li&gt;
&lt;li&gt;Cannot be overridden by users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires IT infrastructure&lt;/li&gt;
&lt;li&gt;Platform-specific implementation&lt;/li&gt;
&lt;li&gt;Less flexible for developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Regulated industries, security-sensitive environments.&lt;/p&gt;


&lt;h2&gt;
  
  
  4) Bootstrap Scripts (Automated Setup)
&lt;/h2&gt;

&lt;p&gt;Scripts can automate the configuration of VS Code settings, especially useful for ephemeral environments like &lt;a href="https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/setting-up-your-project-for-codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; or CI runners.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cross-Platform Setup Script
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PowerShell (Windows/PowerShell Core):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# scripts/setup-vscode.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$repoSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Join-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PSScriptRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'../.vscode/settings.json'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$userSettingsDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$IsLinux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$IsMacOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/Code/User"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;APPDATA&lt;/span&gt;&lt;span class="s2"&gt;/Code/User"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$userSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Join-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettingsDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'settings.json'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$repoSettings&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Write-Warning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Repository settings not found at: &lt;/span&gt;&lt;span class="nv"&gt;$repoSettings&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Ensure directory exists&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettingsDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-Null&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Merge or copy settings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$Force&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Merging settings..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertFrom-Json&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$repoSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertFrom-Json&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$prop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$new&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PSObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Add-Member&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MemberType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NoteProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$prop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$prop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nv"&gt;$current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Copying settings..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Copy-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$repoSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userSettings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"✓ VS Code settings configured"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ForegroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Green&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Bash (Linux/macOS):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# scripts/setup-vscode.sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;REPO_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/../.vscode/settings.json"&lt;/span&gt;
&lt;span class="nv"&gt;USER_SETTINGS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.config/Code/User"&lt;/span&gt;
&lt;span class="nv"&gt;USER_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER_SETTINGS_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/settings.json"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Repository settings not found at: &lt;/span&gt;&lt;span class="nv"&gt;$REPO_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Ensure directory exists&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_SETTINGS_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Merge or copy settings&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"--force"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Merging settings..."&lt;/span&gt;
    &lt;span class="c"&gt;# Using jq for JSON merging&lt;/span&gt;
    jq &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;'.[0] * .[1]'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER_SETTINGS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tmp"&lt;/span&gt;
    &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER_SETTINGS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tmp"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Copying settings..."&lt;/span&gt;
    &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_SETTINGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✓ VS Code settings configured"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; CI/CD pipelines, &lt;a href="https://code.visualstudio.com/docs/devcontainers/containers" rel="noopener noreferrer"&gt;development containers&lt;/a&gt;, &lt;a href="https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/setting-up-your-project-for-codespaces" rel="noopener noreferrer"&gt;Codespaces&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  5) Recommended Combined Strategy
&lt;/h2&gt;

&lt;p&gt;Layer these approaches based on your organisation's needs:&lt;/p&gt;
&lt;h3&gt;
  
  
  Small Teams / Open Source Projects
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Primary:&lt;/strong&gt; &lt;code&gt;.vscode/settings.json&lt;/code&gt; and &lt;code&gt;.vscode/extensions.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional:&lt;/strong&gt; Shared profile for complex setups&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Medium Sized Teams
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Foundation:&lt;/strong&gt; Repository workspace settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding:&lt;/strong&gt; Team VS Code profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation:&lt;/strong&gt; Bootstrap script for Codespaces/containers&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Enterprise Organisations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Baseline:&lt;/strong&gt; Repository workspace settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standards:&lt;/strong&gt; Department/role-based VS Code profiles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance:&lt;/strong&gt; Enterprise policies via MDM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation:&lt;/strong&gt; Bootstrap scripts for cloud workstations&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  GitHub Copilot-Specific Configuration
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Key Settings and Their Impact
&lt;/h3&gt;

&lt;p&gt;Learn more about &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/getting-started-with-github-copilot?tool=vscode#configuring-github-copilot-settings" rel="noopener noreferrer"&gt;GitHub Copilot settings in VS Code&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github.copilot.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Workspace/User&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.github.com/en/copilot/using-github-copilot/getting-started-with-github-copilot?tool=vscode#enabling-or-disabling-github-copilot" rel="noopener noreferrer"&gt;Control Copilot per language&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github.copilot.advanced.authProvider&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Authentication method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github.copilot.editor.enableAutoCompletions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User/Workspace&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.github.com/en/copilot/using-github-copilot/getting-started-with-github-copilot?tool=vscode#getting-your-first-suggestion" rel="noopener noreferrer"&gt;Automatic suggestions&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github.copilot.chat.localeOverride&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.github.com/en/copilot/using-github-copilot/asking-github-copilot-questions-in-your-ide" rel="noopener noreferrer"&gt;Chat interface language&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a full list and explanation of Copilot-related VS Code settings (including &lt;code&gt;chat&lt;/code&gt;, &lt;code&gt;agent&lt;/code&gt;, and inline suggestion keys) check: &lt;a href="https://dev.to/pwd9000/tune-github-copilot-settings-in-vs-code-32kp"&gt;Tune GitHub Copilot Settings in VS Code&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Security Considerations
&lt;/h3&gt;

&lt;p&gt;Review &lt;a href="https://docs.github.com/en/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization" rel="noopener noreferrer"&gt;GitHub Copilot security best practices&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Disable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Copilot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sensitive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.enable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plaintext"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dotenv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"yaml"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Settings not applying&lt;/td&gt;
&lt;td&gt;Policy override&lt;/td&gt;
&lt;td&gt;Check &lt;a href="https://code.visualstudio.com/docs/setup/enterprise#_troubleshooting" rel="noopener noreferrer"&gt;enterprise policies&lt;/a&gt; with &lt;code&gt;code --status&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot not working&lt;/td&gt;
&lt;td&gt;License/auth issue&lt;/td&gt;
&lt;td&gt;Verify with &lt;code&gt;GitHub Copilot: Check Status&lt;/code&gt; command (&lt;a href="https://docs.github.com/en/copilot/troubleshooting-github-copilot" rel="noopener noreferrer"&gt;troubleshooting guide&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensions missing&lt;/td&gt;
&lt;td&gt;Marketplace access&lt;/td&gt;
&lt;td&gt;Confirm &lt;a href="https://code.visualstudio.com/docs/setup/network#_proxy-server-support" rel="noopener noreferrer"&gt;network/proxy settings&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile not importing&lt;/td&gt;
&lt;td&gt;Version mismatch&lt;/td&gt;
&lt;td&gt;Update VS Code to &lt;a href="https://code.visualstudio.com/updates" rel="noopener noreferrer"&gt;latest version&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start simple:&lt;/strong&gt; Begin with repository settings before adding complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document changes:&lt;/strong&gt; Maintain a CHANGELOG for settings updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test incrementally:&lt;/strong&gt; Validate settings in a clean environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect autonomy:&lt;/strong&gt; Balance standardisation with developer flexibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular reviews:&lt;/strong&gt; Audit settings quarterly for relevance&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Effective settings management improves team velocity and code consistency. Start with repository-level configuration files as they provide immediate value with minimal overhead. Add VS Code profiles for richer onboarding experiences, and only implement enterprise policies when compliance demands it. The layered approach ensures you can adapt as your team grows without sacrificing developer productivity.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.L&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 12-11-2025&lt;/p&gt;

</description>
      <category>github</category>
      <category>vscode</category>
      <category>githubcopilot</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
