<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Antonio Cardenas </title>
    <description>The latest articles on DEV Community by Antonio Cardenas  (@antoniocardenas).</description>
    <link>https://dev.to/antoniocardenas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg</url>
      <title>DEV Community: Antonio Cardenas </title>
      <link>https://dev.to/antoniocardenas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antoniocardenas"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:34:58 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-3mfi</link>
      <guid>https://dev.to/antoniocardenas/-3mfi</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" class="crayons-story__hidden-navigation-link"&gt;Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angularfirebase"&gt;
            &lt;img alt="Angular Firebase logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F821%2Fd43c326b-2812-4d5d-a7e0-f13d3a9567d7.png" class="crayons-logo__image" width="768" height="768"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" alt="antoniocardenas profile" class="crayons-avatar__image" width="625" height="625"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
              
              &lt;div id="story-author-preview-content-3782443" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antoniocardenas" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" class="crayons-avatar__image" alt="" width="625" height="625"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angularfirebase" class="crayons-story__secondary fw-medium"&gt;Angular Firebase&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angularfirebase/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/angularfirebase/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" id="article-link-3782443"&gt;
          Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agentskills"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agentskills&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/angularfirebase/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:32:42 +0000</pubDate>
      <link>https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai</link>
      <guid>https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai</guid>
      <description>&lt;h2&gt;
  
  
  Angular v22 MCP + Skills Integration: Agentic Development Setup
&lt;/h2&gt;

&lt;p&gt;With Angular v22, the MCP (Model Context Protocol) server + Angular Skills stack transforms agent-assisted development from a risky proposition into a deterministic, verifiable workflow. This guide walks you through configuring your environment, setting up the right skills, and building agent-safe components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: Environment Setup
&lt;/h2&gt;

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

&lt;p&gt;Ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js v20+ (&lt;code&gt;node --version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Angular CLI v22+ (&lt;code&gt;npm install -g @angular/cli@latest&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A coding agent environment (Gemini CLI, Cursor, Claude Code, GitHub Copilot, JetBrains AI, or Windsurf)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Configure Angular MCP Server
&lt;/h3&gt;

&lt;p&gt;The Angular CLI ships with the MCP server built-in. Configure it in your agent's settings:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Gemini CLI / Cursor / Claude Code&lt;/strong&gt; (using &lt;code&gt;.gemini/settings.json&lt;/code&gt; or equivalent):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chrome-devtools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"chrome-devtools-mcp@latest"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For JetBrains IDEs&lt;/strong&gt; (Settings → Tools → MCP):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add new server: name &lt;code&gt;angular-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Command: &lt;code&gt;npx -y @angular/cli mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add second server: name &lt;code&gt;chrome-devtools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Command: &lt;code&gt;npx chrome-devtools-mcp@latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test the connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @angular/cli mcp &lt;span class="nt"&gt;--health-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a list of available tools. Common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ng_lint&lt;/code&gt; — runs the linter on your project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_examples&lt;/code&gt; — fetches best-practice code examples&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_best_practices&lt;/code&gt; — retrieves the Angular Best Practices Guide&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_documentation&lt;/code&gt; — queries angular.dev&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.wait_for_build&lt;/code&gt; — blocks until build succeeds/fails (critical for agents)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.start&lt;/code&gt; — starts the dev server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.stop&lt;/code&gt; — stops the dev server&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Install Angular Skills
&lt;/h3&gt;

&lt;p&gt;Skills are installed separately from MCP tools. They augment the agent's knowledge without adding token overhead to every request.&lt;/p&gt;

&lt;p&gt;Install the official Angular skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using npx skills package&lt;/span&gt;
npx @anthropic-ai/skills add &lt;span class="se"&gt;\&lt;/span&gt;
  https://github.com/angular/skills/blob/main/angular-developer/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; angular-developer

npx @anthropic-ai/skills add &lt;span class="se"&gt;\&lt;/span&gt;
  https://github.com/angular/skills/blob/main/angular-new-app/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; angular-new-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if your agent supports URL-based skills, reference directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/skills &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/angular/skills/blob/main/angular-developer/SKILL.md
/skills &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/angular/skills/blob/main/angular-new-app/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In your agent (Gemini CLI, etc.)&lt;/span&gt;
/skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;angular-developer&lt;/code&gt; and &lt;code&gt;angular-new-app&lt;/code&gt; listed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Configure Chrome DevTools for Agents
&lt;/h3&gt;

&lt;p&gt;This gives agents visibility into your running application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx chrome-devtools-mcp@latest &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx chrome-devtools-mcp@latest &lt;span class="nt"&gt;--health-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Part 2: Writing Agent-Safe Components
&lt;/h2&gt;

&lt;p&gt;With MCP + Skills configured, your agent has access to build verification and browser visibility. Now write code that agents can safely modify.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 1: Exhaustive &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt; with Type Safety
&lt;/h3&gt;

&lt;p&gt;Always use exhaustive &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt; blocks. This prevents agents from introducing unhandled cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✓ Good: Type-safe, exhaustive union&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;VehicleStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;maintenance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;critical&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FleetDetailComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;VehicleStatus&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;assertNever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Unhandled status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Template with exhaustive check --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"status-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  @switch (status()) {
    @case ('idle') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Available&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('transit') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;In transit&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('maintenance') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-yellow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Maintenance&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('critical') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-red"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Critical&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @default {
      &lt;span class="c"&gt;&amp;lt;!-- If an agent adds a new status to the union without updating the template, this line will fail to compile --&amp;gt;&lt;/span&gt;
      {{ assertNever(status() as never) }}
    }
  }
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: If a backend team adds &lt;code&gt;'error'&lt;/code&gt; to the union without notifying frontend, the TypeScript build fails—agents can't ship broken code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Signal Forms with Inline Validators
&lt;/h3&gt;

&lt;p&gt;Signal Forms provide type-safe, signal-driven form handling. Agents are far less likely to introduce validation errors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ServiceTicketComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Signal-based form&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MEDIUM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MEDIUM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;assignedTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Signal-based access&lt;/span&gt;
  &lt;span class="nx"&gt;priority$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priority&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valueAsSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Compute UI state based on priority&lt;/span&gt;
  &lt;span class="nx"&gt;priorityClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-red-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-orange-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-gray-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Agent can safely call this; form validation is enforced&lt;/span&gt;
  &lt;span class="nf"&gt;submitTicket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Safe to use form.value — it's typed and validated&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fleetService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTicket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;[formGroup]=&lt;/span&gt;&lt;span class="s"&gt;"form"&lt;/span&gt; &lt;span class="na"&gt;(submit)=&lt;/span&gt;&lt;span class="s"&gt;"submitTicket()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt;
    &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;
    &lt;span class="na"&gt;[class]=&lt;/span&gt;&lt;span class="s"&gt;"priorityClass()"&lt;/span&gt;
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Describe the issue..."&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"priority"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"LOW"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Low&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"MEDIUM"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Medium&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"HIGH"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;High&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"CRITICAL"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Critical&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;[disabled]=&lt;/span&gt;&lt;span class="s"&gt;"form.invalid()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: Agents can't generate invalid form values. TypeScript catches it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: @boundary for Risky Integrations
&lt;/h3&gt;

&lt;p&gt;When integrating third-party code or experimental features, wrap with &lt;code&gt;@boundary&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"dashboard"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Core fleet list always renders --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;fleet-list&lt;/span&gt; &lt;span class="na"&gt;[units]=&lt;/span&gt;&lt;span class="s"&gt;"units()"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- AI diagnostics can fail without crashing the whole page --&amp;gt;&lt;/span&gt;
  @boundary {
    &lt;span class="nt"&gt;&amp;lt;ai-predictive-diagnostics&lt;/span&gt; &lt;span class="na"&gt;[selectedUnit]=&lt;/span&gt;&lt;span class="s"&gt;"selectedUnit()"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  } @catch (error) {
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error-fallback"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Diagnostics unavailable&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ error.message }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"retryDiagnostics()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Retry&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  }
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: When an agent writes complex AI integration code, a single bug won't crash the user's app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 4: Inline Template Functions for Transient Logic
&lt;/h3&gt;

&lt;p&gt;Keep component API clean; let agents write inline handlers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ✓ Inline handler — close to its usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
  &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"vehicles.update(v =&amp;gt; v.filter(item =&amp;gt; item.id !== vehicleId))"&lt;/span&gt;
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-danger"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Remove from fleet
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ✗ Avoid exposing every handler as a method --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- &amp;lt;button (click)="removeVehicle(vehicleId)"&amp;gt;Remove&amp;lt;/button&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the component API surface minimal and lets agents see the full handler intent inline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: Agent Workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Workflow 1: Scaffold a Component (with MCP Verification)
&lt;/h3&gt;

&lt;p&gt;Tell your agent: &lt;em&gt;"Create a ServiceTicketForm component using Angular skills. Use signal forms, include an @boundary for the AI priority analyzer, and run the build to verify."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;get_best_practices&lt;/code&gt; to fetch Signal Forms patterns.&lt;/li&gt;
&lt;li&gt;Scaffold the component with &lt;code&gt;ng generate component&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implement inline validators using the skill guidance.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;dev_server.wait_for_build&lt;/code&gt; to verify compilation.&lt;/li&gt;
&lt;li&gt;If the build fails, read the error and fix it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can monitor this entirely in your agent's chat; no surprise errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow 2: Add AI-Powered Fleet Chat (with Browser Verification)
&lt;/h3&gt;

