<?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.us-east-2.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>Tue, 04 Aug 2026 05:27:44 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-4ane</link>
      <guid>https://dev.to/antoniocardenas/-4ane</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" class="crayons-story__hidden-navigation-link"&gt;Higgsfield-level image &amp;amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. &lt;span&gt;github.com/AntonioCard...&lt;/span&gt; feedback welcome.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-status"&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="/antoniocardenas" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" alt="antoniocardenas profile" class="crayons-avatar__image"&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-4308907" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F355839ae-97e4-4466-8e8e-53a4b48782f4.jpg" class="crayons-avatar__image" alt=""&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;/div&gt;
          &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 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-status"&gt;
        &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" id="article-link-4308907"&gt;
          Higgsfield-level image &amp;amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. &lt;span&gt;github.com/AntonioCard...&lt;/span&gt; feedback welcome.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__contentpreview text-styles"&gt;
          &lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/AntonioCardenas/generate-nanobanana" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F4c092ef2acd8d6dbce069d553db4cb060cc3a41806c9cef93e4ed107512efcf7%2FAntonioCardenas%2Fgenerate-nanobanana" height="600" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/AntonioCardenas/generate-nanobanana" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - AntonioCardenas/generate-nanobanana: Claude Code skill for AI image &amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log beside every file. · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Claude Code skill for AI image &amp;amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log b...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" 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="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;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&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>Higgsfield-level image &amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. https://github.com/AntonioCardenas/generate-nanobanana feedback welcome.</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:27:34 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa</link>
      <guid>https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/AntonioCardenas/generate-nanobanana" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F4c092ef2acd8d6dbce069d553db4cb060cc3a41806c9cef93e4ed107512efcf7%2FAntonioCardenas%2Fgenerate-nanobanana" height="600" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/AntonioCardenas/generate-nanobanana" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - AntonioCardenas/generate-nanobanana: Claude Code skill for AI image &amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log beside every file. · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Claude Code skill for AI image &amp;amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log b...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>github</category>
      <category>llm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Mastering Impeccable: AI Skill Design for Frontend Architecture</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:15:21 +0000</pubDate>
      <link>https://dev.to/turingsoracle/mastering-impeccable-ai-skill-design-for-frontend-architecture-lbe</link>
      <guid>https://dev.to/turingsoracle/mastering-impeccable-ai-skill-design-for-frontend-architecture-lbe</guid>
      <description>&lt;p&gt;Generative coding agents are powerful, but left to their own devices, they default to visual clutter: predictable gradients, uncalibrated spacing, and bloated, outdated component structures. Impeccable is a design skill package, created by Paul Bakaus, that runs directly inside &lt;strong&gt;Claude Code, Gemini CLI, and Codex CLI&lt;/strong&gt; (as well as Cursor and GitHub Copilot) to enforce strict aesthetic guardrails, with the same rule set recompiled for each harness.&lt;/p&gt;

&lt;p&gt;By applying deliberate skill design, you can steer agents away from generic patterns and push them toward precise, high-craft web experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Skill Design, and Why Does It Matter for AI Agents?
&lt;/h2&gt;

&lt;p&gt;Skill design is the practice of building deterministic rails for non-deterministic AI models. Instead of endlessly asking an agent to "make it look better" or "improve performance," you inject a compiled &lt;code&gt;DESIGN.md&lt;/code&gt; and functional directive that the agent must follow on every iteration.&lt;/p&gt;

&lt;p&gt;Impeccable builds on Anthropic's &lt;code&gt;frontend-design&lt;/code&gt; skill and adds 23 commands that give you a shared design vocabulary with the model, plus 58 deterministic anti-pattern detection rules (default Inter font, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, rounded icon tiles above every heading, and more). It turns the AI from a junior developer guessing at your aesthetic into a strict implementer of the visual rules you actually define.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Impeccable's Constraints for Modern Web Apps
&lt;/h2&gt;

