<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Developer Tools | The .NET Blog</title><link>https://thedotnetblog.com/tags/developer-tools/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/developer-tools/index.xml" rel="self" type="application/rss+xml"/><item><title>VS Code 1.119: OpenTelemetry for Agent Sessions, Browser Integration, and Security</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-code-1-119-highlights/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-code-1-119-highlights/</guid><description>VS Code 1.119 (May 2026) adds OpenTelemetry tracing for agent sessions, browser tab sharing for agents, trust &amp; security improvements, and a 1.119.1 security patch.</description><content:encoded>&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_119"&gt;VS Code 1.119&lt;/a&gt; shipped May 6, 2026 (with a 1.119.1 security patch shortly after). The release focuses on agent observability, browser interaction, and reducing interruptions.&lt;/p&gt;
&lt;h2 id="opentelemetry-tracing-for-agent-sessions"&gt;OpenTelemetry tracing for agent sessions&lt;/h2&gt;
&lt;p&gt;This is the standout feature for anyone running agents in production or debugging agentic workflows. Enable it with two settings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;github.copilot.chat.otel.enabled&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;github.copilot.chat.otel.otlpEndpoint&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://localhost:4318&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Traces follow GenAI semantic conventions. Each agent request produces an &lt;code&gt;invoke_agent&lt;/code&gt; root span with nested child spans: &lt;code&gt;chat&lt;/code&gt;, &lt;code&gt;execute_tool&lt;/code&gt;, and &lt;code&gt;execute_hook&lt;/code&gt;. Token usage is reported per request — including cache read and cache creation counts.&lt;/p&gt;
&lt;p&gt;Works with the local agent, Copilot CLI background agent, and the Claude agent. Any OTLP-compatible backend accepts the traces — the &lt;a href="https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/standalone"&gt;Aspire Dashboard standalone&lt;/a&gt; works well for local development.&lt;/p&gt;
&lt;h2 id="agents-can-now-access-browser-tabs"&gt;Agents can now access browser tabs&lt;/h2&gt;
&lt;p&gt;Agents can request access to your integrated browser tabs — but it&amp;rsquo;s not automatic. You have to explicitly share a tab via the context picker, drag-and-drop, or suggested context. There&amp;rsquo;s a sharing button in the browser to revoke access. When an agent tries to open a new tab on the same domain as an already-open (unshared) tab, VS Code prompts you to reuse the existing tab instead.&lt;/p&gt;
&lt;h2 id="optimized-token-usage"&gt;Optimized token usage&lt;/h2&gt;
&lt;p&gt;An experimental lightweight model now handles agent todo-list management, keeping that housekeeping off the more expensive primary model. Reduces token burn on tasks that don&amp;rsquo;t need full reasoning capacity.&lt;/p&gt;
&lt;h2 id="trust--security"&gt;Trust &amp;amp; security&lt;/h2&gt;
&lt;p&gt;Fewer interruptions: VS Code 1.119 reduces prompts for network access requests and temp folder writes by agents. The 1.119.1 patch addresses specific security issues — worth updating if you haven&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id="markdown-preview-quick-swap"&gt;Markdown preview quick-swap&lt;/h2&gt;
&lt;p&gt;Small but useful: you can now quickly swap the current editor to Markdown preview without navigating away.&lt;/p&gt;
&lt;h2 id="vs-code-agents-insiders-preview"&gt;VS Code Agents (Insiders preview)&lt;/h2&gt;
&lt;p&gt;The redesigned agent session UI — new repo picker (local/repos/remote), sub-session improvements, web + mobile polish, progress animations — is available in Insiders at &lt;a href="https://insiders.vscode.dev/agents"&gt;insiders.vscode.dev/agents&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Full changelog: &lt;a href="https://code.visualstudio.com/updates/v1_119"&gt;code.visualstudio.com/updates/v1_119&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure Data Studio Is Retired: Move Your Azure SQL Workflow to VS Code</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio retired February 6 2025, with support ending February 28 2026. Here is the complete migration path to VS Code with the MSSQL extension.</description><content:encoded>&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;Azure Data Studio retired on February 6, 2025&lt;/a&gt;, with support ending February 28, 2026 — the recommended replacement is VS Code with the MSSQL extension.&lt;/p&gt;
&lt;h2 id="what-to-install"&gt;What to install&lt;/h2&gt;
&lt;p&gt;Three things to get started:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MSSQL extension&lt;/strong&gt; — search &amp;ldquo;SQL Server (mssql)&amp;rdquo; in the VS Code Marketplace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL Database Projects extension&lt;/strong&gt; — schema-as-code, build validation, guided publish&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — required by the build system; missing SDK is the most common first-run issue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrating-your-ads-connections-and-settings"&gt;Migrating your ADS connections and settings&lt;/h2&gt;
&lt;p&gt;The MSSQL extension ships an &lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt; that handles the one-time migration in a guided flow: saved connections, connection groups, settings, and key bindings are all imported automatically.&lt;/p&gt;
&lt;h2 id="restoring-f5-muscle-memory"&gt;Restoring F5 muscle memory&lt;/h2&gt;
&lt;p&gt;ADS users rely on F5 to run queries. Install the &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt; extension to get ADS-style key bindings back, including F5.&lt;/p&gt;
&lt;h2 id="sql-database-projects-schema-as-code"&gt;SQL Database Projects: schema as code&lt;/h2&gt;
&lt;p&gt;Right-click a project → &lt;strong&gt;Publish&lt;/strong&gt; → configure target → review the generated T-SQL script → deploy. The script preview before deployment is the key safety feature. Item templates generate stubs for tables, stored procedures, and views — the same workflow as SSDT.&lt;/p&gt;
&lt;p&gt;Common gotcha: a &lt;strong&gt;target platform mismatch&lt;/strong&gt; in the &lt;code&gt;.sqlproj&lt;/code&gt; file will cause build errors if the project was created against a different SQL Server version.&lt;/p&gt;
&lt;h2 id="schema-compare-and-schema-designer"&gt;Schema Compare and Schema Designer&lt;/h2&gt;
&lt;p&gt;The extension also includes &lt;strong&gt;Schema Compare&lt;/strong&gt; (diff your project against the deployed database) and &lt;strong&gt;Schema Designer&lt;/strong&gt; (visual schema editing without writing DDL by hand).&lt;/p&gt;
&lt;h2 id="microsoft-fabric-developers"&gt;Microsoft Fabric developers&lt;/h2&gt;
&lt;p&gt;The setup is identical, but start from the &lt;strong&gt;Fabric portal&lt;/strong&gt; and connect the database to Git first before opening it in VS Code. Microsoft has a dedicated guide: &lt;em&gt;Azure Data Studio to VS Code — What it means for SQL database in Fabric developers&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The migration is a one-time guided flow, not a manual rebuild. Install the three tools, run the ADS Migration Toolkit, restore your key bindings, and you&amp;rsquo;re back to normal in under 10 minutes.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;full article&lt;/a&gt; for step-by-step screenshots and the Fabric-specific walkthrough.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server Is Now a .mcpb — Install It Without Any Runtime</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>The Azure MCP Server is now available as an MCP Bundle (.mcpb) — download it, drag it into Claude Desktop, and you're done. No Node.js, Python, or .NET runtime required.</description><content:encoded>&lt;p&gt;You know what was annoying about setting up MCP servers? You needed a runtime. Node.js for the npm version, Python for pip/uvx, .NET SDK for the dotnet flavor, Docker if you wanted containers. Just to get a tool connected to your AI client.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server just changed that&lt;/a&gt;. It&amp;rsquo;s now available as an &lt;code&gt;.mcpb&lt;/code&gt; — an MCP Bundle — and the setup is drag-and-drop.&lt;/p&gt;
&lt;h2 id="whats-an-mcp-bundle"&gt;What&amp;rsquo;s an MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Think of it like a VS Code extension (&lt;code&gt;.vsix&lt;/code&gt;) or a browser extension (&lt;code&gt;.crx&lt;/code&gt;), but for MCP servers. A &lt;code&gt;.mcpb&lt;/code&gt; file is a self-contained ZIP archive that includes the server binary and all its dependencies. Everything needed to run on your platform, packaged together.&lt;/p&gt;
&lt;p&gt;The end result: you download one file, open it in a supported client, and the server runs. No runtime to install, no &lt;code&gt;package.json&lt;/code&gt; to manage, no version conflicts.&lt;/p&gt;
&lt;h2 id="how-to-install-it"&gt;How to install it&lt;/h2&gt;
&lt;p&gt;Three steps:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Download the bundle for your platform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;GitHub Releases page&lt;/a&gt; and grab the &lt;code&gt;.mcpb&lt;/code&gt; file for your OS and architecture. Make sure you pick the right one — &lt;code&gt;osx-arm64&lt;/code&gt; for Apple Silicon, &lt;code&gt;osx-x64&lt;/code&gt; for Intel Mac, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Install in Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The easiest way: drag and drop the &lt;code&gt;.mcpb&lt;/code&gt; file into the Claude Desktop window while you&amp;rsquo;re on the Extensions settings page (&lt;code&gt;☰ → File → Settings → Extensions&lt;/code&gt;). Review the server details, click Install, confirm. Done.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip: You can also set Claude Desktop as the default app for &lt;code&gt;.mcpb&lt;/code&gt; files and double-click to install.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. Authenticate to Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. The Azure MCP Server uses your existing Azure credentials.&lt;/p&gt;
&lt;h2 id="what-you-can-do-with-it"&gt;What you can do with it&lt;/h2&gt;
&lt;p&gt;Once installed, you have access to 100+ Azure service tools directly from your AI client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query and manage Cosmos DB, Storage, Key Vault, App Service, Foundry&lt;/li&gt;
&lt;li&gt;Generate &lt;code&gt;az&lt;/code&gt; CLI commands for any task&lt;/li&gt;
&lt;li&gt;Create Bicep and Terraform templates&lt;/li&gt;
&lt;li&gt;Get architecture recommendations and diagnostics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try prompts like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;List all resource groups in my subscription&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Generate a Bicep template for a web app with a SQL database&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;What Cosmos DB databases do I have?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Show me the secrets in my Key Vault named my-vault&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="which-install-method-should-you-use"&gt;Which install method should you use?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&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;code&gt;.mcpb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude Desktop users who want zero-config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code Extension&lt;/td&gt;
&lt;td&gt;Developers working in VS Code + GitHub Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm/npx&lt;/td&gt;
&lt;td&gt;Developers who already have Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pip/uvx&lt;/td&gt;
&lt;td&gt;Python developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;CI/CD pipelines and containers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All methods give you the same tools. The &lt;code&gt;.mcpb&lt;/code&gt; is just the most frictionless path for Claude Desktop users.&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;MCP servers are genuinely useful — they let AI clients interact with external systems in a structured way. But the setup friction has been a real barrier, especially for users who aren&amp;rsquo;t developers or who just don&amp;rsquo;t want to manage runtimes for every tool they install.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;.mcpb&lt;/code&gt; format feels like the right direction. It&amp;rsquo;s the same principle as VS Code extensions or browser extensions: one file, platform-native binary, install and go.&lt;/p&gt;
&lt;p&gt;If the MCP ecosystem keeps moving this direction, connecting AI clients to services will get a lot simpler.&lt;/p&gt;
&lt;h2 id="get-started"&gt;Get started&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Download&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;full post&lt;/a&gt; for troubleshooting tips and a comparison of all install methods.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118: Copilot CLI Gets Session Names, Model Badges, and TypeScript 7.0 Nightly Opt-In</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 is a focused release centered on Copilot CLI improvements — session naming, model badges, auto model selection, and a new option to opt into TypeScript 7.0 nightlies.</description><content:encoded>&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;Visual Studio Code 1.118&lt;/a&gt; is a smaller focused release — mostly Copilot CLI refinements — but there are a few things worth noting if you use the Agents app or TypeScript heavily.&lt;/p&gt;
&lt;h2 id="copilot-cli-sessions-get-real-names"&gt;Copilot CLI: sessions get real names&lt;/h2&gt;
&lt;p&gt;The Copilot CLI SDK session-title APIs are now used as the source of truth for session names. Previously you&amp;rsquo;d get auto-generated labels; now sessions surface the actual name from the SDK. Small quality-of-life improvement but it makes navigating multiple agent sessions a lot less confusing.&lt;/p&gt;
&lt;h2 id="switch-sessions-faster-with-keyboard-shortcuts"&gt;Switch sessions faster with keyboard shortcuts&lt;/h2&gt;
&lt;p&gt;The Agents app now has &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt;, etc. bound to quickly switch between sessions. If you&amp;rsquo;re running multiple Copilot CLI sessions in parallel (which, if you&amp;rsquo;re doing agent-heavy work, you probably are), this removes a lot of mouse clicking.&lt;/p&gt;
&lt;h2 id="model-badges-in-chat"&gt;Model badges in chat&lt;/h2&gt;
&lt;p&gt;Copilot CLI responses in the chat panel now show a model badge — you can see at a glance which model handled each request. Useful when you&amp;rsquo;re experimenting with different models in the same session.&lt;/p&gt;
&lt;h2 id="auto-model-selection-lands-in-copilot-cli"&gt;Auto model selection lands in Copilot CLI&lt;/h2&gt;
&lt;p&gt;The auto model selection feature — previously available in other parts of Copilot — now works in the Copilot CLI agent too. Let the system pick the best model for the task rather than manually switching.&lt;/p&gt;
&lt;h2 id="typescript-70-nightly-opt-in"&gt;TypeScript 7.0 nightly opt-in&lt;/h2&gt;
&lt;p&gt;This one&amp;rsquo;s interesting if you&amp;rsquo;re on the TypeScript cutting edge: you can now opt in to testing TypeScript 7.0 nightlies directly from VS Code settings. TypeScript 7.0 is a major release with significant changes (the &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;beta dropped a few days ago&lt;/a&gt;), and the opt-in path makes it easy to test without changing your global TypeScript install.&lt;/p&gt;
&lt;h2 id="under-the-hood-node-pty-cleanup"&gt;Under the hood: &lt;code&gt;node-pty&lt;/code&gt; cleanup&lt;/h2&gt;
&lt;p&gt;The Copilot CLI SDK now resolves &lt;code&gt;node-pty&lt;/code&gt; from VS Code via &lt;code&gt;hostRequire&lt;/code&gt; instead of copying binaries into the SDK&amp;rsquo;s prebuilds folder at build time. This is an internal change but it simplifies distribution and means fewer things that can go wrong at runtime.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Not a splashy release, but the Copilot CLI improvements add up — especially session management for anyone doing agent-heavy development. The TypeScript 7.0 nightly opt-in is a nice touch for those who like living on the edge.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;full release notes&lt;/a&gt; for the complete change list.&lt;/p&gt;</content:encoded></item><item><title>azd Hooks in Python, TypeScript, and .NET: Stop Fighting Shell Scripts</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>The Azure Developer CLI now lets you write hooks in Python, JavaScript, TypeScript, or .NET. No more context-switching to Bash just to run a migration script.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve ever had a fully .NET project and still found yourself writing Bash scripts just to run azd hooks, you know the pain. Why switch to shell syntax just for a pre-provision step when everything else in your project is C#?&lt;/p&gt;
&lt;p&gt;That frustration is now officially solved. The Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;just shipped multi-language hook support&lt;/a&gt;, and it&amp;rsquo;s exactly as good as it sounds.&lt;/p&gt;
&lt;h2 id="hooks-quickly-if-youre-not-familiar"&gt;Hooks, quickly, if you&amp;rsquo;re not familiar&lt;/h2&gt;
&lt;p&gt;Hooks are scripts that run at key points in the &lt;code&gt;azd&lt;/code&gt; lifecycle — before provisioning, after deployment, and more. They&amp;rsquo;re defined in &lt;code&gt;azure.yaml&lt;/code&gt; and let you inject custom logic without forking the CLI itself.&lt;/p&gt;
&lt;p&gt;Previously you were limited to Bash and PowerShell. Now you can use &lt;strong&gt;Python, JavaScript, TypeScript, or .NET&lt;/strong&gt; — and &lt;code&gt;azd&lt;/code&gt; handles the rest automatically.&lt;/p&gt;
&lt;h2 id="how-the-detection-works"&gt;How the detection works&lt;/h2&gt;
&lt;p&gt;You just point the hook at a file and &lt;code&gt;azd&lt;/code&gt; infers the language from the extension:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. No extra config. If the extension is ambiguous, you can add an explicit &lt;code&gt;kind: python&lt;/code&gt; (or whatever) to override.&lt;/p&gt;
&lt;h2 id="language-specific-details-worth-knowing"&gt;Language-specific details worth knowing&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Drop a &lt;code&gt;requirements.txt&lt;/code&gt; or &lt;code&gt;pyproject.toml&lt;/code&gt; next to your script (or anywhere up the directory tree) and &lt;code&gt;azd&lt;/code&gt; creates a virtual environment, installs deps, and runs your script:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hooks/
├── setup.py
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;No virtualenv management on your end. &lt;code&gt;azd&lt;/code&gt; walks up from the script location to find the nearest project file.&lt;/p&gt;
&lt;h3 id="javascript-and-typescript"&gt;JavaScript and TypeScript&lt;/h3&gt;
&lt;p&gt;Same pattern — put a &lt;code&gt;package.json&lt;/code&gt; near your script and &lt;code&gt;azd&lt;/code&gt; runs &lt;code&gt;npm install&lt;/code&gt; first. For TypeScript, it uses &lt;code&gt;npx tsx&lt;/code&gt; so there&amp;rsquo;s no compile step and no &lt;code&gt;tsconfig.json&lt;/code&gt; required:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hooks/
├── seed.ts
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Want to use pnpm or yarn? There&amp;rsquo;s a &lt;code&gt;config.packageManager&lt;/code&gt; option for that.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Two modes here, which is nice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project mode&lt;/strong&gt;: If there&amp;rsquo;s a &lt;code&gt;.csproj&lt;/code&gt; next to the script, &lt;code&gt;azd&lt;/code&gt; runs &lt;code&gt;dotnet restore&lt;/code&gt; and &lt;code&gt;dotnet build&lt;/code&gt; automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-file mode&lt;/strong&gt;: On .NET 10+, you can drop a standalone &lt;code&gt;.cs&lt;/code&gt; file and it runs directly via &lt;code&gt;dotnet run script.cs&lt;/code&gt;. No project file needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re already on .NET 10, single-file mode is honestly the cleanest option for simple migration or seeding scripts. No project scaffolding, no &lt;code&gt;.csproj&lt;/code&gt; to maintain.&lt;/p&gt;
&lt;h2 id="executor-specific-config"&gt;Executor-specific config&lt;/h2&gt;
&lt;p&gt;Each language supports an optional &lt;code&gt;config&lt;/code&gt; block when you need to tweak the defaults:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;virtualEnvName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.venv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also mix formats in the same &lt;code&gt;hooks:&lt;/code&gt; block — different languages for different lifecycle events, platform-specific overrides for Windows vs. Linux, whatever you need.&lt;/p&gt;
&lt;h2 id="why-this-matters-for-net-developers"&gt;Why this matters for .NET developers&lt;/h2&gt;
&lt;p&gt;The boring answer is &amp;ldquo;consistency.&amp;rdquo; But honestly it goes deeper than that. Hooks are often the last place in an azd-based project that forces you into a different language context. Now your entire deployment pipeline — from app code to infrastructure scripts to lifecycle hooks — can live in one language.&lt;/p&gt;
&lt;p&gt;More practically: you can now reuse your existing .NET utilities in hooks. Have a shared class library for database schema management? Just reference it in your hook project. Have a Python data-seeding script you already wrote? Drop it straight into &lt;code&gt;azure.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;This is one of those changes that sounds small but quietly removes a lot of friction from daily azd workflows. Multi-language hook support is available now — check the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;official post&lt;/a&gt; for the full docs, and head to &lt;a href="https://github.com/Azure/azure-dev"&gt;the azd GitHub repo&lt;/a&gt; to try it out on your next project.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: One Endpoint for All Your Agent Tools</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry just launched Toolboxes in public preview — a way to curate, manage, and expose AI agent tools through a single MCP-compatible endpoint without re-wiring everything per agent.</description><content:encoded>&lt;p&gt;Here&amp;rsquo;s a problem that sounds boring until you&amp;rsquo;ve actually hit it: your organization is building multiple AI agents, each one needs tools, and every team is wiring those tools up from scratch. Same Web Search integration, same Azure AI Search config, same GitHub MCP server connection — just in a different repo, by a different team, with different credentials and no shared governance.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry just shipped &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; in public preview, and it&amp;rsquo;s a direct answer to that problem.&lt;/p&gt;
&lt;h2 id="whats-a-toolbox"&gt;What&amp;rsquo;s a Toolbox?&lt;/h2&gt;
&lt;p&gt;A Toolbox is a named, reusable bundle of tools that you define once in Foundry and expose through a single MCP-compatible endpoint. Any agent runtime that speaks MCP can consume it — you&amp;rsquo;re not locked to Foundry Agents.&lt;/p&gt;
&lt;p&gt;The pitch is simple: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Define the tools, configure auth centrally (OAuth passthrough, Entra managed identity), publish the endpoint. Every agent that needs those tools connects to the endpoint and gets them all.&lt;/p&gt;
&lt;p&gt;No per-tool wiring. No per-agent credential management.&lt;/p&gt;
&lt;h2 id="the-four-pillars-two-of-which-ship-today"&gt;The four pillars (two of which ship today)&lt;/h2&gt;
&lt;p&gt;The Toolbox feature is organized around four ideas:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coming soon&lt;/td&gt;
&lt;td&gt;Find existing approved tools without hunting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Available now&lt;/td&gt;
&lt;td&gt;Curate tools into a named, reusable bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Available now&lt;/td&gt;
&lt;td&gt;Single MCP endpoint exposes all tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coming soon&lt;/td&gt;
&lt;td&gt;Centralized auth + observability across all tool calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Today the focus is on Build and Consume. That&amp;rsquo;s enough to remove the most immediate friction.&lt;/p&gt;
&lt;h2 id="getting-started-in-practice"&gt;Getting started in practice&lt;/h2&gt;
&lt;p&gt;The SDK is Python-first for now. You start by creating an &lt;code&gt;AIProjectClient&lt;/code&gt; and then build a toolbox:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FOUNDRY_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you create a toolbox version with the tools you want to bundle:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Search public and internal docs, then respond to GitHub issues.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Search approved public documentation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once published, Foundry gives you a unified endpoint:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;https://zava.services.ai.azure.com/api/projects/&amp;lt;project&amp;gt;/toolbox/&amp;lt;toolbox-name&amp;gt;/mcp?api-version=v1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Point any MCP-compatible agent runtime at that URL and it discovers all the tools in the bundle dynamically. One connection. All tools.&lt;/p&gt;
&lt;h2 id="not-locked-to-foundry-agents"&gt;Not locked to Foundry Agents&lt;/h2&gt;
&lt;p&gt;This is worth spelling out because it&amp;rsquo;s a common concern when Microsoft ships something under the Foundry brand.&lt;/p&gt;
&lt;p&gt;Toolboxes are &lt;strong&gt;created and governed&lt;/strong&gt; in Foundry, but the consumption surface is the open MCP protocol. That means you can use them from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom agents&lt;/strong&gt; built with Microsoft Agent Framework, LangGraph, or your own code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; and other MCP-enabled IDEs&lt;/li&gt;
&lt;li&gt;Any other runtime that speaks MCP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re not locked in. The toolbox is Foundry-homed (that&amp;rsquo;s where you manage it) but not Foundry-bound (you can consume it from anywhere).&lt;/p&gt;
&lt;h2 id="why-it-matters-now"&gt;Why it matters now&lt;/h2&gt;
&lt;p&gt;The multi-agent wave is hitting production. Teams are building 5, 10, 20 agents — and the tool-wiring problem compounds fast. Every new agent is a new surface for duplicated config, stale credentials, and inconsistent behavior.&lt;/p&gt;
&lt;p&gt;Toolboxes don&amp;rsquo;t solve governance and discovery yet (those are &amp;ldquo;coming soon&amp;rdquo;), but the Build + Consume foundation is enough to start centralizing. Once the Govern pillar ships, you&amp;rsquo;ll have a proper observable, centrally-controlled tool layer for your entire agent fleet.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;This is early — public preview, Python SDK first, with Discover and Govern still coming. But the model is sound, and the MCP-native design means it works with the tools you&amp;rsquo;re already building on. Take a look at the &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;official announcement&lt;/a&gt; to get started.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 from the Terminal and UI Automation for Agents</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 ships winapp run for terminal-based debug launches, winapp ui for UI automation, and a new NuGet package that makes dotnet run work with packaged apps.</description><content:encoded>&lt;p&gt;Visual Studio&amp;rsquo;s F5 experience is great. But having to open VS just to launch and debug a packaged Windows app is a bit much when you&amp;rsquo;re deep in a CI pipeline, running an automated workflow, or — increasingly — when an AI agent is doing the testing.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 just &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;shipped&lt;/a&gt;, and it addresses this directly with two headline features: &lt;code&gt;winapp run&lt;/code&gt; and &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-from-anywhere"&gt;winapp run: F5 from anywhere&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; takes an unpackaged app folder and a manifest, and does everything VS does for a debug launch: registers a loose package, launches the app, and preserves your &lt;code&gt;LocalState&lt;/code&gt; across re-deploys.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Build your app, then run it as a packaged app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works for WinUI, WPF, WinForms, Console, Avalonia, and more. The modes are designed for both developers and automated workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Launch and return control to the terminal immediately. Good for CI/automation where you need the app running but don&amp;rsquo;t want to block.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Cleans up the registered package when the app closes. Clean test runs, no leftover state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Captures &lt;code&gt;OutputDebugString&lt;/code&gt; messages and exceptions in real time. When a crash happens, a minidump is captured and analyzed in-process — managed (.NET) crashes via ClrMD, native (C++/WinRT) crashes via DbgEng. Add &lt;code&gt;--symbols&lt;/code&gt; to pull PDBs from the Microsoft Symbol Server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the kind of setup that makes headless test runs and agent-driven validation actually work. An agent can now launch your app, interact with it, verify behavior, and clean up — all without Visual Studio.&lt;/p&gt;
&lt;h2 id="new-nuget-package-dotnet-run-for-packaged-apps"&gt;New NuGet package: dotnet run for packaged apps&lt;/h2&gt;
&lt;p&gt;For .NET developers specifically, there&amp;rsquo;s a new NuGet package: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Add it to your project (or let &lt;code&gt;winapp init&lt;/code&gt; do it), and &lt;code&gt;dotnet run&lt;/code&gt; handles the entire inner loop: build, prepare a loose-layout package, register with Windows, and launch — all in one step.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Let winapp init set it up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Or install directly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works with WinUI, WPF, WinForms, Console, Avalonia. No manual registration, no extra commands. Just &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is a big quality-of-life win. If you&amp;rsquo;ve been maintaining a Makefile or PowerShell script just to wire together the build-and-register-and-launch cycle, that&amp;rsquo;s now a solved problem.&lt;/p&gt;
&lt;h2 id="winapp-ui-ui-automation-from-the-command-line"&gt;winapp ui: UI Automation from the command line&lt;/h2&gt;
&lt;p&gt;This is the one that opens up agentic scenarios. &lt;code&gt;winapp ui&lt;/code&gt; gives you full UI Automation access to any running Windows app — WPF, WinForms, Win32, Electron, WinUI3 — all from the terminal.&lt;/p&gt;
&lt;p&gt;What you can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List all top-level windows&lt;/li&gt;
&lt;li&gt;Walk the full UI Automation tree of any window&lt;/li&gt;
&lt;li&gt;Find elements by name, type, or automation ID&lt;/li&gt;
&lt;li&gt;Click, invoke, and set values&lt;/li&gt;
&lt;li&gt;Take screenshots (per-window or multi-window composites)&lt;/li&gt;
&lt;li&gt;Wait for elements to appear — useful for test synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combine &lt;code&gt;winapp ui&lt;/code&gt; with &lt;code&gt;winapp run&lt;/code&gt; and you have a complete build → launch → verify workflow from the terminal. An agent can run your app, inspect the UI state, interact with it programmatically, and validate the result. No Visual Studio, no test framework bootstrapping, no manual steps.&lt;/p&gt;
&lt;p&gt;For those building CI pipelines that do actual UI validation on Windows desktop apps, this is genuinely useful.&lt;/p&gt;
&lt;h2 id="other-bits-worth-noting"&gt;Other bits worth noting&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: The cleanup counterpart to &lt;code&gt;winapp run&lt;/code&gt;. Removes a sideloaded dev package when you&amp;rsquo;re done.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Adds a &lt;code&gt;uap5:AppExecutionAlias&lt;/code&gt; so a packaged app can be launched by name from the terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab completion&lt;/strong&gt;: One command to set up completions for PowerShell, then every &lt;code&gt;winapp&lt;/code&gt; command and option is tab-completable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Package.appxmanifest&lt;/code&gt; by default&lt;/strong&gt;: &lt;code&gt;winapp init&lt;/code&gt; now creates &lt;code&gt;Package.appxmanifest&lt;/code&gt; (VS convention) instead of &lt;code&gt;appxmanifest.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="get-it"&gt;Get it&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The CLI is in public preview. Check the &lt;a href="https://github.com/microsoft/WinAppCli"&gt;GitHub repo&lt;/a&gt; for full docs, guides for .NET, C++, Electron, Rust, Flutter, and more — and to file issues. The &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;original announcement&lt;/a&gt; has all the details.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117: Agents Are Getting Their Own Git Branches and I'm Here For It</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 ships worktree isolation for agent sessions, persistent Autopilot mode, and subagent support. The agentic coding workflow just got way more real.</description><content:encoded>&lt;p&gt;The line between &amp;ldquo;AI assistant&amp;rdquo; and &amp;ldquo;AI teammate&amp;rdquo; keeps getting thinner. VS Code 1.117 just dropped and the &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;full release notes&lt;/a&gt; are packed, but the story here is clear: agents are becoming first-class citizens in your dev workflow.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what actually matters.&lt;/p&gt;
&lt;h2 id="autopilot-mode-finally-remembers-your-preference"&gt;Autopilot mode finally remembers your preference&lt;/h2&gt;
&lt;p&gt;Previously, you had to re-enable Autopilot every time you started a new session. Annoying. Now your permission mode persists across sessions, and you can configure the default.&lt;/p&gt;
&lt;p&gt;The Agent Host supports three session configs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — tools ask for confirmation before running&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — auto-approves everything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — fully autonomous, answers its own questions and keeps going&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re scaffolding a new .NET project with migrations, Docker, and CI — set it to Autopilot once and forget about it. That preference sticks.&lt;/p&gt;
&lt;h2 id="worktree-and-git-isolation-for-agent-sessions"&gt;Worktree and git isolation for agent sessions&lt;/h2&gt;
&lt;p&gt;This is the big one. Agent sessions now support full worktree and git isolation. That means when an agent works on a task, it gets its own branch and working directory. Your main branch stays untouched.&lt;/p&gt;
&lt;p&gt;Even better — Copilot CLI generates meaningful branch names for these worktree sessions. No more &lt;code&gt;agent-session-abc123&lt;/code&gt;. You get something that actually describes what the agent is doing.&lt;/p&gt;
&lt;p&gt;For .NET developers running multiple feature branches or fixing bugs while a long scaffolding task runs, this is a game changer. You can have an agent building out your API controllers in one worktree while you&amp;rsquo;re debugging a service layer issue in another. No conflicts. No stashing. No mess.&lt;/p&gt;
&lt;h2 id="subagents-and-agent-teams"&gt;Subagents and agent teams&lt;/h2&gt;
&lt;p&gt;The Agent Host Protocol now supports subagents. An agent can spin up other agents to handle parts of a task. Think of it as delegating — your main agent coordinates, and specialized agents handle the pieces.&lt;/p&gt;
&lt;p&gt;This is early, but the potential for .NET workflows is obvious. Imagine one agent handling your EF Core migrations while another sets up your integration tests. We&amp;rsquo;re not fully there yet, but the protocol support landing now means tooling will follow fast.&lt;/p&gt;
&lt;h2 id="terminal-output-auto-included-when-agents-send-input"&gt;Terminal output auto-included when agents send input&lt;/h2&gt;
&lt;p&gt;Small but meaningful. When an agent sends input to the terminal, the terminal output is now automatically included in the context. Before, the agent had to make an extra turn just to read what happened.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever watched an agent run &lt;code&gt;dotnet build&lt;/code&gt;, fail, and then take another round-trip just to see the error — that friction is gone. It sees the output immediately and reacts.&lt;/p&gt;
&lt;h2 id="self-updating-agents-app-on-macos"&gt;Self-updating Agents app on macOS&lt;/h2&gt;
&lt;p&gt;The standalone Agents app on macOS now self-updates. No more manually downloading new versions. It just stays current.&lt;/p&gt;
&lt;h2 id="the-smaller-stuff-worth-knowing"&gt;The smaller stuff worth knowing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;package.json hovers&lt;/strong&gt; now show both the installed version and the latest available. Useful if you manage npm tooling alongside your .NET projects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images in JSDoc&lt;/strong&gt; comments render correctly in hovers and completions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI sessions&lt;/strong&gt; now indicate whether they were created by VS Code or externally — handy when you&amp;rsquo;re jumping between terminals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code, and Gemini CLI&lt;/strong&gt; are recognized as shell types. The editor knows what you&amp;rsquo;re running.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-takeaway"&gt;The takeaway&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 isn&amp;rsquo;t a flashy feature dump. It&amp;rsquo;s infrastructure. Worktree isolation, persistent permissions, subagent protocols — these are the building blocks for a workflow where agents handle real, parallel tasks without stepping on your code.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building with .NET and haven&amp;rsquo;t leaned into the agentic workflow yet, honestly, now&amp;rsquo;s the time to start.&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox Lets Copilot Agents Refactor Your Code Without Risking Your Machine</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox gives GitHub Copilot agents a secure microVM to run wild with refactoring — no permission prompts, no risk to your host. Here's why that changes everything for large-scale .NET modernization.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve used Copilot&amp;rsquo;s agent mode for anything beyond small edits, you know the pain. Every file write, every terminal command — another permission prompt. Now imagine running that across 50 projects. Not fun.&lt;/p&gt;
&lt;p&gt;The Azure team just dropped a post about &lt;a href="https://devblogs.microsoft.com/all-things-azure/best-of-both-worlds-for-agentic-refactoring-github-copilot-microvms-via-docker-sandbox/"&gt;Docker Sandbox for GitHub Copilot agents&lt;/a&gt;, and honestly, this is one of the most practical agentic tooling improvements I&amp;rsquo;ve seen. It uses microVMs to give Copilot a fully isolated environment where it can go wild — install packages, run builds, execute tests — without touching your host system.&lt;/p&gt;
&lt;h2 id="what-docker-sandbox-actually-gives-you"&gt;What Docker Sandbox actually gives you&lt;/h2&gt;
&lt;p&gt;The core idea is simple: spin up a lightweight microVM with a full Linux environment, sync your workspace into it, and let the Copilot agent operate freely inside. When it&amp;rsquo;s done, changes sync back.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what makes it more than just &amp;ldquo;run stuff in a container&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bidirectional workspace sync&lt;/strong&gt; that preserves absolute paths. Your project structure looks identical inside the sandbox. No path-related build failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Docker daemon&lt;/strong&gt; running inside the microVM. The agent can build and run containers without ever mounting your host&amp;rsquo;s Docker socket. That&amp;rsquo;s a big deal for security.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/HTTPS filtering proxies&lt;/strong&gt; that control what the agent can reach on the network. You decide which registries and endpoints are allowed. Supply chain attacks from a rogue &lt;code&gt;npm install&lt;/code&gt; inside the sandbox? Blocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YOLO mode&lt;/strong&gt; — yes, that&amp;rsquo;s what they call it. The agent runs without permission prompts because it literally cannot damage your host. Every destructive action is contained.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-net-developers-should-care"&gt;Why .NET developers should care&lt;/h2&gt;
&lt;p&gt;Think about the modernization work so many teams are facing right now. You have a .NET Framework solution with 30 projects, and you need to move it to .NET 9. That&amp;rsquo;s hundreds of file changes — project files, namespace updates, API replacements, NuGet migrations.&lt;/p&gt;
&lt;p&gt;With Docker Sandbox, you can point a Copilot agent at a project, let it refactor freely inside the microVM, run &lt;code&gt;dotnet build&lt;/code&gt; and &lt;code&gt;dotnet test&lt;/code&gt; to validate, and only accept the changes that actually work. No risk of it accidentally nuking your local dev environment while experimenting.&lt;/p&gt;
&lt;p&gt;The post also describes running a &lt;strong&gt;fleet of parallel agents&lt;/strong&gt; — each in its own sandbox — tackling different projects simultaneously. For large .NET solutions or microservice architectures, that&amp;rsquo;s a massive time saver. One agent per service, all running isolated, all validated independently.&lt;/p&gt;
&lt;h2 id="the-security-angle-matters"&gt;The security angle matters&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing most people skip over: when you let an AI agent execute arbitrary commands, you&amp;rsquo;re trusting it with your entire machine. Docker Sandbox flips that model. The agent gets full autonomy inside a throwaway environment. The network proxy ensures it can only pull from approved sources. Your host filesystem, Docker daemon, and credentials stay untouched.&lt;/p&gt;
&lt;p&gt;For teams with compliance requirements — and that&amp;rsquo;s most enterprise .NET shops — this is the difference between &amp;ldquo;we can&amp;rsquo;t use agentic AI&amp;rdquo; and &amp;ldquo;we can adopt it safely.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="takeaway"&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Docker Sandbox solves the fundamental tension of agentic coding: agents need freedom to be useful, but freedom on your host machine is dangerous. MicroVMs give you both. If you&amp;rsquo;re planning any large-scale .NET refactoring or modernization, this is worth setting up now. The combination of Copilot&amp;rsquo;s code intelligence with a safe execution environment is exactly what production teams have been waiting for.&lt;/p&gt;</content:encoded></item><item><title>Stop Babysitting Your Terminal: Aspire's Detached Mode Changes the Workflow</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 lets you run your AppHost in the background and take your terminal back. Combined with new CLI commands and agent support, this is a bigger deal than it sounds.</description><content:encoded>&lt;p&gt;Every time you run an Aspire AppHost, your terminal is gone. Locked. Occupied until you Ctrl+C out of it. Need to run a quick command? Open another tab. Want to check logs? Another tab. It&amp;rsquo;s a small friction that adds up fast.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 fixes this. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;wrote up the full details&lt;/a&gt;, and honestly, this is one of those features that immediately changes how you work.&lt;/p&gt;
&lt;h2 id="detached-mode-one-command-terminal-back"&gt;Detached mode: one command, terminal back&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s the shorthand for &lt;code&gt;aspire run --detach&lt;/code&gt;. Your AppHost boots up in the background and you get your terminal back immediately. No extra tabs. No terminal multiplexer. Just your prompt, ready to go.&lt;/p&gt;
&lt;h2 id="managing-whats-running"&gt;Managing what&amp;rsquo;s running&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing — running in the background is only useful if you can actually manage what&amp;rsquo;s out there. Aspire 13.2 ships a full set of CLI commands for exactly that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List all running AppHosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inspect the state of a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stream logs from a running AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stop a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This turns the Aspire CLI into a proper process manager. You can start multiple AppHosts, check their status, tail their logs, and shut them down — all from a single terminal session.&lt;/p&gt;
&lt;h2 id="combine-it-with-isolated-mode"&gt;Combine it with isolated mode&lt;/h2&gt;
&lt;p&gt;Detached mode pairs naturally with isolated mode. Want to run two instances of the same project in the background without port conflicts?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each gets random ports, separate secrets, and its own lifecycle. Use &lt;code&gt;aspire ps&lt;/code&gt; to see both, &lt;code&gt;aspire stop&lt;/code&gt; to kill whichever you&amp;rsquo;re done with.&lt;/p&gt;
&lt;h2 id="why-this-is-huge-for-coding-agents"&gt;Why this is huge for coding agents&lt;/h2&gt;
&lt;p&gt;This is where it gets really interesting. A coding agent working in your terminal can now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start the app with &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Query its state with &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check logs with &lt;code&gt;aspire logs&lt;/code&gt; to diagnose issues&lt;/li&gt;
&lt;li&gt;Stop it with &lt;code&gt;aspire stop&lt;/code&gt; when done&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All without losing the terminal session. Before detached mode, an agent that ran your AppHost would lock itself out of its own terminal. Now it can start, observe, iterate, and clean up — exactly how you&amp;rsquo;d want an autonomous agent to work.&lt;/p&gt;
&lt;p&gt;The Aspire team leaned into this. Running &lt;code&gt;aspire agent init&lt;/code&gt; sets up an Aspire skill file that teaches agents these commands. So tools like Copilot&amp;rsquo;s coding agent can manage your Aspire workloads out of the box.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Detached mode is a workflow upgrade disguised as a simple flag. You stop context-switching between terminals, agents stop blocking themselves, and the new CLI commands give you real visibility into what&amp;rsquo;s running. It&amp;rsquo;s practical, it&amp;rsquo;s clean, and it makes the daily development loop noticeably smoother.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;full post&lt;/a&gt; for all the details and grab Aspire 13.2 with &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Tools Are Now Baked Into Visual Studio 2022 — No Extension Required</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Azure MCP tools ship as part of the Azure development workload in Visual Studio 2022. Over 230 tools, 45 Azure services, zero extensions to install.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve been using the Azure MCP tools in Visual Studio through the separate extension, you know the drill — install the VSIX, restart, hope it doesn&amp;rsquo;t break, manage version mismatches. That friction is gone.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;announced&lt;/a&gt; that Azure MCP tools now ship directly as part of the Azure development workload in Visual Studio 2022. No extension. No VSIX. No restart dance.&lt;/p&gt;
&lt;h2 id="what-this-actually-means"&gt;What this actually means&lt;/h2&gt;
&lt;p&gt;Starting with Visual Studio 2022 version 17.14.30, the Azure MCP Server is bundled with the Azure development workload. If you already have that workload installed, you just need to toggle it on in GitHub Copilot Chat and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;Over 230 tools across 45 Azure services — accessible directly from the chat window. List your storage accounts, deploy an ASP.NET Core app, diagnose App Service issues, query Log Analytics — all without opening a browser tab.&lt;/p&gt;
&lt;h2 id="why-this-matters-more-than-it-sounds"&gt;Why this matters more than it sounds&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing about developer tooling: every extra step is friction, and friction kills adoption. Having MCP as a separate extension meant version mismatches, installation failures, and one more thing to keep updated. Baking it into the workload means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single update path&lt;/strong&gt; through the Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No version drift&lt;/strong&gt; between the extension and the IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always current&lt;/strong&gt; — the MCP Server updates with regular VS releases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For teams standardizing on Azure, this is a big deal. You install the workload once, enable the tools, and they&amp;rsquo;re there for every session.&lt;/p&gt;
&lt;h2 id="what-you-can-do-with-it"&gt;What you can do with it&lt;/h2&gt;
&lt;p&gt;The tools cover the full development lifecycle through Copilot Chat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learn&lt;/strong&gt; — ask about Azure services, best practices, architecture patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design &amp;amp; develop&lt;/strong&gt; — get service recommendations, configure app code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy&lt;/strong&gt; — provision resources and deploy directly from the IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troubleshoot&lt;/strong&gt; — query logs, check resource health, diagnose production issues&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A quick example — type this in Copilot Chat:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;List my storage accounts in my current subscription.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot calls the Azure MCP tools behind the scenes, queries your subscriptions, and returns a formatted list with names, locations, and SKUs. No portal needed.&lt;/p&gt;
&lt;h2 id="how-to-enable-it"&gt;How to enable it&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update to Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; or higher&lt;/li&gt;
&lt;li&gt;Make sure the &lt;strong&gt;Azure development&lt;/strong&gt; workload is installed&lt;/li&gt;
&lt;li&gt;Open GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Select tools&lt;/strong&gt; button (the two wrenches icon)&lt;/li&gt;
&lt;li&gt;Toggle &lt;strong&gt;Azure MCP Server&lt;/strong&gt; on&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it. It stays enabled across sessions.&lt;/p&gt;
&lt;h2 id="one-caveat"&gt;One caveat&lt;/h2&gt;
&lt;p&gt;The tools are disabled by default — you need to opt in. And VS 2026-specific tools aren&amp;rsquo;t available in VS 2022. Tool availability also depends on your Azure subscription permissions, same as the portal.&lt;/p&gt;
&lt;h2 id="the-bigger-picture"&gt;The bigger picture&lt;/h2&gt;
&lt;p&gt;This is part of a clear trend: MCP is becoming the standard way to surface cloud tools in developer IDEs. We&amp;rsquo;ve already seen the &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;Azure MCP Server 2.0 stable release&lt;/a&gt; and MCP integrations across VS Code and other editors. Having it built into Visual Studio&amp;rsquo;s workload system is the natural progression.&lt;/p&gt;
&lt;p&gt;For us .NET developers who live in Visual Studio, this removes yet another reason to context-switch to the Azure portal. And honestly, the less tab-switching, the better.&lt;/p&gt;</content:encoded></item><item><title>azd update — One Command to Rule All Your Package Managers</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>The Azure Developer CLI now has a universal update command that works regardless of how you installed it — winget, Homebrew, Chocolatey, or install script.</description><content:encoded>&lt;p&gt;You know that &amp;ldquo;A new version of azd is available&amp;rdquo; message that pops up every few weeks? The one you dismiss because you can&amp;rsquo;t remember whether you installed &lt;code&gt;azd&lt;/code&gt; via winget, Homebrew, or that curl script you ran six months ago? Yeah, that&amp;rsquo;s finally fixed.&lt;/p&gt;
&lt;p&gt;Microsoft just shipped &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — a single command that updates the Azure Developer CLI to the latest version regardless of how you originally installed it. Windows, macOS, Linux — doesn&amp;rsquo;t matter. One command.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. If you want early access to new features, you can switch to the daily insiders build:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel daily
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The command detects your current installation method and uses the appropriate update mechanism under the hood. No more &amp;ldquo;wait, did I use winget or choco on this machine?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="the-small-catch"&gt;The small catch&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; ships starting with version 1.23.x. If you&amp;rsquo;re on an older version, you&amp;rsquo;ll need to do one last manual update using your original installation method. After that, &lt;code&gt;azd update&lt;/code&gt; handles everything going forward.&lt;/p&gt;
&lt;p&gt;Check your current version with &lt;code&gt;azd version&lt;/code&gt;. If you need a fresh install, the &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;install docs&lt;/a&gt; have you covered.&lt;/p&gt;
&lt;h2 id="why-it-matters"&gt;Why it matters&lt;/h2&gt;
&lt;p&gt;This is a small quality-of-life improvement, but for those of us who use &lt;code&gt;azd&lt;/code&gt; daily for deploying AI agents and Aspire apps to Azure, staying current means fewer &amp;ldquo;this bug was already fixed in the latest version&amp;rdquo; moments. One less thing to think about.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;full announcement&lt;/a&gt; and Jon Gallant&amp;rsquo;s &lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;deeper dive&lt;/a&gt; for more context.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Wants to Be Your AI Agent's Best Friend</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 goes all-in on agentic development — structured CLI output, isolated runs, auto-healing environments, and full OpenTelemetry data so your AI agents can actually build, run, and observe your apps.</description><content:encoded>&lt;p&gt;You know that moment when your AI coding agent writes some solid code, you get excited, and then it completely falls apart trying to actually &lt;em&gt;run&lt;/em&gt; the thing? Port conflicts, phantom processes, wrong environment variables — suddenly your agent is burning tokens troubleshooting startup issues instead of building features.&lt;/p&gt;
&lt;p&gt;The Aspire team just dropped a &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;really thoughtful post&lt;/a&gt; about exactly this problem, and their answer is compelling: Aspire 13.2 is designed not just for humans, but for AI agents.&lt;/p&gt;
&lt;h2 id="the-problem-is-real"&gt;The problem is real&lt;/h2&gt;
&lt;p&gt;AI agents are incredible at writing code. But shipping a working full-stack app involves way more than generating files. You need to start services in the right order, manage ports, set environment variables, connect databases, and get feedback when things break. Right now, most agents handle all of this through trial-and-error — running commands, reading error output, trying again.&lt;/p&gt;
&lt;p&gt;We layer on Markdown instructions, custom skills, and prompts to try to guide them, but those are unpredictable, can&amp;rsquo;t be compiled, and cost tokens just to parse. The Aspire team nailed the core insight: agents need &lt;strong&gt;compilers and structured APIs&lt;/strong&gt;, not more Markdown.&lt;/p&gt;
&lt;h2 id="aspire-as-agent-infrastructure"&gt;Aspire as agent infrastructure&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what Aspire 13.2 brings to the agentic development table:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your entire stack in typed code.&lt;/strong&gt; The AppHost defines your full topology — API, frontend, database, cache — in compilable TypeScript or C#:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&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;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&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;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An agent can read this to understand app topology, add resources, wire up connections, and &lt;em&gt;build to verify&lt;/em&gt;. The compiler tells it immediately if something is wrong. No guessing, no trial-and-error with config files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One command to rule them all.&lt;/strong&gt; Instead of agents juggling &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt;, and database startup scripts, everything is just &lt;code&gt;aspire start&lt;/code&gt;. All resources launch in the right order, on the right ports, with the right configuration. Long-running processes don&amp;rsquo;t hang the agent either — Aspire manages them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolated mode for parallel agents.&lt;/strong&gt; With &lt;code&gt;--isolated&lt;/code&gt;, each Aspire run gets its own random ports and separate user secrets. Got multiple agents working across git worktrees? They won&amp;rsquo;t collide. This is huge for tools like VS Code&amp;rsquo;s background agents that spin up parallel environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent eyes through telemetry.&lt;/strong&gt; Here&amp;rsquo;s where it gets really powerful. The Aspire CLI exposes full OpenTelemetry data during development — traces, metrics, structured logs. Your agent isn&amp;rsquo;t just reading console output and hoping for the best. It can trace a failing request across services, profile slow endpoints, and pinpoint exactly where things break. That&amp;rsquo;s production-grade observability in the development loop.&lt;/p&gt;
&lt;h2 id="the-bowling-bumper-analogy"&gt;The bowling bumper analogy&lt;/h2&gt;
&lt;p&gt;The Aspire team uses a great analogy: think of Aspire as bowling lane bumpers for AI agents. If the agent isn&amp;rsquo;t perfect (and it won&amp;rsquo;t be), the bumpers keep it from throwing gutter balls. The stack definition prevents misconfiguration, the compiler catches errors, the CLI handles process management, and the telemetry provides the feedback loop.&lt;/p&gt;
&lt;p&gt;Pair this with something like Playwright CLI, and your agent can actually &lt;em&gt;use&lt;/em&gt; your app — clicking through flows, checking the DOM, seeing broken things in telemetry, fixing the code, restarting, and testing again. Build, run, observe, fix. That&amp;rsquo;s the autonomous development loop we&amp;rsquo;ve been chasing.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;New to Aspire? Install the CLI from &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; and follow the &lt;a href="https://aspire.dev/get-started/first-app"&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Already using Aspire? Run &lt;code&gt;aspire update --self&lt;/code&gt; to get 13.2, then point your favorite coding agent at your repo. You might be surprised how much further it gets with Aspire&amp;rsquo;s guardrails in place.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 isn&amp;rsquo;t just a distributed app framework anymore — it&amp;rsquo;s becoming essential agent infrastructure. Structured stack definitions, one-command startup, isolated parallel runs, and real-time telemetry give AI agents exactly what they need to go from writing code to shipping apps.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;full post&lt;/a&gt; from the Aspire team for all the details and demo videos.&lt;/p&gt;</content:encoded></item><item><title>Aspire's Isolated Mode Fixes the Port Conflict Nightmare for Parallel Development</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introduces --isolated mode: random ports, separate secrets, and zero collisions when running multiple instances of the same AppHost. Perfect for AI agents, worktrees, and parallel workflows.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve ever tried running two instances of the same project at the same time, you know the pain. Port 8080 is already in use. Port 17370 is taken. Kill something, restart, juggle environment variables — it&amp;rsquo;s a productivity killer.&lt;/p&gt;
&lt;p&gt;This problem is getting worse, not better. AI agents create git worktrees to work independently. Background agents spin up separate environments. Developers checkout the same repo twice for feature branches. Every one of these scenarios hits the same wall: two instances of the same app fighting over the same ports.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 fixes this with a single flag. James Newton-King from the Aspire team &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;wrote up the full details&lt;/a&gt;, and it&amp;rsquo;s one of those &amp;ldquo;why didn&amp;rsquo;t we have this sooner&amp;rdquo; features.&lt;/p&gt;
&lt;h2 id="the-fix---isolated"&gt;The fix: &lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Each run gets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Random ports&lt;/strong&gt; — no more collisions between instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolated user secrets&lt;/strong&gt; — connection strings and API keys stay separate per instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No manual port reassignment. No environment variable juggling. Each run gets a fresh, collision-free environment automatically.&lt;/p&gt;
&lt;h2 id="real-scenarios-where-this-shines"&gt;Real scenarios where this shines&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Multiple checkouts.&lt;/strong&gt; You&amp;rsquo;ve got a feature branch in one directory and a bugfix in another:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both run without conflicts. The dashboard shows what&amp;rsquo;s running and where.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Background agents in VS Code.&lt;/strong&gt; When Copilot Chat&amp;rsquo;s background agent creates a git worktree to work on your code independently, it may need to run your Aspire AppHost. Without &lt;code&gt;--isolated&lt;/code&gt;, that&amp;rsquo;s a port collision with your primary worktree. With it, both instances just work.&lt;/p&gt;
&lt;p&gt;The Aspire skill that ships with &lt;code&gt;aspire agent init&lt;/code&gt; automatically instructs agents to use &lt;code&gt;--isolated&lt;/code&gt; when working in worktrees. So Copilot&amp;rsquo;s background agent should handle this out of the box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration tests alongside development.&lt;/strong&gt; Need to run tests against a live AppHost while continuing to build features? Isolated mode gives each context its own ports and config.&lt;/p&gt;
&lt;h2 id="how-it-works-under-the-hood"&gt;How it works under the hood&lt;/h2&gt;
&lt;p&gt;When you pass &lt;code&gt;--isolated&lt;/code&gt;, the CLI generates a unique instance ID for the run. This drives two behaviors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Port randomization&lt;/strong&gt; — instead of binding to predictable ports defined in your AppHost config, isolated mode picks random available ports for everything — the dashboard, service endpoints, all of it. Service discovery adjusts automatically, so services find each other regardless of which ports they land on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secret isolation&lt;/strong&gt; — each isolated run gets its own user secrets store, keyed by the instance ID. Connection strings and API keys from one run don&amp;rsquo;t leak into another.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your code doesn&amp;rsquo;t need any changes. Aspire&amp;rsquo;s service discovery resolves endpoints at runtime, so everything connects correctly regardless of port assignment.&lt;/p&gt;
&lt;h2 id="when-to-use-it"&gt;When to use it&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;--isolated&lt;/code&gt; when running multiple instances of the same AppHost simultaneously — whether that&amp;rsquo;s parallel development, automated tests, AI agents, or git worktrees. For single-instance development where you prefer predictable ports, regular &lt;code&gt;aspire run&lt;/code&gt; still works fine.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Isolated mode is a small feature that solves a real, increasingly common problem. As AI-assisted development pushes us toward more parallel workflows — multiple agents, multiple worktrees, multiple contexts — the ability to just spin up another instance without fighting over ports is essential.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;full post&lt;/a&gt; for all the technical details and try it out with &lt;code&gt;aspire update --self&lt;/code&gt; to get 13.2.&lt;/p&gt;</content:encoded></item><item><title>That Visual Studio Floating Windows Setting You Didn't Know About (But Should)</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>A hidden Visual Studio setting gives you full control over floating windows — independent taskbar entries, proper multi-monitor behavior, and perfect FancyZones integration. One dropdown changes everything.</description><content:encoded>&lt;p&gt;If you use multiple monitors with Visual Studio (and honestly, who doesn&amp;rsquo;t these days), you&amp;rsquo;ve probably experienced the annoyance: floating tool windows disappear when you minimize the main IDE, they always stay on top of everything else, and they don&amp;rsquo;t show up as separate taskbar buttons. It works for some workflows, but for multi-monitor setups it&amp;rsquo;s frustrating.&lt;/p&gt;
&lt;p&gt;Mads Kristensen from the Visual Studio team &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;shared a little-known setting&lt;/a&gt; that completely changes how floating windows behave. One dropdown. That&amp;rsquo;s it.&lt;/p&gt;
&lt;h2 id="the-setting"&gt;The setting&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Windows &amp;gt; Floating Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The dropdown &amp;ldquo;These floating windows are owned by the main window&amp;rdquo; has three options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; — full independence. Every floating window gets its own taskbar entry and behaves like a normal Windows window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt; (default) — documents float freely, tool windows stay tied to the IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; — classic Visual Studio behavior, everything tied to the main window.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-none-is-the-move-for-multi-monitor-setups"&gt;Why &amp;ldquo;None&amp;rdquo; is the move for multi-monitor setups&lt;/h2&gt;
&lt;p&gt;Set it to &lt;strong&gt;None&lt;/strong&gt; and suddenly all your floating tool windows and documents behave like real Windows applications. They appear in the taskbar, stay visible when you minimize the main Visual Studio window, and stop forcing themselves to the front of everything.&lt;/p&gt;
&lt;p&gt;Combine this with &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; and it&amp;rsquo;s a game changer. Create custom layouts across your monitors, snap your Solution Explorer to one zone, debugger to another, and code files wherever you want. Everything stays put, everything is independently accessible, and your workspace feels organized instead of chaotic.&lt;/p&gt;
&lt;h2 id="quick-recommendations"&gt;Quick recommendations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-monitor power users&lt;/strong&gt;: Set to &lt;strong&gt;None&lt;/strong&gt;, pair with FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Occasional floaters&lt;/strong&gt;: &lt;strong&gt;Tool Windows&lt;/strong&gt; (default) is a solid middle ground&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traditional workflow&lt;/strong&gt;: &lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; keeps everything classic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pro tip: &lt;strong&gt;Ctrl + double-click&lt;/strong&gt; on any tool window title bar to instantly float or dock it. No restart needed after changing the setting.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s one of those &amp;ldquo;I can&amp;rsquo;t believe I didn&amp;rsquo;t know about this&amp;rdquo; settings. If floating windows in Visual Studio have ever annoyed you, go change this right now.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;full post&lt;/a&gt; for the details and screenshots.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — Agents App Gets Keyboard Navigation and File Context Completions</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 focuses on Agents app polish — dedicated keybindings, accessibility improvements, file-context completions, and CSS @import link resolution.</description><content:encoded>&lt;p&gt;VS Code 1.116 is the April 2026 release, and while it&amp;rsquo;s lighter than some recent updates, the changes are focused and meaningful — especially if you&amp;rsquo;re using the Agents app daily.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what landed, based on the &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;official release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="agents-app-improvements"&gt;Agents app improvements&lt;/h2&gt;
&lt;p&gt;The Agents app continues to mature with usability polish that makes a real difference in daily workflows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dedicated keybindings&lt;/strong&gt; — you can now focus the Changes view, the files tree within Changes, and the Chat Customizations view with dedicated commands and keyboard shortcuts. If you&amp;rsquo;ve been clicking around the Agents app to navigate, this brings full keyboard-driven workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility help dialog&lt;/strong&gt; — pressing &lt;code&gt;Alt+F1&lt;/code&gt; in the chat input box now opens an accessibility help dialog showing available commands and keybindings. Screen reader users can also control announcement verbosity. Good accessibility benefits everyone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File-context completions&lt;/strong&gt; — type &lt;code&gt;#&lt;/code&gt; in the Agents app chat to trigger file-context completions scoped to your current workspace. This is one of those small quality-of-life improvements that speeds up every interaction — no more typing full file paths when referencing code.&lt;/p&gt;
&lt;h2 id="css-import-link-resolution"&gt;CSS &lt;code&gt;@import&lt;/code&gt; link resolution&lt;/h2&gt;
&lt;p&gt;A nice one for frontend developers: VS Code now resolves CSS &lt;code&gt;@import&lt;/code&gt; references that use node_modules paths. You can &lt;code&gt;Ctrl+click&lt;/code&gt; through imports like &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; when using bundlers. Small but eliminates a friction point in CSS workflows.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 is about refinement — making the Agents app more navigable, more accessible, and more keyboard-friendly. If you&amp;rsquo;re spending significant time in the Agents app (and I suspect many of us are), these changes add up.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;full release notes&lt;/a&gt; for the complete list.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — Background Terminal Notifications, SSH Agent Mode, and More</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 brings background terminal notifications for agents, SSH remote agent hosting, file paste in terminals, and session-aware edit tracking. Here's what matters for .NET developers.</description><content:encoded>&lt;p&gt;VS Code 1.115 just &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;dropped&lt;/a&gt;, and while it&amp;rsquo;s a lighter release in terms of headline features, the agent-related improvements are genuinely useful if you&amp;rsquo;re working with AI coding assistants daily.&lt;/p&gt;
&lt;p&gt;Let me highlight what&amp;rsquo;s actually worth knowing.&lt;/p&gt;
&lt;h2 id="background-terminals-talk-back-to-agents"&gt;Background terminals talk back to agents&lt;/h2&gt;
&lt;p&gt;This is the standout feature. Background terminals now automatically notify agents when commands complete, including the exit code and terminal output. Input prompts in background terminals are also detected and surfaced to the user.&lt;/p&gt;
&lt;p&gt;Why does this matter? If you&amp;rsquo;ve used Copilot&amp;rsquo;s agent mode to run build commands or test suites in the background, you know the pain of &amp;ldquo;did that finish yet?&amp;rdquo; — background terminals were essentially fire-and-forget. Now the agent gets notified when your &lt;code&gt;dotnet build&lt;/code&gt; or &lt;code&gt;dotnet test&lt;/code&gt; completes, sees the output, and can react accordingly. It&amp;rsquo;s a small change that makes agent-driven workflows significantly more reliable.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a new &lt;code&gt;send_to_terminal&lt;/code&gt; tool that lets agents send commands to background terminals with user confirmation, fixing the issue where &lt;code&gt;run_in_terminal&lt;/code&gt; with a timeout would move terminals to the background and make them read-only.&lt;/p&gt;
&lt;h2 id="ssh-remote-agent-hosting"&gt;SSH remote agent hosting&lt;/h2&gt;
&lt;p&gt;VS Code now supports connecting to remote machines over SSH, automatically installing the CLI and starting it in agent host mode. This means your AI agent sessions can target remote environments directly — useful for .NET developers who build and test on Linux servers or cloud VMs.&lt;/p&gt;
&lt;h2 id="edit-tracking-in-agent-sessions"&gt;Edit tracking in agent sessions&lt;/h2&gt;
&lt;p&gt;File edits made during agent sessions are now tracked and restored, with diffs, undo/redo, and state restoration. If an agent makes changes to your code and something goes wrong, you can see exactly what changed and roll it back. Peace of mind for letting agents modify your codebase.&lt;/p&gt;
&lt;h2 id="browser-tab-awareness-and-other-improvements"&gt;Browser tab awareness and other improvements&lt;/h2&gt;
&lt;p&gt;A few more quality-of-life additions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Browser tab tracking&lt;/strong&gt; — chat can now track and link to browser tabs opened during a session, so agents can reference web pages you&amp;rsquo;re looking at&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File paste in terminal&lt;/strong&gt; — paste files (including images) into the terminal with Ctrl+V, drag-and-drop, or right-click&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test coverage in minimap&lt;/strong&gt; — test coverage indicators now show in the minimap for a quick visual overview&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinch-to-zoom on Mac&lt;/strong&gt; — integrated browser supports pinch-to-zoom gestures&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot entitlements in Sessions&lt;/strong&gt; — status bar shows usage info in the Sessions view&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon in Go to File&lt;/strong&gt; — open web pages show favicons in the quick pick list&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 is an incremental release, but the agent improvements — background terminal notifications, SSH agent hosting, and edit tracking — add up to a noticeably smoother experience for AI-assisted development. If you&amp;rsquo;re using Copilot&amp;rsquo;s agent mode for .NET projects, these are the kinds of quality-of-life fixes that reduce friction daily.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;full release notes&lt;/a&gt; for every detail.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Ships a Docs CLI — and Your AI Agent Can Use It Too</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 adds aspire docs — a CLI for searching, browsing, and reading official documentation without leaving your terminal. It also works as a tool for AI agents. Here's why this matters.</description><content:encoded>&lt;p&gt;You know that moment when you&amp;rsquo;re deep in an Aspire AppHost, wiring up integrations, and you need to check exactly which parameters the Redis integration expects? You alt-tab to your browser, hunt through aspire.dev, squint at the API docs, then come back to your editor. Context lost. Flow broken.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 just &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;shipped a fix for that&lt;/a&gt;. The &lt;code&gt;aspire docs&lt;/code&gt; CLI lets you search, browse, and read official Aspire documentation directly from your terminal. And because it&amp;rsquo;s backed by reusable services, AI agents and skills can use the same commands to look up docs instead of hallucinating APIs that don&amp;rsquo;t exist.&lt;/p&gt;
&lt;h2 id="the-problem-this-actually-solves"&gt;The problem this actually solves&lt;/h2&gt;
&lt;p&gt;David Pine nails it in the original post: AI agents were &lt;em&gt;terrible&lt;/em&gt; at helping developers build Aspire apps. They&amp;rsquo;d recommend &lt;code&gt;dotnet run&lt;/code&gt; instead of &lt;code&gt;aspire run&lt;/code&gt;, reference learn.microsoft.com for docs that live on aspire.dev, suggest outdated NuGet packages, and — my personal favorite — hallucinate APIs that don&amp;rsquo;t exist.&lt;/p&gt;
&lt;p&gt;Why? Because Aspire was .NET-specific far longer than it&amp;rsquo;s been polyglot, and LLMs are working off training data that predates the latest features. When you give an AI agent the ability to actually look up the current docs, it stops guessing and starts being useful.&lt;/p&gt;
&lt;h2 id="three-commands-zero-browser-tabs"&gt;Three commands, zero browser tabs&lt;/h2&gt;
&lt;p&gt;The CLI is refreshingly simple:&lt;/p&gt;
&lt;h3 id="list-all-docs"&gt;List all docs&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Returns every documentation page available on aspire.dev. Need machine-readable output? Add &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="search-for-a-topic"&gt;Search for a topic&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Searches both titles and content with weighted relevance scoring. Same search engine that powers the documentation tooling internally. You get ranked results with titles, slugs, and relevance scores.&lt;/p&gt;
&lt;h3 id="read-a-full-page-or-just-one-section"&gt;Read a full page (or just one section)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Streams the full page as markdown to your terminal. Need just one section?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Surgical precision. No scrolling through 500 lines. Just the part you need.&lt;/p&gt;
&lt;h2 id="the-ai-agent-angle"&gt;The AI agent angle&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s where it gets interesting for us developers building with AI tooling. The same &lt;code&gt;aspire docs&lt;/code&gt; commands work as tools for AI agents — through skills, MCP servers, or simple CLI wrappers.&lt;/p&gt;
&lt;p&gt;Instead of your AI assistant making up Aspire APIs based on stale training data, it can call &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, find the official integration docs, read the right page, and give you the documented approach. Real-time, current documentation — not what the model memorized six months ago.&lt;/p&gt;
&lt;p&gt;The architecture behind this is intentional. The Aspire team built reusable services (&lt;code&gt;IDocsIndexService&lt;/code&gt;, &lt;code&gt;IDocsSearchService&lt;/code&gt;, &lt;code&gt;IDocsFetcher&lt;/code&gt;, &lt;code&gt;IDocsCache&lt;/code&gt;) rather than a one-off integration. That means the same search engine works for humans in the terminal, AI agents in your editor, and automation in your CI pipeline.&lt;/p&gt;
&lt;h2 id="real-world-scenarios"&gt;Real-world scenarios&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quick terminal lookups:&lt;/strong&gt; You&amp;rsquo;re three files deep and need Redis config parameters. Two commands, ninety seconds, back to work:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;AI-assisted development:&lt;/strong&gt; Your VS Code skill wraps the CLI commands. You ask &amp;ldquo;Add a PostgreSQL database to my AppHost&amp;rdquo; and the agent looks up the real docs before answering. No hallucinations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD validation:&lt;/strong&gt; Your pipeline validates AppHost configurations against official documentation programmatically. &lt;code&gt;--format Json&lt;/code&gt; output pipes cleanly to &lt;code&gt;jq&lt;/code&gt; and other tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom knowledge bases:&lt;/strong&gt; Building your own AI tooling? Pipe structured JSON output directly into your knowledge base:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No web scraping. No API keys. Same structured data the docs tooling uses internally.&lt;/p&gt;
&lt;h2 id="the-documentation-is-always-live"&gt;The documentation is always live&lt;/h2&gt;
&lt;p&gt;This is the part I appreciate most. The CLI doesn&amp;rsquo;t download a snapshot — it queries aspire.dev with ETag-based caching. The moment the docs update, your CLI and any skill built on top of it reflects that. No stale copies, no &amp;ldquo;but the wiki said&amp;hellip;&amp;rdquo; moments.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; is one of those small features that solves a real problem cleanly. Humans get terminal-native documentation access. AI agents get a way to stop guessing and start referencing actual docs. And it&amp;rsquo;s all backed by the same source of truth.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re building with .NET Aspire and haven&amp;rsquo;t tried the CLI yet, run &lt;code&gt;aspire docs search &amp;quot;your-topic-here&amp;quot;&lt;/code&gt; and see how it feels. Then consider wrapping those commands into whatever AI skill or automation setup you&amp;rsquo;re using — your agents will thank you.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;David Pine&amp;rsquo;s deep dive&lt;/a&gt; on how the docs tooling came together, and the &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;official CLI reference&lt;/a&gt; for all the details.&lt;/p&gt;</content:encoded></item><item><title>azd Now Lets You Run and Debug AI Agents Locally — Here's What Changed in March 2026</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>The Azure Developer CLI shipped seven releases in March 2026. The highlights: a local run-and-debug loop for AI agents, GitHub Copilot integration in project setup, and Container App Jobs support.</description><content:encoded>&lt;p&gt;Seven releases in one month. That&amp;rsquo;s what the Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) team pushed in March 2026, and the headline feature is the one I&amp;rsquo;ve been waiting for: &lt;strong&gt;a local run-and-debug loop for AI agents&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;PC Chan &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;published the full roundup&lt;/a&gt;, and while there&amp;rsquo;s a lot in there, let me filter it down to what actually matters for .NET developers building AI-powered apps.&lt;/p&gt;
&lt;h2 id="run-and-debug-ai-agents-without-deploying"&gt;Run and debug AI agents without deploying&lt;/h2&gt;
&lt;p&gt;This is the big one. The new &lt;code&gt;azure.ai.agents&lt;/code&gt; extension adds a set of commands that give you a proper inner-loop experience for AI agents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — starts your agent locally&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — sends messages to it (local or deployed)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — displays container status and health&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — streams container logs in real time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before this, testing an AI agent meant deploying to Microsoft Foundry every time you made a change. Now you can iterate locally, test your agent&amp;rsquo;s behavior, and only deploy when you&amp;rsquo;re ready. If you&amp;rsquo;ve been building agents with the Microsoft Agent Framework or Semantic Kernel, this changes your daily workflow.&lt;/p&gt;
&lt;p&gt;The invoke command works against both local and deployed agents, which means you can use the same testing workflow regardless of where the agent is running. That&amp;rsquo;s the kind of detail that saves you from maintaining two sets of test scripts.&lt;/p&gt;
&lt;h2 id="github-copilot-scaffolds-your-azd-project"&gt;GitHub Copilot scaffolds your azd project&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; now offers a &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo; option. Instead of manually answering prompts about your project structure, a Copilot agent scaffolds the configuration for you. It checks for a dirty working directory before modifying anything and asks for MCP server tool consent upfront.&lt;/p&gt;
&lt;p&gt;When a command fails, &lt;code&gt;azd&lt;/code&gt; now offers AI-assisted troubleshooting: pick a category (explain, guidance, troubleshoot, or skip), let the agent suggest a fix, and retry — all without leaving the terminal. For complex infrastructure setups, that&amp;rsquo;s a real time saver.&lt;/p&gt;
&lt;h2 id="container-app-jobs-and-deployment-improvements"&gt;Container App Jobs and deployment improvements&lt;/h2&gt;
&lt;p&gt;A few deployment features worth noting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;: &lt;code&gt;azd&lt;/code&gt; now deploys &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; through the existing &lt;code&gt;host: containerapp&lt;/code&gt; config. Your Bicep template determines whether the target is a Container App or a Job — no extra setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configurable deployment timeouts&lt;/strong&gt;: New &lt;code&gt;--timeout&lt;/code&gt; flag on &lt;code&gt;azd deploy&lt;/code&gt; and a &lt;code&gt;deployTimeout&lt;/code&gt; field in &lt;code&gt;azure.yaml&lt;/code&gt;. No more guessing the default 1200-second limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote build fallback&lt;/strong&gt;: When remote ACR build fails, &lt;code&gt;azd&lt;/code&gt; falls back to local Docker/Podman build automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local preflight validation&lt;/strong&gt;: Bicep parameters get validated locally before deploying, catching missing params without a round-trip to Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="developer-experience-polish"&gt;Developer experience polish&lt;/h2&gt;
&lt;p&gt;Some smaller improvements that add up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic pnpm/yarn detection&lt;/strong&gt; for JS/TS projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pyproject.toml support&lt;/strong&gt; for Python packaging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local template directories&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; now accepts filesystem paths for offline iteration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better error messages&lt;/strong&gt; in &lt;code&gt;--no-prompt&lt;/code&gt; mode — all missing values reported at once with resolution commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build environment variables&lt;/strong&gt; injected into all framework build subprocesses (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one is subtle but important: your .NET build now has access to &lt;code&gt;azd&lt;/code&gt; environment variables, which means you can do build-time configuration injection without extra scripting.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The local AI agent debugging loop is the star of this release, but the accumulation of deployment improvements and DX polish makes &lt;code&gt;azd&lt;/code&gt; feel more mature than ever. If you&amp;rsquo;re deploying .NET apps to Azure — especially AI agents — this update is worth the install.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;full release notes&lt;/a&gt; for every detail, or get started with &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;azd install&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps Finally Fixes the Markdown Editor UX Everyone Complained About</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>The Azure DevOps Markdown editor for work items gets a clearer preview-vs-edit mode distinction. It's a small change that fixes a genuinely annoying workflow issue.</description><content:encoded>&lt;p&gt;If you use Azure Boards, you&amp;rsquo;ve probably experienced this: you&amp;rsquo;re reading through a work item description, maybe reviewing acceptance criteria, and you accidentally double-click. Boom — you&amp;rsquo;re in edit mode. You didn&amp;rsquo;t want to edit anything. You were just reading.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;announced the fix&lt;/a&gt;, and it&amp;rsquo;s one of those changes that sounds tiny but actually removes real friction from your daily workflow.&lt;/p&gt;
&lt;h2 id="what-changed"&gt;What changed&lt;/h2&gt;
&lt;p&gt;The Markdown editor for work item text fields now opens in &lt;strong&gt;preview mode by default&lt;/strong&gt;. You can read and interact with the content — follow links, review formatting — without worrying about accidentally entering edit mode.&lt;/p&gt;
&lt;p&gt;When you actually want to edit, you click the edit icon at the top of the field. When you&amp;rsquo;re done, you exit back to preview mode explicitly. Simple, intentional, predictable.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. That&amp;rsquo;s the change.&lt;/p&gt;
&lt;h2 id="why-this-matters-more-than-it-sounds"&gt;Why this matters more than it sounds&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;community feedback thread&lt;/a&gt; on this was long. The double-click-to-edit behavior was introduced with the Markdown editor back in July 2025, and the complaints started almost immediately. The problem wasn&amp;rsquo;t just accidental edits — it was that the whole interaction felt unpredictable. You never knew if clicking would read or edit.&lt;/p&gt;
&lt;p&gt;For teams that do sprint planning, backlog grooming, or code review with Azure Boards, this kind of micro-friction compounds. Every accidental edit mode entry is a context switch. Every &amp;ldquo;wait, did I change something?&amp;rdquo; moment is wasted attention.&lt;/p&gt;
&lt;p&gt;The new default respects the most common interaction pattern: you read work items far more often than you edit them.&lt;/p&gt;
&lt;h2 id="rollout-status"&gt;Rollout status&lt;/h2&gt;
&lt;p&gt;This is already rolling out to a subset of customers and expanding to everyone over the next two to three weeks. If you&amp;rsquo;re not seeing it yet, you will soon.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Not every improvement needs to be a headline feature. Sometimes the best update is just removing something annoying. This is one of those — a small UX fix that makes Azure Boards feel less hostile to people who just want to read their work items in peace.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio Brings Slot-Based Navigation and Sharing to Visual Studio Bookmarks</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>Mads Kristensen's new Bookmark Studio extension adds keyboard-driven slot navigation, a bookmark manager, colors, labels, and export/share capabilities to Visual Studio bookmarks.</description><content:encoded>&lt;p&gt;Bookmarks in Visual Studio have always been&amp;hellip; fine. You set one, you navigate to the next, you forget which bookmark is which. They work, but they&amp;rsquo;ve never been the kind of feature you&amp;rsquo;d call powerful.&lt;/p&gt;
&lt;p&gt;Mads Kristensen just &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;released Bookmark Studio&lt;/a&gt;, an experimental extension that fills in exactly the gaps you&amp;rsquo;ve probably run into if you use bookmarks regularly.&lt;/p&gt;
&lt;h2 id="slot-based-navigation"&gt;Slot-based navigation&lt;/h2&gt;
&lt;p&gt;The core addition: bookmarks can now be assigned to slots 1–9 and jumped to directly with &lt;code&gt;Alt+Shift+1&lt;/code&gt; through &lt;code&gt;Alt+Shift+9&lt;/code&gt;. New bookmarks automatically get the next available slot, so in most cases, fast navigation works without any setup.&lt;/p&gt;
&lt;p&gt;This sounds simple, but it changes bookmarks from &amp;ldquo;I have some bookmarks somewhere&amp;rdquo; to &amp;ldquo;Slot 3 is my API controller, Slot 5 is the service layer, Slot 7 is the test.&amp;rdquo; That kind of spatial memory makes navigation nearly instant during focused work sessions.&lt;/p&gt;
&lt;h2 id="the-bookmark-manager"&gt;The Bookmark Manager&lt;/h2&gt;
&lt;p&gt;A new tool window shows all your bookmarks in one place with filtering by name, file, location, color, or slot. Double-click or keyboard-navigate to jump to any bookmark.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever had more than five or six bookmarks and lost track of which was which, this alone is worth installing the extension.&lt;/p&gt;
&lt;h2 id="organization-with-labels-colors-and-folders"&gt;Organization with labels, colors, and folders&lt;/h2&gt;
&lt;p&gt;Bookmarks can optionally have labels, colors, and be grouped into folders. None of it is required — your current bookmark workflow keeps working. But when you&amp;rsquo;re debugging a complex issue or exploring an unfamiliar codebase, being able to color-code and label your bookmarks adds useful context.&lt;/p&gt;
&lt;p&gt;All metadata is stored per solution, so your bookmark organization persists across sessions.&lt;/p&gt;
&lt;h2 id="export-and-share"&gt;Export and share&lt;/h2&gt;
&lt;p&gt;This is the feature I didn&amp;rsquo;t know I wanted. Bookmark Studio lets you export bookmarks as plain text, Markdown, or CSV. That means you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Include bookmark paths in pull request descriptions&lt;/li&gt;
&lt;li&gt;Share investigation breadcrumbs with teammates&lt;/li&gt;
&lt;li&gt;Move bookmark sets between repos or branches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bookmarks stop being a solo navigation tool and start being a way to communicate &amp;ldquo;here&amp;rsquo;s the path through this code.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="bookmarks-that-track-code-movement"&gt;Bookmarks that track code movement&lt;/h2&gt;
&lt;p&gt;Bookmark Studio tracks bookmarks relative to the text they&amp;rsquo;re anchored to, so they don&amp;rsquo;t drift to wrong lines as you edit. If you&amp;rsquo;ve ever set bookmarks during a debugging session and had them all point to the wrong lines after a refactor — this fixes that.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Bookmark Studio doesn&amp;rsquo;t reinvent anything. It takes a feature that&amp;rsquo;s been &amp;ldquo;good enough&amp;rdquo; for years and makes it genuinely useful for focused development. Slot navigation, the Bookmark Manager, and export capabilities are the highlights.&lt;/p&gt;
&lt;p&gt;Grab it from the &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;Visual Studio Marketplace&lt;/a&gt; and give it a try.&lt;/p&gt;</content:encoded></item><item><title>Visual Studio's March Update Lets You Build Custom Copilot Agents — and the find_symbol Tool Is a Big Deal</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Visual Studio's March 2026 update ships custom Copilot agents, reusable agent skills, a language-aware find_symbol tool, and Copilot-powered profiling from Test Explorer. Here's what matters.</description><content:encoded>&lt;p&gt;Visual Studio just got its most significant Copilot update yet. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;announced the March release&lt;/a&gt;, and the headline is custom agents — but honestly, the &lt;code&gt;find_symbol&lt;/code&gt; tool buried further down might be the feature that changes your workflow the most.&lt;/p&gt;
&lt;p&gt;Let me break down what&amp;rsquo;s actually here.&lt;/p&gt;
&lt;h2 id="custom-copilot-agents-in-your-repo"&gt;Custom Copilot agents in your repo&lt;/h2&gt;
&lt;p&gt;Want Copilot to follow your team&amp;rsquo;s coding standards, run your build pipeline, or query your internal docs? Now you can build exactly that.&lt;/p&gt;
&lt;p&gt;Custom agents are defined as &lt;code&gt;.agent.md&lt;/code&gt; files that you drop into &lt;code&gt;.github/agents/&lt;/code&gt; in your repository. Each agent gets full access to workspace awareness, code understanding, tools, your preferred model, and MCP connections to external services. They show up in the agent picker alongside the built-in agents.&lt;/p&gt;
&lt;p&gt;This is the same pattern VS Code has been supporting — and it&amp;rsquo;s great to see Visual Studio catch up. For teams that have already built agents for VS Code, your &lt;code&gt;.agent.md&lt;/code&gt; files should work across both IDEs (though tool names can vary, so test them).&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/github/awesome-copilot"&gt;awesome-copilot&lt;/a&gt; repo has community-contributed agent configurations you can use as starting points.&lt;/p&gt;
&lt;h2 id="agent-skills-reusable-instruction-packs"&gt;Agent skills: reusable instruction packs&lt;/h2&gt;
&lt;p&gt;Skills are automatically picked up from &lt;code&gt;.github/skills/&lt;/code&gt; in your repo or &lt;code&gt;~/.copilot/skills/&lt;/code&gt; in your profile. Each skill is a &lt;code&gt;SKILL.md&lt;/code&gt; file following the &lt;a href="https://agentskills.io/specification"&gt;Agent Skills specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Think of skills as modular expertise you can mix and match. You might have a skill for your API conventions, another for your testing patterns, and another for your deployment workflow. When a skill activates, it shows up in the chat so you know it&amp;rsquo;s being applied.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been using skills in VS Code, they work the same way in Visual Studio now.&lt;/p&gt;
&lt;h2 id="find_symbol-language-aware-navigation-for-agents"&gt;find_symbol: language-aware navigation for agents&lt;/h2&gt;
&lt;p&gt;This is where things get really interesting. The new &lt;code&gt;find_symbol&lt;/code&gt; tool gives Copilot&amp;rsquo;s agent mode actual language-service-powered symbol navigation. Instead of searching your code as text, the agent can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find all references to a symbol across your project&lt;/li&gt;
&lt;li&gt;Access type information, declarations, and scope metadata&lt;/li&gt;
&lt;li&gt;Navigate call sites with full language awareness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What this means in practice: when you ask Copilot to refactor a method or update a parameter signature across call sites, it can actually see your code&amp;rsquo;s structure. No more &amp;ldquo;the agent changed the method but missed three call sites&amp;rdquo; situations.&lt;/p&gt;
&lt;p&gt;Supported languages include C#, C++, Razor, TypeScript, and anything with a supported LSP extension. For .NET developers, this is a massive improvement — C# codebases with deep type hierarchies and interfaces benefit enormously from symbol-aware navigation.&lt;/p&gt;
&lt;h2 id="profile-tests-with-copilot"&gt;Profile tests with Copilot&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s now a &lt;strong&gt;Profile with Copilot&lt;/strong&gt; command in the Test Explorer context menu. Select a test, click profile, and the Profiling Agent automatically runs it and analyzes performance — combining CPU usage and instrumentation data to deliver actionable insights.&lt;/p&gt;
&lt;p&gt;No more manually configuring profiler sessions, running the test, exporting results, and trying to read a flame graph. The agent does the analysis and tells you what&amp;rsquo;s slow and why. Currently .NET only, which makes sense given Visual Studio&amp;rsquo;s deep .NET diagnostics integration.&lt;/p&gt;
&lt;h2 id="perf-tips-during-live-debugging"&gt;Perf tips during live debugging&lt;/h2&gt;
&lt;p&gt;Performance optimization now happens while you debug, not after. As you step through code, Visual Studio shows execution time and performance signals inline. See a slow line? Click the Perf Tip and ask Copilot for optimization suggestions right there.&lt;/p&gt;
&lt;p&gt;The Profiling Agent captures runtime data automatically — elapsed time, CPU usage, memory behavior — and Copilot uses it to pinpoint hot spots. This keeps performance work as part of your debugging flow instead of a separate task you keep postponing.&lt;/p&gt;
&lt;h2 id="fix-nuget-vulnerabilities-from-solution-explorer"&gt;Fix NuGet vulnerabilities from Solution Explorer&lt;/h2&gt;
&lt;p&gt;When a vulnerability is detected in a NuGet package, you now see a notification with a &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt; link directly in Solution Explorer. Click through and Copilot analyzes the vulnerability, recommends the right package updates, and implements them.&lt;/p&gt;
&lt;p&gt;For teams that struggle to keep dependencies up to date (which is basically everyone), this removes the friction of &amp;ldquo;I know there&amp;rsquo;s a vulnerability but figuring out the right update path is a project in itself.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Custom agents and skills are the headline, but &lt;code&gt;find_symbol&lt;/code&gt; is the sleeper hit — it fundamentally changes how accurate Copilot can be when refactoring .NET code. Combined with live profiling integration and vulnerability fixes, this update makes Visual Studio&amp;rsquo;s AI features feel genuinely practical rather than demo-ready.&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; to try it all out.&lt;/p&gt;</content:encoded></item><item><title>From Laptop to Production: Deploying AI Agents to Microsoft Foundry with Two Commands</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>The Azure Developer CLI now has 'azd ai agent' commands that take your AI agent from local dev to a live Foundry endpoint in minutes. Here's the full workflow.</description><content:encoded>&lt;p&gt;You know that gap between &amp;ldquo;it works on my machine&amp;rdquo; and &amp;ldquo;it&amp;rsquo;s deployed and serving traffic&amp;rdquo;? For AI agents, that gap has been painfully wide. You need to provision resources, deploy models, wire up identity, set up monitoring — and that&amp;rsquo;s before anyone can actually call your agent.&lt;/p&gt;
&lt;p&gt;The Azure Developer CLI just made this a &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;two-command affair&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-new-azd-ai-agent-workflow"&gt;The new &lt;code&gt;azd ai agent&lt;/code&gt; workflow&lt;/h2&gt;
&lt;p&gt;Let me walk through what this actually looks like. You have an AI agent project — let&amp;rsquo;s say a hotel concierge agent. It works locally. You want it running on Microsoft Foundry.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Two commands. &lt;code&gt;azd ai agent init&lt;/code&gt; scaffolds the infrastructure-as-code in your repo, and &lt;code&gt;azd up&lt;/code&gt; provisions everything on Azure and publishes your agent. You get a direct link to your agent in the Foundry portal.&lt;/p&gt;
&lt;h2 id="what-happens-under-the-hood"&gt;What happens under the hood&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;init&lt;/code&gt; command generates real, inspectable Bicep templates in your repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Foundry Resource&lt;/strong&gt; (top-level container)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Foundry Project&lt;/strong&gt; (where your agent lives)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model deployment&lt;/strong&gt; configuration (GPT-4o, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed identity&lt;/strong&gt; with proper RBAC role assignments&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; for the service map&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; with agent metadata and environment variables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the key part: you own all of this. It&amp;rsquo;s versioned Bicep in your repo. You can inspect it, customize it, and commit it alongside your agent code. No magic black boxes.&lt;/p&gt;
&lt;h2 id="the-dev-inner-loop"&gt;The dev inner loop&lt;/h2&gt;
&lt;p&gt;What I really like is the local development story. When you&amp;rsquo;re iterating on agent logic, you don&amp;rsquo;t want to redeploy every time you change a prompt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This starts your agent locally. Pair it with &lt;code&gt;azd ai agent invoke&lt;/code&gt; to send test prompts, and you&amp;rsquo;ve got a tight feedback loop. Edit code, restart, invoke, repeat.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;invoke&lt;/code&gt; command is smart about routing too — when a local agent is running, it targets that automatically. When it&amp;rsquo;s not, it hits the remote endpoint.&lt;/p&gt;
&lt;h2 id="real-time-monitoring"&gt;Real-time monitoring&lt;/h2&gt;
&lt;p&gt;This is the feature that sold me. Once your agent is deployed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every request and response flowing through your agent streams to your terminal in real time. For debugging production issues, this is invaluable. No digging through log analytics, no waiting for metrics to aggregate — you see what&amp;rsquo;s happening right now.&lt;/p&gt;
&lt;h2 id="the-full-command-set"&gt;The full command set&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the quick reference:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffold a Foundry agent project with IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provision Azure resources and deploy the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send prompts to the remote or local agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run the agent locally for development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stream real-time logs from the published agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check agent health and status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clean up all Azure resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="why-this-matters-for-net-developers"&gt;Why this matters for .NET developers&lt;/h2&gt;
&lt;p&gt;Even though the sample in the announcement is Python-based, the infrastructure story is language-agnostic. Your .NET agent gets the same Bicep scaffolding, the same managed identity setup, the same monitoring pipeline. And if you&amp;rsquo;re already using &lt;code&gt;azd&lt;/code&gt; for your .NET Aspire apps or Azure deployments, this fits right into your existing workflow.&lt;/p&gt;
&lt;p&gt;The deployment gap for AI agents has been one of the biggest friction points in the ecosystem. Going from a working prototype to a production endpoint with proper identity, networking, and monitoring shouldn&amp;rsquo;t require a week of DevOps work. Now it requires two commands and a few minutes.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; is available now. If you&amp;rsquo;ve been putting off deploying your AI agents because the infrastructure setup felt like too much work, give this a shot. Check out the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;full walkthrough&lt;/a&gt; for the complete step-by-step including frontend chat app integration.&lt;/p&gt;</content:encoded></item></channel></rss>