&lt;p&gt;From the logistics-manager-app codelab, tell your agent: &lt;em&gt;"Implement a fleet chat query feature. Use the Gemini API to analyze fleet data and return filtered results. Start the dev server with Chrome DevTools, navigate to the chat component, and take a screenshot to verify the feature works."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;FleetChatService&lt;/code&gt; that accepts a natural-language query.&lt;/li&gt;
&lt;li&gt;Send the current &lt;code&gt;units()&lt;/code&gt; signal state to the Gemini API.&lt;/li&gt;
&lt;li&gt;Parse Gemini's response and filter the fleet.&lt;/li&gt;
&lt;li&gt;Update the chat UI with results.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;dev_server.start&lt;/code&gt; to spin up the dev server.&lt;/li&gt;
&lt;li&gt;Call Chrome DevTools to navigate to the component.&lt;/li&gt;
&lt;li&gt;Snap a screenshot showing the chat results.&lt;/li&gt;
&lt;li&gt;Read the screenshot and confirm the feature works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No hallucinations—the agent has eyes on the running application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow 3: Implement Predictive Diagnostics with @boundary
&lt;/h3&gt;

&lt;p&gt;From the codelab, tell your agent: &lt;em&gt;"Add a 'Run AI Diagnostic' button to the FleetDetailModal. The button should call a Gemini API with the unit's telemetry (speed, battery, status). Wrap the diagnostics component with @boundary so if the AI call fails, it doesn't crash the modal. Test it by triggering a vehicle detail view and clicking the button."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;DiagnosticsComponent&lt;/code&gt; that calls the AI service.&lt;/li&gt;
&lt;li&gt;Wrap it with &lt;code&gt;@boundary&lt;/code&gt; in the modal template.&lt;/li&gt;
&lt;li&gt;Implement a fallback UI in the &lt;a class="mentioned-user" href="https://dev.to/catch"&gt;@catch&lt;/a&gt; block.&lt;/li&gt;
&lt;li&gt;Add retry logic.&lt;/li&gt;
&lt;li&gt;Start the dev server.&lt;/li&gt;
&lt;li&gt;Navigate to a vehicle detail modal.&lt;/li&gt;
&lt;li&gt;Click the diagnostic button.&lt;/li&gt;
&lt;li&gt;Verify the result (or error) in the browser.&lt;/li&gt;
&lt;li&gt;If the test fails, analyze the error and iterate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This entire workflow is deterministic. The agent can't ship broken code—the build will catch it first, and Chrome DevTools will catch runtime issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 4: Skills Configuration Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One Server Per Domain
&lt;/h3&gt;

&lt;p&gt;Don't load the Angular MCP server alongside your deployment server and communication server. Create separate IDE configurations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"chrome-devtools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chrome-devtools-mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deployment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"deploy-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"my-deploy-cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate only the profile you need for the task at hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version Your Skills
&lt;/h3&gt;

&lt;p&gt;Put skills in your repo and version them like code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/my-project
  /skills
    /angular-v22-dev-guidelines.md
    /our-design-system.md
    /api-integration-patterns.md
  /src
  angular.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reference them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @anthropic-ai/skills add ./skills/angular-v22-dev-guidelines.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review and update skills when you update Angular versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measure Context Budget
&lt;/h3&gt;

&lt;p&gt;Before running an agent on a real task, ask it to estimate token usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What's the total token count of all my installed MCP tools and skills?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If over 30% of your context window is on tool definitions, simplify. Agents need room to think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write MCP Guardrails in Skills
&lt;/h3&gt;

&lt;p&gt;Instead of relying on the agent to "be careful," write it into the skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Angular Update Guardrail Skill&lt;/span&gt;

Before running &lt;span class="sb"&gt;`ng update`&lt;/span&gt;, ALWAYS:
&lt;span class="p"&gt;1.&lt;/span&gt; Create a git branch: &lt;span class="sb"&gt;`git checkout -b ng-update-v22`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Run tests: &lt;span class="sb"&gt;`npm test`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Commit current state: &lt;span class="sb"&gt;`git commit -m "checkpoint before ng update"`&lt;/span&gt;
&lt;span class="p"&gt;4.&lt;/span&gt; Then and only then run: &lt;span class="sb"&gt;`ng update @angular/core @angular/cli`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent will follow the skill's instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 5: Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"MCP server not found"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify &lt;code&gt;npx @angular/cli mcp --health-check&lt;/code&gt; returns a list of tools&lt;/li&gt;
&lt;li&gt;Restart your agent IDE&lt;/li&gt;
&lt;li&gt;Check that Angular CLI v22+ is installed: &lt;code&gt;ng version&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Skills not recognized"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;npx @anthropic-ai/skills list&lt;/code&gt; to confirm they're installed&lt;/li&gt;
&lt;li&gt;Restart your agent&lt;/li&gt;
&lt;li&gt;Verify the skill URL is correct&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Chrome DevTools not taking screenshots"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure Chrome is installed and in PATH&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx chrome-devtools-mcp@latest --health-check&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check that you've started the dev server with &lt;code&gt;dev_server.start&lt;/code&gt; before asking the agent to navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Build verification timed out"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;dev_server.wait_for_build&lt;/code&gt; tool has a default timeout (usually 30 seconds)&lt;/li&gt;
&lt;li&gt;If your builds are slower, ask the agent to increase the timeout in the MCP call&lt;/li&gt;
&lt;li&gt;Check that the dev server is running: &lt;code&gt;ng serve&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;With Angular v22's MCP + Skills stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents write type-safe code&lt;/strong&gt; that compiles or fails, never silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exhaustive type checking&lt;/strong&gt; prevents new states from slipping past.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@boundary&lt;/strong&gt; contains failures instead of crashing the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline templates&lt;/strong&gt; keep components clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal Forms&lt;/strong&gt; enforce validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome DevTools integration&lt;/strong&gt; gives agents visibility into running code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills teach modern patterns&lt;/strong&gt; aligned to your version and conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hallucination loop is closed. Code generation becomes verifiable. Agentic development shifts from risky to reliable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up Angular MCP in your IDE/agent (5 minutes)&lt;/li&gt;
&lt;li&gt;Install Angular Skills (2 minutes)&lt;/li&gt;
&lt;li&gt;Configure Chrome DevTools (2 minutes)&lt;/li&gt;
&lt;li&gt;Write a test component using the patterns above&lt;/li&gt;
&lt;li&gt;Ask your agent to scaffold a feature and verify it with MCP tools&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular Skills Repository: &lt;a href="https://github.com/angular/skills" rel="noopener noreferrer"&gt;https://github.com/angular/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chrome DevTools for Agents: &lt;a href="https://developer.chrome.com/docs/devtools/agents" rel="noopener noreferrer"&gt;https://developer.chrome.com/docs/devtools/agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Logistics Manager Codelab: &lt;a href="https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md" rel="noopener noreferrer"&gt;https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>mcp</category>
      <category>agentskills</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop AI Agents From Hallucinating: Angular v22's Type-Safe, Boundary-Protected Pipelines</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:22:07 +0000</pubDate>
      <link>https://dev.to/turingsoracle/stop-ai-agents-from-hallucinating-angular-v22s-type-safe-boundary-protected-pipelines-3j1k</link>
      <guid>https://dev.to/turingsoracle/stop-ai-agents-from-hallucinating-angular-v22s-type-safe-boundary-protected-pipelines-3j1k</guid>
      <description>&lt;h1&gt;
  
  
  Angular v22: Agentic Pipelines and Resilient Template Architectures
&lt;/h1&gt;

&lt;p&gt;The frontend landscape is no longer just about rendering pixels; it's about establishing robust pipelines that integrate seamlessly with automated, AI-driven workflows. At Google I/O 2026, the Angular team unveiled a massive structural shift for the framework. Moving towards the v22 release (launching the week of June 1st, 2026), Angular is solidifying its primitive layer—pushing Signal Forms and Resource APIs to stable—while actively engineering the framework to act as a first-class citizen in agentic development environments.&lt;/p&gt;

&lt;p&gt;Here is an architectural breakdown of the most critical updates and what they mean for high-performance core engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agentic Pipeline: Angular MCP + Skills
&lt;/h2&gt;

&lt;p&gt;For those of us configuring custom agentic workflows, the standard LLM coding loop is notoriously brittle. An agent writes code, claims it works, and leaves you to discover the compilation errors at runtime.&lt;/p&gt;

&lt;p&gt;Angular is attacking this friction head-on by pairing two critical systems: the Angular CLI's Model Context Protocol (MCP) server that enables AI assistants to interact directly with the Angular CLI, providing tools for code generation, modernizing code, fetching examples, and running &lt;code&gt;builds/tests&lt;/code&gt;, and the &lt;strong&gt;Angular Skills framework&lt;/strong&gt; — a specialized knowledge layer that teaches agents to write modern, v22-aligned code.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works: The MCP Server + Skills Stack
&lt;/h3&gt;

&lt;p&gt;The Angular CLI MCP server exposes tools that launch an interactive AI-powered Angular tutor, find authoritative best-practice code examples, retrieve the Angular Best Practices Guide, and list applications and libraries in the workspace by reading angular.json, and search the official documentation at angular.dev.&lt;/p&gt;

&lt;p&gt;Configure it in your IDE or agent environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The angular-developer skill generates Angular code and provides architectural guidance, triggering when creating projects, components, or services or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling, testing, or CLI tooling.&lt;/p&gt;

&lt;p&gt;When an agent scaffolds a new component, instead of reaching for outdated Angular 15 patterns, the &lt;code&gt;angular-developer&lt;/code&gt; skill injects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal-first reactivity&lt;/strong&gt;: &lt;code&gt;input()&lt;/code&gt; and &lt;code&gt;output()&lt;/code&gt; instead of &lt;code&gt;@Input()&lt;/code&gt; and &lt;code&gt;@Output()&lt;/code&gt; decorators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnPush by default&lt;/strong&gt;: Change detection set to &lt;code&gt;ChangeDetectionStrategy.OnPush&lt;/code&gt; from the start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standalone components&lt;/strong&gt;: No &lt;code&gt;NgModule&lt;/code&gt; boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-safe forms&lt;/strong&gt;: Signal Forms for reactive, typed form handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-world example from the Angular logistics-manager-app codelab: agents can implement AI-powered fleet chat by updating FleetService to include a queryFleet(prompt) method, using the gemini-sdk skill to send the current units() state to Gemini and filter data based on the user's input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing the Hallucination Loop: MCP + Chrome DevTools for Agents
&lt;/h3&gt;