&lt;p&gt;Precision is everything when you wire this workflow in. Impeccable respects your existing design system rather than overwriting it: when it runs, it scans your codebase (tokens, components, Tailwind config) and loads your brand rules from your own &lt;code&gt;DESIGN.md&lt;/code&gt;, instead of imposing a generic aesthetic. So if your identity is built on a minimalist look, the right way to enforce it is to &lt;strong&gt;declare it yourself&lt;/strong&gt; in that file — a limited green-and-pink palette, a dark base background at &lt;code&gt;#0c1624&lt;/code&gt;, typography and tone of voice — so every subsequent command reads it before generating anything. Impeccable doesn't decide that aesthetic for you; it gives you the vocabulary and the mechanism to keep yours consistent across every iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Commands That Do the Heavy Lifting
&lt;/h3&gt;

&lt;p&gt;Impeccable exposes 23 commands that act as a shared vocabulary with the agent — each one names a specific kind of design intervention. Three of the most useful for a production workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/audit&lt;/code&gt;&lt;/strong&gt; — a production-quality pass. Runs the deterministic anti-pattern detector (58 curated rules: generic gradients, default Inter font, nested cards, predictable shadows, etc.) against your current code and reports findings without changing anything yet. It's the diagnostic step before you touch code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/normalize&lt;/code&gt;&lt;/strong&gt; — fixes inconsistencies within the system itself: spacing, border radii, type sizes, or color usage that drifted from the tokens defined in your &lt;code&gt;DESIGN.md&lt;/code&gt;. Useful when multiple agent sessions have introduced small divergences over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/polish&lt;/code&gt;&lt;/strong&gt; — the final quality pass. Applies fixes within your existing system (it doesn't invent a new one), removes detected "AI tells," and reruns the detector before handing the result back, until it reaches zero findings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical flow in Claude Code or Cursor looks like this: &lt;code&gt;/impeccable audit&lt;/code&gt; to diagnose, &lt;code&gt;/impeccable normalize&lt;/code&gt; to align what already exists with your tokens, and &lt;code&gt;/impeccable polish&lt;/code&gt; as a final pass before committing — each one reading the same &lt;code&gt;DESIGN.md&lt;/code&gt;/&lt;code&gt;PRODUCT.md&lt;/code&gt; so it never drifts from your brand.&lt;/p&gt;

&lt;p&gt;These three are just the starting point: there are 20 more commands (&lt;code&gt;/typeset&lt;/code&gt;, &lt;code&gt;/distill&lt;/code&gt;, &lt;code&gt;/colorize&lt;/code&gt;, &lt;code&gt;/layout&lt;/code&gt;, &lt;code&gt;/bolder&lt;/code&gt;, &lt;code&gt;/quieter&lt;/code&gt;, &lt;code&gt;/overdrive&lt;/code&gt;, among others) covering typography, color, layout, and motion. You can find the full command list, installation docs, and source code in the &lt;a href="https://github.com/pbakaus/impeccable/blob/main/README.md" rel="noopener noreferrer"&gt;official repository README&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Example: Your Own Brand Rules
&lt;/h3&gt;

&lt;p&gt;Impeccable doesn't impose frontend architecture — it doesn't decide whether you use zoneless Angular, Signals, or which animation engine to reach for; that stays in your hands. What it does do is consistently read the visual rules you define. A &lt;code&gt;DESIGN.md&lt;/code&gt; with strict brand constraints might look like this, as an illustrative example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustrative example only — not Impeccable's actual schema,&lt;/span&gt;
&lt;span class="c1"&gt;# which uses DESIGN.md/PRODUCT.md in Markdown (Google Stitch spec)&lt;/span&gt;
&lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;background_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0c1624"&lt;/span&gt;
  &lt;span class="na"&gt;allowed_accents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pink"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calm,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;precise,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hype"&lt;/span&gt;
  &lt;span class="na"&gt;anti_references&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Avoid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pure&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;white.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Don't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gradients.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Reject&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;aggressive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;weapon-related&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;iconography,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;avoid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generating&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;showing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hands&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;visual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;assets."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any motion engine or architecture decision (GSAP, Lenis, Angular with Signals, etc.) is still your own technical stack choice — Impeccable simply keeps the agent from reintroducing generic visual patterns while you implement it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>claude</category>
    </item>
    <item>
      <title>Haz que tu frontend se mantenga impecable</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:12:23 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/haz-que-tu-frontend-se-mantenga-impecable-3ldc</link>
      <guid>https://dev.to/antoniocardenas/haz-que-tu-frontend-se-mantenga-impecable-3ldc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" class="crayons-story__hidden-navigation-link"&gt;Dominando Impeccable: para mantener coherencia y consistencia de diseño&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.us-east-2.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.us-east-2.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-4270170" 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.us-east-2.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/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 30&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/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" id="article-link-4270170"&gt;
          Dominando Impeccable: para mantener coherencia y consistencia de diseño
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/claude"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claude&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/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/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" 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/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.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 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;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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 crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&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>Dominando Impeccable: para mantener coherencia y consistencia de diseño</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:11:27 +0000</pubDate>
      <link>https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739</link>
      <guid>https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739</guid>
      <description>&lt;p&gt;Los agentes de código generativo son potentes, pero si se les deja a su libre albedrío, por defecto producen un desorden visual: degradados predecibles, espaciados sin calibrar y estructuras de componentes pesadas y obsoletas. Impeccable es un paquete de habilidades de diseño, creado por Paul Bakaus, que opera directamente dentro de &lt;strong&gt;Claude Code, Gemini CLI y Codex CLI&lt;/strong&gt; (además de Cursor y GitHub Copilot) para imponer estrictos límites estéticos, con un mismo conjunto de reglas recompilado para cada harness.&lt;/p&gt;

