<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>atmos Blog</title>
        <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog</link>
        <description>atmos Blog</description>
        <lastBuildDate>Thu, 19 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Real-Time Instance Status from Atmos CLI to Atmos Pro]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[For teams using Atmos Pro, the Atmos CLI now pushes instance status directly to the Atmos Pro dashboard the moment a plan or apply completes. The dashboard reflects the real state of every component within seconds — no polling, no waiting for webhooks, no stale data.]]></description>
            <content:encoded><![CDATA[<p>For teams using <a href="https://atmos-pro.com/" target="_blank" rel="noopener noreferrer" class="">Atmos Pro</a>, the Atmos CLI now pushes instance status directly to the Atmos Pro dashboard the moment a plan or apply completes. The dashboard reflects the real state of every component within seconds — no polling, no waiting for webhooks, no stale data.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="live-infrastructure-status">Live Infrastructure Status<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload#live-infrastructure-status" class="hash-link" aria-label="Direct link to Live Infrastructure Status" title="Direct link to Live Infrastructure Status" translate="no">​</a></h2>
<p><a href="https://atmos-pro.com/" target="_blank" rel="noopener noreferrer" class="">Atmos Pro</a> gives teams a real-time view of every infrastructure component across all environments. With this release, the status pipeline gets significantly faster: the CLI reports results to Atmos Pro immediately after each terraform operation completes.</p>
<p>When you run <code>atmos terraform plan</code> or <code>atmos terraform deploy</code> with <code>--upload-status</code>, the CLI sends the raw execution result to Atmos Pro. The dashboard updates within seconds, showing whether each component is in sync, has drift, or encountered an error — across every stack, every environment, at a glance.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>The CLI sends the raw command and exit code to Atmos Pro, which interprets the result server-side. This means Atmos Pro can refine how it classifies status without requiring a CLI update. The CLI stays simple — it just reports what happened.</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Plan with status reporting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan mycomponent </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod-use1 --upload-status</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Apply with status reporting</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform deploy mycomponent </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod-use1 --upload-status</span><br></span></code></pre></div></div>
<p>In CI workflows, add <code>--upload-status</code> to your plan and apply steps. Combined with the new CI exit code mapping, your workflows stay green while Atmos Pro captures the full picture:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">exit_codes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># no changes → CI success</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># error → CI failure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># changes detected → CI success</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Infrastructure teams managing hundreds of components need to know the state of their deployments at all times. Before this change, status updates depended on webhook processing and background reconciliation — introducing delays and gaps. Now the CLI closes that loop directly:</p>
<ul>
<li class=""><strong>Instant feedback</strong> — dashboard updates seconds after plan or apply finishes</li>
<li class=""><strong>Complete coverage</strong> — both plan and apply report status, including errors</li>
<li class=""><strong>Zero configuration drift</strong> — Atmos Pro always reflects the latest execution result</li>
<li class=""><strong>CI-native</strong> — works seamlessly in GitHub Actions, GitLab CI, or any CI system</li>
</ul>
<p>If you're managing infrastructure at scale, <a href="https://atmos-pro.com/" target="_blank" rel="noopener noreferrer" class="">Atmos Pro</a> turns your CLI output into a shared, real-time operational view for the entire team.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Isolated Browser Sessions for Multi-Account Console Access]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The atmos auth console command now supports isolated browser sessions, allowing you to have multiple cloud provider consoles open simultaneously — one per identity — without logout conflicts.]]></description>
            <content:encoded><![CDATA[<p>The <code>atmos auth console</code> command now supports isolated browser sessions, allowing you to have multiple cloud provider consoles open simultaneously — one per identity — without logout conflicts.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>When you run <code>atmos auth console</code> for different identities, each session now opens in its own isolated Chrome browser context. No more logout conflicts when switching between accounts — whether you're using AWS, Azure, or any other supported provider.</p>
<p>Enable it globally in your <code>atmos.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">console</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">isolated</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p>Or per-invocation with the <code>--isolated</code> flag:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth console </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--identity</span><span class="token plain"> plat-staging/AdministratorAccess </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--isolated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth console </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--identity</span><span class="token plain"> cards-staging/AdministratorAccess </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--isolated</span><br></span></code></pre></div></div>
<p>Both sessions run simultaneously in separate browser windows with fully isolated cookies and session state.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Teams working across multiple cloud accounts frequently need to have several consoles open at once — comparing configurations, debugging cross-account issues, or monitoring deployments across environments. Cloud providers like AWS and Azure enforce a single session per browser context, forcing users to log out and back in every time they switch accounts.</p>
<p>If you've ever seen this, you know the pain:</p>
<p><img decoding="async" loading="lazy" alt="AWS requires you to log out before signing into a different account" src="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/assets/images/aws-logout-conflict-d43e012199ddedf635963e0d1c527da2.png" width="1000" height="338" class="img_fkQH"></p>
<p>Isolated sessions solve this by giving each identity its own Chrome browser profile via <code>--user-data-dir</code>. This works for any provider that <code>atmos auth console</code> supports — AWS, Azure, and others as they're added. Sessions are deterministic per identity, so reopening the same identity reuses its profile (no re-login needed within the session lifetime). Different identities are fully isolated.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="platform-support">Platform Support<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions#platform-support" class="hash-link" aria-label="Direct link to Platform Support" title="Direct link to Platform Support" translate="no">​</a></h2>
<p>Isolated sessions work on any platform with Chrome or Chromium installed:</p>
<ul>
<li class=""><strong>macOS</strong>: Uses <code>open -na "Google Chrome" --args --user-data-dir=&lt;dir&gt;</code></li>
<li class=""><strong>Linux</strong>: Uses <code>google-chrome --user-data-dir=&lt;dir&gt;</code></li>
<li class=""><strong>Windows</strong>: Uses <code>chrome.exe --user-data-dir=&lt;dir&gt;</code></li>
</ul>
<p>If Chrome is not installed, Atmos falls back to the default browser with a helpful warning. The feature degrades gracefully — it never blocks console access.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have questions or feedback? Join us on <a href="https://slack.cloudposse.com/" target="_blank" rel="noopener noreferrer" class="">Slack</a> or open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>Enhancement</category>
        </item>
        <item>
            <title><![CDATA[Taming the Beast: Refactoring processArgsAndFlags to 100% Test Coverage]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[What do you do when you find a 490-line function with ~67 cyclomatic complexity and 0% test coverage on its]]></description>
            <content:encoded><![CDATA[<p>What do you do when you find a 490-line function with ~67 cyclomatic complexity and 0% test coverage on its
critical paths? You refactor it. This post covers how we eliminated the highest-complexity function in
Atmos and replaced it with a clean, table-driven design — achieving <strong>100% unit test coverage</strong> along the way.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-is-processargsandflags">What is <code>processArgsAndFlags</code>?<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#what-is-processargsandflags" class="hash-link" aria-label="Direct link to what-is-processargsandflags" title="Direct link to what-is-processargsandflags" translate="no">​</a></h2>
<p><code>processArgsAndFlags</code> is the internal workhorse that parses CLI arguments for every <code>atmos terraform</code>,
<code>atmos helmfile</code>, and <code>atmos packer</code> invocation. It extracts structured information from raw argument
slices: which component to deploy, which stack, which flags to pass through, and which to consume
internally.</p>
<p>Before this refactor, the function contained <strong>25+ repetitive if/else chains</strong> like this:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> arg </span><span class="token operator" style="color:rgb(127, 219, 202)">==</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommandFlag </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">inputArgsAndFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Errorf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">errFlagFormat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> errUtils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ErrInvalidFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommand </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> inputArgsAndFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">i</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">else</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">HasPrefix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">arg</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token string" style="color:rgb(173, 219, 103)">"="</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommandFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    terraformCommandFlagParts </span><span class="token operator" style="color:rgb(127, 219, 202)">:=</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Split</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"="</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">terraformCommandFlagParts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">!=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Errorf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">errFlagFormat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> errUtils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ErrInvalidFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommand </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> terraformCommandFlagParts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// ... repeated 24 more times for other flags</span><br></span></code></pre></div></div>
<p>This pattern appeared <strong>26 times</strong> — once for each string-valued flag. Adding a new flag required copying
and adapting 7–8 lines of boilerplate. Missing a case was easy and hard to detect without coverage.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-refactor-dry-table-driven-design">The Refactor: DRY Table-Driven Design<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#the-refactor-dry-table-driven-design" class="hash-link" aria-label="Direct link to The Refactor: DRY Table-Driven Design" title="Direct link to The Refactor: DRY Table-Driven Design" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-parseflagvalue--one-helper-for-all-forms">1. <code>parseFlagValue</code> — One Helper for All Forms<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#1-parseflagvalue--one-helper-for-all-forms" class="hash-link" aria-label="Direct link to 1-parseflagvalue--one-helper-for-all-forms" title="Direct link to 1-parseflagvalue--one-helper-for-all-forms" translate="no">​</a></h3>
<p>We extracted a single helper that handles both <code>--flag value</code> (space-separated) and <code>--flag=value</code>
(equals-separated) forms:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">parseFlagValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> arg </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> args </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> index </span><span class="token builtin" style="color:rgb(130, 170, 255)">int</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">bool</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">error</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> arg </span><span class="token operator" style="color:rgb(127, 219, 202)">==</span><span class="token plain"> flag </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> index</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">Errorf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">errFlagFormat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> errUtils</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ErrInvalidFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">index</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">HasPrefix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> flag</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token string" style="color:rgb(173, 219, 103)">"="</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// SplitN(..., 2) keeps any additional "=" in the value intact.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// e.g., --query=.tags[?env==prod] correctly returns ".tags[?env==prod]"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        parts </span><span class="token operator" style="color:rgb(127, 219, 202)">:=</span><span class="token plain"> strings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">SplitN</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"="</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> parts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>This fixes two latent bugs in the original code:</p>
<ol>
<li class="">
<p><strong>Prefix collision</strong>: the old code used <code>strings.HasPrefix(arg+"=", flag)</code> which produced false
positives for flags sharing a common prefix (e.g., <code>--terraform-command-extra</code> matching
<code>--terraform-command</code>). The new <code>strings.HasPrefix(arg, flag+"=")</code> is correct and unambiguous.</p>
</li>
<li class="">
<p><strong>Values containing <code>=</code></strong>: the old code used <code>strings.Split(arg, "=")</code> and rejected anything with
more than one <code>=</code> sign. This meant <code>--query=.tags[?env==prod]</code> or <code>--append-user-agent=Key=Value</code>
would error. Using <code>strings.SplitN(arg, "=", 2)</code> limits the split to the first <code>=</code>, preserving
the rest of the value intact.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-stringflagdefs--the-table-that-replaces-200-lines">2. <code>stringFlagDefs</code> — The Table That Replaces 200+ Lines<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#2-stringflagdefs--the-table-that-replaces-200-lines" class="hash-link" aria-label="Direct link to 2-stringflagdefs--the-table-that-replaces-200-lines" title="Direct link to 2-stringflagdefs--the-table-that-replaces-200-lines" translate="no">​</a></h3>
<p>All 26 string-valued flags now live in a single declaration:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">var</span><span class="token plain"> stringFlagDefs </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain">stringFlagDef</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommandFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">func</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">info </span><span class="token operator" style="color:rgb(127, 219, 202)">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ArgsAndFlagsInfo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> v </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformCommand </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> v </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformDirFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">     </span><span class="token keyword" style="color:rgb(127, 219, 202)">func</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">info </span><span class="token operator" style="color:rgb(127, 219, 202)">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ArgsAndFlagsInfo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> v </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">TerraformDir </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> v </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// ... 24 more entries</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// --planfile sets two fields:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain">cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PlanFileFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">func</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">info </span><span class="token operator" style="color:rgb(127, 219, 202)">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ArgsAndFlagsInfo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> v </span><span class="token builtin" style="color:rgb(130, 170, 255)">string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">PlanFile </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> v</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">UseTerraformPlan </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>Adding a new CLI flag is now a <strong>single line</strong>. The loop in <code>processArgsAndFlags</code> becomes:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">for</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">_</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> def </span><span class="token operator" style="color:rgb(127, 219, 202)">:=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">range</span><span class="token plain"> stringFlagDefs </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    val</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> found</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(127, 219, 202)">:=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">parseFlagValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">def</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> arg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> inputArgsAndFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(127, 219, 202)">!=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">return</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> err</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> found </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        def</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">setFunc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(127, 219, 202)">&amp;</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token keyword" style="color:rgb(127, 219, 202)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-specialized-helpers-for-complex-flags">3. Specialized Helpers for Complex Flags<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#3-specialized-helpers-for-complex-flags" class="hash-link" aria-label="Direct link to 3. Specialized Helpers for Complex Flags" title="Direct link to 3. Specialized Helpers for Complex Flags" translate="no">​</a></h3>
<p>Two flags have non-standard semantics and get their own focused helpers:</p>
<p><strong><code>parseIdentityFlag</code></strong> handles <code>--identity</code>'s optional-value behavior:</p>
<ul>
<li class=""><code>--identity</code> → <code>__SELECT__</code> (prompts for interactive selection)</li>
<li class=""><code>--identity value</code> → uses <code>value</code></li>
<li class=""><code>--identity=</code> → <code>__SELECT__</code> (empty value triggers selection)</li>
<li class=""><code>--identity=value</code> → uses <code>value</code></li>
</ul>
<p><strong><code>parseFromPlanFlag</code></strong> handles <code>--from-plan</code>'s optional path:</p>
<ul>
<li class=""><code>--from-plan</code> → enables plan mode, no specific file</li>
<li class=""><code>--from-plan path</code> → enables plan mode, uses <code>path</code></li>
<li class=""><code>--from-plan=path</code> → enables plan mode, uses <code>path</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="4-boolean-flags-consolidated">4. Boolean Flags Consolidated<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#4-boolean-flags-consolidated" class="hash-link" aria-label="Direct link to 4. Boolean Flags Consolidated" title="Direct link to 4. Boolean Flags Consolidated" translate="no">​</a></h3>
<p>Five separate <code>if</code> statements became one <code>switch</code>:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">switch</span><span class="token plain"> arg </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">case</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">DryRunFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">    info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">DryRun </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">case</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">SkipInitFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">  info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">SkipInit </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">case</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">HelpFlag1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">HelpFlag2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">NeedHelp </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">case</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">AffectedFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">  info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Affected </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">case</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">AllFlag</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">       info</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">All </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="5-boolean-flag-stripping-bug-fixed">5. Boolean Flag Stripping Bug Fixed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#5-boolean-flag-stripping-bug-fixed" class="hash-link" aria-label="Direct link to 5. Boolean Flag Stripping Bug Fixed" title="Direct link to 5. Boolean Flag Stripping Bug Fixed" translate="no">​</a></h3>
<p>This was the most insidious bug: every entry in <code>commonFlags</code> — including purely boolean flags like
<code>--dry-run</code>, <code>--skip-init</code>, <code>--affected</code>, and <code>--all</code> — was unconditionally stripping both the flag
at index <code>i</code> <strong>and</strong> the next argument at index <code>i+1</code> from the pass-through list. The result:</p>
<div class="language-sh codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-sh codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># --refresh=false was silently dropped before reaching terraform</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> dev --dry-run </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--refresh</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">false</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># --parallelism=10 was silently dropped</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform apply vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--affected</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--parallelism</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><br></span></code></pre></div></div>
<p>The fix introduces <code>valueTakingCommonFlags</code> — a set built from <code>stringFlagDefs</code> plus explicitly
enumerated value-taking entries (<code>--stack</code>, <code>-s</code>, <code>--global-options</code>, <code>--kubeconfig-path</code>, profiler
string flags). The stripping loop now only advances to <code>i+1</code> for flags that actually consume a value:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> f </span><span class="token operator" style="color:rgb(127, 219, 202)">==</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">FromPlanFlag </span><span class="token operator" style="color:rgb(127, 219, 202)">||</span><span class="token plain"> f </span><span class="token operator" style="color:rgb(127, 219, 202)">==</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">IdentityFlag </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// Optional-value: only strip i+1 if next arg isn't a flag.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">len</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">inputArgsAndFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain"> i</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">!</span><span class="token plain">strings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">HasPrefix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">inputArgsAndFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">i</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"-"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        indexesToRemove </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">append</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">indexesToRemove</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> i</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">else</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> valueTakingCommonFlags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">f</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// Value-taking: always strip i+1 (the value was consumed during parsing).</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    indexesToRemove </span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">append</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">indexesToRemove</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> i</span><span class="token operator" style="color:rgb(127, 219, 202)">+</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// Boolean-only flags: do nothing — i+1 passes through to the underlying tool.</span><br></span></code></pre></div></div>
<p>This was a silent data-loss bug: users who combined an Atmos boolean flag with a Terraform flag in
the same command line were silently losing their Terraform flag. The bug had existed since the feature
was first introduced.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="coverage-from-patchwork-to-100">Coverage: From Patchwork to 100%<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#coverage-from-patchwork-to-100" class="hash-link" aria-label="Direct link to Coverage: From Patchwork to 100%" title="Direct link to Coverage: From Patchwork to 100%" translate="no">​</a></h2>
<p>All functions in the refactored code now have <strong>100% unit test coverage</strong>:</p>
<table><thead><tr><th>Function</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td><code>processArgsAndFlags</code></td><td>78.8%</td><td><strong>100%</strong></td></tr><tr><td><code>parseQuotedCompoundSubcommand</code></td><td>92.9%</td><td><strong>100%</strong></td></tr><tr><td><code>parseFlagValue</code></td><td>N/A (new)</td><td><strong>100%</strong></td></tr><tr><td><code>parseIdentityFlag</code></td><td>N/A (new)</td><td><strong>100%</strong></td></tr><tr><td><code>parseFromPlanFlag</code></td><td>N/A (new)</td><td><strong>100%</strong></td></tr></tbody></table>
<p>The new test suite adds 12 focused test functions covering:</p>
<ul>
<li class="">Every string flag in both space-separated and equals-separated forms</li>
<li class="">All boolean flags (<code>--dry-run</code>, <code>--skip-init</code>, <code>-h</code>, <code>--help</code>, <code>--affected</code>, <code>--all</code>)</li>
<li class="">Global options in both <code>--global-options value</code> and <code>--global-options=value</code> forms</li>
<li class=""><code>NeedHelp</code> handling with and without a subsequent subcommand</li>
<li class=""><code>--from-plan</code> in all four forms (alone, with path, with <code>=path</code>, with <code>=</code>)</li>
<li class="">Boolean flags NOT stripping adjacent pass-through flags (regression suite for the stripping bug)</li>
<li class="">Error paths: missing values, invalid options</li>
<li class="">Flag value stripping from <code>AdditionalArgsAndFlags</code> (both flag and value removed, not just the flag)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Every CLI invocation of <code>atmos terraform</code>, <code>atmos helmfile</code>, or <code>atmos packer</code> goes through this code.
Confidence in its correctness directly translates to confidence in Atmos as a whole.</p>
<p>With 100% coverage and a table-driven design:</p>
<ul>
<li class=""><strong>Adding a new flag</strong> is a one-line change</li>
<li class=""><strong>Bugs are caught immediately</strong> by the test suite</li>
<li class=""><strong>The code is readable</strong> — flag definitions are declarations, not imperative code</li>
<li class=""><strong>Maintenance burden drops</strong> — no more copy-paste archaeology</li>
</ul>
<p>This work is part of Atmos's commitment to pushing test coverage from 74% toward 80%+ while making the
codebase increasingly approachable for contributors.</p>]]></content:encoded>
            <category>DX</category>
            <category>Core</category>
        </item>
        <item>
            <title><![CDATA[Refactoring ExecuteTerraform: From Cyclomatic Complexity 160 to 26]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When a single function accumulates 160 decision branches, it becomes nearly impossible to reason about, test, or safely change.]]></description>
            <content:encoded><![CDATA[<p>When a single function accumulates 160 decision branches, it becomes nearly impossible to reason about, test, or safely change.
That's exactly what happened to <code>ExecuteTerraform</code> in Atmos — the beating heart of every <code>atmos terraform</code> call.
This post explains why we refactored it and what we learned along the way.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem-a-760-line-monolith">The Problem: A 760-Line Monolith<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#the-problem-a-760-line-monolith" class="hash-link" aria-label="Direct link to The Problem: A 760-Line Monolith" title="Direct link to The Problem: A 760-Line Monolith" translate="no">​</a></h2>
<p><code>ExecuteTerraform</code> was the largest single function in the Atmos codebase.
Over time it had grown to handle everything from authentication setup and stack processing to workspace management, provisioner orchestration, plan-file cleanup, and status uploads — all inline, in a single sprawling function.</p>
<p>The cyclomatic complexity score was <strong>160</strong> — more than ten times the project's lint limit of 15.
That meant:</p>
<ul>
<li class=""><strong>No unit tests</strong> — the function required a real <code>atmos.yaml</code>, a real stack, real terraform binaries, and live AWS credentials just to call it.</li>
<li class=""><strong>Impossible to audit</strong> — anyone reviewing a security fix had to trace through hundreds of interleaved branches.</li>
<li class=""><strong>Fragile changes</strong> — adding a new flag required careful reading of the entire function to avoid introducing regressions.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-approach-extract-name-test">The Approach: Extract, Name, Test<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#the-approach-extract-name-test" class="hash-link" aria-label="Direct link to The Approach: Extract, Name, Test" title="Direct link to The Approach: Extract, Name, Test" translate="no">​</a></h2>
<p>Rather than rewrite from scratch, we took a disciplined extraction approach:</p>
<ol>
<li class=""><strong>Identify logical boundaries</strong> — each block of related code became a candidate for a helper function.</li>
<li class=""><strong>Name precisely</strong> — function names like <code>setupTerraformAuth</code>, <code>checkComponentRestrictions</code>, and <code>assembleComponentEnvVars</code> communicate intent immediately.</li>
<li class=""><strong>Test every helper</strong> — because each function now has a clear signature and no side effects beyond its stated purpose, we could write fast, offline unit tests with no infrastructure.</li>
<li class=""><strong>Apply DRY</strong> — the provisioner-setup logic that was duplicated between the early-init pre-step and the <code>init</code> subcommand path was unified into a single <code>prepareInitExecution</code> helper.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="helper-functions-introduced">Helper Functions Introduced<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#helper-functions-introduced" class="hash-link" aria-label="Direct link to Helper Functions Introduced" title="Direct link to Helper Functions Introduced" translate="no">​</a></h3>
<table><thead><tr><th>Function</th><th>Responsibility</th></tr></thead><tbody><tr><td><code>resolveTerraformCommand</code></td><td>Pick <code>terraform</code>, <code>tofu</code>, or a custom binary</td></tr><tr><td><code>handleVersionSubcommand</code></td><td>Short-circuit for <code>version</code> — no stack needed</td></tr><tr><td><code>setupTerraformAuth</code></td><td>Merge global + component auth, create AuthManager, inject bridge</td></tr><tr><td><code>resolveAndProvisionComponentPath</code></td><td>Resolve path, auto-generate files, JIT-provision from source</td></tr><tr><td><code>checkComponentRestrictions</code></td><td>Guard abstract, locked, and HTTP-backend constraints</td></tr><tr><td><code>printAndWriteVarFiles</code></td><td>Log and persist variable files</td></tr><tr><td><code>validateTerraformComponent</code></td><td>Run OPA / JSON-schema policies</td></tr><tr><td><code>generateConfigFiles</code></td><td>Write backend config, provider overrides, generated files</td></tr><tr><td><code>warnOnConflictingEnvVars</code></td><td>Detect <code>TF_CLI_ARGS</code> / <code>TF_WORKSPACE</code> collisions</td></tr><tr><td><code>assembleComponentEnvVars</code></td><td>Compose the full subprocess environment</td></tr><tr><td><code>shouldRunTerraformInit</code></td><td>Decide if a pre-init step is needed</td></tr><tr><td><code>buildInitArgs</code></td><td>Build <code>init</code> flag list (reconfigure, varfile)</td></tr><tr><td><code>prepareInitExecution</code></td><td>Clean workspace + run provisioners + resolve workdir path</td></tr><tr><td><code>executeTerraformInitPhase</code></td><td>Execute the pre-init step</td></tr><tr><td><code>handleDeploySubcommand</code></td><td>Map <code>deploy</code> → <code>apply</code> with auto-approve</td></tr><tr><td><code>logTerraformContext</code></td><td>Emit execution-context debug log</td></tr><tr><td><code>buildPlanSubcommandArgs</code></td><td>Plan-specific flags (out, upload-status)</td></tr><tr><td><code>buildApplySubcommandArgs</code></td><td>Apply-specific flags (varfile or planfile)</td></tr><tr><td><code>buildInitSubcommandArgs</code></td><td>Init-specific flags (reconfigure, varfile)</td></tr><tr><td><code>buildWorkspaceSubcommandArgs</code></td><td>Workspace sub-subcommand argument</td></tr><tr><td><code>appendApplyPlanFileArg</code></td><td>Append positional plan-file to apply</td></tr><tr><td><code>buildTerraformCommandArgs</code></td><td>Orchestrate all of the above for the main command</td></tr><tr><td><code>runWorkspaceSetup</code></td><td>Select / create the Terraform workspace</td></tr><tr><td><code>checkTTYRequirement</code></td><td>Fail fast when <code>apply</code> is called without a TTY</td></tr><tr><td><code>addRegionEnvVarForImport</code></td><td>Inject <code>AWS_REGION</code> for <code>terraform import</code></td></tr><tr><td><code>resolveExitCode</code></td><td>Extract an integer exit code from an error</td></tr><tr><td><code>executeMainTerraformCommand</code></td><td>Run the command, handle upload-status, propagate exit codes</td></tr><tr><td><code>cleanupTerraformFiles</code></td><td>Remove ephemeral plan / varfiles</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-result">The Result<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#the-result" class="hash-link" aria-label="Direct link to The Result" title="Direct link to The Result" translate="no">​</a></h2>
<p>After the refactoring:</p>
<ul>
<li class=""><code>ExecuteTerraform</code> complexity: <strong>26</strong> (down from 160)</li>
<li class=""><code>buildTerraformCommandArgs</code> complexity: <strong>9</strong> (the most complex helper)</li>
<li class=""><strong>100+ new unit tests</strong> — all pure in-process, zero infrastructure required</li>
<li class=""><strong>Zero behavior changes</strong> — the entire existing integration test suite passes unchanged</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="lessons-learned">Lessons Learned<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#lessons-learned" class="hash-link" aria-label="Direct link to Lessons Learned" title="Direct link to Lessons Learned" translate="no">​</a></h2>
<p><strong>Complexity limits are guardrails, not suggestions.</strong> A max-complexity of 15 sounds strict until you see what happens when it is ignored for years.</p>
<p><strong>Test-driven extraction pays off.</strong> Writing tests for each extracted helper forced us to think about the contract of each function, which in turn exposed several subtle differences (e.g., the slightly different init-reconfigure logic for the early-init pre-step vs. the init subcommand path).</p>
<p><strong>Naming is architecture.</strong> When you can give a 20-line block of code a precise 3-word name, you have found a real abstraction.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Check out the <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">Atmos GitHub repository</a> and feel free to open issues, contribute code, or share ideas.
We welcome contributions from the community!</p>]]></content:encoded>
            <category>Core</category>
            <category>DX</category>
            <category>Enhancement</category>
        </item>
        <item>
            <title><![CDATA[Native CI Integration: Rich Plan Summaries Without Extra Actions]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration</guid>
            <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When you see complex bash scripts and conditional logic in GitHub Actions workflows, that's a signal: the underlying tool wasn't designed for CI. Atmos now has built-in CI integration that makes the same command work identically locally and in CI—no wrapper scripts, no extra actions, no hidden complexity.]]></description>
            <content:encoded><![CDATA[<p>When you see complex bash scripts and conditional logic in GitHub Actions workflows, that's a signal: the underlying tool wasn't designed for CI. Atmos now has built-in CI integration that makes the same command work identically locally and in CI—no wrapper scripts, no extra actions, no hidden complexity.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem-with-ci-glue-code">The Problem with CI Glue Code<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#the-problem-with-ci-glue-code" class="hash-link" aria-label="Direct link to The Problem with CI Glue Code" title="Direct link to The Problem with CI Glue Code" translate="no">​</a></h2>
<p>Look at any mature infrastructure repository's CI workflows. You'll find bash scripts parsing terraform output with <code>grep</code> and <code>awk</code>, conditional logic to handle plan files across jobs, and environment variable gymnastics to pass data between steps.</p>
<p>This complexity isn't accidental—it's compensation. When tools aren't designed for CI, teams build layers of glue code to bridge the gap. The cost is real: workflows that work in CI fail locally (and vice versa), debugging requires reproducing the entire CI environment, and tribal knowledge accumulates in workflow files.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-reproducibility-principle">The Reproducibility Principle<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#the-reproducibility-principle" class="hash-link" aria-label="Direct link to The Reproducibility Principle" title="Direct link to The Reproducibility Principle" translate="no">​</a></h2>
<p>Infrastructure tools should follow a simple principle: <strong>the same command should produce the same behavior everywhere.</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># This should work identically:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># locally</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># in GitHub Actions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># in GitLab CI</span><br></span></code></pre></div></div>
<p>When a tool is truly CI-native, your workflow files become trivial:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Before: Complex workflow with hidden logic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Plan</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token scalar string" style="color:rgb(173, 219, 103)"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    output=$(atmos terraform plan vpc -s prod 2&gt;&amp;1)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    echo "$output"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    # Parse for changes...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    # Upload artifacts...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    # Post PR comment...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># After: CI-native tool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Plan</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform plan vpc </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s prod</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-this-enables">What This Enables<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#what-this-enables" class="hash-link" aria-label="Direct link to What This Enables" title="Direct link to What This Enables" translate="no">​</a></h2>
<p>Previously, getting beautiful plan summaries in GitHub Actions required using separate actions like <code>github-action-atmos-terraform-plan</code>. These wrapped the CLI with CI-specific behaviors, creating two codebases that evolved separately.</p>
<p>Now, Atmos handles everything natively. The CLI detects when it's running in CI and automatically generates the same rich output you're used to—resource badges, collapsible diffs, terraform outputs.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-you-get">What You Get<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#what-you-get" class="hash-link" aria-label="Direct link to What You Get" title="Direct link to What You Get" translate="no">​</a></h2>
<ul>
<li class=""><strong>Rich job summaries</strong> — resource badges, collapsible diffs, plan/apply templates (written to <code>$GITHUB_STEP_SUMMARY</code>)</li>
<li class=""><strong>Live status checks</strong> — real-time progress ("Plan in progress" → "3 to add, 1 to change, 0 to destroy")</li>
<li class=""><strong>Output variables</strong> — plan/apply results exported to <code>$GITHUB_OUTPUT</code> for downstream jobs</li>
<li class=""><strong>Planfile storage</strong> — store planfiles in S3, GitHub Artifacts, or local filesystem with SHA256 integrity verification</li>
<li class=""><strong>Custom templates</strong> — Go template syntax for full control over summaries and comments</li>
<li class=""><strong>Auto-detection</strong> — CI mode enabled automatically from <code>CI=true</code> or <code>GITHUB_ACTIONS=true</code></li>
<li class=""><strong>Same command</strong> works locally and in CI</li>
<li class=""><strong>PR comments</strong> <em>(coming soon)</em> — auto-updated plan summaries on pull requests</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="quick-start">Quick Start<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<p>Here's a minimal workflow using <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/profiles">profiles</a> and <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/auth">auth</a> with OIDC:</p>
<div class="theme-tabs-container tabs-container tabList_GbJJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_2aiT tabs__item--active">GitHub Actions Workflow</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_2aiT">profiles/ci/auth.yaml</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_2aiT">atmos.yaml</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_q_c7"><div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Terraform Plan</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">pull_request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">plan</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">permissions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">id-token</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> write</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">contents</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> read</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">ATMOS_PROFILE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ci</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">ATMOS_IDENTITY</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> plat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">dev/admin</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloudposse/github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">setup</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">atmos@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Terraform Plan</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform plan mycomponent </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s dev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_q_c7" hidden=""><div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">providers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">github-oidc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github/oidc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">region</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">audience</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> sts.amazonaws.com</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">identities</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">plat-dev/admin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws/assume</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">role</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">via</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">oidc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">principal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">assume_role</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> arn</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">111111111111</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">role/acme</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">plat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">gbl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">dev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_q_c7" hidden=""><div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Auto-enabled when CI detected, or set explicitly</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Output variables for downstream jobs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">output</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">variables</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> has_changes</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> has_additions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> has_destructions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> artifact_key</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> plan_summary</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Job summary with plan/apply results</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">summary</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Commit status checks</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">checks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">context_prefix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"atmos"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Template overrides</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">templates</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">base_path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">".atmos/ci/templates"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">plan</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"plan.md"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">apply</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"apply.md"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># To store planfiles across CI pipeline stages, add:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">planfiles</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Stores are tried in priority order</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">priority</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Named stores</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">stores</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github/artifacts</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">retention_days</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">7</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></div></div></div>
<p>That's it. Atmos detects GitHub Actions automatically and writes the plan summary to <code>$GITHUB_STEP_SUMMARY</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example-output">Example Output<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#example-output" class="hash-link" aria-label="Direct link to Example Output" title="Direct link to Example Output" translate="no">​</a></h2>
<div style="border:1px solid var(--ifm-color-emphasis-300);border-radius:8px;padding:1.5rem;background-color:var(--ifm-background-surface-color)"><h3 class="anchor anchorTargetStickyNavbar_SsMH" id="changes-found-for-vpc-in-dev-us-east-1">Changes Found for <code>vpc</code> in <code>dev-us-east-1</code><a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#changes-found-for-vpc-in-dev-us-east-1" class="hash-link" aria-label="Direct link to changes-found-for-vpc-in-dev-us-east-1" title="Direct link to changes-found-for-vpc-in-dev-us-east-1" translate="no">​</a></h3><a href="https://cloudposse.com/"><img src="https://cloudposse.com/logo-300x69.svg" width="100px" align="right"></a><p><a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#" class=""><img decoding="async" loading="lazy" src="https://shields.io/badge/PLAN-CREATE-success?style=for-the-badge" alt="create" class="img_fkQH"></a> <a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#" class=""><img decoding="async" loading="lazy" src="https://shields.io/badge/PLAN-DESTROY-critical?style=for-the-badge" alt="destroy" class="img_fkQH"></a></p><div class="theme-admonition theme-admonition-danger admonition_cbIa alert alert--danger"><div class="admonitionHeading_squj"><span class="admonitionIcon_bxkr"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Caution</div><div class="admonitionContent_HCPN"><p><strong>Terraform will delete resources!</strong>
This plan contains resource delete operations. Please check the plan result very carefully.</p></div></div><details class="details_LWFL alert alert--info details_hOWq" data-collapsed="true"><summary>Resources: 3 to add, 0 to change, 1 to destroy.</summary><div><div class="collapsibleContent_RdcH"><br><p>To reproduce this locally, run:</p><div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev-us-east-1</span><br></span></code></pre></div></div><hr><h4 class="anchor anchorTargetStickyNavbar_SsMH" id="create">Create<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#create" class="hash-link" aria-label="Direct link to Create" title="Direct link to Create" translate="no">​</a></h4><div class="language-diff codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-diff codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">+ aws_vpc.main</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">+ aws_subnet.public[0]</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">+ aws_subnet.public[1]</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_SsMH" id="destroy">Destroy<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#destroy" class="hash-link" aria-label="Direct link to Destroy" title="Direct link to Destroy" translate="no">​</a></h4><div class="language-diff codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-diff codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">- aws_security_group.deprecated</span><br></span></code></pre></div></div></div></div></details><details class="details_LWFL alert alert--info details_hOWq" data-collapsed="true"><summary>Terraform <strong>Plan</strong> Summary</summary><div><div class="collapsibleContent_RdcH"><div class="language-hcl codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-hcl codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># random_id.id2 will be created</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  + </span><span class="token keyword" style="color:rgb(127, 219, 202)">resource </span><span class="token keyword type variable" style="color:rgb(214, 222, 235)">"random_id"</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"id2"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">b64_std</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">b64_url</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">byte_length</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">dec</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">hex</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + </span><span class="token property" style="color:rgb(128, 203, 196)">id</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Plan: </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> to add, </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> to change, </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> to destroy.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Apply complete! Resources: </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> added, </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> changed, </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> destroyed.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Outputs:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token property" style="color:rgb(128, 203, 196)">cluster_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"cluster-754a1c6160064d0b"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token property" style="color:rgb(128, 203, 196)">lb_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"load-balancer-763d296bbfc8ccc6"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token property" style="color:rgb(128, 203, 196)">vpc_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"vpc-69e5cf6a55e1eb81"</span><br></span></code></pre></div></div></div></div></details><details class="details_LWFL alert alert--info details_hOWq" data-collapsed="true"><summary>Terraform Outputs</summary><div><div class="collapsibleContent_RdcH"><table><thead><tr><th>Output</th><th>Value</th></tr></thead><tbody><tr><td><code>cluster_id</code></td><td><code>cluster-754a1c6160064d0b</code></td></tr><tr><td><code>lb_id</code></td><td><code>load-balancer-763d296bbfc8ccc6</code></td></tr><tr><td><code>vpc_id</code></td><td><code>vpc-69e5cf6a55e1eb81</code></td></tr></tbody></table></div></div></details></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="learn-more">Learn More<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ci">CI Configuration</a> — complete configuration options and permissions reference</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ci">Native CI Overview</a> — feature overview and architecture</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ci/planfile-storage">Planfile Storage</a> — store and verify planfiles across CI pipeline stages</li>
</ul>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[98% Complexity Reduction in describe stacks]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[ExecuteDescribeStacks was the most complex function in the entire Atmos codebase — cyclomatic complexity of 247 and cognitive complexity of 1252. We broke it apart.]]></description>
            <content:encoded><![CDATA[<p><code>ExecuteDescribeStacks</code> was the most complex function in the entire Atmos codebase — cyclomatic complexity of <strong>247</strong> and cognitive complexity of <strong>1252</strong>. We broke it apart.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p><code>ExecuteDescribeStacks</code> in <code>internal/exec/describe_stacks.go</code> was a <strong>1,160-line monolith</strong> that repeated nearly identical component-processing logic four times — once for each component type (Terraform, Helmfile, Packer, Ansible). The duplication made it impossible to unit test individual behaviours and extremely difficult to reason about.</p>
<p>We extracted the shared logic into a new <code>describe_stacks_component_processor.go</code> file containing:</p>
<table><thead><tr><th>Function</th><th>Responsibility</th></tr></thead><tbody><tr><td><code>describeStacksProcessor</code></td><td>Immutable config + mutable result map</td></tr><tr><td><code>processStackFile</code></td><td>Orchestrates one stack file</td></tr><tr><td><code>processComponentTypeSection</code></td><td>Iterates over all components of one type</td></tr><tr><td><code>processComponentEntry</code></td><td>Processes a single component (shared for all 4 types)</td></tr><tr><td><code>extractDescribeComponentSections</code></td><td>Extracts vars, metadata, settings, env, auth, …</td></tr><tr><td><code>buildConfigAndStacksInfo</code></td><td>Builds the <code>ConfigAndStacksInfo</code> struct</td></tr><tr><td><code>resolveStackName</code></td><td>Manifest name → template → pattern → filename</td></tr><tr><td><code>shouldFilterByStack</code></td><td>Clean filter predicate</td></tr><tr><td><code>ensureComponentEntryInMap</code></td><td>Creates nested map paths safely</td></tr><tr><td><code>setAtmosComponentMetadata</code></td><td>Stamps atmos_component/stack/stack_file</td></tr><tr><td><code>resolveIncludeEmpty</code></td><td>Reads atmos.yaml IncludeEmpty setting</td></tr><tr><td><code>addSectionsToComponentEntry</code></td><td>Writes filtered sections to output map</td></tr><tr><td><code>processComponentSectionTemplates</code></td><td>Go template processing</td></tr><tr><td><code>processComponentSectionYAMLFunctions</code></td><td>YAML function processing</td></tr><tr><td><code>applyTerraformMetadataInheritance</code></td><td>Terraform-specific metadata inheritance</td></tr><tr><td><code>hasStackExplicitComponents</code></td><td>Detects stacks with components</td></tr><tr><td><code>hasStackImports</code></td><td>Detects stacks with imports</td></tr><tr><td><code>filterEmptyFinalStacks</code></td><td>Post-processing pruning</td></tr><tr><td><code>stackHasNonEmptyComponents</code></td><td>Checks for meaningful component content</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p><strong>Before:</strong></p>
<ul>
<li class=""><code>ExecuteDescribeStacks</code>: cyclomatic complexity <strong>247</strong>, cognitive complexity <strong>1252</strong></li>
<li class="">1,160 lines of deeply nested, copy-pasted code</li>
<li class="">Practically untestable at a unit level</li>
</ul>
<p><strong>After:</strong></p>
<ul>
<li class=""><code>ExecuteDescribeStacks</code> orchestrator: cyclomatic complexity <strong>10</strong></li>
<li class="">Max complexity across all extracted functions: cyclomatic <strong>20</strong>, cognitive <strong>22</strong> (<code>processComponentEntry</code>)</li>
<li class="">All pure helper functions covered at <strong>~96%</strong> by unit tests (remaining uncovered lines are unreachable defensive type-assertion guards)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>The public API is <strong>completely unchanged</strong>. <code>ExecuteDescribeStacks</code> accepts the same parameters and returns the same <code>map[string]any</code>. No migration is required.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="new-unit-tests">New Unit Tests<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction#new-unit-tests" class="hash-link" aria-label="Direct link to New Unit Tests" title="Direct link to New Unit Tests" translate="no">​</a></h2>
<p>80+ unit tests now cover every pure helper function at near-100%:</p>
<div class="language-go codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-go codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// Example: testing shouldFilterByStack in isolation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">func</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">TestShouldFilterByStack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">t </span><span class="token operator" style="color:rgb(127, 219, 202)">*</span><span class="token plain">testing</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">T</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    assert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">False</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">shouldFilterByStack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(173, 219, 103)">""</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"stacks/prod.yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// no filter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    assert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">False</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">shouldFilterByStack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(173, 219, 103)">"prod"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"stacks/prod.yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// matches name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    assert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">True</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">shouldFilterByStack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(173, 219, 103)">"dev"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"stacks/prod.yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">// no match</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>We're continuing to reduce complexity across the codebase. If you spot a function with high complexity, open an issue or PR. Check the <a href="https://atmos.tools/community/contributing" target="_blank" rel="noopener noreferrer" class="">contributing guide</a> to get started.</p>]]></content:encoded>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[3.5× Faster Deep Merge for Stack Processing]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos stack processing is now up to 3.5× faster for deep-merge operations — the hot path]]></description>
            <content:encoded><![CDATA[<p>Atmos stack processing is now up to <strong>3.5× faster</strong> for deep-merge operations — the hot path
executed thousands of times per <code>atmos describe component</code>, <code>atmos terraform plan</code>, and every
other command that reads stack configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Every time Atmos resolves a component — merging globals, imports, overrides, base-component
settings, environment variables, vars, and backend config — it performs a series of <em>deep merge</em>
operations on <code>map[string]any</code> trees.  The previous implementation called <code>mergo.Merge</code> on a
<strong>pre-copied</strong> duplicate of every input map, paying two costs per merge step:</p>
<ol>
<li class=""><strong>Full deep-copy</strong> of the source map (even keys that would never conflict with the destination).</li>
<li class=""><strong>Reflection-based traversal</strong> inside mergo to walk the copied map and assign values.</li>
</ol>
<p>The new implementation replaces this pattern with a single-pass, reflection-free <strong>native Go
merge</strong>:</p>
<ul>
<li class="">The first input is deep-copied once to create the initial accumulator.</li>
<li class="">Each subsequent input is merged directly — values are copied into the accumulator <em>only</em> when
they are stored as leaves (new keys, scalar overrides, or slice results).  Shared intermediate
<code>map[string]any</code> containers are recursed into without any allocation.</li>
</ul>
<p>This reduces <strong>N full pre-copies</strong> (one per input) down to <strong>1 pre-copy</strong> plus <strong>O(changed
leaves)</strong> incremental copies for a typical N-input merge.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="benchmark-results">Benchmark Results<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#benchmark-results" class="hash-link" aria-label="Direct link to Benchmark Results" title="Direct link to Benchmark Results" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain"># Micro-benchmark (5 inputs, 3 top-level keys)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Before  BenchmarkMerge-4             682 k iter /  5062 ns/op   ← original mergo</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">After   BenchmarkMerge-4            2514 k iter /  1427 ns/op   ← 3.5× faster</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"># Production-scale (10 inputs, 25 top-level sections, nested maps + list-of-map-of-list)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">After   BenchmarkMerge_ProductionScale-4   27K iter / 44000 ns/op / 10952 B/op / 189 allocs/op</span><br></span></code></pre></div></div>
<p>The 3.5× improvement is from the 5-input micro-benchmark.  The production-scale benchmark
(10 inheritance layers, 25 top-level sections including nested maps, tags, providers, backend,
lists, scalars, and deeply nested <code>node_groups</code> with per-group subnet lists — a
list-of-map-of-list pattern common in EKS and network stacks) shows ~44 µs per full stack
merge on a typical CI/CD server — well under any practical latency budget even for large
configurations with many stacks.</p>
<p>Run the production benchmark locally:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">go </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">test</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-run</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">^$ </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-bench</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">BenchmarkMerge_ProductionScale </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-benchmem</span><span class="token plain"> ./pkg/merge/</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></span></code></pre></div></div>
<p>The improvement scales with the number of inputs and the depth of the configuration tree —
exactly the shapes that matter most in production stacks with multiple layers of inheritance.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="semantic-compatibility">Semantic Compatibility<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#semantic-compatibility" class="hash-link" aria-label="Direct link to Semantic Compatibility" title="Direct link to Semantic Compatibility" translate="no">​</a></h2>
<p>The new implementation preserves the same merge semantics as the mergo-based code for the
common cases, including all three list merge strategies (<code>replace</code>, <code>append</code>, <code>merge</code>) and the
<code>WithSliceDeepCopy</code> / <code>WithAppendSlice</code> behaviours.</p>
<p>Cross-validation tests (opt-in via <code>go test -tags compare_mergo ./pkg/merge/...</code>) verify
the native implementation matches mergo for the core cases.  Where behavior intentionally
differs, the tests document it as a <strong>defined contract</strong> (see below).</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="edge-case-slicedeepcopy-result-length">Edge case: <code>sliceDeepCopy</code> result length<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#edge-case-slicedeepcopy-result-length" class="hash-link" aria-label="Direct link to edge-case-slicedeepcopy-result-length" title="Direct link to edge-case-slicedeepcopy-result-length" translate="no">​</a></h3>
<p>When <code>sliceDeepCopy</code> is active and the source list is <strong>longer</strong> than the destination list,
the merged result keeps the overlapping merged positions and appends deep-copied source tail
elements, so the result length grows to <code>max(len(dst), len(src))</code>.  This matches mergo's
<code>WithSliceDeepCopy</code> behavior and is cross-validated against mergo in
<a href="https://github.com/cloudposse/atmos/blob/main/pkg/merge/merge_compare_mergo_test.go" target="_blank" rel="noopener noreferrer" class=""><code>merge_compare_mergo_test.go</code></a>
(run with <code>go test -tags compare_mergo ./pkg/merge/...</code>).
See <a href="https://github.com/cloudposse/atmos/blob/main/docs/fixes/2026-03-19-deep-merge-native-fixes.md" target="_blank" rel="noopener noreferrer" class=""><code>docs/fixes/2026-03-19-deep-merge-native-fixes.md</code></a>
for full edge-case documentation.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="partial-mergo-replacement">Partial mergo replacement<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#partial-mergo-replacement" class="hash-link" aria-label="Direct link to Partial mergo replacement" title="Direct link to Partial mergo replacement" translate="no">​</a></h3>
<p>This change replaces the hot-path deep merge in <code>pkg/merge/merge.go</code>.  The <code>mergo</code> library is
still used in two lower-traffic call sites:</p>
<ul>
<li class=""><code>pkg/merge/merge_yaml_functions.go</code> — YAML function merge helpers</li>
<li class=""><code>pkg/devcontainer/config_loader.go</code> — devcontainer config loading</li>
</ul>
<p>Migration of these remaining sites is tracked in <a href="https://github.com/cloudposse/atmos/issues/2242" target="_blank" rel="noopener noreferrer" class="">issue #2242</a>; the dependency will be
removed once those two call sites are ported.  Until then, a future CVE in mergo could
still affect atmos.  Follow <a href="https://github.com/cloudposse/atmos/issues/2242" target="_blank" rel="noopener noreferrer" class="">#2242</a> for progress.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>No action required — the improvement is automatic from this release onward.  If you notice
any difference in merge results, please open an issue.</p>]]></content:encoded>
            <category>Enhancement</category>
            <category>Core</category>
        </item>
        <item>
            <title><![CDATA[Introducing Structured Component Dependencies]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now supports a new dependencies.components format for declaring explicit component dependencies with support for cross-type dependencies, file/folder watching, and stack templates.]]></description>
            <content:encoded><![CDATA[<p>Atmos now supports a new <code>dependencies.components</code> format for declaring explicit component dependencies with support for cross-type dependencies, file/folder watching, and stack templates.</p>
<div class="intro"><p>Declare component dependencies explicitly with the new structured format that supports cross-type dependencies, file/folder watching, and dynamic stack templates.</p></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The new <code>dependencies.components</code> section provides a structured way to declare component dependencies:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> rds</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .vars.tenant }}-{{ .vars.environment }}-prod"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> configs/app.json</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="key-features">Key Features<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features" translate="no">​</a></h3>
<ul>
<li class=""><strong>Cross-type dependencies</strong>: Terraform components can depend on Helmfile components using the <code>kind</code> field</li>
<li class=""><strong>File/folder watching</strong>: Trigger rebuilds when config files change with <code>kind: file</code> or <code>kind: folder</code></li>
<li class=""><strong>Template support</strong>: Dynamic stack references with Go templates</li>
<li class=""><strong>Inheritance</strong>: Dependencies are replaced during stack inheritance by default, or appended when <code>list_merge_strategy: append</code> is configured</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="cross-type-dependencies">Cross-Type Dependencies<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#cross-type-dependencies" class="hash-link" aria-label="Direct link to Cross-Type Dependencies" title="Direct link to Cross-Type Dependencies" translate="no">​</a></h3>
<p>The <code>kind</code> field allows you to declare dependencies on components of different types:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc                    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># terraform (default)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ingress</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> helmfile                    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># helmfile component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> platform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">stack</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="file-and-folder-dependencies">File and Folder Dependencies<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#file-and-folder-dependencies" class="hash-link" aria-label="Direct link to File and Folder Dependencies" title="Direct link to File and Folder Dependencies" translate="no">​</a></h3>
<p>Track external files and folders that affect your component:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">lambda</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">dependencies</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> configs/lambda</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">settings.json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> folder</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> src/lambda/handler</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="coming-soon">Coming Soon<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#coming-soon" class="hash-link" aria-label="Direct link to Coming Soon" title="Direct link to Coming Soon" translate="no">​</a></h2>
<p>In Q1 2026, we're adding <strong>automatic dependency detection</strong> from YAML functions. Dependencies will be inferred automatically from <code>!terraform.output</code> and <code>!terraform.state</code> usage—no manual configuration needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-started">Get Started<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>See the <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/dependencies/components">Component Dependencies documentation</a> for complete details.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[EKS Kubeconfig Authentication: Native kubectl Access Without the AWS CLI]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now supports native EKS kubeconfig authentication through the integrations system. When you authenticate with an identity, Atmos automatically generates kubeconfig entries for linked EKS clusters, giving you seamless kubectl access without requiring the AWS CLI.]]></description>
            <content:encoded><![CDATA[<p>Atmos now supports native EKS kubeconfig authentication through the integrations system. When you authenticate with an identity, Atmos automatically generates kubeconfig entries for linked EKS clusters, giving you seamless kubectl access without requiring the AWS CLI.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>atmos auth</code> system now supports EKS integrations that automatically provision kubeconfig when you log in:</p>
<ul>
<li class=""><strong><code>aws/eks</code> integration kind</strong> - Configure EKS clusters as integrations linked to identities</li>
<li class=""><strong><code>atmos aws eks token</code> command</strong> - kubectl exec credential plugin for short-lived token generation</li>
<li class=""><strong>Enhanced <code>atmos aws eks update-kubeconfig</code></strong> - New <code>--integration</code> and <code>--identity</code> flags for Go SDK-based kubeconfig generation</li>
<li class=""><strong>Automatic cleanup</strong> - Kubeconfig entries are removed when you log out</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, accessing EKS clusters required installing the AWS CLI, running <code>aws eks update-kubeconfig</code>, and managing credentials separately. Now everything is managed through your <code>atmos.yaml</code> configuration:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">integrations</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">dev/eks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws/eks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">via</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">admin</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">cluster</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">region</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">alias</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dev</span><br></span></code></pre></div></div>
<p>A single <code>atmos auth login dev-admin</code> provisions both AWS credentials and kubeconfig entries. kubectl automatically calls <code>atmos aws eks token</code> for fresh tokens when needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<ol>
<li class="">Add an EKS integration to your <code>atmos.yaml</code> linking a cluster to an identity</li>
<li class="">Run <code>atmos auth login &lt;identity&gt;</code> - kubeconfig is auto-provisioned</li>
<li class="">Use <code>kubectl --context &lt;alias&gt; get pods</code> - tokens are generated automatically</li>
</ol>
<p>See the <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/tutorials/eks-kubeconfig-authentication">EKS Kubeconfig Authentication Tutorial</a> for a complete setup guide.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have feedback or questions? Open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Required Identities for Multi-Account Components]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities</guid>
            <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos identities now support required: true, enabling automatic authentication of multiple identities before Terraform runs — without prompting.]]></description>
            <content:encoded><![CDATA[<p>Atmos identities now support <code>required: true</code>, enabling automatic authentication of multiple identities before Terraform runs — without prompting.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When Terraform components use multiple AWS provider aliases for multi-account patterns (e.g., hub-spoke networking), each provider assumes a different IAM role. In CI environments with OIDC authentication, only the primary identity's profile was written to the shared credentials file. The additional provider aliases failed because their AWS profiles didn't exist.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-solution">The Solution<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities#the-solution" class="hash-link" aria-label="Direct link to The Solution" title="Direct link to The Solution" translate="no">​</a></h2>
<p>Identities can now be marked as <code>required: true</code>. Before Terraform runs, Atmos automatically authenticates every required identity and writes their profiles to the shared credentials file — no prompting, no selection.</p>
<p>The <code>required</code> field is orthogonal to <code>default</code>:</p>
<ul>
<li class=""><strong><code>default: true</code></strong> — sets the PRIMARY identity (<code>AWS_PROFILE</code>, credential env vars). Only one allowed.</li>
<li class=""><strong><code>required: true</code></strong> — auto-authenticate without prompting. Multiple allowed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example">Example<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">identities</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">core-network</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws/assume</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">role</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">       </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Primary identity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Auto-authenticate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ... via, principal, etc. (see full identity config below)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">plat-prod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws/assume</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">role</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Auto-authenticate as secondary</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ... via, principal, etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">plat-staging</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws/assume</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">role</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">required</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Auto-authenticate as secondary</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ... via, principal, etc.</span><br></span></code></pre></div></div>
<blockquote>
<p>This snippet highlights the <code>default</code> and <code>required</code> fields only.
Each identity also needs <code>via</code> and <code>principal</code> configuration — see the full
<a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth/identities">identities documentation</a> for complete <code>aws/assume-role</code> examples.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<ol>
<li class="">Atmos authenticates the <code>default</code> identity as the primary (sets <code>AWS_PROFILE</code> and default credentials).</li>
<li class="">Atmos finds all identities with <code>required: true</code> and authenticates each one.</li>
<li class="">All profiles are written to the shared credentials file, making them available for Terraform provider aliases.</li>
<li class="">Failures for non-primary required identities are non-fatal — Atmos logs a warning and continues.</li>
<li class="">Terraform runs with all profiles available, so multi-account provider aliases resolve correctly.</li>
</ol>
<p>The <code>--identity</code> CLI flag takes precedence over <code>default</code> for primary selection, but required identities are still authenticated as secondary.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Warn When Vendoring from an Archived GitHub Repository]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo</guid>
            <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now emits a warning when you vendor a component or stack source from a GitHub repository that has been archived—helping you catch stale dependencies before they cause problems in production.]]></description>
            <content:encoded><![CDATA[<p>Atmos now emits a warning when you vendor a component or stack source from a GitHub repository that has been archived—helping you catch stale dependencies before they cause problems in production.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>When <code>atmos vendor pull</code> fetches a component or stack source from GitHub, it now calls the GitHub Repositories API to check whether the repository is archived. If it is, Atmos emits a warning:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">WARN GitHub repository is archived and no longer actively maintained.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     Vendoring from an archived repository may include outdated or unsupported code.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     repository=cloudposse/terraform-null-label component=null-label</span><br></span></code></pre></div></div>
<p>The check is <strong>best-effort</strong>: if the GitHub API is unavailable (network error, rate limit, missing token), the check is skipped and a <code>TRACE</code>-level message is logged—vendoring proceeds normally. Each unique repository incurs at most one API call per run, bounded by the per-repo timeout (default 5s, configurable via <code>ATMOS_GITHUB_ARCHIVED_CHECK_TIMEOUT</code>). In environments with many unique repositories, the total latency is at most <code>timeout × number_of_unique_repos</code>.</p>
<p>In air-gapped or offline environments, set <code>ATMOS_GITHUB_ARCHIVED_CHECK_TIMEOUT=0s</code> to skip the check entirely (no API call is made, no error is logged). To shorten the per-repo timeout, use a smaller value such as <code>ATMOS_GITHUB_ARCHIVED_CHECK_TIMEOUT=2s</code>.</p>
<p>The warning applies to both vendor manifest sources (<code>vendor.yaml</code>) and component vendoring configs (<code>component.yaml</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>GitHub-archived repositories are no longer actively maintained. When you vendor from an archived repo, you may inadvertently pull in code with:</p>
<ul>
<li class="">Known security vulnerabilities that will never be patched</li>
<li class="">Incompatibilities with newer versions of your other dependencies</li>
<li class="">No upstream support if issues are discovered</li>
</ul>
<p>Without this warning, there's no signal that the repository is in a frozen state. Engineers discovering archived dependencies late in a release cycle—after security scans or compliance reviews—face expensive last-minute changes. The earlier you catch a stale dependency, the cheaper it is to address.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Atmos calls the GitHub REST API (<code>GET /repos/{owner}/{repo}</code>) and inspects the <code>archived</code> field. The check runs <strong>once per unique owner/repo pair</strong> across all sources and components in a single run — even if multiple vendor entries reference different subdirectories or use different URI formats for the same repository. Results are cached in memory so no duplicate API calls are made.</p>
<p>The URI parser handles all common vendor source formats:</p>
<table><thead><tr><th>Format</th><th>Example</th></tr></thead><tbody><tr><td>Plain go-getter</td><td><code>github.com/org/repo//path?ref=v1</code></td></tr><tr><td>HTTPS</td><td><code>https://github.com/org/repo.git//path</code></td></tr><tr><td>go-getter force prefix</td><td><code>git::https://github.com/org/repo</code></td></tr><tr><td>SSH scheme</td><td><code>ssh://git@github.com/org/repo.git</code></td></tr><tr><td>SCP-style</td><td><code>git@github.com:org/repo.git//path</code></td></tr><tr><td><code>github://</code> scheme</td><td><code>github://org/repo/subdir@ref</code></td></tr></tbody></table>
<p>Non-GitHub sources (OCI registries, S3, local paths, GitLab, Bitbucket) are silently skipped.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/warn-vendor-archived-repo#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>If you encounter a false positive or have feedback on the warning message, please <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">open an issue</a>.</p>]]></content:encoded>
            <category>Enhancement</category>
        </item>
        <item>
            <title><![CDATA[AI-Powered Analysis for Atmos Commands with the Global --ai Flag]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Add --ai to any Atmos command and get instant AI-powered analysis of the output. Successful plans get]]></description>
            <content:encoded><![CDATA[<p>Add <code>--ai</code> to any Atmos command and get instant AI-powered analysis of the output. Successful plans get
summarized, errors get explained with step-by-step fixes — zero workflow changes required.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<ol>
<li class="">Run any Atmos command with <code>--ai</code></li>
<li class="">The command executes normally — output streams to your terminal in real-time</li>
<li class="">After the command completes, the captured output is sent to the AI provider</li>
<li class="">The AI analysis appears below the command output</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="plan-analysis">Plan Analysis<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#plan-analysis" class="hash-link" aria-label="Direct link to Plan Analysis" title="Direct link to Plan Analysis" translate="no">​</a></h2>
<div><div class="terminal"><div class="window-bar"><div class="window-controls"><div class="control-dot close-dot"></div><div class="control-dot minimize-dot"></div><div class="control-dot maximize-dot"></div></div><h1>atmos terraform plan --ai</h1></div><div class="viewport"><div><div class="language-console codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-console codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform plan vpc -s ue1-prod --ai</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Terraform will perform the following actions:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  # null_resource.vpc will be created</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  + resource "null_resource" "vpc" {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + id       = (known after apply)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      + triggers = {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          + "availability_zones"  = "us-east-1a,us-east-1b,us-east-1c"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          + "environment"         = "production"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          + "nat_gateway_enabled" = "true"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          + "vpc_cidr"            = "10.10.0.0/16"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Plan: 1 to add, 0 to change, 0 to destroy.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ AI analysis complete</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Terraform Plan Summary:  vpc  in  ue1-prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ### Plan Succeeded — 1 Resource to Create</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Metric     │ Value</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ────────────┼───────</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   To Add     │ 1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   To Change  │ 0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   To Destroy │ 0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  A  null_resource.vpc  will be created with CIDR  10.10.0.0/16 ,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  3 availability zones, and NAT Gateways enabled.</span><br></span></code></pre></div></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="error-explanation">Error Explanation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#error-explanation" class="hash-link" aria-label="Direct link to Error Explanation" title="Direct link to Error Explanation" translate="no">​</a></h2>
<p>When commands fail, the AI explains the root cause and provides actionable fixes:</p>
<div><div class="terminal"><div class="window-bar"><div class="window-controls"><div class="control-dot close-dot"></div><div class="control-dot minimize-dot"></div><div class="control-dot maximize-dot"></div></div><h1>atmos terraform plan --ai (error)</h1></div><div class="viewport"><div><div class="language-console codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-console codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform plan vpc -s ue1-pro --ai</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ AI analysis complete</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Component Not Found Error</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Atmos cannot locate the  vpc  component within the  ue1-pro  stack.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Quick Fix</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Check                           │ Command</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ─────────────────────────────────┼────────────────────────────────────</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Stack name is correct           │  atmos list stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Component is defined in stack   │  atmos list components -s ue1-pro</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   No YAML syntax errors           │  atmos validate stacks</span><br></span></code></pre></div></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="domain-specific-analysis-with---skill">Domain-Specific Analysis with <code>--skill</code><a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#domain-specific-analysis-with---skill" class="hash-link" aria-label="Direct link to domain-specific-analysis-with---skill" title="Direct link to domain-specific-analysis-with---skill" translate="no">​</a></h2>
<p>Pair <code>--ai</code> with <code>--skill</code> for domain-specific expertise. Combine multiple skills with commas or repeated flags:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Terraform expertise for plan analysis</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--skill</span><span class="token plain"> atmos-terraform</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Multiple skills (comma-separated)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--skill</span><span class="token plain"> atmos-terraform,atmos-stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Multiple skills (repeated flag)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--skill</span><span class="token plain"> atmos-terraform </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--skill</span><span class="token plain"> atmos-stacks</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="enable-via-environment-variable">Enable via Environment Variable<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#enable-via-environment-variable" class="hash-link" aria-label="Direct link to Enable via Environment Variable" title="Direct link to Enable via Environment Variable" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Enable for all commands in the session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_AI</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">true</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># With skills</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_AI</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">true </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_SKILL</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">atmos-terraform,atmos-stacks atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="works-with-everything">Works with Everything<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#works-with-everything" class="hash-link" aria-label="Direct link to Works with Everything" title="Direct link to Works with Everything" translate="no">​</a></h2>
<p>The <code>--ai</code> flag works with <strong>any</strong> Atmos command:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform apply vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> ue1-prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe stacks </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos validate stacks </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list components </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="try-it">Try It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#try-it" class="hash-link" aria-label="Direct link to Try It" title="Direct link to Try It" translate="no">​</a></h2>
<div class="action-card"><h2>Explore the AI Example</h2><div><p>Try <code>--ai</code> and <code>--skill</code> with a complete multi-region infrastructure project using mock components — no cloud credentials required.</p><div><a class="button button--lg button--primary" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/examples/ai">Browse Example</a></div></div><div class="action-card__cta-group"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="learn-more">Learn More<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai">AI Configuration</a> — Full configuration reference</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/global-flags">Global Flags</a> — All global flags including <code>--ai</code> and <code>--skill</code></li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/skills">AI Skills</a> — Available skills for domain-specific analysis</li>
</ul>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Global `ignore_missing_template_values` for Stack Imports]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values</guid>
            <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now supports a global templates.settings.ignoremissingtemplatevalues option in atmos.yaml, eliminating the need to set ignoremissingtemplatevalues: true on every individual catalog import.]]></description>
            <content:encoded><![CDATA[<p>Atmos now supports a global <code>templates.settings.ignore_missing_template_values</code> option in <code>atmos.yaml</code>, eliminating the need to set <code>ignore_missing_template_values: true</code> on every individual catalog import.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Previously, if you used Go templates in imported stack manifests (e.g. for dynamic component generation or external systems like Datadog), you had to annotate every import:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"catalog/datadog-monitors"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"catalog/eks-cluster-tmpl"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"catalog/rds-cluster-tmpl"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ... repeat for every catalog import</span><br></span></code></pre></div></div>
<p>For teams with hundreds of catalog imports, this was a maintenance burden.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-fix">The Fix<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>Set it once, globally, in <code>atmos.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">templates</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p>That's it. All imports across your entire project will now silently skip missing template values instead of failing.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Many teams use Go templates in stack manifests to dynamically generate Atmos components (e.g. multi-flavor clusters, per-region replicas), or to pass configuration to external monitoring/observability systems (e.g. Datadog, Grafana). In these cases, not every template variable needs to be provided by Atmos — some are resolved later by the external system.</p>
<p>The <code>ignore_missing_template_values</code> setting instructs Atmos to replace any missing template variable with an empty string rather than returning an error. Setting this globally removes the friction of adding it to every import.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="per-import-override-still-works">Per-Import Override Still Works<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#per-import-override-still-works" class="hash-link" aria-label="Direct link to Per-Import Override Still Works" title="Direct link to Per-Import Override Still Works" translate="no">​</a></h2>
<p>The global setting is a default. Individual imports can still override it in either direction:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">templates</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># global default</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/prod.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"catalog/strict-config"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">ignore_missing_template_values</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># override: fail on missing values for this import</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="difference-from-skip_templates_processing">Difference from <code>skip_templates_processing</code><a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#difference-from-skip_templates_processing" class="hash-link" aria-label="Direct link to difference-from-skip_templates_processing" title="Direct link to difference-from-skip_templates_processing" translate="no">​</a></h2>
<table><thead><tr><th>Setting</th><th>Behavior</th></tr></thead><tbody><tr><td><code>skip_templates_processing: true</code></td><td>Skips template processing entirely — templates are preserved as-is</td></tr><tr><td><code>ignore_missing_template_values: true</code></td><td>Processes templates but silently ignores missing variables</td></tr></tbody></table>
<p>Use <code>skip_templates_processing</code> when an import contains Go template syntax meant for another system. Use <code>ignore_missing_template_values</code> when you want Atmos to process your templates but tolerate missing variables.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>We'd love to hear your feedback! Please <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">open an issue</a> if you have questions or suggestions.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Introducing Atmos AI: Your Infrastructure-Aware AI Assistant]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai</guid>
            <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to introduce Atmos AI, an intelligent assistant built directly into Atmos CLI that understands your infrastructure-as-code like no other AI assistant can.]]></description>
            <content:encoded><![CDATA[<p>We're excited to introduce <strong>Atmos AI</strong>, an intelligent assistant built directly into Atmos CLI that understands your infrastructure-as-code like no other AI assistant can.</p>
<p>Unlike general-purpose AI coding assistants, Atmos AI has deep, native understanding of Atmos stacks, components, inheritance patterns, and infrastructure workflows. It's not just an AI that knows about code—it's an AI that truly understands <em>your infrastructure</em>.</p>
<p>With support for 7 AI providers (including local/offline Ollama), persistent sessions with full conversation memory, tool execution with granular permissions and persistent permission cache, specialized skills for specific tasks, and seamless IDE integration via MCP—Atmos AI brings the productivity patterns of industry-leading AI systems to infrastructure management.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Infrastructure-as-code management is complex. Engineers lose hours searching documentation, debugging YAML configurations, understanding stack inheritance across dozens of files, and onboarding team members. The problem isn't lack of tools—it's the <strong>cognitive overhead</strong> of managing complex infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-solution-atmos-ai">The Solution: Atmos AI<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#the-solution-atmos-ai" class="hash-link" aria-label="Direct link to The Solution: Atmos AI" title="Direct link to The Solution: Atmos AI" translate="no">​</a></h2>
<p>Atmos AI solves this through <strong>infrastructure-aware intelligence</strong>. It's like having an expert Atmos engineer available 24/7, ready to analyze your stacks, validate configurations, answer questions, and help with best practices.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="see-it-in-action">See It in Action<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#see-it-in-action" class="hash-link" aria-label="Direct link to See It in Action" title="Direct link to See It in Action" translate="no">​</a></h3>
<p>Ask a question about your infrastructure and Atmos AI automatically inspects your stacks, components, and configuration:</p>
<div><div class="terminal"><div class="window-bar"><div class="window-controls"><div class="control-dot close-dot"></div><div class="control-dot minimize-dot"></div><div class="control-dot maximize-dot"></div></div><h1>atmos ai ask (Claude)</h1></div><div class="viewport"><div><div class="language-console codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-console codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos ai ask "what stacks and components do we have in the infra?"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">👽 Thinking...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  I'll list all the available stacks and components in your infrastructure.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Based on the infrastructure configuration, here are the stacks and components:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Stacks (4 total)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  1. **ue1-network** - Network stack in us-east-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  2. **ue1-prod** - Production stack in us-east-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  3. **uw2-network** - Network stack in us-west-2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  4. **uw2-prod** - Production stack in us-west-2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Components by Stack</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ### ue1-network</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/attachment - Transit Gateway attachment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/hub - Transit Gateway hub</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • vpc - Virtual Private Cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ### ue1-prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/attachment - Transit Gateway attachment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • vpc - Virtual Private Cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ### uw2-network</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/attachment - Transit Gateway attachment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/cross-region-hub-connector - Cross-region Transit Gateway connector</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • vpc - Virtual Private Cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ### uw2-prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • tgw/attachment - Transit Gateway attachment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  • vpc - Virtual Private Cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ## Summary</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Your infrastructure is organized across two AWS regions (us-east-1 and us-west-2),</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  with dedicated network and production stacks in each region. The network stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  contain Transit Gateway hubs for network connectivity, while the production stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  use Transit Gateway attachments to connect to the network infrastructure. All stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  include VPC components for network isolation.</span><br></span></code></pre></div></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="what-makes-atmos-ai-different">What Makes Atmos AI Different?<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#what-makes-atmos-ai-different" class="hash-link" aria-label="Direct link to What Makes Atmos AI Different?" title="Direct link to What Makes Atmos AI Different?" translate="no">​</a></h3>
<ul>
<li class=""><strong>Deep Atmos Understanding</strong> — Knows stack structure, inheritance patterns, component relationships, and provides context-aware recommendations.</li>
<li class=""><strong>Full Conversation Memory</strong> — Remembers entire chat history within sessions. Resume conversations days or weeks later with full context.</li>
<li class=""><strong>Tool Execution</strong> — Analyzes infrastructure automatically via read-only operations, real-time YAML/Terraform validation, and a granular permission system.</li>
<li class=""><strong>Multi-Provider Support</strong> — 7 providers including local/offline Ollama. Switch providers mid-conversation with Ctrl+P.</li>
<li class=""><strong>Persistent Sessions</strong> — SQLite-backed storage with named sessions, auto-compact, and cross-platform support.</li>
<li class=""><strong>Non-Interactive Execution</strong> — Run AI prompts programmatically for scripting and CI/CD with structured JSON output.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="key-features">Key Features<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-infrastructure-aware-intelligence">1. Infrastructure-Aware Intelligence<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#1-infrastructure-aware-intelligence" class="hash-link" aria-label="Direct link to 1. Infrastructure-Aware Intelligence" title="Direct link to 1. Infrastructure-Aware Intelligence" translate="no">​</a></h3>
<p>Atmos AI has <strong>native tools</strong> to inspect your infrastructure:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">You: What VPC CIDR does production use?</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">AI: Let me check your configuration</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Executes: atmos describe component vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod-use1-network</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Your production VPC uses CIDR </span><span class="token number" style="color:rgb(247, 140, 108)">10.2</span><span class="token plain">.0.0/16 with public subnets,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    private subnets, and NAT Gateways enabled </span><span class="token keyword" style="color:rgb(127, 219, 202)">in</span><span class="token plain"> all AZs.</span><br></span></code></pre></div></div>
<p>Available tools include <code>atmos_describe_component</code>, <code>atmos_list_stacks</code>, <code>atmos_validate_stacks</code>, <code>validate_file_lsp</code>, file operations, and web search. See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/tools">Tool System documentation</a> for the full list.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-real-time-validation-with-lsp">2. Real-Time Validation with LSP<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#2-real-time-validation-with-lsp" class="hash-link" aria-label="Direct link to 2. Real-Time Validation with LSP" title="Direct link to 2. Real-Time Validation with LSP" translate="no">​</a></h3>
<p>Atmos AI integrates with Language Server Protocol to provide <strong>IDE-quality validation</strong> directly in the chat — catching typos, deprecated properties, and schema violations in YAML, Terraform, and HCL files.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-persistent-sessions-with-full-memory">3. Persistent Sessions with Full Memory<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#3-persistent-sessions-with-full-memory" class="hash-link" aria-label="Direct link to 3. Persistent Sessions with Full Memory" title="Direct link to 3. Persistent Sessions with Full Memory" translate="no">​</a></h3>
<p>Unlike basic chatbots that forget context, Atmos AI <strong>remembers everything</strong> within a session. Start an architecture discussion on Monday, resume Tuesday with full context, and reference earlier decisions a week later — all with the same named session.</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai chat </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--session</span><span class="token plain"> vpc-migration</span><br></span></code></pre></div></div>
<p>Sessions are stored in SQLite with visual session picker (Ctrl+L), provider awareness, and auto-compact for extended conversations. See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/sessions">Sessions documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="4-specialized-ai-skills">4. Specialized AI Skills<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#4-specialized-ai-skills" class="hash-link" aria-label="Direct link to 4. Specialized AI Skills" title="Direct link to 4. Specialized AI Skills" translate="no">​</a></h3>
<p>Atmos AI provides <strong>21+ specialized skills</strong> you can install from the marketplace:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Install all official skills with one command</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai skill </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> cloudposse/atmos</span><br></span></code></pre></div></div>
<p>Skills include <strong>atmos-terraform</strong>, <strong>atmos-stacks</strong>, <strong>atmos-validation</strong>, <strong>atmos-components</strong>, <strong>atmos-config</strong>, and many more — each with tailored prompts and tool access for its domain.</p>
<p><strong>Switch skills with Ctrl+A</strong> during conversations! See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/skills">AI Skills documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="5-multi-provider-support">5. Multi-Provider Support<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#5-multi-provider-support" class="hash-link" aria-label="Direct link to 5. Multi-Provider Support" title="Direct link to 5. Multi-Provider Support" translate="no">​</a></h3>
<p>Choose the right AI for your needs:</p>
<table><thead><tr><th>Provider</th><th>Best For</th><th>Privacy</th></tr></thead><tbody><tr><td><strong>Anthropic (Claude)</strong></td><td>Complex reasoning, analysis</td><td>Cloud</td></tr><tr><td><strong>OpenAI (GPT)</strong></td><td>Code generation, refactoring</td><td>Cloud</td></tr><tr><td><strong>Google (Gemini)</strong></td><td>Large context windows</td><td>Cloud</td></tr><tr><td><strong>xAI (Grok)</strong></td><td>Real-time knowledge</td><td>Cloud</td></tr><tr><td><strong>Ollama (Local)</strong></td><td><strong>Complete privacy, offline</strong></td><td><strong>100% Local</strong></td></tr><tr><td><strong>AWS Bedrock</strong></td><td>Enterprise, AWS-native</td><td>AWS</td></tr><tr><td><strong>Azure OpenAI</strong></td><td>Enterprise, Azure-native</td><td>Azure</td></tr></tbody></table>
<p><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers#ollama-installation">Ollama</a> runs AI models <strong>entirely on your machine</strong> — zero API costs, complete privacy, offline capable, and compliance ready. Enterprise teams can use AWS Bedrock or Azure OpenAI for data residency, VPC isolation, and audit logging.</p>
<p>See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers">AI Providers documentation</a> for setup instructions.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="6-project-instructions-atmosmd">6. Project Instructions (ATMOS.md)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#6-project-instructions-atmosmd" class="hash-link" aria-label="Direct link to 6. Project Instructions (ATMOS.md)" title="Direct link to 6. Project Instructions (ATMOS.md)" translate="no">​</a></h3>
<p>Provide <strong>project-specific context</strong> to the AI across all sessions via an <code>ATMOS.md</code> file — human-readable Markdown that's version-controlled with your repo. Include your organization's naming conventions, common commands, stack patterns, and CIDR allocations.</p>
<p>See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/instructions">Project Instructions documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="7-model-context-protocol-mcp-integration">7. Model Context Protocol (MCP) Integration<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#7-model-context-protocol-mcp-integration" class="hash-link" aria-label="Direct link to 7. Model Context Protocol (MCP) Integration" title="Direct link to 7. Model Context Protocol (MCP) Integration" translate="no">​</a></h3>
<p>Use Atmos tools from <strong>any MCP-compatible client</strong> — Claude Desktop, VSCode/Cursor, or custom clients:</p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"mcpServers"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"atmos"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"command"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"atmos"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"args"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"mcp"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"start"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>Learn more: <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai/mcp-server">MCP Server documentation</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="8-permission-system">8. Permission System<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#8-permission-system" class="hash-link" aria-label="Direct link to 8. Permission System" title="Direct link to 8. Permission System" translate="no">​</a></h3>
<p>A <strong>three-tier security model</strong> protects your infrastructure:</p>
<ul>
<li class=""><strong>Allowed Tools</strong> — Execute without prompting (e.g., <code>atmos_describe_component</code>, <code>atmos_list_stacks</code>, <code>read_file</code>)</li>
<li class=""><strong>Restricted Tools</strong> — Require confirmation (e.g., <code>edit_file</code>, <code>write_stack_file</code>, <code>write_component_file</code>)</li>
<li class=""><strong>Blocked Tools</strong> — Never execute (e.g., <code>execute_bash_command</code>, <code>execute_atmos_command</code>)</li>
</ul>
<p>Permission decisions persist across sessions in <code>.atmos/ai.settings.local.json</code>, reducing prompt fatigue by 80%+. Every tool execution is logged with timestamp, user, and context.</p>
<p>See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/tools">Tool System documentation</a> for configuration details.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="9-non-interactive-execution-and-cicd-integration">9. Non-Interactive Execution and CI/CD Integration<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#9-non-interactive-execution-and-cicd-integration" class="hash-link" aria-label="Direct link to 9. Non-Interactive Execution and CI/CD Integration" title="Direct link to 9. Non-Interactive Execution and CI/CD Integration" translate="no">​</a></h3>
<p>Execute AI prompts programmatically with structured output:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Simple execution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">exec</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"List all production stacks"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># JSON output for parsing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">exec</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"Analyze VPC configuration"</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain"> analysis.json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># CI/CD integration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">result</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token variable" style="color:rgb(214, 222, 235)">$(</span><span class="token variable" style="color:rgb(214, 222, 235)">atmos ai </span><span class="token variable builtin class-name" style="color:rgb(255, 203, 139)">exec</span><span class="token variable" style="color:rgb(214, 222, 235)"> </span><span class="token variable string" style="color:rgb(173, 219, 103)">"Check for security issues"</span><span class="token variable" style="color:rgb(214, 222, 235)"> </span><span class="token variable parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token variable" style="color:rgb(214, 222, 235)"> json</span><span class="token variable" style="color:rgb(214, 222, 235)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">if</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"</span><span class="token string variable" style="color:rgb(214, 222, 235)">$result</span><span class="token string" style="color:rgb(173, 219, 103)">"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">|</span><span class="token plain"> jq </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-e</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'.success == false'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(127, 219, 202)">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">exit</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">fi</span><br></span></code></pre></div></div>
<p><strong>JSON Output Structure:</strong></p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"success"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"response"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"Analysis complete..."</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"tool_calls"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token property" style="color:rgb(128, 203, 196)">"tool"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"atmos_list_stacks"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">"success"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"tokens"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token property" style="color:rgb(128, 203, 196)">"prompt"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">120</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">"completion"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">80</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">"cached"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"metadata"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token property" style="color:rgb(128, 203, 196)">"model"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"claude-sonnet-4-6"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">"provider"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"anthropic"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>Supports multiple output formats (JSON, text, markdown), standard exit codes, stdin piping, and session context for multi-turn scripts. Learn more: <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/ai/exec">atmos ai exec documentation</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="10-token-caching-for-cost-savings">10. Token Caching for Cost Savings<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#10-token-caching-for-cost-savings" class="hash-link" aria-label="Direct link to 10. Token Caching for Cost Savings" title="Direct link to 10. Token Caching for Cost Savings" translate="no">​</a></h3>
<p>Atmos AI supports <strong>prompt caching</strong> to dramatically reduce API costs — up to 90% savings by reusing frequently-sent content like system prompts and project instructions.</p>
<table><thead><tr><th>Provider</th><th>Caching Discount</th></tr></thead><tbody><tr><td><strong>Anthropic</strong></td><td>90%</td></tr><tr><td><strong>OpenAI / Azure</strong></td><td>50%</td></tr><tr><td><strong>Gemini</strong></td><td>Free</td></tr><tr><td><strong>Grok</strong></td><td>75%</td></tr><tr><td><strong>Bedrock</strong></td><td>Up to 90%</td></tr></tbody></table>
<p>Most providers cache automatically. For Anthropic, enable explicit cache markers in <code>atmos.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">ai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">providers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">anthropic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cache_system_prompt</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cache_project_instructions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p>Learn more: <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers#token-caching">Token Caching documentation</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="getting-started">Getting Started<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-configure-atmos-ai">1. Configure Atmos AI<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#1-configure-atmos-ai" class="hash-link" aria-label="Direct link to 1. Configure Atmos AI" title="Direct link to 1. Configure Atmos AI" translate="no">​</a></h3>
<p>Add to your <code>atmos.yaml</code>:</p>
<div><div class="file"><div class="tab"><h1><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="gear" class="svg-inline--fa fa-gear fa-1x" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z"></path></svg><span>atmos.yaml</span></h1></div><div class="viewport"><div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">ai</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">default_provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"anthropic"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">providers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">anthropic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"claude-sonnet-4-6"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!env</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"ANTHROPIC_API_KEY"</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-set-up-your-provider">2. Set Up Your Provider<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#2-set-up-your-provider" class="hash-link" aria-label="Direct link to 2. Set Up Your Provider" title="Direct link to 2. Set Up Your Provider" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># For Claude (Anthropic)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ANTHROPIC_API_KEY</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token string" style="color:rgb(173, 219, 103)">"sk-ant-..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># For Ollama (Local/Offline) - no API key needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ollama pull llama4</span><br></span></code></pre></div></div>
<p>See <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers">AI Providers</a> for all provider setup instructions.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-start-using-atmos-ai">3. Start Using Atmos AI<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#3-start-using-atmos-ai" class="hash-link" aria-label="Direct link to 3. Start Using Atmos AI" title="Direct link to 3. Start Using Atmos AI" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Interactive chat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai chat</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Named session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai chat </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--session</span><span class="token plain"> infrastructure-review</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Quick question</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai ask </span><span class="token string" style="color:rgb(173, 219, 103)">"What components are in production?"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Non-interactive execution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ai </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">exec</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"List all production stacks"</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># MCP server for Claude Desktop</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp start</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-next">What's Next?<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>We're continuously improving Atmos AI. Here's what's shipped and what's coming:</p>
<p><strong>Recently Completed:</strong></p>
<ul>
<li class="">Non-Interactive Execution (<code>atmos ai exec</code>)</li>
<li class="">Structured JSON Output with standard exit codes</li>
<li class="">Token Caching (Prompt Caching) — up to 90% cost savings</li>
<li class="">Conversation Checkpointing — export/import sessions</li>
<li class="">Automatic Context Discovery with .gitignore support</li>
<li class="">Skill Marketplace — install community skills from the Agent Skills registry</li>
</ul>
<p><strong>Coming Soon:</strong></p>
<ul>
<li class="">Enhanced LSP (HCL, JSON Schema)</li>
<li class="">Advanced Analytics — token usage tracking, cost analysis</li>
<li class="">Multi-Skill Workflows — skill delegation and collaboration</li>
<li class="">IDE Plugins — native VSCode/JetBrains integration</li>
<li class="">Private Skill Registries and advanced security</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="learn-more">Learn More<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai">Configuration Guide</a> - Complete configuration reference</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers">AI Providers</a> - All 7 providers with setup instructions</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/tools">Tool System</a> - Tool execution and permissions</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/skills">AI Skills</a> - Marketplace-installed skills</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/sessions">Sessions</a> - Session management and auto-compact</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/instructions">Project Instructions</a> - ATMOS.md documentation</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai/mcp-server">MCP Server</a> - Claude Desktop integration</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai/troubleshooting">Troubleshooting</a> - Common issues and solutions</li>
<li class=""><a href="https://atmos.tools/" target="_blank" rel="noopener noreferrer" class="">Atmos Documentation</a></li>
</ul>
<p><strong>Get Involved:</strong></p>
<ul>
<li class=""><a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub Issues</a></li>
<li class=""><a href="https://github.com/cloudposse/atmos/discussions" target="_blank" rel="noopener noreferrer" class="">Community Discussions</a></li>
</ul>
<hr>
<p>Happy infrastructure engineering!</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Introducing Atmos LSP: IDE-Native Infrastructure Configuration]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp</guid>
            <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to introduce Atmos LSP, bringing IDE-quality features directly to your infrastructure configuration workflow—no context switching, no manual validation, no documentation hunting.]]></description>
            <content:encoded><![CDATA[<p>We're excited to introduce <strong>Atmos LSP</strong>, bringing IDE-quality features directly to your infrastructure configuration workflow—no context switching, no manual validation, no documentation hunting.</p>
<p>Atmos LSP provides comprehensive Language Server Protocol integration that transforms how you write and validate Atmos configurations. Get instant feedback on errors, autocomplete for Atmos keywords, hover documentation without leaving your editor, and seamless integration with external language servers for YAML and Terraform validation.</p>
<p>With support for 13+ editors (VS Code, Neovim, Zed, Cursor, Emacs, and more), multiple transport protocols, and deep AI integration—writing infrastructure configuration now feels like writing code in a modern IDE.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Infrastructure configuration is error-prone and time-consuming. Engineers constantly:</p>
<ul>
<li class=""><strong>Context switch</strong> between editor and terminal to validate configurations</li>
<li class=""><strong>Run commands manually</strong> to check syntax errors (<code>atmos validate stacks</code>)</li>
<li class=""><strong>Search documentation</strong> for correct YAML structure and Atmos keywords</li>
<li class=""><strong>Discover errors late</strong> during terraform plan or apply</li>
<li class=""><strong>Fix typos manually</strong> without autocomplete assistance</li>
<li class=""><strong>Navigate large configs</strong> without structural overview</li>
</ul>
<p>Even simple typos in YAML can cause deployment failures that take hours to debug. The feedback loop is too long, and the cost of mistakes is too high.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-solution-atmos-lsp">The Solution: Atmos LSP<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#the-solution-atmos-lsp" class="hash-link" aria-label="Direct link to The Solution: Atmos LSP" title="Direct link to The Solution: Atmos LSP" translate="no">​</a></h2>
<p>Atmos LSP brings <strong>IDE-native infrastructure configuration</strong> through the Language Server Protocol (LSP)—the same standard that powers modern code editors.</p>
<p><strong>What You Get:</strong></p>
<ul>
<li class=""><strong>Real-time validation</strong> as you type—catch errors before committing</li>
<li class=""><strong>Autocomplete</strong> for Atmos keywords, components, and variables</li>
<li class=""><strong>Hover documentation</strong> explains Atmos concepts without leaving your editor</li>
<li class=""><strong>Multi-editor support</strong>—works in VS Code, Neovim, Zed, Cursor, Emacs, and 8+ others</li>
<li class=""><strong>External LSP integration</strong>—unified YAML and Terraform validation</li>
<li class=""><strong>AI integration</strong>—enables AI assistants to validate configurations accurately</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="dual-component-design">Dual-Component Design<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#dual-component-design" class="hash-link" aria-label="Direct link to Dual-Component Design" title="Direct link to Dual-Component Design" translate="no">​</a></h3>
<p>Atmos LSP consists of two complementary components:</p>
<p><strong>1. Atmos LSP Server</strong> - Native Atmos-specific features</p>
<ul>
<li class="">Autocomplete for Atmos keywords (<code>import</code>, <code>components</code>, <code>vars</code>, etc.)</li>
<li class="">Hover documentation for all Atmos concepts</li>
<li class="">Real-time Atmos-specific validation</li>
<li class="">Multi-transport support (stdio, TCP, WebSocket)</li>
</ul>
<p><strong>2. Atmos LSP Client</strong> - External language server integration</p>
<ul>
<li class="">Manages multiple LSP servers (yaml-language-server, terraform-ls)</li>
<li class="">Routes files to appropriate server by type</li>
<li class="">Aggregates diagnostics from all servers</li>
<li class="">Provides unified interface for AI tools</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="key-features">Key Features<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-real-time-validation">1. Real-Time Validation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#1-real-time-validation" class="hash-link" aria-label="Direct link to 1. Real-Time Validation" title="Direct link to 1. Real-Time Validation" translate="no">​</a></h3>
<p>Get instant feedback as you type—no more waiting for <code>atmos validate stacks</code>:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/prod/vpc.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> stacks/base  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ❌ Error: imports must be arrays</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cidr_block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ✅ Valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">vpc_ciddr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.1.0.0/16       </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  Warning: Unknown property</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                                     </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">#     (did you mean 'cidr_block'?)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">availability_zones</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  Warning: Property deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">1a               </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic">#     Use 'azs' instead</span><br></span></code></pre></div></div>
<p><strong>Validation Triggers:</strong></p>
<ul>
<li class="">Real-time as you type</li>
<li class="">On document save</li>
<li class="">On document open</li>
<li class="">Manual validation request</li>
</ul>
<p><strong>Validation Types:</strong></p>
<ul>
<li class=""><strong>YAML Syntax</strong> - Malformed YAML detection</li>
<li class=""><strong>Atmos Structure</strong> - Stack schema validation</li>
<li class=""><strong>Import Arrays</strong> - Ensures imports are valid lists</li>
<li class=""><strong>Component Sections</strong> - Validates terraform/helmfile structure</li>
<li class=""><strong>Type Safety</strong> - Checks value types match expectations</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-intelligent-autocomplete">2. Intelligent Autocomplete<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#2-intelligent-autocomplete" class="hash-link" aria-label="Direct link to 2. Intelligent Autocomplete" title="Direct link to 2. Intelligent Autocomplete" translate="no">​</a></h3>
<p>Stop memorizing Atmos keywords—let autocomplete guide you:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Type 'com' and press Ctrl+Space</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">com</span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ↓</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Autocomplete suggests:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  helmfile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><br></span></code></pre></div></div>
<p><strong>Autocomplete Categories:</strong></p>
<p><strong>Top-Level Keywords:</strong></p>
<ul>
<li class=""><code>import</code> - Import other stack files</li>
<li class=""><code>components</code> - Define infrastructure components</li>
<li class=""><code>vars</code> - Stack variables</li>
<li class=""><code>settings</code> - Stack settings</li>
<li class=""><code>metadata</code> - Stack metadata</li>
</ul>
<p><strong>Component Types:</strong></p>
<ul>
<li class=""><code>terraform</code> - Terraform components</li>
<li class=""><code>helmfile</code> - Helmfile components</li>
</ul>
<p><strong>Common Variables:</strong></p>
<ul>
<li class=""><code>namespace</code>, <code>tenant</code>, <code>environment</code>, <code>stage</code>, <code>region</code></li>
<li class=""><code>enabled</code> - Enable/disable pattern</li>
<li class=""><code>tags</code> - Resource tags</li>
</ul>
<p><strong>Settings:</strong></p>
<ul>
<li class=""><code>spacelift</code> - Spacelift integration</li>
<li class=""><code>atlantis</code> - Atlantis integration</li>
<li class=""><code>validation</code> - Validation rules</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-hover-documentation">3. Hover Documentation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#3-hover-documentation" class="hash-link" aria-label="Direct link to 3. Hover Documentation" title="Direct link to 3. Hover Documentation" translate="no">​</a></h3>
<p>Get context-aware documentation without leaving your editor:</p>
<p><strong>Hover over <code>import</code>:</strong></p>
<div class="language-markdown codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-markdown codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token bold content">import</span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Import other Atmos stack configuration files.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Import paths are relative to the stacks directory.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token bold content">Example:</span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">```yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">import:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> catalog/vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> mixins/kubernetes</span><br></span></code></pre></div></div>
<p><strong>Note:</strong> Imports are processed sequentially, and later imports
can override values from earlier imports.</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">**Documented Keywords:**</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Stack structure: `import`, `components`, `vars`, `settings`, `metadata`</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Component types: `terraform`, `helmfile`</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Stack variables: `namespace`, `tenant`, `environment`, `stage`, `region`</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">- Common patterns: `enabled` flag, resource `tags`</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">### 4. Multi-Editor Support (13+ IDEs)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Works with your favorite editor—same experience everywhere:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| Editor | Status | Setup |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">|--------|--------|-------|</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **VS Code** | Yes | LSP client extension |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Neovim** | Yes | nvim-lspconfig |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Cursor** | Yes | LSP client (VS Code fork) |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Zed** | Yes | Built-in LSP config |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Emacs** | Yes | lsp-mode |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Vim** | Yes | vim-lsp plugin |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Sublime Text** | Yes | LSP package |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Helix** | Yes | languages.toml |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **IntelliJ IDEA** | Yes | LSP4IJ plugin |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Kate** | Yes | LSP client plugin |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Lapce** | Yes | Built-in LSP |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Atom** | Yes | atom-languageclient |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Eclipse** | Yes | LSP4E |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">**Universal Setup Pattern:**</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">```json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">{</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  "atmos-lsp": {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    "command": "atmos",</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    "args": ["lsp", "start"],</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    "filetypes": ["yaml"]</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="5-multi-transport-support">5. Multi-Transport Support<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#5-multi-transport-support" class="hash-link" aria-label="Direct link to 5. Multi-Transport Support" title="Direct link to 5. Multi-Transport Support" translate="no">​</a></h3>
<p>Choose the right transport for your environment:</p>
<p><strong>stdio (Default)</strong> - Desktop IDE integration</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos lsp start</span><br></span></code></pre></div></div>
<p><strong>TCP</strong> - Remote development and testing</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos lsp start </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--transport</span><span class="token plain"> tcp </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--address</span><span class="token plain"> localhost:7777</span><br></span></code></pre></div></div>
<p><strong>WebSocket</strong> - Web-based editors</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos lsp start </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--transport</span><span class="token plain"> websocket </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--address</span><span class="token plain"> localhost:7777</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="6-external-lsp-server-integration">6. External LSP Server Integration<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#6-external-lsp-server-integration" class="hash-link" aria-label="Direct link to 6. External LSP Server Integration" title="Direct link to 6. External LSP Server Integration" translate="no">​</a></h3>
<p>Atmos LSP Client manages external language servers for unified validation:</p>
<p><strong>Supported Servers:</strong></p>
<table><thead><tr><th>Server</th><th>Purpose</th><th>File Types</th></tr></thead><tbody><tr><td><strong>yaml-language-server</strong></td><td>YAML validation with JSON Schema</td><td><code>.yaml</code>, <code>.yml</code></td></tr><tr><td><strong>terraform-ls</strong></td><td>Terraform HCL validation</td><td><code>.tf</code>, <code>.tfvars</code>, <code>.hcl</code></td></tr><tr><td><strong>json-languageserver</strong></td><td>JSON validation</td><td><code>.json</code></td></tr><tr><td><strong>Any LSP Server</strong></td><td>Extensible via config</td><td>Custom</td></tr></tbody></table>
<p><strong>Configuration:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">lsp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">servers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">yaml-ls</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"yaml-language-server"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"--stdio"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filetypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"yml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">initialization_options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">yaml</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">validation</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">hover</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">completion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">terraform-ls</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"terraform-ls"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"serve"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filetypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"tf"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"tfvars"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"hcl"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">initialization_options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">experimentalFeatures</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">validateOnSave</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p><strong>Benefits:</strong></p>
<ul>
<li class="">Single unified validation experience</li>
<li class="">Automatic file routing by extension</li>
<li class="">Diagnostic aggregation from multiple servers</li>
<li class="">Consistent error reporting</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="7-ai-integration">7. AI Integration<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#7-ai-integration" class="hash-link" aria-label="Direct link to 7. AI Integration" title="Direct link to 7. AI Integration" translate="no">​</a></h3>
<p>Enable AI assistants to validate configurations with the <code>validate_file_lsp</code> tool:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">You: Validate stacks/prod/vpc.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">AI: </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Uses validate_file_lsp tool</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Found </span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token plain"> issues </span><span class="token keyword" style="color:rgb(127, 219, 202)">in</span><span class="token plain"> stacks/prod/vpc.yaml:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ERRORS </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain">. Line </span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain">, Col </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain">: Unknown property </span><span class="token string" style="color:rgb(173, 219, 103)">'vpc_ciddr'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       Did you mean </span><span class="token string" style="color:rgb(173, 219, 103)">'vpc_cidr'</span><span class="token plain">?</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain">. Line </span><span class="token number" style="color:rgb(247, 140, 108)">23</span><span class="token plain">, Col </span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token plain">: Invalid CIDR block </span><span class="token function" style="color:rgb(130, 170, 255)">format</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    WARNINGS </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain">. Line </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain">, Col </span><span class="token number" style="color:rgb(247, 140, 108)">7</span><span class="token plain">: Property </span><span class="token string" style="color:rgb(173, 219, 103)">'availability_zones'</span><span class="token plain"> is deprecated</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       Use </span><span class="token string" style="color:rgb(173, 219, 103)">'azs'</span><span class="token plain"> instead</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Would you like me to </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">help</span><span class="token plain"> fix these issues?</span><br></span></code></pre></div></div>
<p><strong>AI Integration Features:</strong></p>
<ul>
<li class="">Precise line and column numbers for errors</li>
<li class="">Clear error/warning separation</li>
<li class="">Suggested fixes when available</li>
<li class="">Summary statistics</li>
<li class="">Supports all AI providers (Claude, GPT, Gemini, Ollama, etc.)</li>
</ul>
<p>Learn more: <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai">Atmos AI Documentation</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="real-world-use-cases">Real-World Use Cases<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#real-world-use-cases" class="hash-link" aria-label="Direct link to Real-World Use Cases" title="Direct link to Real-World Use Cases" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-catch-errors-early">1. Catch Errors Early<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#1-catch-errors-early" class="hash-link" aria-label="Direct link to 1. Catch Errors Early" title="Direct link to 1. Catch Errors Early" translate="no">​</a></h3>
<p><strong>Before Atmos LSP:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Edit stacks/prod/vpc.yaml in editor</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">vim</span><span class="token plain"> stacks/prod/vpc.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Save and exit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Validate manually in terminal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos validate stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ❌ Error: line 15: unknown property 'vpc_ciddr'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Go back to editor, fix, repeat...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">vim</span><span class="token plain"> stacks/prod/vpc.yaml</span><br></span></code></pre></div></div>
<p><strong>With Atmos LSP:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Edit stacks/prod/vpc.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Error appears instantly as you type:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">vpc_ciddr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  Unknown property (did you mean 'vpc_cidr'?)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Red squiggly line appears immediately</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Fix it right away:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">vpc_cidr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ✅ Valid - green checkmark</span><br></span></code></pre></div></div>
<p><strong>Result:</strong> Catch typos in seconds, not minutes.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-learn-atmos-structure">2. Learn Atmos Structure<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#2-learn-atmos-structure" class="hash-link" aria-label="Direct link to 2. Learn Atmos Structure" title="Direct link to 2. Learn Atmos Structure" translate="no">​</a></h3>
<p><strong>Before:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># What top-level keywords are available?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Open documentation...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Search for "stack structure"...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Copy example...</span><br></span></code></pre></div></div>
<p><strong>With Atmos LSP:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Start typing at root level</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Press Ctrl+Space</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Autocomplete shows:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> import</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> components</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> vars</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> settings</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> metadata</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Hover over any keyword for documentation</span><br></span></code></pre></div></div>
<p><strong>Result:</strong> Discover Atmos features without leaving your editor.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-unified-yaml-and-terraform-validation">3. Unified YAML and Terraform Validation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#3-unified-yaml-and-terraform-validation" class="hash-link" aria-label="Direct link to 3. Unified YAML and Terraform Validation" title="Direct link to 3. Unified YAML and Terraform Validation" translate="no">​</a></h3>
<p><strong>Before:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Validate YAML syntax</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">yamllint stacks/prod/vpc.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Validate Terraform</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">cd</span><span class="token plain"> components/terraform/vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">terraform validate</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Check Atmos structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos validate stacks</span><br></span></code></pre></div></div>
<p><strong>With Atmos LSP:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># All validation happens automatically in editor:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># - YAML syntax (yaml-language-server)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># - Atmos structure (atmos lsp server)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># - Terraform HCL (terraform-ls)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># All errors shown inline with precise locations</span><br></span></code></pre></div></div>
<p><strong>Result:</strong> One unified validation experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="4-ai-powered-configuration-review">4. AI-Powered Configuration Review<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#4-ai-powered-configuration-review" class="hash-link" aria-label="Direct link to 4. AI-Powered Configuration Review" title="Direct link to 4. AI-Powered Configuration Review" translate="no">​</a></h3>
<p><strong>Before:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Copy file contents</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Paste into AI chat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Ask for validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># AI provides generic advice</span><br></span></code></pre></div></div>
<p><strong>With Atmos LSP + AI:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">You: Validate stacks/prod/vpc.yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">AI: </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Uses validate_file_lsp tool </span><span class="token keyword" style="color:rgb(127, 219, 202)">for</span><span class="token plain"> precise validation</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Found </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> issues:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain">. Line </span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain">, Col </span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain">: </span><span class="token string" style="color:rgb(173, 219, 103)">'vpc_ciddr'</span><span class="token plain"> should be </span><span class="token string" style="color:rgb(173, 219, 103)">'vpc_cidr'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain">. Line </span><span class="token number" style="color:rgb(247, 140, 108)">30</span><span class="token plain">, Col </span><span class="token number" style="color:rgb(247, 140, 108)">7</span><span class="token plain">: </span><span class="token string" style="color:rgb(173, 219, 103)">'availability_zones'</span><span class="token plain"> is deprecated</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    I can fix both issues. Would you like me to:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain">. Update vpc_ciddr → vpc_cidr</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain">. Migrate availability_zones → azs array</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Apply fixes? </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">yes/no</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></span></code></pre></div></div>
<p><strong>Result:</strong> AI gets precise error locations and can suggest specific fixes.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="getting-started">Getting Started<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="1-start-lsp-server-ide-integration">1. Start LSP Server (IDE Integration)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#1-start-lsp-server-ide-integration" class="hash-link" aria-label="Direct link to 1. Start LSP Server (IDE Integration)" title="Direct link to 1. Start LSP Server (IDE Integration)" translate="no">​</a></h3>
<p><strong>VS Code Setup:</strong></p>
<p>Create <code>.vscode/settings.json</code>:</p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"atmos-lsp"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"command"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"atmos"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"args"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"lsp"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"start"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"filetypes"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"settings"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"atmos"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token property" style="color:rgb(128, 203, 196)">"configPath"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"${workspaceFolder}/atmos.yaml"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>Install a generic LSP client extension (like "LSP" by sublimelsp).</p>
<p><strong>Neovim Setup:</strong></p>
<p>Add to your config:</p>
<div class="language-lua codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-lua codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">require('lspconfig').atmos.setup{</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  cmd = { 'atmos', 'lsp', 'start' },</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  filetypes = { 'yaml' },</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  root_dir = function(fname)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    return require('lspconfig.util').root_pattern('atmos.yaml', '.git')(fname)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  end,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">}</span><br></span></code></pre></div></div>
<p><strong>See Full Setup Guides:</strong></p>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/lsp/lsp-server#editor-configuration">VS Code setup</a></li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/lsp/lsp-server#editor-configuration">Neovim setup</a></li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/lsp/lsp-server#editor-configuration">13+ other editors</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="2-configure-external-lsp-servers-optional">2. Configure External LSP Servers (Optional)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#2-configure-external-lsp-servers-optional" class="hash-link" aria-label="Direct link to 2. Configure External LSP Servers (Optional)" title="Direct link to 2. Configure External LSP Servers (Optional)" translate="no">​</a></h3>
<p>Add to <code>atmos.yaml</code> for YAML and Terraform validation:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">lsp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">servers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># YAML validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">yaml-ls</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"yaml-language-server"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"--stdio"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filetypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"yml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">root_patterns</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"atmos.yaml"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">".git"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">initialization_options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">yaml</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">validation</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">hover</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">completion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Terraform validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">terraform-ls</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"terraform-ls"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"serve"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filetypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"tf"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"tfvars"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"hcl"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">root_patterns</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">".terraform"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">".git"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">initialization_options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">experimentalFeatures</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">validateOnSave</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p><strong>Install External Servers:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Install yaml-language-server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-g</span><span class="token plain"> yaml-language-server</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Install terraform-ls</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># macOS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">brew </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> terraform-ls</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Linux</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-LO</span><span class="token plain"> https://releases.hashicorp.com/terraform-ls/latest/terraform-ls_latest_linux_amd64.zip</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">unzip</span><span class="token plain"> terraform-ls_latest_linux_amd64.zip</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mv</span><span class="token plain"> terraform-ls /usr/local/bin/</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="3-start-editing">3. Start Editing<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#3-start-editing" class="hash-link" aria-label="Direct link to 3. Start Editing" title="Direct link to 3. Start Editing" translate="no">​</a></h3>
<p>Open any Atmos stack file:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/prod/vpc.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Start typing - autocomplete appears</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">com</span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ↓ (Ctrl+Space)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Hover for documentation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ← Hover here for docs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> catalog/vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Real-time validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">vpc_ciddr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  Instant error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">vpc_cidr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ✅ Fixed</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="advanced-features">Advanced Features<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#advanced-features" class="hash-link" aria-label="Direct link to Advanced Features" title="Direct link to Advanced Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="diagnostic-formatting">Diagnostic Formatting<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#diagnostic-formatting" class="hash-link" aria-label="Direct link to Diagnostic Formatting" title="Direct link to Diagnostic Formatting" translate="no">​</a></h3>
<p>Three output formats for different use cases:</p>
<p><strong>1. Full Format</strong> - Human-readable</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">ERRORS (2):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Line 15, Col 5: Unknown property 'vpc_ciddr' (did you mean 'vpc_cidr'?)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Source: yaml-language-server</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Line 23, Col 3: Invalid CIDR block format</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Source: yaml-language-server</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">WARNINGS (1):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Line 30, Col 7: Property 'availability_zones' is deprecated, use 'azs'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Source: yaml-language-server</span><br></span></code></pre></div></div>
<p><strong>2. Compact Format</strong> - One line per issue</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc.yaml:15:5: error: Unknown property 'vpc_ciddr' (yaml-ls)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc.yaml:23:3: error: Invalid CIDR block format (yaml-ls)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc.yaml:30:7: warning: Property 'availability_zones' is deprecated (yaml-ls)</span><br></span></code></pre></div></div>
<p><strong>3. AI-Optimized Format</strong> - Structured for AI</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">Found 3 issue(s) in /stacks/prod/vpc.yaml:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ERRORS (2):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Line 15, Col 5: Unknown property 'vpc_ciddr' (did you mean 'vpc_cidr'?)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Line 23, Col 3: Invalid CIDR block format</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">WARNINGS (1):</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Line 30, Col 7: Property 'availability_zones' is deprecated, use 'azs'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="multi-server-diagnostic-aggregation">Multi-Server Diagnostic Aggregation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#multi-server-diagnostic-aggregation" class="hash-link" aria-label="Direct link to Multi-Server Diagnostic Aggregation" title="Direct link to Multi-Server Diagnostic Aggregation" translate="no">​</a></h3>
<p>Diagnostics from all LSP servers combined:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/prod/eks.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> catalog/vpc       </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ✅ Atmos LSP: Valid import</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">eks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ✅ yaml-ls: Valid YAML syntax</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_versio</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.27"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  yaml-ls: Unknown property</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                                </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ⚠️  Atmos LSP: Typo detection</span><br></span></code></pre></div></div>
<p><strong>Aggregation Features:</strong></p>
<ul>
<li class="">Collect from all servers</li>
<li class="">Deduplicate overlapping diagnostics</li>
<li class="">Sort by severity and location</li>
<li class="">Filter by severity level</li>
<li class="">Per-file diagnostic access</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="document-lifecycle">Document Lifecycle<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#document-lifecycle" class="hash-link" aria-label="Direct link to Document Lifecycle" title="Direct link to Document Lifecycle" translate="no">​</a></h3>
<p>LSP tracks your editing workflow:</p>
<p><strong>1. Document Open</strong> → Initial validation + publish diagnostics
<strong>2. Document Change</strong> → Real-time re-validation (debounced)
<strong>3. Document Save</strong> → Final validation
<strong>4. Document Close</strong> → Clear diagnostics, free resources</p>
<p><strong>Thread-Safe:</strong></p>
<ul>
<li class="">Document collection protected with RWMutex</li>
<li class="">Concurrent access supported</li>
<li class="">No race conditions</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="performance">Performance<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#performance" class="hash-link" aria-label="Direct link to Performance" title="Direct link to Performance" translate="no">​</a></h2>
<p><strong>Validation Speed:</strong></p>
<ul>
<li class="">Initial validation: &lt;100ms for typical stack files</li>
<li class="">Real-time updates: &lt;50ms (debounced)</li>
<li class="">Large files (&gt;1000 lines): &lt;200ms</li>
</ul>
<p><strong>Resource Usage:</strong></p>
<ul>
<li class="">Memory: ~10-50MB per server</li>
<li class="">CPU: Minimal (validation only on change)</li>
<li class="">Network: None (all local)</li>
</ul>
<p><strong>Optimizations:</strong></p>
<ul>
<li class="">Debounced validation (avoid validation on every keystroke)</li>
<li class="">Async diagnostic publishing (non-blocking)</li>
<li class="">Thread-safe concurrent access</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-coming-next">What's Coming Next<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#whats-coming-next" class="hash-link" aria-label="Direct link to What's Coming Next" title="Direct link to What's Coming Next" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="short-term-next-3-months">Short-term (Next 3 Months)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#short-term-next-3-months" class="hash-link" aria-label="Direct link to Short-term (Next 3 Months)" title="Direct link to Short-term (Next 3 Months)" translate="no">​</a></h3>
<p><strong>Go-to-Definition:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">import</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> catalog/vpc  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Ctrl+Click → Opens stacks/catalog/vpc.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">module  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Ctrl+Click → Opens components/terraform/vpc-module/</span><br></span></code></pre></div></div>
<p><strong>Document Symbols (Outline View):</strong></p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">Outline:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">├── imports (3)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   ├── catalog/vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   ├── catalog/eks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   └── mixins/common</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">├── components</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   ├── terraform</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   │   ├── vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   │   ├── eks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">│   │   └── rds</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">└── vars</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ├── namespace</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ├── environment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    └── region</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="medium-term-3-6-months">Medium-term (3-6 Months)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#medium-term-3-6-months" class="hash-link" aria-label="Direct link to Medium-term (3-6 Months)" title="Direct link to Medium-term (3-6 Months)" translate="no">​</a></h3>
<p><strong>Find References:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">vpc_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">123</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Find all references → Shows all files using vpc_id</span><br></span></code></pre></div></div>
<p><strong>Rename Symbol:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">old_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> value  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Rename to new_name → Updates all usages across files</span><br></span></code></pre></div></div>
<p><strong>Code Actions (Quick Fixes):</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">vpc_ciddr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 10.0.0.0/16  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Quick fix: Change to 'vpc_cidr'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="long-term-6-months">Long-term (6+ Months)<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#long-term-6-months" class="hash-link" aria-label="Direct link to Long-term (6+ Months)" title="Direct link to Long-term (6+ Months)" translate="no">​</a></h3>
<p><strong>Cross-File Validation:</strong></p>
<ul>
<li class="">Validate component references exist</li>
<li class="">Check variable consistency across stacks</li>
<li class="">Detect circular imports</li>
<li class="">Dependency analysis</li>
</ul>
<p><strong>Enhanced Schema Support:</strong></p>
<ul>
<li class="">JSON Schema integration</li>
<li class="">Custom validation rules</li>
<li class="">Pluggable validators</li>
<li class="">User-defined schemas</li>
</ul>
<p><strong>Performance Improvements:</strong></p>
<ul>
<li class="">Parsed document caching</li>
<li class="">Incremental text sync</li>
<li class="">Background processing</li>
<li class="">Metrics and profiling</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="security--privacy">Security &amp; Privacy<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#security--privacy" class="hash-link" aria-label="Direct link to Security &amp; Privacy" title="Direct link to Security &amp; Privacy" translate="no">​</a></h2>
<p><strong>LSP Server:</strong></p>
<ul>
<li class="">Read-only access to opened documents</li>
<li class="">No file system access beyond provided documents</li>
<li class="">No network access</li>
<li class="">Validates user input safely</li>
</ul>
<p><strong>LSP Client:</strong></p>
<ul>
<li class="">Spawns only configured, trusted servers</li>
<li class="">Local stdio communication only</li>
<li class="">No network communication</li>
<li class="">No credential handling</li>
</ul>
<p><strong>Privacy:</strong></p>
<ul>
<li class="">All processing 100% local</li>
<li class="">No telemetry or analytics</li>
<li class="">No document content sent to cloud</li>
<li class="">External servers may have own policies (check yaml-ls, terraform-ls docs)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="troubleshooting">Troubleshooting<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="lsp-server-not-starting">LSP Server Not Starting<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#lsp-server-not-starting" class="hash-link" aria-label="Direct link to LSP Server Not Starting" title="Direct link to LSP Server Not Starting" translate="no">​</a></h3>
<p><strong>Check:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Verify atmos is in PATH</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">which</span><span class="token plain"> atmos</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test LSP server manually</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos lsp start</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Should wait for stdin (Ctrl+C to exit)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Check Atmos version (LSP requires v1.50.0+)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos version</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="no-autocomplete-or-validation">No Autocomplete or Validation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#no-autocomplete-or-validation" class="hash-link" aria-label="Direct link to No Autocomplete or Validation" title="Direct link to No Autocomplete or Validation" translate="no">​</a></h3>
<p><strong>VS Code:</strong></p>
<ol>
<li class="">Check Output panel → "Atmos LSP" for errors</li>
<li class="">Verify LSP client extension is installed</li>
<li class="">Reload window (Cmd/Ctrl+Shift+P → "Reload Window")</li>
</ol>
<p><strong>Neovim:</strong></p>
<div class="language-lua codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-lua codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">-- Check LSP status</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">:LspInfo</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">-- Check logs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">:lua vim.cmd('e ' .. vim.lsp.get_log_path())</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="external-lsp-server-not-working">External LSP Server Not Working<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#external-lsp-server-not-working" class="hash-link" aria-label="Direct link to External LSP Server Not Working" title="Direct link to External LSP Server Not Working" translate="no">​</a></h3>
<p><strong>Check server is installed:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># YAML server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">yaml-language-server </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Terraform server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">terraform-ls version</span><br></span></code></pre></div></div>
<p><strong>Check configuration:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos.yaml - verify paths are correct</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">lsp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">servers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">yaml-ls</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"yaml-language-server"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Must be in PATH</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(173, 219, 103)">"--stdio"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></span></code></pre></div></div>
<p><strong>Enable debug logging:</strong></p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Set environment variable before starting editor</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_LOGS_LEVEL</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">Debug</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="learn-more">Learn More<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-lsp#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<p><strong>Documentation:</strong></p>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/lsp/lsp-server">LSP Server Guide</a> - Complete server setup for 13+ editors</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/lsp/lsp-client">LSP Client Guide</a> - External server integration</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/tools#available-tools">AI Integration</a> - AI validation tool</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration">Configuration Reference</a> - Full atmos.yaml options</li>
</ul>
<p><strong>LSP Resources:</strong></p>
<ul>
<li class=""><a href="https://microsoft.github.io/language-server-protocol/" target="_blank" rel="noopener noreferrer" class="">Language Server Protocol Specification</a></li>
<li class=""><a href="https://github.com/redhat-developer/yaml-language-server" target="_blank" rel="noopener noreferrer" class="">yaml-language-server</a></li>
<li class=""><a href="https://github.com/hashicorp/terraform-ls" target="_blank" rel="noopener noreferrer" class="">terraform-ls</a></li>
</ul>
<p><strong>Related Features:</strong></p>
<ul>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai">Atmos AI</a> - AI-powered infrastructure assistance</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/validate/usage">Atmos Validation</a> - Validation commands</li>
<li class=""><a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/stacks">Atmos Stacks</a> - Stack structure and inheritance</li>
</ul>
<p><strong>Get Involved:</strong></p>
<ul>
<li class=""><a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub Issues</a></li>
<li class=""><a href="https://github.com/cloudposse/atmos/discussions" target="_blank" rel="noopener noreferrer" class="">Community Discussions</a></li>
</ul>
<hr>
<p>Happy configuring!</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[Per-Target Version Overrides in Vendor Manifests]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-target-version-overrides</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-target-version-overrides</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Vendor targets now accept optional version overrides, enabling multiple versions of the same component from a single source entry.]]></description>
            <content:encoded><![CDATA[<p>Vendor targets now accept optional version overrides, enabling multiple versions of the same component from a single source entry.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-target-version-overrides#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>targets</code> field in vendor manifests now supports both the original string syntax and a new map syntax with <code>path</code> and <code>version</code> keys. When a target specifies its own <code>version</code>, the source URL template is re-resolved with that version.</p>
<p><strong>Before</strong> (still works):</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">targets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/terraform/vpc"</span><br></span></code></pre></div></div>
<p><strong>New map syntax with per-target version override:</strong></p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">targets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/terraform/vpc/{{.Version}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"2.1.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/terraform/vpc/{{.Version}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"3.0.0"</span><br></span></code></pre></div></div>
<p>Both syntaxes can be mixed freely within the same targets list.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-target-version-overrides#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, vendoring multiple versions of the same component required duplicating the entire source entry for each version. With per-target version overrides, a single source entry can vendor the same component to multiple paths with different versions:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">sources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/terraform-aws-vpc.git///?ref={{.Version}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"2.1.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">targets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/terraform/vpc"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/terraform/vpc/{{.Version}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"3.0.0"</span><br></span></code></pre></div></div>
<p>This vendors version 2.1.0 to <code>components/terraform/vpc</code> and version 3.0.0 to <code>components/terraform/vpc/3.0.0</code>, all from a single source definition.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/vendor-target-version-overrides#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Update your <code>vendor.yaml</code> to use the map syntax for any targets that need a different version than the source-level default. The <code>path</code> field is required; the <code>version</code> field is optional. When <code>version</code> is omitted, the target inherits the source-level version as before.</p>
<p>See the <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/design-patterns/version-management/vendoring-components">vendoring documentation</a> for more details and examples.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Multi-Cloud Documentation and Design Patterns]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs</guid>
            <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos has always been cloud agnostic, but our documentation hasn't always reflected that. This release adds comprehensive multi-cloud documentation including a new design pattern for organizing stacks across different cloud providers.]]></description>
            <content:encoded><![CDATA[<p>Atmos has always been cloud agnostic, but our documentation hasn't always reflected that. This release adds comprehensive multi-cloud documentation including a new design pattern for organizing stacks across different cloud providers.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="multi-cloud-overview-page">Multi-Cloud Overview Page<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#multi-cloud-overview-page" class="hash-link" aria-label="Direct link to Multi-Cloud Overview Page" title="Direct link to Multi-Cloud Overview Page" translate="no">​</a></h3>
<p>A new <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/multi-cloud">Multi-Cloud</a> page explains how Atmos works with any cloud provider that Terraform supports. It includes a cloud concept mapping table that translates equivalent concepts across AWS, Azure, and GCP — from organizational hierarchy (Organizations vs Management Groups vs Folders) to networking (VPC vs VNet vs VPC Network) to identity (IAM Roles vs Managed Identities vs Service Accounts).</p>
<p>The page also includes tabbed configuration examples showing how to set up <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth">authentication</a> and <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/stores">stores</a> for each provider.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="multi-cloud-configuration-design-pattern">Multi-Cloud Configuration Design Pattern<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#multi-cloud-configuration-design-pattern" class="hash-link" aria-label="Direct link to Multi-Cloud Configuration Design Pattern" title="Direct link to Multi-Cloud Configuration Design Pattern" translate="no">​</a></h3>
<p>A new <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/design-patterns/stack-organization/multi-cloud-configuration">Multi-Cloud Configuration</a> design pattern shows how to organize your stacks so the directory layout mirrors how your cloud provider organizes its resources. The guiding principle: what you see on disk should match how resources are deployed.</p>
<p>Each cloud gets its own example with native terminology in folder names:</p>
<ul>
<li class=""><strong>AWS</strong>: <code>accounts/dev/us-east-1.yaml</code></li>
<li class=""><strong>Azure</strong>: <code>subscriptions/dev/eastus.yaml</code></li>
<li class=""><strong>GCP</strong>: <code>projects/dev/us-central1.yaml</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="application-sdlc-environments-design-pattern">Application SDLC Environments Design Pattern<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#application-sdlc-environments-design-pattern" class="hash-link" aria-label="Direct link to Application SDLC Environments Design Pattern" title="Direct link to Application SDLC Environments Design Pattern" translate="no">​</a></h3>
<p>Not every repository needs deep organizational hierarchy. A new <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/design-patterns/stack-organization/application-sdlc">Application SDLC Environments</a> design pattern shows how application repositories can co-locate infrastructure alongside application code with a minimal flat structure: <code>dev.yaml</code>, <code>staging.yaml</code>, <code>prod.yaml</code>, and optionally <code>preview.yaml</code> for ephemeral PR environments.</p>
<p>This pattern makes it easy for developers to get up and running with Atmos in their application repositories without being overwhelmed by organizational taxonomy. The directory structure exposes only what the team needs to care about — the SDLC environment — while keeping everything else as inherited defaults. The result is a clean architecture where infrastructure ships with the application in the same repo and the same pull request.</p>
<p>For a working example of this pattern, see the <a href="https://github.com/cloudposse-examples/app-on-ecs" target="_blank" rel="noopener noreferrer" class="">app-on-ecs</a> reference architecture on GitHub.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="azure-and-gcp-auth-documentation">Azure and GCP Auth Documentation<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#azure-and-gcp-auth-documentation" class="hash-link" aria-label="Direct link to Azure and GCP Auth Documentation" title="Direct link to Azure and GCP Auth Documentation" translate="no">​</a></h3>
<p>The <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/auth/usage">auth usage page</a>, <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth/providers">providers reference</a>, and <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth/identities">identities reference</a> now include Azure and GCP alongside AWS, with tabbed examples for each cloud.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/multi-cloud-docs#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Teams deploying to Azure or GCP can now find documentation that speaks their cloud's language instead of translating from AWS-centric examples. The concept mapping table helps engineers working across multiple clouds quickly find equivalent services.</p>
<p>For application developers, the SDLC pattern provides a low-friction on-ramp to Atmos — co-locate your Terraform next to your app code, define one file per environment, and let Atmos handle the rest.</p>]]></content:encoded>
            <category>Documentation</category>
        </item>
        <item>
            <title><![CDATA[Source Cache TTL for JIT-Vendored Components]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl</guid>
            <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now supports a ttl field on component source configuration to control how long cached JIT-vendored sources are reused before automatically re-pulling from the remote. This is especially useful when working with floating refs like branch names during active development.]]></description>
            <content:encoded><![CDATA[<p>Atmos now supports a <code>ttl</code> field on component source configuration to control how long cached JIT-vendored sources are reused before automatically re-pulling from the remote. This is especially useful when working with floating refs like branch names during active development.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>source</code> specification now accepts an optional <code>ttl</code> (time-to-live) field that controls cache expiration for JIT-vendored components. When the TTL expires, the source is automatically re-pulled on the next command invocation.</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">my-module</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"git::https://github.com/org/repo.git"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"main"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">ttl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"0s"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Always re-pull from upstream</span><br></span></code></pre></div></div>
<p>A global default TTL can be set in <code>atmos.yaml</code> and overridden per-component:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># atmos.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">ttl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1h"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Re-pull sources older than 1 hour</span><br></span></code></pre></div></div>
<p>If no TTL is set, behavior is unchanged: cached sources are reused indefinitely and only re-pulled when the version or URI changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>When using floating refs like branch names (<code>version: "main"</code>), the version string never changes even though the upstream content does. Previously, Atmos would silently reuse stale cached code, forcing developers to manually delete <code>.workdir/</code> or run <code>source pull --force</code> before every plan.</p>
<p>This created a painful inner loop during active development and a behavioral gap between local environments (cached) and CI (ephemeral, always fresh).</p>
<p>With <code>ttl</code>, you describe how stale is acceptable and Atmos enforces it automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p><strong>Active development</strong> (always get latest):</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"git::https://github.com/org/repo.git"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"develop"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">ttl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"0s"</span><br></span></code></pre></div></div>
<p><strong>Team collaboration</strong> (hourly refresh):</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"git::https://github.com/org/repo.git"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"main"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">ttl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1h"</span><br></span></code></pre></div></div>
<p><strong>Stable releases</strong> (no TTL needed):</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/terraform-aws-components//modules/vpc"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.450.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># No ttl - cache indefinitely, only re-pull on version change</span><br></span></code></pre></div></div>
<p>Supported duration formats: <code>"0s"</code>, <code>"30m"</code>, <code>"1h"</code>, <code>"7d"</code>, <code>"daily"</code>, <code>"weekly"</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-cache-ttl#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>We'd love to hear your feedback on this feature! Please <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">open an issue</a> if you have questions or suggestions.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[AI Agent Skills for Atmos]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills</guid>
            <pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Atmos now ships 21 agent skills that give AI coding assistants deep knowledge of Atmos conventions, stack configuration, Terraform orchestration, authentication, validation, and more. Skills build on two open standards -- AGENTS.md and Agent Skills -- and work across Claude Code, OpenAI Codex, Gemini CLI, Cursor, Windsurf, GitHub Copilot, and other AI tools.]]></description>
            <content:encoded><![CDATA[<p>Atmos now ships 21 agent skills that give AI coding assistants deep knowledge of Atmos conventions, stack configuration, Terraform orchestration, authentication, validation, and more. Skills build on two open standards -- <a href="https://agents.md/" target="_blank" rel="noopener noreferrer" class="">AGENTS.md</a> and <a href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer" class="">Agent Skills</a> -- and work across Claude Code, OpenAI Codex, Gemini CLI, Cursor, Windsurf, GitHub Copilot, and other AI tools.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Atmos includes a new <code>agent-skills/</code> directory at the repository root containing 21 domain-specific skills packaged as a single Claude Code plugin:</p>
<p><code>atmos-terraform</code>, <code>atmos-helmfile</code>, <code>atmos-packer</code>, <code>atmos-ansible</code>, <code>atmos-workflows</code>, <code>atmos-custom-commands</code>, <code>atmos-config</code>, <code>atmos-introspection</code>, <code>atmos-auth</code>, <code>atmos-stores</code>, <code>atmos-toolchain</code>, <code>atmos-devcontainer</code>, <code>atmos-stacks</code>, <code>atmos-components</code>, <code>atmos-vendoring</code>, <code>atmos-validation</code>, <code>atmos-schemas</code>, <code>atmos-gitops</code>, <code>atmos-yaml-functions</code>, <code>atmos-templates</code>, <code>atmos-design-patterns</code></p>
<p>Each skill is a self-contained package with a primary <code>SKILL.md</code> instruction file (under 500 lines) and a <code>references/</code> directory with deeper reference material. An <code>AGENTS.md</code> router file maps user tasks to the right skill, so AI tools load only the context they need.</p>
<p>The skills are built on two open standards:</p>
<ul>
<li class=""><strong><a href="https://agents.md/" target="_blank" rel="noopener noreferrer" class="">AGENTS.md</a></strong> -- The cross-tool instruction file standard created by OpenAI with Google, Cursor, and others. Governed by the Linux Foundation's Agentic AI Foundation (AAIF). Adopted by 60,000+ GitHub repos.</li>
<li class=""><strong><a href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer" class="">Agent Skills</a></strong> -- The directory-based skill packaging format (<code>SKILL.md</code>) created by Anthropic. Adopted by Microsoft, OpenAI, Cursor, and GitHub.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>AI coding assistants are increasingly part of infrastructure workflows. Without domain-specific context, they rely on general training data that may be outdated, incomplete, or wrong. Common issues include:</p>
<ul>
<li class="">Generating invalid YAML that doesn't match the Atmos schema</li>
<li class="">Using incorrect CLI commands or flags</li>
<li class="">Missing Atmos-specific patterns like deep merging, abstract components, or YAML functions</li>
<li class="">Not knowing about features like <code>!store</code>, <code>!terraform.output</code>, or multi-provider authentication</li>
</ul>
<p>Agent skills solve this by providing structured, up-to-date knowledge directly in the repository. The AI loads the relevant skill before answering, ensuring accurate and current guidance.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Every major AI tool has its own configuration directory. The skills live in a tool-agnostic <code>agent-skills/</code> folder, and you symlink or reference them from each tool's expected location.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="claude-code">Claude Code<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#claude-code" class="hash-link" aria-label="Direct link to Claude Code" title="Direct link to Claude Code" translate="no">​</a></h3>
<p>Install from the Cloud Posse plugin marketplace:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Add the Cloud Posse marketplace (one-time setup)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">/plugin marketplace </span><span class="token function" style="color:rgb(130, 170, 255)">add</span><span class="token plain"> cloudposse/atmos</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Install the Atmos skills plugin (all 21 skills)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">/plugin </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> atmos@cloudposse</span><br></span></code></pre></div></div>
<p>One plugin, one install command, all 21 skills. The <code>cloudposse/atmos</code> GitHub repo serves as the marketplace -- Claude Code fetches the plugin manifest directly from the repo. No central registry or approval is involved. Once installed, the plugin is cached locally and skills activate automatically when you ask Atmos-related questions.</p>
<p>To uninstall:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Remove the plugin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">/plugin uninstall atmos@cloudposse</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Remove the marketplace (optional)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">/plugin marketplace remove cloudposse</span><br></span></code></pre></div></div>
<p>For Atmos contributors working directly in the repo, skills are also auto-discovered via <code>.claude/skills/</code> symlinks.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="openai-codex">OpenAI Codex<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#openai-codex" class="hash-link" aria-label="Direct link to OpenAI Codex" title="Direct link to OpenAI Codex" translate="no">​</a></h3>
<p>Codex natively reads <code>AGENTS.md</code> from the repository root (it co-created this standard). Copy the router to the repo root for automatic discovery:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token function" style="color:rgb(130, 170, 255)">cp</span><span class="token plain"> agent-skills/AGENTS.md AGENTS.md</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="gemini-cli-cursor-windsurf-github-copilot">Gemini CLI, Cursor, Windsurf, GitHub Copilot<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#gemini-cli-cursor-windsurf-github-copilot" class="hash-link" aria-label="Direct link to Gemini CLI, Cursor, Windsurf, GitHub Copilot" title="Direct link to Gemini CLI, Cursor, Windsurf, GitHub Copilot" translate="no">​</a></h3>
<p>Each tool has its own integration path:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Gemini CLI -- symlink to .gemini/skills</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">ln</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> agent-skills .gemini/skills</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Cursor -- create .cursor/rules/atmos.mdc (frontmatter required for auto-loading)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-p</span><span class="token plain"> .cursor/rules </span><span class="token operator" style="color:rgb(127, 219, 202)">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">cat</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain"> .cursor/rules/atmos.mdc </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;&lt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'RULE'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">---</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">description: Atmos infrastructure orchestration guidance</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">globs: "*.yaml, *.tf"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">alwaysApply: false</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">---</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">@agent-skills/AGENTS.md</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token string" style="color:rgb(173, 219, 103)">RULE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Windsurf -- add reference in .windsurfrules (also auto-discovers AGENTS.md)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'Always refer to agent-skills/AGENTS.md for Atmos commands and configuration patterns.'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;&gt;</span><span class="token plain"> .windsurfrules</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># GitHub Copilot -- reference in .github/copilot-instructions.md</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-p</span><span class="token plain"> .github </span><span class="token operator" style="color:rgb(127, 219, 202)">&amp;&amp;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'Always refer to agent-skills/AGENTS.md for Atmos commands and configuration patterns.'</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;&gt;</span><span class="token plain"> .github/copilot-instructions.md</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="other-tools">Other Tools<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#other-tools" class="hash-link" aria-label="Direct link to Other Tools" title="Direct link to Other Tools" translate="no">​</a></h3>
<p>Antigravity reads from <code>.agent/skills/</code>, JetBrains Junie reads <code>AGENTS.md</code> as a fallback alongside <code>.junie/guidelines.md</code>, and Amazon Q uses JSON configs in <code>.amazonq/cli-agents/</code>. The skills use standard Markdown with YAML frontmatter, which is universally compatible.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="in-your-infrastructure-project">In Your Infrastructure Project<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#in-your-infrastructure-project" class="hash-link" aria-label="Direct link to In Your Infrastructure Project" title="Direct link to In Your Infrastructure Project" translate="no">​</a></h3>
<p>You install the <code>atmos</code> binary -- you don't need to clone the Atmos repository. Skills are installed separately through your AI tool.</p>
<p>For Claude Code, install skills via the plugin marketplace (see above). For other AI tools that don't have Atmos marketplace support, use Atmos vendoring to pull the skills into your project:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Add to vendor.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos/v1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> AtmosVendorConfig</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">agent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">skills</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Vendor Atmos AI agent skills</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">sources</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"agent-skills"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/atmos.git//agent-skills?ref={{.Version}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"main"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">targets</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"agent-skills"</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor pull </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> agent-skills</span><br></span></code></pre></div></div>
<p>This downloads the <code>agent-skills/</code> directory with the correct structure intact. To update skills later, run the same command again.</p>
<p>See the <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/ai/agent-skills">AI Agent Skills documentation</a> for the full skill reference and <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/projects/setup-editor/ai-assistants">Configure AI Assistants</a> for tool-specific setup instructions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-skills-are-activated">How Skills Are Activated<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#how-skills-are-activated" class="hash-link" aria-label="Direct link to How Skills Are Activated" title="Direct link to How Skills Are Activated" translate="no">​</a></h2>
<p>You don't invoke skills manually. When you ask your AI assistant a question about Atmos, it automatically activates the right skill based on your question. At session start, the AI loads lightweight metadata from each installed skill. When your question matches a skill's description, the full skill content loads on demand.</p>
<p>For example, asking <em>"How do I configure stack imports?"</em> automatically activates the <code>atmos-stacks</code> skill. No special syntax needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-agent-skills#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>We welcome contributions to expand and improve the skills. Each skill follows a simple structure: one <code>SKILL.md</code> file with YAML frontmatter and a <code>references/</code> directory for detailed content.</p>
<p>Open an issue or pull request on <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">GitHub</a> to suggest improvements or add new skills.</p>]]></content:encoded>
            <category>Feature</category>
            <category>DX</category>
        </item>
        <item>
            <title><![CDATA[New !aws.organization_id YAML Function]]></title>
            <link>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function</link>
            <guid>https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function</guid>
            <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Access the AWS Organization ID directly in stack configuration with the new !aws.organization_id YAML function.]]></description>
            <content:encoded><![CDATA[<p>Access the AWS Organization ID directly in stack configuration with the new <code>!aws.organization_id</code> YAML function.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Atmos now includes a new <code>!aws.organization_id</code> YAML function that retrieves the AWS Organization ID by calling
the AWS Organizations <code>DescribeOrganization</code> API. This complements the existing AWS context functions:
<code>!aws.account_id</code>, <code>!aws.caller_identity_arn</code>, <code>!aws.caller_identity_user_id</code>, and <code>!aws.region</code>.</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">my-component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">organization_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>The AWS Organization ID is commonly needed for:</p>
<ul>
<li class=""><strong>Service Control Policies (SCPs)</strong> - Scoping policies to the organization</li>
<li class=""><strong>Cross-account trust policies</strong> - Referencing the organization in IAM conditions</li>
<li class=""><strong>Resource tagging</strong> - Tagging resources with the organization ID for cost allocation</li>
<li class=""><strong>Multi-account governance</strong> - Configuring components that operate at the organization level</li>
</ul>
<p>Previously, users had to hardcode the organization ID or use workarounds. Now it's available dynamically,
just like other AWS context values.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Use <code>!aws.organization_id</code> anywhere in your stack YAML files:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">governance</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">org_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">OrganizationId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><br></span></code></pre></div></div>
<p>The function requires the <code>organizations:DescribeOrganization</code> IAM permission and the account must be
a member of an AWS Organization.</p>
<p>Results are cached for the duration of the CLI invocation, so multiple references only make one API call.</p>
<p>This is equivalent to Terragrunt's <code>get_aws_org_id()</code> function.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<ul>
<li class="">Read the <a class="" href="https://pr-2175.atmos-docs.ue2.dev.plat.cloudposse.org/functions/yaml/aws.organization-id">documentation</a> for full details</li>
<li class="">Report issues on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
</ul>]]></content:encoded>
            <category>Feature</category>
        </item>
    </channel>
</rss>