&lt;p&gt;The real power unlocks when you chain Angular MCP with Chrome DevTools for Agents, which allows agents to navigate websites, interact with buttons, explore pages, and run instant accessibility audits through a fully managed browser instance.&lt;/p&gt;

&lt;p&gt;The workflow becomes deterministic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent writes code&lt;/strong&gt; using the &lt;code&gt;angular-developer&lt;/code&gt; skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP triggers &lt;code&gt;dev_server.wait_for_build&lt;/code&gt;&lt;/strong&gt; — the agent blocks until compilation succeeds or fails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent spawns the dev server&lt;/strong&gt; using &lt;code&gt;dev_server.start&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome DevTools for Agents takes a screenshot&lt;/strong&gt; to visually verify DOM changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent reads the rendered output&lt;/strong&gt; and fixes errors if needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This closes the hallucination loop entirely. No more "I'll assume that worked" — the agent has eyes on your running application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Resilience with @boundary
&lt;/h2&gt;

&lt;p&gt;In complex UI engineering—especially when mixing DOM layouts with heavy WebGL or custom animation loops—a single component failure can crash the entire change detection cycle, resulting in a blank screen.&lt;/p&gt;

&lt;p&gt;To solve this, Angular is introducing &lt;strong&gt;@boundary&lt;/strong&gt; (landing in Developer Preview in Q3 2026).&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@boundary&lt;/code&gt; block introduces native error boundaries directly into the template compilation. If an isolated widget or complex directive throws a fatal error, &lt;code&gt;@boundary&lt;/code&gt; traps it, preventing the crash from bubbling up and halting the rest of the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error Isolation and Fallback Patterns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@boundary {
  &lt;span class="nt"&gt;&amp;lt;heavy-webgl-scene-renderer&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
} @catch (error) {
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error-fallback"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Scene unavailable&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ error.message }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"retryBoundary()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reload scene&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike try-catch in component logic, &lt;code&gt;@boundary&lt;/code&gt; operates at the &lt;strong&gt;template compilation level&lt;/strong&gt;. The boundary knows about the component tree and can isolate errors without unwinding the entire change detection cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retry Logic Without State Reload
&lt;/h3&gt;

&lt;p&gt;The architecture enables intentional retry logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashboardComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;sceneError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;retryBoundary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Retry logic — the boundary re-renders, re-executes the component&lt;/span&gt;
    &lt;span class="c1"&gt;// but preserves the outer application state&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sceneError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In traditional Angular, a critical error in one component forces a full page reload. With &lt;code&gt;@boundary&lt;/code&gt;, you contain the failure. The fleet dashboard can crash, but the user can still see the service queue and vehicle list. Error containment becomes a first-class concern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Level Boundaries for Granular Control
&lt;/h3&gt;

&lt;p&gt;You can nest &lt;code&gt;@boundary&lt;/code&gt; blocks for layered error handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@boundary {
  &lt;span class="nt"&gt;&amp;lt;telemetry-dashboard&amp;gt;&lt;/span&gt;
    @boundary {
      &lt;span class="nt"&gt;&amp;lt;ai-predictive-diagnostics&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    } @catch {
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Diagnostics unavailable&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    }
  &lt;span class="nt"&gt;&amp;lt;/telemetry-dashboard&amp;gt;&lt;/span&gt;
} @catch {
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Dashboard offline&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The inner boundary catches errors from the diagnostics component; the outer boundary catches errors from the entire dashboard. This mirrors real-world failure domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Dive: Advanced Control Flow Mechanics in &lt;code&gt;@switch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The evolution of Angular's control flow syntax isn't just about cleaner aesthetics — it's about moving runtime liabilities into compile-time guarantees. The updates to the &lt;code&gt;@switch&lt;/code&gt; block address two classic pain points in template architecture: redundant boilerplate via multiple case matching and structural desynchronization via exhaustive type checking.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Multiple Case Matching (Boilerplate Reduction)
&lt;/h3&gt;

&lt;p&gt;In traditional templates, if multiple states shared identical UI representation, you were forced to duplicate template blocks or nest conditional elements. Angular now allows comma-separated matching values within a single &lt;code&gt;@case&lt;/code&gt; block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@switch (orderStatus()) {
  @case ('pending', 'processing') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is being prepared.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('shipped') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is on the way.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('delivered') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Order complete.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The template compiler groups these branches efficiently without generating redundant view nodes. Instead of maintaining two separate case blocks with identical markup, a single case handles multiple states. This is especially powerful when dealing with isomorphic state enums where the user-facing representation is identical across several backend statuses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Exhaustive Checking via the &lt;code&gt;never&lt;/code&gt; Type
&lt;/h3&gt;

&lt;p&gt;The most critical architectural upgrade is compile-time exhaustiveness enforcement. When dealing with strict TypeScript union types (e.g., &lt;code&gt;type Status = 'open' | 'closed' | 'archived'&lt;/code&gt;), a common source of production bugs occurs when a backend team introduces a new status — but the frontend template is never updated. The UI silently fails or shows a blank state.&lt;/p&gt;

&lt;p&gt;By combining template variable evaluation with an exhaustive default assignment using the &lt;code&gt;never&lt;/code&gt; type boundary assertion, the Angular compiler can enforce that every branch of a union type is explicitly handled. If a new member is added to the union, the build breaks immediately until that state is handled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Component TypeScript&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OrderStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;processing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delivered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;orderStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OrderStatus&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// This forces exhaustive checking — TypeScript won't compile without all cases&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;assertNever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Unhandled status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Template with exhaustive guarantee --&amp;gt;&lt;/span&gt;
@switch (orderStatus()) {
  @case ('pending') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Waiting to be processed.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('processing') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is being prepared.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('shipped') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is on the way.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('delivered') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Order complete.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @default {
    {{ assertNever(orderStatus() as never) }}
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a backend engineer adds a sixth status (&lt;code&gt;'returned'&lt;/code&gt;) without notifying the frontend, TypeScript compilation fails immediately. This shifts the burden of type safety from runtime testing to the development build process — exactly where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inline Template Functions: Reducing Class Boilerplate
&lt;/h2&gt;

&lt;p&gt;In v22, you can now safely inline short, quick arrow functions directly within template event bindings without bloating your TypeScript class. This is more than cosmetic—it's a statement about where logic belongs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pattern: Event Handlers and Transforms
&lt;/h3&gt;

&lt;p&gt;Instead of exposing every handler as a class method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: pollutes the component API&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;([...]);&lt;/span&gt;

  &lt;span class="nf"&gt;onAddItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;onRemoveItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now inline these directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- v22: inline arrow functions in templates --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; [...items, newItem()])"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; items.filter(i =&amp;gt; i.id !== id))"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Remove&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The component surface shrinks—only the true public API remains visible. Transient handlers stay in the template, where they logically belong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template Errors and Type Inference
&lt;/h3&gt;

&lt;p&gt;The template compiler now provides rich type feedback for inline expressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- TypeScript error: items.update expects an updater function --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update('invalid')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Wrong&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ✓ Correct: full type checking on the inline arrow function parameter --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; items.slice(0, items.length - 1))"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Remove last
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is critical for agent-assisted development. When the &lt;code&gt;angular-developer&lt;/code&gt; skill writes template code, the compiler catches type mismatches immediately, preventing hallucinations from reaching production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Example: Form Field Transforms
&lt;/h3&gt;

&lt;p&gt;From the logistics-manager-app codelab, when a user describes an issue like "The vehicle is emitting smoke and the engine has stopped," the AI should automatically set the priority to CRITICAL by adding a listener to the issue field in the &lt;strong&gt;serviceForm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With inline template functions, you can implement this compactly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
  &lt;span class="na"&gt;(blur)=&lt;/span&gt;&lt;span class="s"&gt;"priorityField.setValue(
    analyzePriority(issueField.value)
  )"&lt;/span&gt;
  &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Describe the issue..."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The handler stays close to its trigger, making the intent transparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Reactivity Refinements
&lt;/h2&gt;

&lt;p&gt;Beyond agents, error boundaries, and control flow mechanics, Angular is sharpening the broader developer experience:&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal Forms: Fine-Grained Reactivity for Complex Forms
&lt;/h3&gt;

&lt;p&gt;Moving out of Developer Preview in v22, Signal Forms combines the strict typing of reactive forms with the granular reactivity of Signals. A form with 50 fields now updates only the field that changed—not the entire form tree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ServiceTicketForm&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;issueDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;assignedTechnician&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Signal-based access with fine-grained tracking&lt;/span&gt;
  &lt;span class="nx"&gt;priority$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priority&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valueAsSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Only the priority display updates when priority changes&lt;/span&gt;
  &lt;span class="nx"&gt;priorityStyles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Angular Aria: Accessible UI Primitives
&lt;/h3&gt;

&lt;p&gt;Alongside Signal Forms, Angular Aria (the headless, fully accessible UI directive set) also hits stable, allowing you to build heavily customized, high-contrast UI components without sacrificing native accessibility standards.&lt;/p&gt;

&lt;p&gt;This is crucial for AI-assisted development. When the &lt;code&gt;angular-developer&lt;/code&gt; skill scaffolds a custom dropdown or modal, it automatically includes the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard navigation (arrow keys, enter, escape)&lt;/li&gt;
&lt;li&gt;ARIA roles and live regions&lt;/li&gt;
&lt;li&gt;Focus management&lt;/li&gt;
&lt;li&gt;Screen reader announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No agent hallucinations about accessibility—it's baked in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vitest as Default
&lt;/h3&gt;

&lt;p&gt;The Angular CLI now scaffolds all new projects with Vitest as the default test runner, replacing Karma for dramatically faster, more modern testing cycles. Tests run in milliseconds instead of seconds, making the agent feedback loop nearly instant.&lt;/p&gt;

&lt;h3&gt;
  
  
  OnPush as Default Change Detection
&lt;/h3&gt;

&lt;p&gt;New components use &lt;code&gt;ChangeDetectionStrategy.OnPush&lt;/code&gt; by default, encouraging signal-based reactivity over Zone.js-triggered checks from project inception. This trains both developers and agents to think in terms of granular, trackable state changes rather than global change detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Skills: Teaching Agents Modern Patterns
&lt;/h2&gt;

&lt;p&gt;Angular Skills are designed to help coding agents create applications aligned with the latest versions of Angular, best practices, and new features and manage Angular applications effectively. These skills provide architectural guidance, generate idiomatic Angular code, and help scaffold new projects using modern best practices.&lt;/p&gt;

&lt;p&gt;Two key skills ship with v22:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;angular-developer&lt;/code&gt;&lt;/strong&gt;: Generates code for components, services, state management, forms, routing, SSR, and more. Always references the correct Angular version before providing guidance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;angular-new-app&lt;/code&gt;&lt;/strong&gt;: Creates a new Angular app using the Angular CLI, providing important guidelines for effectively setting up and structuring a modern Angular application, with flags like --ai-config=[agents, claude, copilot, cursor, gemini, jetbrains, none, windsurf] to tune the generated code for the specific agent's conventions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Skills and MCP tools are complementary—don't confuse them. One MCP server per domain (don't load everything at once); version your skills like code (a skill for Angular 19 patterns will actively hurt you on Angular 21); use skills to write MCP guardrails (e.g., "Before running ng update, always create a git branch first"); and measure your context budget (if over 30% of your context window is on tool definitions, you have a configuration problem).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consolidation Release
&lt;/h2&gt;

&lt;p&gt;Angular is no longer just catching up in the reactivity space; by natively integrating MCP and Angular Skills, hardening its template error boundaries with &lt;code&gt;@boundary&lt;/code&gt;, automating exhaustive type checking in control flow, and enabling inline template functions, it is actively defining what a modern, agent-ready frontend architecture looks like.&lt;/p&gt;

&lt;p&gt;v22 is the signal-first era made concrete. The framework's multi-year modernization effort converges into a coherent, production-ready, agentic-native development model where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents write type-safe templates&lt;/strong&gt; that compile or fail, never silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error boundaries isolate failures&lt;/strong&gt; instead of crashing the entire app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control flow is exhaustive&lt;/strong&gt; by default, not a runtime surprise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers close the hallucination loop&lt;/strong&gt; with real browser visibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills teach agents modern patterns&lt;/strong&gt; tailored to your version and conventions.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's new in Angular - Chrome for Developers (Google I/O 2026)&lt;/li&gt;
&lt;li&gt;Angular Skills Repository: &lt;a href="https://github.com/angular/skills" rel="noopener noreferrer"&gt;https://github.com/angular/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Logistics Manager App Codelab: &lt;a href="https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md" rel="noopener noreferrer"&gt;https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP Skills vs MCP Tools: The Right Way to Configure Your Server (Antonio Cárdenas, yeou.dev)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 15:19:49 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-ehm</link>
      <guid>https://dev.to/antoniocardenas/-ehm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" class="crayons-story__hidden-navigation-link"&gt;Antigravity ha muerto, larga vida a Antigravity.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angularfirebase"&gt;
            &lt;img alt="Angular Firebase logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F821%2Fd43c326b-2812-4d5d-a7e0-f13d3a9567d7.png" class="crayons-logo__image" width="768" height="768"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" alt="antoniocardenas profile" class="crayons-avatar__image" width="625" height="625"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
              
              &lt;div id="story-author-preview-content-3704933" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antoniocardenas" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" class="crayons-avatar__image" alt="" width="625" height="625"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angularfirebase" class="crayons-story__secondary fw-medium"&gt;Angular Firebase&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" id="article-link-3704933"&gt;
          Antigravity ha muerto, larga vida a Antigravity.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/antigravity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;antigravity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spanish"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spanish&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 15:14:44 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-3hhb</link>
      <guid>https://dev.to/antoniocardenas/-3hhb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" class="crayons-story__hidden-navigation-link"&gt;Antigravity is Dead. Long Live Antigravity.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/turingsoracle"&gt;
            &lt;img alt="Turing's Oracle logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9347%2F7a287c81-6a1d-486c-9c09-5d4d5640ad06.png" class="crayons-logo__image" width="176" height="176"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" alt="antoniocardenas profile" class="crayons-avatar__image" width="625" height="625"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
              
              &lt;div id="story-author-preview-content-3704613" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antoniocardenas" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" class="crayons-avatar__image" alt="" width="625" height="625"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/turingsoracle" class="crayons-story__secondary fw-medium"&gt;Turing's Oracle&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" id="article-link-3704613"&gt;
          Antigravity is Dead. Long Live Antigravity.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/antigravity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;antigravity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;9&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Antigravity ha muerto, larga vida a Antigravity.</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 01:16:49 +0000</pubDate>
      <link>https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5</link>
      <guid>https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5</guid>
      <description>&lt;p&gt;Google acaba de lanzar &lt;strong&gt;Antigravity 2.0&lt;/strong&gt; en I/O 2026 — y en el mismo aliento, mató a Gemini CLI, dejó tirado un montón de historiales de chat en un directorio de respaldo, y lanzó tres nuevas superficies compartiendo la misma marca. Si abriste la app esta mañana y entraste en pánico porque tus conversaciones desaparecieron: sigue leyendo. Lo arreglamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó en I/O 2026
&lt;/h2&gt;

&lt;p&gt;El 18 de mayo de 2026, Google rebautizó Antigravity de "competidor de Cursor" a una &lt;strong&gt;plataforma de desarrollo agent-first&lt;/strong&gt; completa, impulsada por Gemini 3.5 Flash. La marca ahora abarca cuatro productos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity 2.0&lt;/strong&gt; — la nueva app de escritorio independiente con orquestación multiagente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity CLI&lt;/strong&gt; — herramienta de terminal escrita en Go que reemplaza a Gemini CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity SDK&lt;/strong&gt; — acceso programático al mismo &lt;em&gt;agent harness&lt;/em&gt; que Google usa internamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity IDE&lt;/strong&gt; — la app original estilo VS Code de noviembre de 2025, todavía viva
Y aquí está la fecha que no puedes ignorar: &lt;strong&gt;Gemini CLI se apaga el 18 de junio de 2026&lt;/strong&gt; para usuarios de AI Pro, AI Ultra y la capa gratuita. Las empresas con Gemini Code Assist Standard o Enterprise mantienen el acceso — el resto tiene 30 días para migrar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Las cuatro caras de Antigravity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Antigravity 2.0 (App de escritorio)
&lt;/h3&gt;

&lt;p&gt;El producto estrella. Corre múltiples agentes en paralelo, incluye subagentes dinámicos para flujos paralelizados, programa tareas en segundo plano y se integra nativamente con AI Studio, Firebase y Android. Exportas un proyecto desde AI Studio en tu teléfono, lo abres en local, con el contexto completo intacto. También trae soporte de comandos por voz — puedes hablarle a tus agentes en lugar de escribir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antigravity CLI
&lt;/h3&gt;

&lt;p&gt;Reconstruida desde cero en Go. El mismo &lt;em&gt;agent harness&lt;/em&gt; que el desktop, nativa para terminal, notablemente más rápida que su predecesora. Si vives en Gemini CLI hoy, este es tu destino de migración — y tienes hasta el &lt;strong&gt;18 de junio&lt;/strong&gt; para cambiar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica tu instalación tras migrar&lt;/span&gt;
antigravity &lt;span class="nt"&gt;--version&lt;/span&gt;
antigravity agent new &lt;span class="s2"&gt;"refactoriza el módulo de auth"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Antigravity SDK
&lt;/h3&gt;

&lt;p&gt;Para construir agentes personalizados sobre la infraestructura de coding de Google, optimizados para los modelos Gemini. Tú defines los comportamientos, tú hospedas donde quieras — Google Cloud, tu propia infraestructura, lo que mejor encaje. Las plantillas de agentes personalizados están disponibles en AI Studio para casos de uso empresariales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antigravity IDE (el original)
&lt;/h3&gt;

&lt;p&gt;Sigue mantenido. Sigue siendo el fork de VS Code de noviembre de 2025. Este es con el que la mayoría nos enganchamos — y es el que tiene la trampa de migración (más abajo).&lt;/p&gt;

&lt;h2&gt;
  
  
  El dolor inmediato: tu historial está en el directorio equivocado
&lt;/h2&gt;

&lt;p&gt;Si actualizaste a 2.0 y tus conversaciones desaparecieron, &lt;strong&gt;tu data no se perdió — la migración la dejó tirada en una carpeta de respaldo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antigravity 2.0 usa tres directorios bajo &lt;code&gt;~/.gemini/&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directorio&lt;/th&gt;
&lt;th&gt;Dueño&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data activa de la app standalone 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data activa del IDE original&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Snapshot que creó la migración — frecuentemente más completo que el directorio activo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tras la actualización, el directorio &lt;code&gt;antigravity/&lt;/code&gt; de la app standalone termina frecuentemente sin entradas de &lt;em&gt;brain&lt;/em&gt;, &lt;em&gt;scratch space&lt;/em&gt; ni archivos de conversación. El &lt;code&gt;antigravity-backup/&lt;/code&gt; al lado tiene el set completo. Solo necesitamos poner el correcto delante de la app.&lt;/p&gt;

&lt;h3&gt;
  
  
  La solución: rsync desde el backup al directorio activo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;macOS / Linux&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dry-run primero — mira exactamente qué cambiaría&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avhn&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'mcp_config.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity-backup/ &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity/

&lt;span class="c"&gt;# ¿Se ve bien? Ejecútalo de verdad (quita el flag -n)&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avh&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'mcp_config.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity-backup/ &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Por qué excluir &lt;code&gt;mcp_config.json&lt;/code&gt;? Normalmente es un symlink que apunta a tu configuración local del servidor MCP — si lo sobrescribes, rompes tus conexiones MCP activas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (PowerShell)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="s2"&gt;\.gemini\antigravity-backup"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="s2"&gt;\.gemini\antigravity"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Espejo con robocopy, excluyendo mcp_config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;robocopy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/E&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/XF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mcp_config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de correrlo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cierra completamente&lt;/strong&gt; Antigravity — mata el proceso, no solo cierres la ventana.&lt;/li&gt;
&lt;li&gt;Reabre la app.&lt;/li&gt;
&lt;li&gt;Verifica que el panel lateral ahora muestre tus threads.
Si algo se ve raro, tu &lt;code&gt;antigravity-backup/&lt;/code&gt; está intacto — puedes volver a correr el sync o copiar archivos específicos a mano. Para mayor tranquilidad, haz un snapshot de &lt;code&gt;antigravity-backup/&lt;/code&gt; en un lugar externo antes de empezar a tocarlo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cómo instalar solo el IDE (saltarte 2.0)
&lt;/h2&gt;

&lt;p&gt;La buena noticia: &lt;strong&gt;el IDE y la app standalone 2.0 guardan su data en directorios separados&lt;/strong&gt; (&lt;code&gt;antigravity-ide/&lt;/code&gt; vs &lt;code&gt;antigravity/&lt;/code&gt;), así que tu historial del IDE no queda destrozado cuando 2.0 se instala al lado.&lt;/p&gt;

&lt;p&gt;La mala noticia: &lt;strong&gt;los instaladores chocan a nivel del sistema operativo.&lt;/strong&gt; Instala ambos y el binario del IDE se niega a arrancar — las dependencias están acopladas. Desinstalar 2.0 tampoco sana al IDE; tienes que reinstalar el IDE limpio, lo cual borra tus ajustes locales.&lt;/p&gt;

&lt;p&gt;Si quieres quedarte solo con el IDE:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desinstala Antigravity 2.0 por completo&lt;/strong&gt; si ya lo instalaste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Haz backup&lt;/strong&gt; de &lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt; antes de tocar nada más.&lt;/li&gt;
&lt;li&gt;Descarga el instalador del IDE desde la página de releases: &lt;a href="https://antigravity.google/releases" rel="noopener noreferrer"&gt;antigravity.google/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Escoge una versión anterior al split de 2.0 — &lt;strong&gt;1.23.2&lt;/strong&gt; es el punto de aterrizaje más seguro.&lt;/li&gt;
&lt;li&gt;En Ajustes, pon las actualizaciones en manual para que la app no salte silenciosamente a 2.0.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// settings.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"update.mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manual"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checklist de migración
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Migra tus workflows de Gemini CLI a Antigravity CLI &lt;strong&gt;antes del 18 de junio de 2026&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Elige uno: 2.0 desktop &lt;em&gt;o&lt;/em&gt; el IDE original — nunca instales ambos&lt;/li&gt;
&lt;li&gt;[ ] Haz backup de &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; y &lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt; semanalmente.&lt;/li&gt;
&lt;li&gt;[ ] Si tu historial desapareció tras la actualización, &lt;code&gt;rsync&lt;/code&gt; desde &lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt; (excluyendo &lt;code&gt;mcp_config.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Pon &lt;code&gt;update.mode&lt;/code&gt; en &lt;code&gt;manual&lt;/code&gt; si dependes del IDE&lt;/li&gt;
&lt;li&gt;[ ] Evalúa la nueva capa AI Ultra de $100 si corres cargas multi-agente (5× los límites del Pro)
## TL;DR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity 2.0 + CLI + SDK llegaron en I/O 2026. Gemini CLI muere el 18 de junio de 2026. ¿Perdiste tu historial de chat? Tu data está en &lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt; — haz &lt;code&gt;rsync&lt;/code&gt; hacia &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; (excluyendo &lt;code&gt;mcp_config.json&lt;/code&gt;) y reinicia la app. ¿Quieres solo el IDE viejo? Desinstala 2.0, instala 1.23.2 desde la página de releases, pon las actualizaciones en manual. Elige uno — no corras 2.0 y el IDE al mismo tiempo.&lt;/p&gt;

&lt;p&gt;El rey ha muerto. Larga vida al rey. Migra con cuidado.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>gemini</category>
      <category>antigravity</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Antigravity is Dead. Long Live Antigravity.</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 00:14:21 +0000</pubDate>
      <link>https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m</link>
      <guid>https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m</guid>
      <description>&lt;p&gt;Google just dropped &lt;strong&gt;Antigravity 2.0&lt;/strong&gt; at I/O 2026—and in the same breath, it killed Gemini CLI, stranded a lot of chat histories in a backup directory, and shipped three new surfaces sharing the same brand. If you opened the app this morning and panicked because your conversations are gone, keep reading. We'll fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What just happened at I/O 2026
&lt;/h2&gt;

&lt;p&gt;On May 18, 2026, Google rebranded Antigravity from a "cursor competitor" into a full &lt;strong&gt;agent-first development platform&lt;/strong&gt; powered by Gemini 3.5 Flash. The brand now spans four products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity 2.0&lt;/strong&gt; — the new standalone desktop app with multi-agent orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity CLI&lt;/strong&gt; — a Go-based terminal tool replacing Gemini CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity SDK&lt;/strong&gt; — programmatic access to the same agent harness Google uses internally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity IDE&lt;/strong&gt; — the original VS Code-style app from November 2025, still alive
And here's the deadline you can't ignore: &lt;strong&gt;Gemini CLI sunsets on June 18, 2026&lt;/strong&gt; for AI Pro, AI Ultra, and free-tier users. Enterprise on Gemini Code Assist Standard or Enterprise keeps access — everyone else has 30 days to migrate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Four Faces of Antigravity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Antigravity 2.0 (Desktop App)
&lt;/h3&gt;

&lt;p&gt;The flagship. Runs multiple agents in parallel, ships dynamic subagents for parallelized workflows, schedules tasks in the background, and integrates natively with AI Studio, Firebase, and Android. Export a project from AI Studio on your phone and open it locally, full context intact. Voice command support is in too — you can talk to your agents instead of typing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antigravity CLI
&lt;/h3&gt;

&lt;p&gt;Rebuilt from scratch in Go. Same agent harness as the desktop, terminal-native, and noticeably faster than its predecessor. If you live in Gemini CLI today, this is your migration target — and you have until &lt;strong&gt;June 18&lt;/strong&gt; to switch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify your install once you migrate&lt;/span&gt;
antigravity &lt;span class="nt"&gt;--version&lt;/span&gt;
antigravity agent new &lt;span class="s2"&gt;"refactor the auth module"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Antigravity SDK
&lt;/h3&gt;

&lt;p&gt;For building custom agents on top of Google's coding infrastructure, optimized for Gemini models. You define the behaviors; you host wherever it fits — Google Cloud, your own infra, your choice. Custom agent templates are available in AI Studio for enterprise use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antigravity IDE (the original)
&lt;/h3&gt;

&lt;p&gt;Still maintained. Still the VS Code fork from November 2025. This is the one most of us got hooked on — and it's the one with the migration trap (more on that below).&lt;/p&gt;

&lt;h2&gt;
  
  
  The immediate pain: your chat history is in the wrong directory
&lt;/h2&gt;

&lt;p&gt;If you updated to 2.0 and your conversations are gone, &lt;strong&gt;your data is not lost — the migration stranded it in a backup folder.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antigravity 2.0 uses three directories under &lt;code&gt;~/.gemini/&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directory&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live data for the standalone 2.0 app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live data for the original IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Snapshot the migration created — often more complete than the live dir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After the update, the standalone app's &lt;code&gt;antigravity/&lt;/code&gt; dir frequently ends up missing brain entries, scratch space, and conversation files. The &lt;code&gt;antigravity-backup/&lt;/code&gt; next to it has the full set. We just need to put the right one in front of the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fix: rsync from backup into the live dir
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;macOS / Linux&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dry-run first — see exactly what would change&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avhn&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'mcp_config.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity-backup/ &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity/

&lt;span class="c"&gt;# Looks right? Run it for real (drop the -n flag)&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avh&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'mcp_config.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity-backup/ &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.gemini/antigravity/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why exclude &lt;code&gt;mcp_config.json&lt;/code&gt;? It's usually a symlink pointing at your local MCP server configuration — overwrite it and you break your active MCP connections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (PowerShell)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="s2"&gt;\.gemini\antigravity-backup"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="s2"&gt;\.gemini\antigravity"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Robocopy mirror, excluding mcp_config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;robocopy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/E&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/XF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mcp_config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fully quit&lt;/strong&gt; Antigravity — kill the process, don't just close the window.&lt;/li&gt;
&lt;li&gt;Reopen the app.&lt;/li&gt;
&lt;li&gt;Verify the side panel now shows your threads.
If anything looks off, your &lt;code&gt;antigravity-backup/&lt;/code&gt; is untouched — you can re-run the sync or copy specific files manually. For peace of mind, snapshot &lt;code&gt;antigravity-backup/&lt;/code&gt; to an external location before you start poking at it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to install just the IDE (skip 2.0)
&lt;/h2&gt;

&lt;p&gt;The good news: &lt;strong&gt;the IDE and the standalone 2.0 app keep their data in separate directories&lt;/strong&gt; (&lt;code&gt;antigravity-ide/&lt;/code&gt; vs &lt;code&gt;antigravity/&lt;/code&gt;), so your IDE history doesn't get clobbered when 2.0 installs alongside it.&lt;/p&gt;

&lt;p&gt;The bad news: &lt;strong&gt;the installers conflict at the OS level.&lt;/strong&gt; Install both and the IDE binary refuses to launch — dependencies are coupled. Uninstalling 2.0 doesn't fully heal the IDE either; you have to reinstall the IDE cleanly, which wipes your IDE settings.&lt;/p&gt;

&lt;p&gt;If you want to stay on the IDE only:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uninstall Antigravity 2.0 completely&lt;/strong&gt; if you already installed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back up&lt;/strong&gt; &lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt; before touching anything else.&lt;/li&gt;
&lt;li&gt;Grab the IDE installer from the releases page: &lt;a href="https://antigravity.google/releases" rel="noopener noreferrer"&gt;antigravity.google/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pick a version that predates the 2.0 split — &lt;strong&gt;1.23.2&lt;/strong&gt; is the safest landing pad.&lt;/li&gt;
&lt;li&gt;In Settings, switch updates to manual so the app doesn't silently jump back to 2.0.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// settings.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"update.mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manual"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migration checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Migrate Gemini CLI workflows to Antigravity CLI &lt;strong&gt;before June 18, 2026&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Pick one: 2.0 desktop &lt;em&gt;or&lt;/em&gt; the original IDE — never install both&lt;/li&gt;
&lt;li&gt;[ ] Back up &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; and &lt;code&gt;~/.gemini/antigravity-ide&lt;/code&gt; weekly&lt;/li&gt;
&lt;li&gt;[ ] If history disappeared post-update, &lt;code&gt;rsync&lt;/code&gt; from &lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt; (exclude &lt;code&gt;mcp_config.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Set &lt;code&gt;update.mode&lt;/code&gt; to &lt;code&gt;manual&lt;/code&gt; if you depend on the IDE&lt;/li&gt;
&lt;li&gt;[ ] Evaluate the new $100 AI Ultra tier if you run multi-agent workloads (5× the Pro limits)
## TL;DR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity 2.0 + CLI + SDK shipped at I/O 2026. Gemini CLI dies June 18, 2026. Lost your chat history? Your data is sitting in &lt;code&gt;~/.gemini/antigravity-backup&lt;/code&gt; — &lt;code&gt;rsync&lt;/code&gt; it into &lt;code&gt;~/.gemini/antigravity&lt;/code&gt; (excluding &lt;code&gt;mcp_config.json&lt;/code&gt;), restart the app. Want the old IDE only? Uninstall 2.0, install 1.23.2 from the releases page, set updates to manual. Pick one — don't run 2.0 and the IDE side by side.&lt;/p&gt;

&lt;p&gt;The king is dead. Long live the king. Migrate carefully.&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>gemini</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:42:13 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-42e5</link>
      <guid>https://dev.to/antoniocardenas/-42e5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angular/whats-new-in-taiga-ui-v5-a-modern-angular-ui-kit-7lm" class="crayons-story__hidden-navigation-link"&gt;What's New in Taiga UI v5: A Modern Angular UI Kit&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angular"&gt;
            &lt;img alt="Angular logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F802%2F39aa2792-6183-496a-8513-1a38c76dbfb6.png" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/nsbarsukov" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F857015%2F62fc9803-5d13-4219-8601-661ca0ee3241.jpg" alt="nsbarsukov profile" class="crayons-avatar__image" width="800" height="1066"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/nsbarsukov" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Barsukov Nikita
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Barsukov Nikita
                
              
              &lt;div id="story-author-preview-content-3448416" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/nsbarsukov" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F857015%2F62fc9803-5d13-4219-8601-661ca0ee3241.jpg" class="crayons-avatar__image" alt="" width="800" height="1066"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Barsukov Nikita&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angular" class="crayons-story__secondary fw-medium"&gt;Angular&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angular/whats-new-in-taiga-ui-v5-a-modern-angular-ui-kit-7lm" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/angular/whats-new-in-taiga-ui-v5-a-modern-angular-ui-kit-7lm" id="article-link-3448416"&gt;
          What's New in Taiga UI v5: A Modern Angular UI Kit
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/angular/whats-new-in-taiga-ui-v5-a-modern-angular-ui-kit-7lm" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angular/whats-new-in-taiga-ui-v5-a-modern-angular-ui-kit-7lm#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            13 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 25 Mar 2026 23:50:01 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-5dcp</link>
      <guid>https://dev.to/antoniocardenas/-5dcp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dezkareid/sincronizando-mi-agentsmd-4e0c" class="crayons-story__hidden-navigation-link"&gt;Sincronizando mi AGENTS.md&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/dezkareid" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461615%2Fb7e9c050-6fa6-4365-b06a-48ceb6c71ea3.jpg" alt="dezkareid profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dezkareid" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Joel Humberto Gómez Paredes
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Joel Humberto Gómez Paredes
                
              
              &lt;div id="story-author-preview-content-3249844" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dezkareid" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461615%2Fb7e9c050-6fa6-4365-b06a-48ceb6c71ea3.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Joel Humberto Gómez Paredes&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/dezkareid/sincronizando-mi-agentsmd-4e0c" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dezkareid/sincronizando-mi-agentsmd-4e0c" id="article-link-3249844"&gt;
          Sincronizando mi AGENTS.md
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dezkareid/sincronizando-mi-agentsmd-4e0c" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dezkareid/sincronizando-mi-agentsmd-4e0c#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>javascript</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Mon, 23 Mar 2026 07:35:27 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-11m1</link>
      <guid>https://dev.to/antoniocardenas/-11m1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck" class="crayons-story__hidden-navigation-link"&gt;MCP Skills vs MCP Tools: La forma correcta de configurar MCP Server&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angularfirebase"&gt;
            &lt;img alt="Angular Firebase logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F821%2Fd43c326b-2812-4d5d-a7e0-f13d3a9567d7.png" class="crayons-logo__image" width="768" height="768"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" alt="antoniocardenas profile" class="crayons-avatar__image" width="625" height="625"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
              
              &lt;div id="story-author-preview-content-3383081" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antoniocardenas" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" class="crayons-avatar__image" alt="" width="625" height="625"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angularfirebase" class="crayons-story__secondary fw-medium"&gt;Angular Firebase&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck" id="article-link-3383081"&gt;
          MCP Skills vs MCP Tools: La forma correcta de configurar MCP Server
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spanish"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spanish&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>angular</category>
      <category>mcp</category>
      <category>spanish</category>
      <category>webdev</category>
    </item>
    <item>
      <title>MCP Skills vs MCP Tools: La forma correcta de configurar MCP Server</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sun, 22 Mar 2026 08:59:35 +0000</pubDate>
      <link>https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck</link>
      <guid>https://dev.to/angularfirebase/mcp-skills-vs-mcp-tools-la-forma-correcta-de-configurar-mcp-server-24ck</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Las skills y las herramientas MCP no son lo mismo — y confundirlos tiene un costo real. Aprende la diferencia, los problemas reales y cómo combinarlos para un flujo de trabajo agéntico que sí funcione.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Todo el mundo habla de MCP. Todo el mundo habla de skills.&lt;/p&gt;

&lt;p&gt;La mayoría los usa como sinónimos — y ese es exactamente el problema.&lt;/p&gt;

&lt;p&gt;No son lo mismo. No resuelven el mismo problema. Y si usas el incorrecto, lo vas a sentir: alucinaciones, contexto desbordado, agentes que pierden el hilo y flujos de trabajo que se rompen bajo presión.&lt;/p&gt;

&lt;p&gt;Vamos a resolverlo.&lt;/p&gt;




&lt;h2&gt;
  
  
  El modelo mental
&lt;/h2&gt;

&lt;p&gt;Piénsalo como una cocina.&lt;/p&gt;

&lt;p&gt;Las &lt;strong&gt;herramientas MCP&lt;/strong&gt; son tus electrodomésticos e ingredientes — el horno, el refrigerador, los vegetales frescos. Capacidad pura. Sin ellos, no se cocina nada.&lt;/p&gt;

&lt;p&gt;Los &lt;strong&gt;skills&lt;/strong&gt; son tus recetas — las instrucciones paso a paso que le dicen a un chef exactamente cómo convertir esos ingredientes en algo bueno. Sin ellas, tienes poder, pero sin dirección.&lt;/p&gt;

&lt;p&gt;Un agente con solo herramientas MCP &lt;em&gt;puede&lt;/em&gt; hacer cosas, pero no necesariamente sabe &lt;em&gt;cómo&lt;/em&gt; hacerlas bien. Un agente con solo skills tiene excelentes instrucciones, pero no puede actuar sobre ellas.&lt;/p&gt;

&lt;p&gt;Necesitas los dos.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es una herramienta MCP?
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;Model Context Protocol&lt;/strong&gt; es un estándar abierto — ahora bajo la Agentic AI Foundation de la Linux Foundation — que le da a los agentes de IA una forma estandarizada de conectarse a sistemas externos: bases de datos, APIs, sistemas de archivos, GitHub, Slack, tu Angular CLI.&lt;/p&gt;

&lt;p&gt;Cuando conectas un servidor MCP a tu cliente —ya sea Claude Code, la CLI de Gemini o un agente personalizado—, este accede a un conjunto de &lt;strong&gt;herramientas deterministas y tipadas&lt;/strong&gt;. Cada herramienta tiene un esquema claro de entrada y salida. Cuando el agente la llama, se ejecuta — sin interpretación, sin riesgo de alucinación a nivel de ejecución. Es una llamada de API estructurada, no una sugerencia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP es como el agente &lt;em&gt;alcanza fuera de sí mismo&lt;/em&gt;. Es el sistema nervioso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usa MCP cuando el agente necesite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leer o escribir en un sistema real (base de datos, sistema de archivos, API)&lt;/li&gt;
&lt;li&gt;Ejecutar acciones con entradas y salidas claras y auditables.&lt;/li&gt;
&lt;li&gt;Conectarse a herramientas que no controlas&lt;/li&gt;
&lt;li&gt;Integrar múltiples servicios a través de una interfaz consistente.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ¿Qué es un skill?
&lt;/h2&gt;

&lt;p&gt;Un &lt;strong&gt;skill&lt;/strong&gt; es una carpeta que contiene un archivo Markdown (con frontmatter YAML) más scripts y recursos opcionales. No es ejecutable por sí solo — es un playbook.&lt;/p&gt;

&lt;p&gt;Cuando la solicitud de un usuario coincide con los criterios de relevancia de un skill, el agente carga esas instrucciones dinámicamente y las sigue. Es como darle al agente memoria procedural de nivel experto, bajo demanda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-component-review&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Revisar componentes Angular para cumplimiento de Signals y arquitectura standalone&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Revisión de Componente Angular&lt;/span&gt;

Al revisar un componente Angular:
&lt;span class="p"&gt;1.&lt;/span&gt; Verificar que todo el estado use &lt;span class="sb"&gt;`signal()`&lt;/span&gt; o &lt;span class="sb"&gt;`computed()`&lt;/span&gt; — nunca mutación directa
&lt;span class="p"&gt;2.&lt;/span&gt; Confirmar que el componente es &lt;span class="sb"&gt;`standalone: true`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Asegurar que no queden dependencias de &lt;span class="sb"&gt;`NgModule`&lt;/span&gt;
&lt;span class="p"&gt;4.&lt;/span&gt; Validar que se use &lt;span class="sb"&gt;`@if`&lt;/span&gt; / &lt;span class="sb"&gt;`@for`&lt;/span&gt; en lugar de &lt;span class="sb"&gt;`*ngIf`&lt;/span&gt; / &lt;span class="sb"&gt;`*ngFor`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El agente lo carga solo cuando es relevante. Cuando no lo es — no te cuesta nada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usa un skill cuando el agente lo necesite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seguir un proceso o checklist consistente.&lt;/li&gt;
&lt;li&gt;Aplicar experiencia específica del dominio (tus estándares de código, criterios de revisión).&lt;/li&gt;
&lt;li&gt;Codificar conocimiento que no cambia frecuentemente.&lt;/li&gt;
&lt;li&gt;Reutilizar el mismo flujo de trabajo en distintas conversaciones.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Los desventajas reales
&lt;/h2&gt;

&lt;p&gt;Aquí es donde la mayoría de las guías se detienen. No deberían.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: El Impuesto de Tokens
&lt;/h3&gt;

&lt;p&gt;Cada herramienta MCP que conectas inyecta su esquema completo en la ventana de contexto &lt;em&gt;antes de que el agente procese un solo mensaje&lt;/em&gt;. Cada herramienta cuesta 550–1,400 tokens. Conecta GitHub, Slack y Sentry y estás mirando &lt;strong&gt;55,000 tokens quemados de entrada&lt;/strong&gt; — más de un cuarto del límite de 200k de Claude antes de hacer cualquier trabajo real.&lt;/p&gt;

&lt;p&gt;Un equipo reportó conectar tres servidores MCP y consumir &lt;strong&gt;143,000 de 200,000 tokens&lt;/strong&gt; solo en definiciones de herramientas. Al agente le quedaban 57,000 tokens para la conversación real.&lt;/p&gt;

&lt;p&gt;Y si usas Gemini con su ventana de contexto de 1M+ tokens, podrías pensar que puedes ignorar esto. No lo hagas. Incluso si te sobra espacio, inyectar 55,000 tokens de esquema JSON crudo en cada iteración de la conversación aumenta la latencia, incrementa los costos de la API y diluye el enfoque del modelo.&lt;/p&gt;

&lt;p&gt;La buena noticia: clientes modernos como Claude Code y la CLI de Gemini han adoptado el &lt;strong&gt;progressive discovery&lt;/strong&gt; para MCP — cargando solo nombres y descripciones de herramientas al inicio (~20–50 tokens cada una), y obteniendo los esquemas completos solo cuando el agente realmente necesita una herramienta. El overhead de tokens cayó ~85%. Pero esto solo funciona si tu configuración MCP está preparada para usarlo — y la mayoría todavía no lo está.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills: El Problema de la Desactualización
&lt;/h3&gt;

&lt;p&gt;Los skills son archivos Markdown. No se actualizan solos. Si tus patrones de Angular evolucionan — digamos que migraste de &lt;code&gt;setInput()&lt;/code&gt; a la nueva API declarativa en Angular 20 — tu Skill sigue enseñando la forma antigua hasta que alguien lo actualice manualmente.&lt;/p&gt;

&lt;p&gt;Cuantos más skills creas, mayor es la carga de mantenimiento. Y si un skill está sutilmente equivocado, el agente lo seguirá con confianza — sin error, solo output silenciosamente incorrecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ambos: El problema de selección
&lt;/h3&gt;

&lt;p&gt;Dale a un agente demasiadas herramientas o demasiados skills y empieza a tomar las decisiones equivocadas — llama a la herramienta incorrecta, activa el playbook equivocado, o los combina de formas que producen instrucciones contradictorias. Los expertos recomiendan no superar &lt;strong&gt;10–15 herramientas MCP activas&lt;/strong&gt; al mismo tiempo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cómo combinarlos
&lt;/h2&gt;

&lt;p&gt;El patrón más poderoso es usarlos como capas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capa 1 — MCP provee acceso.&lt;/strong&gt;&lt;br&gt;
Conecta solo lo que el agente genuinamente necesita para la tarea actual. Angular CLI, una base de datos, un sistema de archivos. Mantenlo simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capa 2 — Skills proveen experiencia.&lt;/strong&gt;&lt;br&gt;
Crea un Skill que le diga al agente &lt;em&gt;cómo&lt;/em&gt; usar esas herramientas en tu contexto específico. No solo "ejecuta el Angular CLI" — sino "al migrar un componente, ejecuta &lt;code&gt;ng generate&lt;/code&gt; con estos flags, luego valida contra estos patrones."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capa 3 — Skills pueden orquestar MCP.&lt;/strong&gt;&lt;br&gt;
Un skill puede definir un flujo de trabajo multipaso que llame a múltiples herramientas MCP en secuencia. Ejemplo: un skill de "Deploy &amp;amp; Notify" que usa el MCP de GitHub para hacer push, un MCP de CI/CD para lanzar el build, y un MCP de Slack para notificar al equipo — todo bajo un playbook coherente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-migration-workflow&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Flujo completo para migrar un componente Angular a patrones v21&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Flujo de Migración&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Usa el MCP del Angular CLI para verificar la versión actual del componente
&lt;span class="p"&gt;2.&lt;/span&gt; Ejecuta &lt;span class="sb"&gt;`ng update`&lt;/span&gt; para el paquete afectado
&lt;span class="p"&gt;3.&lt;/span&gt; Aplica el schematic de migración zoneless
&lt;span class="p"&gt;4.&lt;/span&gt; Revisa el output contra el Skill de angular-component-review
&lt;span class="p"&gt;5.&lt;/span&gt; Ejecuta los tests y reporta resultados
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Guía de Decisión Práctica
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situación&lt;/th&gt;
&lt;th&gt;Usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Necesito consultar una base de datos real&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito seguir un checklist de code review&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito hacer push a GitHub&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito aplicar el formato de commits de mi equipo&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito leer una API en vivo&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito enseñarle al agente mis reglas de arquitectura Angular&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Necesito acceso Y proceso consistente&lt;/td&gt;
&lt;td&gt;Ambos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mejorando el Flujo de Trabajo
&lt;/h2&gt;

&lt;p&gt;Algunos patrones que realmente funcionan en producción:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Un servidor MCP por dominio.&lt;/strong&gt; No cargues todo al mismo tiempo. Crea configuraciones separadas para "desarrollo Angular", "despliegue" y "comunicación" — y activa solo la que necesitas para cada sesión.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Versiona tus Skills como código.&lt;/strong&gt; Ponlos en tu repositorio. Revísalos cuando actualices tu stack. Un Skill para patrones de Angular 19 te va a perjudicar activamente en Angular 21.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Usa Skills para escribir guardrails de MCP.&lt;/strong&gt; En lugar de confiar en que el agente sepa cuándo llamar a una acción MCP destructiva, escribe un Skill que diga explícitamente: &lt;em&gt;"Antes de ejecutar cualquier &lt;code&gt;ng update&lt;/code&gt;, siempre crea un branch de git primero."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Mide tu presupuesto de contexto.&lt;/strong&gt; Antes de que el agente haga cualquier trabajo real, conoce cuántos tokens consume tu configuración MCP. Si superas el 30% de tu ventana de contexto solo en definiciones de herramientas, tienes un problema de configuración.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deja que el agente mantenga los Skills simples.&lt;/strong&gt; Para áreas de cambio rápido — como mantener actualizadas las convenciones de versión de Angular de tu equipo — deja que el agente actualice el archivo Skill cuando se lo indiques. Es más rápido que hacerlo manualmente y mantiene el Skill honesto.&lt;/p&gt;




&lt;h2&gt;
  
  
  La conclusión
&lt;/h2&gt;

&lt;p&gt;MCP les da a los agentes la capacidad de actuar. Los skills les enseñan cómo actuar bien.&lt;/p&gt;

&lt;p&gt;El debate de "MCP vs Skills" es falso. La pregunta real es: &lt;em&gt;¿necesitas acceso, experiencia, o ambos?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la mayoría de los flujos de trabajo reales con Angular, necesitas los dos. Un agente que puede ejecutar tu CLI, pero no conoce tu arquitectura, es solo una forma más rápida de cometer los mismos errores. Un agente que conoce tus patrones, pero no puede tocar tu proyecto real, es solo un buscador caro.&lt;/p&gt;

&lt;p&gt;Usados juntos, con límites claros y configuración lean, son la base del desarrollo agéntico que realmente funciona.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Anteriormente escribí sobre &lt;a href="https://www.yeou.dev/articulos/angular-21-mcp-migraciones" rel="noopener noreferrer"&gt;Angular 21, MCP y el fin de las migraciones manuales&lt;/a&gt; — un buen punto de partida si eres nuevo en la configuración del servidor MCP para Angular.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>mcp</category>
      <category>spanish</category>
      <category>webdev</category>
    </item>
    <item>
      <title>MCP Skills vs MCP Tools: The Right Way to Configure Your Server</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sun, 22 Mar 2026 08:40:00 +0000</pubDate>
      <link>https://dev.to/turingsoracle/mcp-skills-vs-mcp-tools-the-right-way-to-configure-your-server-562c</link>
      <guid>https://dev.to/turingsoracle/mcp-skills-vs-mcp-tools-the-right-way-to-configure-your-server-562c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Skills and MCP tools are not the same thing — and confusing them costs you. Learn the real difference, the real downsides, and how to combine both for a better agentic workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  MCP Skills vs MCP Tools: What's the Difference and How to Combine Them
&lt;/h1&gt;

&lt;p&gt;Everyone is talking about MCP. Everyone is talking about skills.&lt;/p&gt;

&lt;p&gt;Most people are using them interchangeably — and that's exactly the problem.&lt;/p&gt;

&lt;p&gt;They are not the same thing. They don't solve the same problem. And if you reach for the wrong one, you will feel it: hallucinations, context blowups, agents that drift off-task, and workflows that fall apart under pressure.&lt;/p&gt;

&lt;p&gt;Let's fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of it like a kitchen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP tools&lt;/strong&gt; are your appliances and ingredients — the oven, the fridge, the fresh vegetables. Raw capability. Without them, nothing gets cooked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; are your recipes — the step-by-step instructions that tell a skilled chef exactly how to turn those ingredients into something good. Without them, you have power with no direction.&lt;/p&gt;

&lt;p&gt;An agent with only MCP tools can &lt;em&gt;do&lt;/em&gt; things but doesn't necessarily know &lt;em&gt;how&lt;/em&gt; to do them well. An agent with only skills has great instructions but no way to act on them.&lt;/p&gt;

&lt;p&gt;You need both.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is an MCP Tool?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol&lt;/strong&gt; is an open standard — now under the Linux Foundation's Agentic AI Foundation — that gives AI agents a standardized way to connect to external systems: databases, APIs, file systems, GitHub, Slack, your Angular CLI.&lt;/p&gt;

&lt;p&gt;When you connect an MCP server to your client—whether that's Claude Code, the Gemini CLI, or a custom agent—it gets access to a set of typed, deterministic tools. Each tool has a clear input/output schema. When the agent calls it, it executes — no interpretation, no hallucination risk at the execution level. It's a structured API call, not a suggestion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP is how the agent &lt;em&gt;reaches outside itself&lt;/em&gt;. It's the nervous system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use MCP when you need the agent to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read or write to a real system (database, filesystem, API)&lt;/li&gt;
&lt;li&gt;Execute actions with clear, auditable inputs and outputs&lt;/li&gt;
&lt;li&gt;Connect to tools you don't own or control&lt;/li&gt;
&lt;li&gt;Integrate multiple services through a consistent interface&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Is a Skill?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Skill&lt;/strong&gt; is a folder containing a Markdown file (with YAML frontmatter) plus optional scripts and resources. It's not executable by itself — it's a playbook.&lt;/p&gt;

&lt;p&gt;When a user's request matches a Skill's relevance criteria, the agent loads those instructions dynamically and follows them. Think of it as giving the agent expert-level procedural memory on demand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-component-review&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Review Angular components for Signal compliance and standalone architecture&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Angular Component Review&lt;/span&gt;

When reviewing an Angular component:
&lt;span class="p"&gt;1.&lt;/span&gt; Check that all state uses &lt;span class="sb"&gt;`signal()`&lt;/span&gt; or &lt;span class="sb"&gt;`computed()`&lt;/span&gt; — never direct property mutation
&lt;span class="p"&gt;2.&lt;/span&gt; Verify the component is &lt;span class="sb"&gt;`standalone: true`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Confirm no &lt;span class="sb"&gt;`NgModule`&lt;/span&gt; dependencies remain
&lt;span class="p"&gt;4.&lt;/span&gt; Validate that &lt;span class="sb"&gt;`@if`&lt;/span&gt; / &lt;span class="sb"&gt;`@for`&lt;/span&gt; is used instead of &lt;span class="sb"&gt;`*ngIf`&lt;/span&gt; / &lt;span class="sb"&gt;`*ngFor`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent loads this only when it's relevant. When it's not — it costs you nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a skill when you need the agent to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow a consistent process or checklist&lt;/li&gt;
&lt;li&gt;Apply domain-specific expertise (your coding standards, review criteria)&lt;/li&gt;
&lt;li&gt;Encode knowledge that doesn't change often&lt;/li&gt;
&lt;li&gt;Reuse the same workflow across different conversations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Downsides
&lt;/h2&gt;

&lt;p&gt;This is where most guides stop. They shouldn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: The Token Tax
&lt;/h3&gt;

&lt;p&gt;Every MCP tool you connect injects its full schema into the context window &lt;em&gt;before the agent processes a single message&lt;/em&gt;. Each tool costs 550–1,400 tokens. Connect GitHub, Slack, and Sentry, and you're looking at &lt;strong&gt;55,000 tokens burned upfront&lt;/strong&gt; — over a quarter of Claude's 200k limit before any real work begins. And if you are using Gemini with its 1M+ token window, you might think you can just ignore this. Don't. Even if you have the space to spare, dumping 55,000 tokens of raw JSON schema into every single turn of a conversation drives up your latency, increases API costs, and dilutes the model's focus.&lt;/p&gt;

&lt;p&gt;One team reported connecting three MCP servers and consuming &lt;strong&gt;143,000 of 200,000 tokens&lt;/strong&gt; on tool definitions alone. The agent had 57,000 tokens left for the actual conversation.&lt;/p&gt;

&lt;p&gt;The good news: modern clients like Claude Code and the Gemini CLI have adopted progressive discovery for MCP—loading only tool names and descriptions upfront (~20–50 tokens each) and fetching full schemas only when the agent actually needs a tool. Token overhead declined by ~85%. But this feature only works if your MCP setup is configured to use it, and most setups still aren't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills: The Staleness Problem
&lt;/h3&gt;

&lt;p&gt;Skills are Markdown files. They don't update themselves. If your Angular patterns evolve — say you migrate from &lt;code&gt;setInput()&lt;/code&gt; to the new declarative API in Angular 20 — your Skill still teaches the old way until someone updates it manually.&lt;/p&gt;

&lt;p&gt;The more skills you create, the more maintenance burden you carry. And if a skill is subtly wrong, the agent will follow it confidently — no error, just quietly incorrect output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Both: The Selection Problem
&lt;/h3&gt;

&lt;p&gt;Give an agent too many tools or too many skills, and it starts making the wrong choices — calling the wrong tool, triggering the wrong playbook, or combining them in ways that produce contradictory instructions. Experts recommend staying under &lt;strong&gt;10–15 active MCP tools&lt;/strong&gt; at any time.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Combine Them
&lt;/h2&gt;

&lt;p&gt;The most powerful pattern is using them as layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1 — MCP provides access.&lt;/strong&gt;&lt;br&gt;
Connect only what the agent genuinely needs for the current task. Angular CLI, a database, and a file system. Keep it lean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2 — Skills provide expertise.&lt;/strong&gt;&lt;br&gt;
Create a skill that tells the agent &lt;em&gt;how&lt;/em&gt; to use those tools in your specific context. Not just "run the Angular CLI" — but "when migrating a component, run &lt;code&gt;ng generate&lt;/code&gt; with these flags, then validate against these patterns."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 — Skills can orchestrate MCP.&lt;/strong&gt;&lt;br&gt;
A Skill can define a multi-step workflow that calls multiple MCP tools in sequence. Example: a "Deploy &amp;amp; Notify" Skill that uses GitHub MCP to push, a CI/CD MCP to trigger a build, and a Slack MCP to notify the team — all under one coherent playbook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-migration-workflow&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Full workflow for migrating an Angular component to v21 patterns&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Migration Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Use the Angular CLI MCP to check the current component version
&lt;span class="p"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`ng update`&lt;/span&gt; for the affected package
&lt;span class="p"&gt;3.&lt;/span&gt; Apply the zoneless migration schematic
&lt;span class="p"&gt;4.&lt;/span&gt; Review the output against the angular-component-review Skill
&lt;span class="p"&gt;5.&lt;/span&gt; Run tests and report results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Practical Decision Guide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need to query a real database&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to follow a code review checklist&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to push to GitHub&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to apply your team's commit message format&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to read a live API&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to teach the agent your Angular architecture rules&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need both access and consistent process&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Improving Your Workflow
&lt;/h2&gt;

&lt;p&gt;A few patterns that actually work in production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. One MCP server per domain.&lt;/strong&gt; Don't load everything at once. Create separate configs for "Angular development," "deployment," and "communication" — and activate only the one you need for a given session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Version your Skills like code.&lt;/strong&gt; Put them in your repository. Review them when you update your stack. A Skill for Angular 19 patterns will actively hurt you on Angular 21.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use Skills to write MCP guardrails.&lt;/strong&gt; Instead of relying on the agent to figure out when to call a destructive MCP action, write a Skill that explicitly says: &lt;em&gt;"Before running any &lt;code&gt;ng update&lt;/code&gt;, always create a git branch first."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Measure your context budget.&lt;/strong&gt; Before your agent does any real work, know how many tokens your MCP setup consumes. If you're over 30% of your context window is on tool definitions, you have a configuration problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Let the agent maintain simple Skills.&lt;/strong&gt; For fast-moving areas — like keeping track of your team's current Angular version conventions — let the agent update the Skill file itself when you tell it to. It's faster than doing it manually and keeps the Skill honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;MCP gives agents the ability to act. Skills teach them how to act well.&lt;/p&gt;

&lt;p&gt;The debate of "MCP vs Skills" is a false one. The real question is: &lt;em&gt;do you need access, expertise, or both?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In most real Angular workflows, you need both. An agent that can run your CLI but doesn't know your architecture is just a faster way to make the same mistakes. An agent that knows your patterns but can't touch your actual project is just an expensive search engine.&lt;/p&gt;

&lt;p&gt;Used together, with clear boundaries and lean configuration, they're the foundation of agentic development that actually works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previously I wrote about &lt;a href="https://www.yeou.dev/articles/angular-21-mcp-migrations" rel="noopener noreferrer"&gt;Angular 21 MCP and the end of manual migrations&lt;/a&gt; — a good starting point if you're new to the MCP server setup for Angular.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