&lt;p&gt;Al aplicar un diseño de habilidades deliberado, puedes alejar a los agentes de los patrones genéricos y obligarlos a generar experiencias web precisas y de alto nivel visual.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es el diseño de habilidades y por qué es importante para los agentes de IA?
&lt;/h2&gt;

&lt;p&gt;El diseño de habilidades (&lt;em&gt;skill design&lt;/em&gt;) es la práctica de construir rieles deterministas para modelos de IA no deterministas. En lugar de pedirle interminablemente a un agente que "haga que se vea mejor" o "mejore el rendimiento", inyectas un &lt;code&gt;DESIGN.md&lt;/code&gt; compilado y directivas funcionales que el agente debe respetar en cada iteración.&lt;/p&gt;

&lt;p&gt;Impeccable construye sobre la habilidad &lt;code&gt;frontend-design&lt;/code&gt; de Anthropic y añade 23 comandos con un vocabulario de diseño compartido, más 58 reglas deterministas de detección de antipatrones (fuente Inter por defecto, degradados morado-azul, tarjetas anidadas, texto gris sobre fondos de color, iconos redondeados sobre cada encabezado, entre otros). Transforma a la IA de ser un desarrollador junior que intenta adivinar tu estética a un implementador estricto de las reglas visuales que tú definas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo implementar las restricciones de Impeccable para aplicaciones web modernas
&lt;/h2&gt;

&lt;p&gt;Al integrar este flujo de trabajo, la precisión lo es todo. Impeccable respeta tu sistema de diseño existente en lugar de sobrescribirlo: al ejecutarse, escanea tu código base (tokens, componentes, configuración de Tailwind) y carga las reglas de marca desde tu propio &lt;code&gt;DESIGN.md&lt;/code&gt;, en vez de imponer una estética genérica. Por eso, si tu identidad se basa en una estética minimalista, la forma correcta de imponerla es &lt;strong&gt;declarándola tú mismo&lt;/strong&gt; en ese archivo — paleta limitada de verde y rosa, fondo oscuro base en &lt;code&gt;#0c1624&lt;/code&gt;, tipografía y tono de voz — para que cada comando posterior la lea antes de generar nada. Impeccable no decide esa estética por ti; te da el vocabulario y el mecanismo para que la tuya se respete de forma consistente en cada iteración.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los comandos que hacen el trabajo pesado
&lt;/h3&gt;

&lt;p&gt;Impeccable expone 23 comandos que funcionan como un vocabulario compartido con el agente — cada uno nombra un tipo específico de intervención de diseño. Tres de los más útiles para un flujo de producción:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/audit&lt;/code&gt;&lt;/strong&gt; — un pase de calidad de producción. Ejecuta el detector determinista de antipatrones (58 reglas curadas: degradados genéricos, fuente Inter por defecto, tarjetas anidadas, sombras predecibles, etc.) contra tu código actual y reporta los hallazgos sin modificar nada todavía. Es el paso de diagnóstico antes de tocar código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/normalize&lt;/code&gt;&lt;/strong&gt; — corrige inconsistencias dentro del propio sistema: espaciados, radios de borde, tamaños tipográficos o usos de color que se desviaron de los tokens definidos en tu &lt;code&gt;DESIGN.md&lt;/code&gt;. Útil cuando varias sesiones de un agente fueron introduciendo pequeñas divergencias con el tiempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/polish&lt;/code&gt;&lt;/strong&gt; — el pase final de calidad. Aplica las correcciones dentro de tu sistema existente (no inventa uno nuevo), elimina las "señales de IA" detectadas y vuelve a correr el detector antes de entregar el resultado, hasta llegar a cero hallazgos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo típico en Claude Code o Cursor se ve así: &lt;code&gt;/impeccable audit&lt;/code&gt; para diagnosticar, &lt;code&gt;/impeccable normalize&lt;/code&gt; para alinear lo que ya existe con tus tokens, y &lt;code&gt;/impeccable polish&lt;/code&gt; como pase final antes de hacer commit — cada uno leyendo el mismo &lt;code&gt;DESIGN.md&lt;/code&gt;/&lt;code&gt;PRODUCT.md&lt;/code&gt; para no salirse de tu marca.&lt;/p&gt;

&lt;p&gt;Estos tres son solo el punto de partida: hay otros 20 comandos (&lt;code&gt;/typeset&lt;/code&gt;, &lt;code&gt;/distill&lt;/code&gt;, &lt;code&gt;/colorize&lt;/code&gt;, &lt;code&gt;/layout&lt;/code&gt;, &lt;code&gt;/bolder&lt;/code&gt;, &lt;code&gt;/quieter&lt;/code&gt;, &lt;code&gt;/overdrive&lt;/code&gt;, entre otros) que cubren tipografía, color, layout y movimiento. Puedes ver el listado completo, la documentación de instalación y el código fuente en el &lt;a href="https://github.com/pbakaus/impeccable/blob/main/README.md" rel="noopener noreferrer"&gt;README oficial del repositorio&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo de implementación: Tus propias reglas de marca
&lt;/h3&gt;

&lt;p&gt;Impeccable no impone arquitectura de frontend (no decide si usas Angular zoneless, señales o qué motor de animación usar) — eso queda en tus manos. Lo que sí hace es leer consistentemente las reglas visuales que tú definas. Un &lt;code&gt;DESIGN.md&lt;/code&gt; con restricciones estrictas de marca podría verse así, a modo de ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ejemplo ilustrativo — no es el esquema real de Impeccable,&lt;/span&gt;
&lt;span class="c1"&gt;# que usa DESIGN.md/PRODUCT.md en formato Markdown (spec Google Stitch)&lt;/span&gt;
&lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;background_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0c1624"&lt;/span&gt;
  &lt;span class="na"&gt;allowed_accents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pink"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calma,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;precisa,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hype"&lt;/span&gt;
  &lt;span class="na"&gt;anti_references&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Evitar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;el&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;blanco&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;puro.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;degradados&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;genéricos.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Rechazar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;toda&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;iconografía&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;agresiva&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;relacionada&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;con&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;armas,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;evitar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mostrar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;manos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;los&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;recursos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;visuales."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cualquier motor de movimiento o decisión de arquitectura (GSAP, Lenis, Angular con Signals, etc.) sigue siendo una decisión tuya de stack técnico — Impeccable simplemente evita que el agente reintroduzca los patrones visuales genéricos mientras la implementas.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <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="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6jpi7wmmmcc52bzb6vh.jpeg" height="447" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" rel="noopener noreferrer" class="c-link"&gt;
            Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Angular v22 MCP + Skills Integration: Agentic Development Setup   With Angular v22, the MCP...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &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.us-east-2.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.us-east-2.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.us-east-2.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;11&lt;span class="hidden s:inline"&gt;&amp;nbsp;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;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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 crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&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.us-east-2.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.us-east-2.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.us-east-2.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;11&lt;span class="hidden s:inline"&gt;&amp;nbsp;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;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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 crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&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>
  </channel>
</rss>
