<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog</id>
    <title>atmos Blog</title>
    <updated>2026-04-03T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog"/>
    <subtitle>atmos Blog</subtitle>
    <icon>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/img/atmos-logo.png</icon>
    <entry>
        <title type="html"><![CDATA[Analyze AWS Security Findings and Map Them to Your Infrastructure]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance"/>
        <updated>2026-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos can now pull security findings from AWS Security Hub, map them to the exact Atmos]]></summary>
        <content type="html"><![CDATA[<p>Atmos can now pull security findings from AWS Security Hub, map them to the exact Atmos
components and stacks that manage the affected resources, and generate structured remediation
reports — all from a single command.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#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>Reviewing AWS security findings today means navigating Security Hub, cross-referencing resources
with Terraform code, and manually figuring out which stack configuration caused the issue. This is
slow and requires deep AWS + Terraform expertise.</p>
<p>With <code>atmos aws security analyze</code>, one command replaces that entire workflow:</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 aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod-us-east-1</span><br></span></code></pre></div></div>
<p>The command fetches findings, maps them to your Atmos components via resource tags, and shows
which code manages each affected resource. Add <code>--ai</code> for AI-powered remediation with specific
code changes and deploy commands.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="quick-start">Quick Start<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<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">aws</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">security</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">identity</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)">"security-readonly"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity → Security Hub account</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">region</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)">"us-east-2"</span><span class="token plain">            </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Security Hub aggregation region</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">tag_mapping</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">stack_tag</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:stack"</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_tag</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:component"</span><br></span></code></pre></div></div></div></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 comment" style="color:rgb(99, 119, 119);font-style:italic"># Authenticate and analyze</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth login</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ai</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># With AI remediation</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-you-get">What You Get<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#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>
<p><strong>Without <code>--ai</code></strong> — findings with component mapping:</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">## CRITICAL Findings (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">### 1. S3 bucket without encryption</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">| Field | 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">| **Severity** | CRITICAL |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Source** | security-hub (CIS-1.4) |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Resource** | `arn:aws:s3:::my-bucket` |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Component** | s3-bucket |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Stack** | prod-us-east-1 |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Confidence** | exact |</span><br></span></code></pre></div></div>
<p><strong>With <code>--ai</code></strong> — adds structured remediation:</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">#### Remediation</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">**Root Cause:** The S3 bucket was provisioned without enabling versioning.</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">**Steps:**</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Add versioning_enabled variable to the stack configuration</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Apply the change</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">**Stack Changes:**</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">    versioning_enabled: true</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">**Deploy:** `atmos terraform apply s3-bucket -s prod-us-east-1`</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">**Risk:** low</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="key-features">Key Features<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features" translate="no">​</a></h2>
<ul>
<li class=""><strong>Finding-to-code mapping</strong> — traces AWS resources back to Atmos components via tags or naming heuristics</li>
<li class=""><strong>Atmos Auth integration</strong> — <code>identity</code> field targets the Security Hub delegated admin account</li>
<li class=""><strong>Multi-turn AI analysis</strong> — API providers can call <code>atmos_describe_component</code>, <code>read_component_file</code> to gather context before generating remediation</li>
<li class=""><strong>CLI provider support</strong> — Claude Code and Codex CLI fall back to enriched single-prompt mode</li>
<li class=""><strong>Compliance reports</strong> — <code>atmos aws compliance report --framework cis-aws</code> for framework-specific posture</li>
<li class=""><strong>Four output formats</strong> — Markdown (terminal), JSON (CI/CD), YAML (config), CSV (spreadsheets)</li>
<li class=""><strong>Structured schema</strong> — every output follows the same schema regardless of AI provider</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="commands">Commands<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" 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"># All findings across all stacks</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze</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"># Filter by stack and/or component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod-us-east-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod-us-east-1 </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--component</span><span class="token plain"> 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"># Filter by severity or source</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--severity</span><span class="token plain"> critical,high </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--source</span><span class="token plain"> guardduty</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"># AI-powered remediation (deduplicates findings, retries on errors)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod-us-east-1 </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" 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 to file in any format</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--file</span><span class="token plain"> findings.json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod-us-east-1 </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--file</span><span class="token plain"> report.md</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> csv </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--file</span><span class="token plain"> audit.csv</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"># Compliance reports</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws compliance report </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--framework</span><span class="token plain"> cis-aws</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws compliance report </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--framework</span><span class="token plain"> pci-dss </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--file</span><span class="token plain"> compliance.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"># Override identity or region at runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos aws security analyze </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--identity</span><span class="token plain"> security-admin </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--region</span><span class="token plain"> us-west-2</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="see-it-in-action">See It in Action<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#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></h2>
<p>Tested against a multi-account AWS organization (11 accounts, Security Hub delegated admin,
500 findings fetched, 97% mapped to Atmos components).</p>
<p><strong>Without <code>--ai</code></strong> — findings mapped to components:</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">$ atmos aws security analyze --stack plat-use2-dev --component rds/example</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">ℹ Fetching security findings...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Mapping 500 findings to Atmos components...</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Filtered to 4 findings matching stack="plat-use2-dev" component="rds/example"</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"># Security Report: plat-use2-dev / rds/example</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">Findings: 4 (1 CRITICAL, 3 HIGH)</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">## CRITICAL Findings (1)</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. Security groups should not allow unrestricted access to ports with high risk</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">| Field          | 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">| **Severity**   | CRITICAL                                                     |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Source**     | security-hub (aws-foundational-security-best-practices/1.0)  |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Resource**   | arn:aws:ec2:us-east-2:***:security-group/sg-***              |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Component**  | rds/example                                                  |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Stack**      | plat-use2-dev                                                |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Confidence** | exact                                                        |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Mapped By**  | finding-tag                                                  |</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">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">• atmos_stack = plat-use2-dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• atmos_component = rds/example</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• terraform_component = rds</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• terraform_workspace = plat-use2-dev-rds-example</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• Name = acme-plat-use2-dev-example-postgres-db</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• Namespace = acme</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• Tenant = plat</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• Environment = use2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• Stage = dev</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">## HIGH Findings (3)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Security groups should only allow unrestricted incoming traffic for authorized ports</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Security groups should not allow ingress from 0.0.0.0/0 to port 22</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">3. Security groups should not allow ingress from 0.0.0.0/0 to port 3389</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">| Severity  | Count | Mapped | Unmapped |</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">| CRITICAL  | 1     | 1      | 0        |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| HIGH      | 3     | 3      | 0        |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| **Total** | **4** | **4**  | **0**    |</span><br></span></code></pre></div></div>
<p><strong>With <code>--ai</code></strong> — the AI reads the actual Terraform source and stack config via tools,
detects drift, and generates targeted remediation:</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">$ atmos aws security analyze --stack plat-use2-dev --component rds/example --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">ℹ Analyzing findings with 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 — Security Analysis: rds/example in plat-use2-dev</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">The analysis surfaced 4 findings against a single security group — all mapped</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">with exact confidence to this component via Atmos 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">| Severity    | Count |</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">| 🔴 CRITICAL | 1     |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| 🟠 HIGH     | 3     |</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">## Findings Breakdown</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">### 🟠 Finding 1 — EC2.18: Unrestricted Ingress on Unauthorized Port (HIGH)</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">Standard: AWS Foundational Security Best Practices v1.0.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">Port 5432 (PostgreSQL) is open to 0.0.0.0/0. The likely cause is</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">allowed_cidr_blocks being set to an overly permissive value — potentially</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">from commented-out lines in catalog/rds/defaults.yaml that were activated</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">at some point.</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">Fix: Set in catalog/rds/example.yaml:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    allowed_cidr_blocks: []</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    publicly_accessible: 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">### 🟠 Finding 2 — EC2.13: Unrestricted Ingress on Port 22/SSH (HIGH)</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">Standard: CIS AWS Foundations Benchmark v1.2.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">⚠️ This is anomalous — port 22 has no business being on an RDS security</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">group. This strongly suggests an out-of-band manual change was made directly</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">in the AWS Console, or a referenced SG in associate_security_group_ids</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">carries a port-22 rule.</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">Fix:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Immediately audit and manually remove the port-22 rule in the AWS Console</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Audit any SGs referenced via associate_security_group_ids / security_group_ids</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">3. Re-apply via Terraform to restore IaC control and eliminate drift</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">## Root Cause (Common Thread)</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">Both findings stem from the same security group and share a root cause:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">var.allowed_cidr_blocks being set too permissively, compounded by possible</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">out-of-band drift. The cloudposse/rds/aws module internally creates and</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">manages SG ingress rules based on this variable.</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">## Priority 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">1. Immediately remove the port-22 inbound rule manually — this is likely</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   out-of-band drift and poses direct unauthorized access risk</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. Update catalog/rds/example.yaml to explicitly enforce safe defaults:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     allowed_cidr_blocks: []</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     publicly_accessible: false</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     associate_security_group_ids: []</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     use_private_subnets: true</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">3. Add Terraform validation guards to rds-variables.tf to prevent future</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   regressions:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     validation {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       condition     = !contains(var.allowed_cidr_blocks, "0.0.0.0/0")</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">                       &amp;&amp; !contains(var.allowed_cidr_blocks, "::/0")</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       error_message = "allowed_cidr_blocks must not contain 0.0.0.0/0 or ::/0."</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">4. Clean up catalog/rds/defaults.yaml — permanently remove (don't just</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   comment out) any lines with 0.0.0.0/0 or publicly_accessible: true</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">5. Plan then apply:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     atmos terraform plan rds/example -s plat-use2-dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">     atmos terraform apply rds/example -s plat-use2-dev</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">## Risk Assessment</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">| Finding              | Risk   | Note                                              |</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">| EC2.18 (port 5432)   | Medium | Removing rule breaks direct internet connections  |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">|                      |        | to DB; client SG-based connections are unaffected |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| EC2.13 (port 22/SSH) | Low    | No RDS traffic should depend on SSH; removing     |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">|                      |        | has no expected legitimate impact                 |</span><br></span></code></pre></div></div>
<p>The AI used multi-turn tools (<code>atmos_describe_component</code>, <code>read_component_file</code>) to read
the actual Terraform source and stack config, detected that port 22 on an RDS security group
is anomalous (likely AWS Console drift), identified the common root cause in
<code>allowed_cidr_blocks</code>, and generated targeted remediation with Terraform validation guards
to prevent future regressions. Duplicate findings are deduplicated before AI analysis —
one call covers all related findings.</p>
<p><strong>Compliance report</strong> — framework-specific posture scoring:</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">$ atmos aws compliance report</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"># Compliance Report: CIS AWS Foundations Benchmark</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">## Score: 35/42 Controls Passing (83%)</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">### Failing Controls</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">| Control      | Title                                                                    | Severity |</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">| Config.1     | AWS Config should be enabled with service-linked role                    | CRITICAL |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| EC2.14       | Security groups should not allow ingress from 0.0.0.0/0 to port 3389     | HIGH     |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| EC2.13       | Security groups should not allow ingress from 0.0.0.0/0 to port 22       | HIGH     |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| S3.1         | S3 buckets should have block public access settings enabled              | MEDIUM   |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| EC2.6        | VPC flow logging should be enabled in all VPCs                           | MEDIUM   |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| IAM.17       | Ensure IAM password policy expires passwords within 90 days              | LOW      |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| CloudTrail.7 | Ensure S3 bucket access logging is enabled on CloudTrail S3 bucket       | LOW      |</span><br></span></code></pre></div></div>
<p><strong>Compliance with <code>--ai</code></strong> — adds prioritized remediation guidance:</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">$ atmos aws compliance report --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 — CIS Foundations Benchmark</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">## Overall Status: 🟡 83% Compliant (35/42 controls passing)</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">## 🚨 Priority Issues (Fix First)</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">### CRITICAL</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| Control  | Issue                                   | Action                               |</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">| Config.1 | AWS Config not enabled or missing role  | Enable in all regions, attach role   |</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">### HIGH</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| Control | Issue                             | Action                                  |</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">| EC2.14  | RDP (port 3389) open to 0.0.0.0/0 | Restrict to known IP ranges or VPN      |</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">| EC2.13  | SSH (port 22) open to 0.0.0.0/0   | Use SSM Session Manager instead of SSH  |</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">⚠️ Open SSH/RDP to the world is a common attack vector.</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">## 🟠 Medium Priority</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• S3.1 — Enable S3 Block Public Access at the account level</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• EC2.6 — Enable VPC Flow Logs for all VPCs</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">## 🟢 Low Priority</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• IAM.17 — Set IAM password policy MaxPasswordAge to ≤ 90 days</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">• CloudTrail.7 — Enable S3 access logging on CloudTrail bucket</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">## Recommended Next Steps</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. Lock down security groups for ports 22/3389</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. Enable AWS Config — also helps detect future drift</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">3. Run `atmos terraform apply` on security-groups, vpc, config components</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">4. Re-run this report after remediation to verify score improves</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="try-it">Try It<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#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>Example: AWS Security &amp; Compliance</h2><div><p>Configuration example with auth, tag mapping, AI provider, and all available commands.</p><div><a class="button button--lg button--primary" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/examples/aws-security-compliance">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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-security-compliance#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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/aws/security">Security Configuration</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/aws/security/analyze">Security Analyze Command</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/aws/compliance/report">Compliance Report Command</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth">Atmos Auth</a></li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Use Claude Code, Codex CLI, or Gemini CLI as Atmos AI Providers]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers"/>
        <updated>2026-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos AI now supports CLI providers — invoke your locally installed Claude Code, OpenAI Codex, or]]></summary>
        <content type="html"><![CDATA[<p>Atmos AI now supports <strong>CLI providers</strong> — invoke your locally installed Claude Code, OpenAI Codex, or
Gemini CLI as AI backends. No API keys needed. Just use your existing subscription.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#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>Until now, using Atmos AI required purchasing API tokens from a provider and configuring keys.
Many developers already have Claude Code or Codex installed with active subscriptions
(Claude Max, ChatGPT Pro, or Gemini's free tier). CLI providers let you reuse that investment:</p>
<ul>
<li class=""><strong>No API keys</strong> — the CLI tool handles auth via its own subscription</li>
<li class=""><strong>No per-token billing</strong> — included in your existing plan</li>
<li class=""><strong>Full MCP support</strong> — Claude Code and Codex CLI can use all your configured MCP servers</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="quick-start">Quick Start<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<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)">"claude-code"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># or "codex-cli" or "gemini-cli"</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">claude-code</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">max_turns</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)">10</span><br></span></code></pre></div></div></div></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">brew </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)">--cask</span><span class="token plain"> claude-code </span><span class="token operator" style="color:rgb(127, 219, 202)">&amp;&amp;</span><span class="token plain"> claude auth login</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 did we spend on EC2 last month?"</span><br></span></code></pre></div></div>
<p>That's it. Atmos detects the binary, generates an MCP config with auth wrapping, and passes
everything to Claude Code. You get answers from real AWS data using your subscription.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="available-cli-providers">Available CLI Providers<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#available-cli-providers" class="hash-link" aria-label="Direct link to Available CLI Providers" title="Direct link to Available CLI Providers" translate="no">​</a></h2>
<table><thead><tr><th>Provider</th><th>Binary</th><th>Subscription</th><th>MCP Support</th></tr></thead><tbody><tr><td>Claude Code</td><td><code>claude</code></td><td>Claude Pro/Max ($20-200/mo)</td><td>Full</td></tr><tr><td>OpenAI Codex</td><td><code>codex</code></td><td>ChatGPT Plus/Pro ($20-200/mo)</td><td>Full</td></tr><tr><td>Gemini CLI</td><td><code>gemini</code></td><td>Google account (free tier)</td><td>Blocked for personal accounts</td></tr></tbody></table>
<p>All three providers work for prompt-only queries. For MCP-enabled workflows (AWS billing,
security, IAM, etc.), use Claude Code or Codex CLI.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="mcp-pass-through">MCP Pass-Through<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#mcp-pass-through" class="hash-link" aria-label="Direct link to MCP Pass-Through" title="Direct link to MCP Pass-Through" translate="no">​</a></h2>
<p>When <code>mcp.servers</code> is configured in <code>atmos.yaml</code>, Atmos automatically passes MCP servers to the CLI tool.
Each provider uses its native config format:</p>
<ul>
<li class=""><strong>Claude Code</strong> — temp <code>.mcp.json</code> via <code>--mcp-config</code></li>
<li class=""><strong>Codex CLI</strong> — <code>~/.codex/config.toml</code> (backup/restore after exit)</li>
<li class=""><strong>Gemini CLI</strong> — <code>.gemini/settings.json</code> in the current working directory</li>
</ul>
<p>Auth-requiring servers are wrapped with <code>atmos auth exec -i &lt;identity&gt;</code>. Toolchain PATH
and <code>ATMOS_*</code> env vars are injected automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="see-it-in-action">See It in Action<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#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></h2>
<blockquote>
<p>Outputs below are from a production setup with 8 AWS MCP servers configured.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="claude-code--security-posture">Claude Code — Security Posture<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#claude-code--security-posture" class="hash-link" aria-label="Direct link to Claude Code — Security Posture" title="Direct link to Claude Code — Security Posture" translate="no">​</a></h3>
<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">$ atmos ai ask "What is our security posture in us-east-2 region?"</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">ℹ MCP servers configured: 8 (config: /tmp/atmos-mcp-config.json)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI provider: claude-code</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">  ## Security Posture Summary for us-east-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">  ### ✅ Enabled Security Services (2/6)</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">   GuardDuty - Fully operational</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">    • Status: ENABLED</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    • Finding frequency: Every 6 hours</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    • Active data sources: CloudTrail, DNS Logs, VPC Flow Logs,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      S3 Logs, EKS Audit Logs, RDS Login Events</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    • Current findings: None (clean)</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">   Inspector - Partially enabled</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">    • Status: ENABLED but no scan types active</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">  ### ❌ Disabled Security Services (4/6)</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. IAM Access Analyzer - Not configured</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    2. Security Hub - Not enabled</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    3. Trusted Advisor - Error checking status</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    4. Macie - Not enabled</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">  ### Key Recommendations</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">   High Priority:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    1. Enable Security Hub for centralized findings aggregation</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    2. Enable IAM Access Analyzer</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    3. Enable at least one Inspector scan type</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 security posture is moderate — you have basic threat detection</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   enabled but are missing several important security services.</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="codex-cli--ec2-billing">Codex CLI — EC2 Billing<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#codex-cli--ec2-billing" class="hash-link" aria-label="Direct link to Codex CLI — EC2 Billing" title="Direct link to Codex CLI — EC2 Billing" translate="no">​</a></h3>
<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">$ atmos ai ask "What did we spend on EC2 last month in each region?"</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">ℹ MCP servers configured: 8 (in ~/.codex/config.toml)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI provider: codex-cli</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">   For last month, I used the previous calendar month:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   March 1, 2026 through April 1, 2026.</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">   EC2 spend by region:</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">    • us-east-2: $88.10</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">   Cost Explorer returned only us-east-2 for Amazon Elastic Compute</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Cloud - Compute, so that appears to be the only region with EC2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   spend in that period. AWS also marked the result as Estimated,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   which is normal on April 1, 2026 while billing finalizes.</span><br></span></code></pre></div></div>
<p>Both providers automatically selected the right MCP server (<code>aws-security</code> and <code>aws-billing</code>)
and returned answers from real AWS data — no manual server selection needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="configuration">Configuration<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h2>
<p>You can mix CLI and API providers in the same config and switch between them:</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">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)">"claude-code"</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">claude-code</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">max_turns</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)">10</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">codex-cli</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">full_auto</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">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>
<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"># Uses claude-code (default)</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 stacks do we have?"</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"># Override to codex-cli</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 parameter variable" style="color:rgb(214, 222, 235)">--provider</span><span class="token plain"> codex-cli </span><span class="token string" style="color:rgb(173, 219, 103)">"What did we spend on EC2?"</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"># Override to API provider</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 parameter variable" style="color:rgb(214, 222, 235)">--provider</span><span class="token plain"> anthropic </span><span class="token string" style="color:rgb(173, 219, 103)">"Describe the vpc component"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="try-it">Try It<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#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>Example: AI with Claude Code</h2><div><p>Complete example with Claude Code CLI provider, AWS MCP servers, and automatic auth.</p><div><a class="button button--lg button--primary" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/examples/ai-claude-code">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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-cli-providers#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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/ai">AI Documentation</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/providers">AI Providers Configuration</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/mcp">MCP Configuration</a></li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Connect Atmos to MCP Servers — Use Cloud Tools Without Reimplementing Them]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos can now connect to external MCP servers and use their tools directly in AI conversations.]]></summary>
        <content type="html"><![CDATA[<p>Atmos can now connect to external MCP servers and use their tools directly in AI conversations.
Configure any MCP server in <code>atmos.yaml</code>, and its tools appear alongside native Atmos tools
in <code>atmos ai chat</code>, <code>atmos ai ask</code>, and <code>atmos ai exec</code> — no custom integration code needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#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 MCP ecosystem has hundreds of servers — <a href="https://github.com/awslabs/mcp" target="_blank" rel="noopener noreferrer" class="">20+ from AWS</a> for pricing,
security, documentation, and API access; GCP and Azure servers for their respective clouds; plus
community servers for databases, monitoring, CI/CD, and custom internal APIs.</p>
<p>Instead of waiting for each cloud integration to be built into Atmos, you can now install any
stdio-based MCP server and use it from the Atmos CLI. One <code>atmos.yaml</code> section, zero glue code.
Any MCP server that accepts <code>command</code>, <code>args</code>, and <code>env</code> works — AWS, GCP, Azure, or your own
custom server.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="quick-start">Quick Start<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<p>Add servers 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">mcp</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 comment" style="color:rgb(99, 119, 119);font-style:italic"># Cost Analysis &amp; FinOps</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">aws-billing</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"> uvx</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)">"awslabs.billing-cost-management-mcp-server@latest"</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">env</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><span class="token key atrule">AWS_REGION</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)">"us-east-1"</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 key atrule">description</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)">"AWS Billing — billing summaries and payment history"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"readonly"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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">aws-pricing</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"> uvx</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)">"awslabs.aws-pricing-mcp-server@latest"</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">env</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><span class="token key atrule">AWS_REGION</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)">"us-east-1"</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 key atrule">description</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)">"AWS Pricing — real-time pricing and cost analysis"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"readonly"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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"># Security &amp; Compliance</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">aws-security</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"> uvx</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)">"awslabs.well-architected-security-mcp-server@latest"</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">env</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><span class="token key atrule">AWS_REGION</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)">"us-east-1"</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 key atrule">description</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)">"AWS Security — Well-Architected security posture assessment"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"readonly"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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">aws-iam</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"> uvx</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)">"awslabs.iam-mcp-server@latest"</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">env</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><span class="token key atrule">AWS_REGION</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)">"us-east-1"</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 key atrule">description</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)">"AWS IAM — role/policy analysis and access patterns"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"readonly"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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">aws-cloudtrail</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"> uvx</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)">"awslabs.cloudtrail-mcp-server@latest"</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">env</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><span class="token key atrule">AWS_REGION</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)">"us-east-1"</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 key atrule">description</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)">"AWS CloudTrail — event history and API call auditing"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"readonly"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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"># Documentation (no credentials needed)</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">aws-docs</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"> uvx</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)">"awslabs.aws-documentation-mcp-server@latest"</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">description</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)">"AWS Documentation — search and fetch AWS docs"</span><br></span></code></pre></div></div></div></div></div>
<p>Then use them:</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"># Check what you've configured</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp list</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"># Verify a server works</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">test</span><span class="token plain"> aws-docs</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"># See what tools a server exposes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp tools aws-pricing</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"># Cost analysis (uses aws-pricing)</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's the on-demand price for m7i.xlarge in us-east-1?"</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"># Spend breakdown (uses aws-billing)</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 did we spend on EC2 last month?"</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"># Billing history (uses aws-billing)</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)">"Show our billing summary for the past 3 months"</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"># Security posture (uses aws-security)</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)">"Is GuardDuty enabled in all regions?"</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"># IAM analysis (uses aws-iam)</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)">"List all IAM roles with admin access"</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"># Audit trail (uses aws-cloudtrail)</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)">"Show recent API calls from the root account"</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"># Documentation (uses aws-docs, no credentials needed)</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)">"How do I configure S3 bucket lifecycle rules?"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="smart-server-routing">Smart Server Routing<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#smart-server-routing" class="hash-link" aria-label="Direct link to Smart Server Routing" title="Direct link to Smart Server Routing" translate="no">​</a></h2>
<p>When multiple MCP servers are configured, Atmos automatically selects only the servers
relevant to your question using a lightweight routing call to your configured AI provider.
This keeps tool payloads small and responses fast, even with dozens of servers configured:</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">$ atmos ai ask "List all IAM roles with admin access"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP routing selected 1 of 8 servers: aws-iam</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-iam" started (29 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 29 tools from 1 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 39</span><br></span></code></pre></div></div>
<p>Use <code>--mcp</code> to override and specify servers directly:</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"># Specify one server</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 parameter variable" style="color:rgb(214, 222, 235)">--mcp</span><span class="token plain"> aws-iam </span><span class="token string" style="color:rgb(173, 219, 103)">"List all admin roles"</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"># Comma-separated or repeated flags</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 parameter variable" style="color:rgb(214, 222, 235)">--mcp</span><span class="token plain"> aws-iam,aws-cloudtrail </span><span class="token string" style="color:rgb(173, 219, 103)">"Who accessed the admin role?"</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"># Works with all AI commands</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)">--mcp</span><span class="token plain"> aws-billing</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 parameter variable" style="color:rgb(214, 222, 235)">--mcp</span><span class="token plain"> aws-security,aws-iam </span><span class="token string" style="color:rgb(173, 219, 103)">"audit our security posture"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="visibility">Visibility<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#visibility" class="hash-link" aria-label="Direct link to Visibility" title="Direct link to Visibility" translate="no">​</a></h2>
<p>Atmos shows which MCP servers are active and which tools the AI uses:</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">ℹ MCP routing selected 2 of 8 servers: aws-docs, aws-pricing</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-docs" started (4 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-pricing" started (7 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 11 tools from 2 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 26 total</span><br></span></code></pre></div></div>
<p>After the AI responds, tool executions are listed:</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">---</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">## Tool Executions (2)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">1. ✅ aws-docs → aws.search_documentation (234ms)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">2. ✅ aws-pricing → get_pricing (456ms)</span><br></span></code></pre></div></div>
<p>Tool usage is not inferred — the AI provider explicitly declares which tools it wants to call
via the API protocol (<code>tool_use</code> stop reason with a <code>tool_calls</code> array). Atmos executes the
requested tools, sends results back to the AI for the final answer, and records every call.
If no tool executions appear, the AI genuinely chose not to use any tools for that question.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="cli-commands">CLI Commands<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#cli-commands" class="hash-link" aria-label="Direct link to CLI Commands" title="Direct link to CLI Commands" 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 plain">atmos mcp list            </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List configured external servers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp tools </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List tools from a server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">test</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain">     </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test server connectivity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp status          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Show all server statuses</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp restart </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Restart a server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><span class="token plain"> </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Generate .mcp.json for Claude Code / IDE</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="standard-config-format">Standard Config Format<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#standard-config-format" class="hash-link" aria-label="Direct link to Standard Config Format" title="Direct link to Standard Config Format" translate="no">​</a></h2>
<p>The <code>command</code>, <code>args</code>, <code>env</code> fields follow the same format used by Claude Code, Codex CLI, and
Gemini CLI. Atmos adds <code>description</code>, <code>identity</code>, and <code>timeout</code> as extensions:</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">mcp</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">my-server</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)">"uvx"</span><span class="token plain">                          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Standard</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)">"package@latest"</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"># Standard</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">env</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"># Standard</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">AWS_REGION</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)">"us-east-1"</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">description</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)">"What this server does"</span><span class="token plain">    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos extension</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-identity"</span><span class="token plain">                 </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</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">timeout</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)">"30s"</span><span class="token plain">                          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Connection timeout</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="atmos-auth-integration">Atmos Auth Integration<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#atmos-auth-integration" class="hash-link" aria-label="Direct link to Atmos Auth Integration" title="Direct link to Atmos Auth Integration" translate="no">​</a></h2>
<p>Use <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/auth">Atmos Auth</a> to inject credentials automatically — no manual
<code>AWS_PROFILE</code> setup:</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">mcp</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">aws-security</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"> uvx</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)">"awslabs.well-architected-security-mcp-server@latest"</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"security-audit"</span><span class="token plain">   </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Atmos Auth identity (from the auth section)</span><br></span></code></pre></div></div>
<p>Atmos authenticates through the identity chain, writes isolated credential files, and sets
<code>AWS_SHARED_CREDENTIALS_FILE</code> + <code>AWS_PROFILE</code> on the subprocess.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="toolchain-integration">Toolchain Integration<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#toolchain-integration" class="hash-link" aria-label="Direct link to Toolchain Integration" title="Direct link to Toolchain Integration" translate="no">​</a></h2>
<p>Map <code>uv</code> to the aqua registry and install via the <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/toolchain">Atmos Toolchain</a>:</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">toolchain</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">aliases</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">uv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> astral</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">sh/uv</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 toolchain </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> astral-sh/uv@0.7.12</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="ide-integration">IDE Integration<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#ide-integration" class="hash-link" aria-label="Direct link to IDE Integration" title="Direct link to IDE Integration" translate="no">​</a></h2>
<p>Use the same servers from Claude Code, Cursor, or any MCP-compatible IDE:</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"># Generate .mcp.json from your atmos.yaml config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><br></span></code></pre></div></div>
<p>Servers with <code>identity</code> are automatically wrapped with <code>atmos auth exec</code> for
credential injection. The generated <code>.mcp.json</code> works with Claude Code out of the box.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="atmos-yaml-functions">Atmos YAML Functions<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#atmos-yaml-functions" class="hash-link" aria-label="Direct link to Atmos YAML Functions" title="Direct link to Atmos YAML Functions" translate="no">​</a></h2>
<p>Atmos YAML functions work in env values:</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">mcp</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">my-server</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"> uvx</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)">"my-server@latest"</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">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">AWS_REGION</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"> AWS_DEFAULT_REGION    </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Read OS env var</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)">!exec</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"vault kv get -field=key secret/mcp"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Run command</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">PROJECT_ROOT</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)">!repo-root</span><span class="token plain">               </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Git root path</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="see-it-in-action">See It in Action<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#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></h2>
<blockquote>
<p>All outputs below are from real AWS accounts. Account IDs, resource identifiers,
and internal names have been redacted. Cost figures represent an example of real-world spending.</p>
</blockquote>
<p>List configured servers:</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">$ atmos mcp list</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       NAME         STATUS                           DESCRIPTION</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"> aws-api            stopped  AWS API — direct AWS CLI access with security controls</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-billing        stopped  AWS Billing — billing summaries and payment history</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-cloudtrail     stopped  AWS CloudTrail — event history and API call auditing</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-docs           stopped  AWS Documentation — search and fetch AWS docs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-iam            stopped  AWS IAM — role/policy analysis and access patterns</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-knowledge      stopped  AWS Knowledge — managed AWS knowledge base (remote)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-pricing        stopped  AWS Pricing — real-time pricing and cost analysis</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> aws-security       stopped  AWS Security — Well-Architected security posture assessment</span><br></span></code></pre></div></div>
<p>Explore tools from a security server:</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">$ atmos mcp tools aws-security</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">           TOOL                                                         DESCRIPTION</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"> CheckSecurityServices     Verify if selected AWS security services are enabled in the specified region and account.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> GetSecurityFindings       Retrieve security findings from AWS security services.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> GetStoredSecurityContext  Retrieve security services data that was stored in context from a previous CheckSecurityServices call.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> CheckStorageEncryption    Check if AWS storage resources have encryption enabled.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> ListServicesInRegion      List all AWS services being used in a specific region.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"> CheckNetworkSecurity      Check if AWS network resources are configured for secure data-in-transit.</span><br></span></code></pre></div></div>
<p>Test server connectivity:</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">$ atmos mcp test aws-docs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ Server started successfully</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ Initialization handshake complete</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ 4 tools available</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ Server responds to ping</span><br></span></code></pre></div></div>
<p>Ask AI with MCP tools:</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">$ atmos ai ask "How do I configure S3 bucket lifecycle rules?"</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">ℹ MCP routing selected 1 of 8 servers: aws-knowledge</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-knowledge" started (6 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 6 tools from 1 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 16</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">   Configuring S3 Bucket Lifecycle Rules</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">   S3 lifecycle rules automate object management by transitioning objects between</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   storage classes, archiving, or expiring them. Here's a comprehensive guide:</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><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">  ## 📋 Lifecycle Rule Structure</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">   Each rule contains 3 key 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">   Component │ Description</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">   Metadata  │ Rule ID and Status (Enabled/Disabled)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Filter    │ Which objects the rule applies to (prefix, tags, size)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Actions   │ What to do (transition, expire, delete)</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 bucket can have up to 1,000 rules per lifecycle configuration.</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><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">  ## 🔧 Available 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">   Action                           │ Description</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">    Transition                      │ Move objects to a different storage class after N days</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    Expiration                      │ Permanently delete current object versions</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    NoncurrentVersionTransition     │ Transition old versions in versioned buckets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    NoncurrentVersionExpiration     │ Delete noncurrent versions in versioned buckets</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    AbortIncompleteMultipartUpload  │ Cancel incomplete uploads after N days</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    ExpiredObjectDeleteMarker       │ Remove expired delete markers</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><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">  ## Tool Executions (1)</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. ✅ aws-knowledge → aws.search_documentation (2874ms)</span><br></span></code></pre></div></div>
<p>Ask AI about billing with MCP tools:</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">$ atmos ai ask "Show our billing summary for the past 2 months"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP routing selected 1 of 8 servers: aws-billing</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-billing" started (25 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 25 tools from 1 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 35</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 retrieve your billing summary for the past 2 months right away!</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">   Here's your billing summary for the past 2 months (February–March 2026):</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><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">  ## 📊 AWS Billing Summary — February &amp; March 2026</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">  ### 💰 Monthly Totals</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">   Service                                  │ Feb 2026 │ Mar 2026 │ Change</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">   Amazon Virtual Private Cloud             │ $309.53  │ $261.17   │ ▼ $48.36</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Elastic Container Registry Public │ $103.63  │ $103.66   │ ▲ $0.03</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   EC2 - Other                              │ $88.12   │ $123.39   │ ▲ $35.27</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AWS Key Management Service               │ $50.94   │ $47.98    │ ▼ $2.96</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Redshift                          │ $50.87   │ $0.30     │ ▼ $50.57</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Tax                                      │ $47.80   │ $40.98    │ ▼ $6.82</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Relational Database Service       │ $43.99   │ $0.11     │ ▼ $43.88</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AWS App Runner                           │ $28.42   │ $27.55    │ ▼ $0.87</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AWS WAF                                  │ $18.00   │ $18.00    │ —</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon EC2 Compute                       │ $5.03    │ $15.30    │ ▲ $10.27</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AmazonCloudWatch                         │ $10.08   │ $10.45    │ ▲ $0.37</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Simple Storage Service            │ $10.08   │ $9.35     │ ▼ $0.73</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Route 53                          │ $5.61    │ $5.68     │ ▲ $0.07</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Elastic File System               │ $3.65    │ —         │ ▼ $3.65</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon EC2 Container Registry (ECR)      │ $2.69    │ $2.75     │ ▲ $0.06</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon EKS                               │ —        │ $1.86     │ ▲ $1.86</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Amazon Registrar                         │ —        │ $14.00    │ ▲ $14.00</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AWS Cost Explorer                        │ $2.07    │ $1.91     │ ▼ $0.16</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Other services                           │ ~$1.65   │ ~$1.41    │ ▼ $0.24</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><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">  ### 📈 Grand Totals</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">   Month      │ Total Cost</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">   Feb 2026   │ ~$782.16</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Mar 2026   │ ~$745.26</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Difference │ ▼ $36.90 (-4.7%)</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><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">  ### 🔍 Key Observations</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. Amazon VPC is the largest cost at ~$261–$310/month (NAT Gateway data</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       transfer is typically the main driver). Costs dropped notably in March.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    2. Redshift &amp; RDS dropped sharply in March ($50.87 → $0.30 and</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       $43.99 → $0.11), suggesting those resources were stopped or deleted.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    3. EC2 - Other increased by $35 in March — worth investigating if this</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       correlates with EBS, data transfer, or Elastic IP costs.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    4. Amazon EC2 Compute tripled in March ($5.03 → $15.30), possibly linked</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       to the appearance of EKS ($1.86), indicating new compute workloads.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    5. Amazon Registrar appeared as a new $14 charge in March (domain renewal).</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">  │  ⚠️ Note: Credits and refunds are excluded from these figures.</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><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">  ## Tool Executions (1)</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. ✅ aws-billing → cost-explorer (381ms)</span><br></span></code></pre></div></div>
<p>Check security posture with MCP tools:</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">$ atmos ai ask "Is GuardDuty enabled in all regions?"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP routing selected 2 of 8 servers: aws-api, aws-security</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-api" started (2 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-security" started (6 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 8 tools from 2 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 18</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">  ## ❌ GuardDuty is NOT Enabled in All Regions</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">   GuardDuty is only enabled in 1 out of 34 regions checked.</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">  ### ✅ Enabled (1 region)</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">   Region    │ Detector ID</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">   us-east-2 │  &lt;detector-id-redacted&gt;</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">  ### ❌ Not Enabled (33 regions)</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">   Region         │ Region         │ Region</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">   ap-south-1     │ ap-south-2     │ ap-southeast-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   ap-southeast-2 │ ap-southeast-3 │ ap-southeast-4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   ap-northeast-1 │ ap-northeast-2 │ ap-northeast-3</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   ap-east-1      │ ca-central-1   │ ca-west-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   eu-central-1   │ eu-central-2   │ eu-north-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   eu-south-1     │ eu-south-2     │ eu-west-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   eu-west-2      │ eu-west-3      │ me-central-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   me-south-1     │ il-central-1   │ af-south-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   sa-east-1      │ us-east-1      │ us-west-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   us-west-2      │ mx-central-1   │ ...</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><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">  ### 🔒 Recommendations</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. Enable GuardDuty in all active regions — even regions where you don't</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       actively deploy can be targeted by attackers.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    2. Use a GuardDuty delegated administrator (via AWS Organizations) to</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">       centrally enable and manage across all accounts and regions.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    3. Consider AWS Security Hub to aggregate findings from all regions.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    4. Prioritize us-east-1, us-west-2, eu-west-1 immediately.</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><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">  ## Tool Executions (4)</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. ✅ aws-api → call_aws (400ms)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  2. ✅ aws-api → call_aws (14ms)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  3. ✅ aws-api → call_aws (7ms)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  4. ✅ aws-api → call_aws (9450ms)</span><br></span></code></pre></div></div>
<p>Audit IAM roles with smart routing:</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">$ atmos ai ask "List all IAM roles with admin access"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP routing selected 1 of 8 servers: aws-iam</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ MCP server "aws-iam" started (29 tools)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ Registered 29 tools from 1 MCP server(s)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ℹ AI tools initialized: 39</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 help you find all IAM roles with admin access. Let me fetch the</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   list of IAM roles and policies simultaneously.</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><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">  ## 🔐 IAM Roles with Admin Access</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. ✅ Direct AdministratorAccess Policy (4 attachments)</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">   Role Name                                        │ Description                                    │ Trust Principal</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">    AWSReservedSSO_AdministratorAccess_...          │ Allow Full Administrator access to the account │ AWS SSO (SAML Federation)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    AWSReservedSSO_RootAccess_...                   │ Centralized root access to member accounts     │ AWS SSO (SAML Federation)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    AWSReservedSSO_TerraformApplyAccess_...         │ Full Terraform state and account access        │ AWS SSO (SAML Federation)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    AWSReservedSSO_TerraformApplyAccess-Core_...    │ Full Terraform access (core backend)           │ AWS SSO (SAML Federation)</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><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">   Category                                  │ Count</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">   Full Admin (AdministratorAccess policy)   │ 4 roles</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   Broad Terraform/State access (elevated)   │ 4 roles</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">   AWS Service-Linked Roles (scoped)         │ 13 roles</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><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">  ### 🛡️ Security Recommendations</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. Review SSO assignments for AdministratorAccess and RootAccess roles.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    2. Audit TerraformApplyAccess roles — ensure MFA/session policies are enforced.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    3. Monitor tfstate roles — cross-account trust across 14 accounts.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    4. Enable CloudTrail for AssumeRole calls on high-privilege roles.</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><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">  ## Tool Executions (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">  1. ✅ aws-iam → list_roles (314ms)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  2. ✅ aws-iam → list_policies (174ms)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="try-it">Try It<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#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 MCP Example</h2><div><p>Try a complete example with pre-configured AWS MCP servers — documentation, knowledge base,
pricing, API access, and security assessment.</p><div><a class="button button--lg button--primary" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/examples/mcp">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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/mcp-server-integrations#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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/mcp">MCP Configuration</a> — Full configuration reference</li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/mcp/list">MCP Commands</a> — CLI command reference</li>
<li class=""><a href="https://github.com/awslabs/mcp" target="_blank" rel="noopener noreferrer" class="">AWS MCP Servers</a> — All available AWS servers</li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/ai">Atmos AI</a> — AI features overview</li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ambient Credential Support for IRSA, IMDS, and ECS Task Roles]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support"/>
        <updated>2026-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports ambient AWS credentials from IRSA, EC2 instance profiles, and ECS task roles via two new identity kinds: ambient (generic passthrough) and aws/ambient (AWS SDK default credential chain).]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports ambient AWS credentials from IRSA, EC2 instance profiles, and ECS task roles via two new identity kinds: <code>ambient</code> (generic passthrough) and <code>aws/ambient</code> (AWS SDK default credential chain).</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-new">What's New<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>Two new identity kinds make it possible to run Atmos natively in environments where credentials are already available:</p>
<ul>
<li class="">
<p><strong><code>ambient</code></strong> — A cloud-agnostic passthrough that preserves all environment variables as-is. No credential clearing, no IMDS disabling, no file overrides. Use this when you just want Atmos to leave the environment alone.</p>
</li>
<li class="">
<p><strong><code>aws/ambient</code></strong> — An AWS-specific identity that resolves credentials through the <a href="https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html" target="_blank" rel="noopener noreferrer" class="">AWS SDK's default credential provider chain</a>. This supports environment variables, shared config files, IRSA web identity tokens, EC2 instance metadata (IMDS), and ECS container credentials. Unlike <code>ambient</code>, it returns real AWS credentials that can be used by chained identities like <code>aws/assume-role</code>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="quick-start">Quick Start<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="eks-pod-with-irsa">EKS Pod with IRSA<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#eks-pod-with-irsa" class="hash-link" aria-label="Direct link to EKS Pod with IRSA" title="Direct link to EKS Pod with IRSA" translate="no">​</a></h3>
<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">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">eks-deployer</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/ambient</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">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)">1</span><br></span></code></pre></div></div>
<p>That's it. The pod's IRSA-injected <code>AWS_WEB_IDENTITY_TOKEN_FILE</code> and <code>AWS_ROLE_ARN</code> environment variables are preserved and used by the AWS SDK when Terraform runs.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="ec2-instance-profile">EC2 Instance Profile<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#ec2-instance-profile" class="hash-link" aria-label="Direct link to EC2 Instance Profile" title="Direct link to EC2 Instance Profile" translate="no">​</a></h3>
<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">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">instance-creds</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/ambient</span><br></span></code></pre></div></div>
<p>The EC2 instance metadata service (IMDS) provides credentials automatically. No region needed if it's set elsewhere.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="simple-passthrough">Simple Passthrough<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#simple-passthrough" class="hash-link" aria-label="Direct link to Simple Passthrough" title="Direct link to Simple Passthrough" translate="no">​</a></h3>
<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">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">passthrough</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"> ambient</span><br></span></code></pre></div></div>
<p>Use this when credentials are pre-configured in the environment and you just want Atmos to pass them through without any modification.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#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, Atmos auth explicitly disabled IMDS and cleared IRSA environment variables to prevent accidental credential leakage. This was the right default for developer workstations and interactive SSO flows, but it made it impossible to use infrastructure-provided credentials in:</p>
<ul>
<li class=""><strong>EKS pods</strong> using IAM Roles for Service Accounts (IRSA)</li>
<li class=""><strong>EC2 instances</strong> with IAM instance profiles</li>
<li class=""><strong>ECS tasks</strong> with task roles</li>
<li class=""><strong>CI runners</strong> with pre-configured AWS credentials</li>
</ul>
<p>Teams in these environments had to either bypass Atmos auth entirely (losing identity management, integrations, and audit trail) or maintain parallel credential management.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="chaining-with-assume-role">Chaining with Assume Role<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#chaining-with-assume-role" class="hash-link" aria-label="Direct link to Chaining with Assume Role" title="Direct link to Chaining with Assume Role" translate="no">​</a></h2>
<p>A common pattern in multi-account environments: use the pod's IRSA credentials to assume a role in another account.</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">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 comment" style="color:rgb(99, 119, 119);font-style:italic"># Base: use the pod's IRSA credentials</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">pod-base</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/ambient</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">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)">1</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"># Chain: assume a cross-account role using IRSA as the base</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">cross-account-deployer</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">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">base</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"> </span><span class="token string" style="color:rgb(173, 219, 103)">"arn:aws:iam::999999999999:role/TerraformDeployRole"</span><br></span></code></pre></div></div>
<p>The <code>aws/ambient</code> identity resolves the IRSA credentials, then <code>aws/assume-role</code> uses them to call <code>sts:AssumeRole</code> into the target account.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#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>Every other AWS identity kind in Atmos calls a shared <code>PrepareEnvironment()</code> helper that:</p>
<ol>
<li class="">Clears credential env vars (<code>AWS_ACCESS_KEY_ID</code>, <code>AWS_WEB_IDENTITY_TOKEN_FILE</code>, etc.)</li>
<li class="">Sets <code>AWS_EC2_METADATA_DISABLED=true</code></li>
<li class="">Points <code>AWS_SHARED_CREDENTIALS_FILE</code> and <code>AWS_PROFILE</code> to Atmos-managed files</li>
</ol>
<p>The <code>aws/ambient</code> identity <strong>skips all of this</strong>. It creates a copy of the environment and returns it with only an optional region override. This allows the AWS SDK's full default credential chain to work naturally.</p>
<p>The <code>ambient</code> identity is even simpler — it returns the environment completely unchanged.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="when-to-use-each">When to Use Each<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#when-to-use-each" class="hash-link" aria-label="Direct link to When to Use Each" title="Direct link to When to Use Each" translate="no">​</a></h2>
<table><thead><tr><th>Identity Kind</th><th>Use When</th></tr></thead><tbody><tr><td><code>aws/ambient</code></td><td>Running on AWS infrastructure (EKS/EC2/ECS) where you need chaining support</td></tr><tr><td><code>ambient</code></td><td>Any environment where credentials are pre-configured and you want zero interference</td></tr><tr><td><code>aws/assume-role</code> via SSO</td><td>Developer workstations, interactive flows</td></tr><tr><td><code>aws/assume-role</code> via GitHub OIDC</td><td>GitHub Actions CI/CD</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-started">Get Started<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ambient-credential-support#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/auth">Authentication Configuration</a> — Full auth documentation with ambient examples</li>
<li class=""><a href="https://github.com/cloudposse/atmos/tree/main/examples/config-profiles/profiles/eks" target="_blank" rel="noopener noreferrer" class="">EKS Profile Example</a> — Ready-to-use EKS/IRSA configuration</li>
</ul>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Chunked Uploads for Large Stack Payloads]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads"/>
        <updated>2026-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now automatically chunks large payloads when uploading affected stacks and instances to Atmos Pro, eliminating HTTP 413 errors for large infrastructure repositories.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now automatically chunks large payloads when uploading affected stacks and instances to Atmos Pro, eliminating HTTP 413 errors for large infrastructure repositories.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>When running <code>atmos describe affected --upload</code> or <code>atmos list instances --upload</code>, the CLI now checks the serialized payload size before sending. If the payload exceeds the configurable threshold (default 4MB), Atmos splits the data into multiple smaller requests, each tagged with batch metadata (<code>batch_id</code>, <code>batch_index</code>, <code>batch_total</code>) for server-side reassembly.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="key-improvements">Key Improvements<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads#key-improvements" class="hash-link" aria-label="Direct link to Key Improvements" title="Direct link to Key Improvements" translate="no">​</a></h3>
<ul>
<li class=""><strong>Automatic chunking</strong> - Payloads are split transparently when they exceed the size threshold</li>
<li class=""><strong>Compact JSON</strong> - Upload payloads now use compact JSON serialization, reducing size by ~30%</li>
<li class=""><strong>Configurable threshold</strong> - The <code>max_payload_bytes</code> setting in <code>atmos.yaml</code> lets you tune the chunk size</li>
<li class=""><strong>Backward compatible</strong> - Small payloads send exactly as before; old CLI versions continue to work with updated servers</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads#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>Organizations with large infrastructure footprints (hundreds of stacks and components) were hitting Vercel's serverless function body size limit (~4.5MB) when uploading stack data to Atmos Pro. The existing <code>StripAffectedForUpload</code> optimization reduces payloads by 70-75%, but that was not enough for the largest repositories.</p>
<p>With chunked uploads, there is no practical upper limit on the number of stacks or instances that can be uploaded.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads#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>Chunked uploads work automatically with no configuration required. To customize the chunk size threshold, add <code>max_payload_bytes</code> to the <code>pro</code> section of 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">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">pro</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">max_payload_bytes</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)">4194304</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># 4MB (default)</span><br></span></code></pre></div></div>
<p>Set a lower value if you're behind a reverse proxy with a smaller body size limit, or a higher value if your server supports larger payloads.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/chunked-stack-uploads#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="">Report issues at <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">github.com/cloudposse/atmos/issues</a></li>
<li class="">Join the discussion in <a href="https://github.com/orgs/cloudposse/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a></li>
</ul>]]></content>
        <author>
            <name>Daniel Miller</name>
            <uri>https://github.com/milldr</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Zero-Config CI with Describe Affected Auto-Detection]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection"/>
        <updated>2026-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The atmos describe affected command now auto-detects the base commit in CI environments, eliminating the need for verbose flag wiring in your workflows.]]></summary>
        <content type="html"><![CDATA[<p>The <code>atmos describe affected</code> command now auto-detects the base commit in CI environments, eliminating the need for verbose flag wiring in your workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>We introduced the <code>--base</code> flag as a unified replacement for <code>--ref</code> and <code>--sha</code>, and added automatic base resolution when running in CI with <code>ci.enabled: true</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="before">Before<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#before" class="hash-link" aria-label="Direct link to Before" title="Direct link to Before" translate="no">​</a></h3>
<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 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"> Describe affected</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)">    atmos describe affected \</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">      --ref ${{ github.event.pull_request.head.sha }} \</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">      --sha ${{ github.event.action == 'closed' &amp;&amp; steps.get_parent.outputs.parent_commit || github.event.pull_request.base.sha }}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="after">After<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#after" class="hash-link" aria-label="Direct link to After" title="Direct link to After" translate="no">​</a></h3>
<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 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"> Describe affected</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 describe affected</span><br></span></code></pre></div></div>
<p>That's it. No flags needed. Atmos reads GitHub Actions environment variables and event payloads to determine the correct base commit for each event type.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#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>When <code>ci.enabled</code> is <code>true</code> in your <code>atmos.yaml</code> and no explicit <code>--base</code> flag is provided, each CI provider resolves the base commit automatically:</p>
<table><thead><tr><th>GitHub Actions Event</th><th>Base Resolution</th></tr></thead><tbody><tr><td>Pull request (open/sync)</td><td>Target branch from <code>GITHUB_BASE_REF</code></td></tr><tr><td>Pull request (closed/merged)</td><td>PR base SHA from event payload</td></tr><tr><td>Push</td><td>Previous HEAD from event payload</td></tr><tr><td>Force push</td><td>Parent commit (<code>HEAD~1</code>)</td></tr><tr><td>Merge group</td><td>Target branch from <code>GITHUB_BASE_REF</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the---base-flag">The <code>--base</code> Flag<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#the---base-flag" class="hash-link" aria-label="Direct link to the---base-flag" title="Direct link to the---base-flag" translate="no">​</a></h2>
<p>The new <code>--base</code> flag replaces both <code>--ref</code> and <code>--sha</code> with a single, intuitive flag that accepts either format:</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 describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--base</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--base</span><span class="token plain"> refs/tags/v1.16.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--base</span><span class="token plain"> 3a5eafeab90426bd82bf5899896b28cc0bab3073</span><br></span></code></pre></div></div>
<p>The old <code>--ref</code> and <code>--sha</code> flags still work but are now deprecated.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="provider-agnostic-architecture">Provider-Agnostic Architecture<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#provider-agnostic-architecture" class="hash-link" aria-label="Direct link to Provider-Agnostic Architecture" title="Direct link to Provider-Agnostic Architecture" translate="no">​</a></h2>
<p>Base resolution is part of the CI provider interface — each provider implements its own <code>ResolveBase()</code> method. GitHub Actions is the first implementation, with the architecture ready for GitLab CI, Jenkins, and other providers.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-auto-detection#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Try it out in your GitHub Actions workflows and let us know how it works. Open an issue at <a href="https://github.com/cloudposse/atmos" target="_blank" rel="noopener noreferrer" class="">github.com/cloudposse/atmos</a> with any feedback.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Gists: Community Recipes for Atmos]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now has a dedicated space for community-contributed recipes called Gists — creative patterns showing how to combine Atmos features in ways that go beyond standard documentation.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now has a dedicated space for community-contributed recipes called <strong>Gists</strong> — creative patterns showing how to combine Atmos features in ways that go beyond standard documentation.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-are-gists">What Are Gists?<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists#what-are-gists" class="hash-link" aria-label="Direct link to What Are Gists?" title="Direct link to What Are Gists?" translate="no">​</a></h2>
<p>Gists are shared as-is by community contributors. Unlike maintained <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/examples">examples</a>, gists may need adaptation for your version of Atmos. They serve as inspiration and starting points for building your own workflows.</p>
<table><thead><tr><th></th><th>Examples</th><th>Gists</th></tr></thead><tbody><tr><td><strong>Maintained</strong></td><td>Yes, tested with each release</td><td>No, shared as-is</td></tr><tr><td><strong>Scope</strong></td><td>Single feature demonstration</td><td>Combining multiple features</td></tr><tr><td><strong>Style</strong></td><td>Minimal config files</td><td>Rich README + config files</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="first-gist-finops-with-aws-mcp-servers">First Gist: FinOps with AWS MCP Servers<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists#first-gist-finops-with-aws-mcp-servers" class="hash-link" aria-label="Direct link to First Gist: FinOps with AWS MCP Servers" title="Direct link to First Gist: FinOps with AWS MCP Servers" translate="no">​</a></h2>
<p>Our inaugural gist is a masterclass in combining <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/commands">Custom Commands</a>, <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/auth">Auth</a>, and <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/toolchain">Toolchain</a> to give AI assistants direct access to AWS cost data.</p>
<p>Ask Claude questions like "What did we spend on EC2 last month?" and get real answers from your actual AWS account — all authenticated automatically through Atmos.</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 AWS MCP server packages</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp aws </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> all</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 a cost server with automatic AWS auth</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp aws start cost-explorer</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 that auth is working</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos mcp aws </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">test</span><span class="token plain"> all</span><br></span></code></pre></div></div>
<p>The gist configures 21 AWS MCP servers including Billing, Cost Explorer, Pricing, CloudWatch, IAM, and more — all using a single authentication pattern powered by <code>atmos auth exec</code>.</p>
<p><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/gists/mcp-with-aws">Browse the gist</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="contributing-a-gist">Contributing a Gist<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists#contributing-a-gist" class="hash-link" aria-label="Direct link to Contributing a Gist" title="Direct link to Contributing a Gist" translate="no">​</a></h2>
<p>Have a creative Atmos recipe? We welcome contributions.</p>
<ol>
<li class="">Create a directory in <code>gists/</code> with your config files and a comprehensive README</li>
<li class="">Submit a pull request</li>
<li class="">Your gist will automatically appear on the <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/gists">Gists page</a></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-gists#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="">Browse the <a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/gists">Gists collection</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/community/slack">Join us on Slack</a></li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/community/office-hours">Attend Office Hours</a></li>
</ul>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Real-Time Instance Status from Atmos CLI to Atmos Pro]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/instance-status-upload"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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>
        <author>
            <name>Daniel Miller</name>
            <uri>https://github.com/milldr</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Isolated Browser Sessions for Multi-Account Console Access]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-console-isolated-sessions"/>
        <updated>2026-03-18T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Taming the Beast: Refactoring processArgsAndFlags to 100% Test Coverage]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/process-args-flags-refactor"/>
        <updated>2026-03-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[What do you do when you find a 490-line function with ~67 cyclomatic complexity and 0% test coverage on its]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>nitrocode</name>
            <uri>https://github.com/nitrocode</uri>
        </author>
        <category label="DX" term="DX"/>
        <category label="Core" term="Core"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Refactoring ExecuteTerraform: From Cyclomatic Complexity 160 to 26]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/refactoring-executeterraform-for-testability"/>
        <updated>2026-03-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[When a single function accumulates 160 decision branches, it becomes nearly impossible to reason about, test, or safely change.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>nitrocode</name>
            <uri>https://github.com/nitrocode</uri>
        </author>
        <category label="Core" term="Core"/>
        <category label="DX" term="DX"/>
        <category label="Enhancement" term="Enhancement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Native CI Integration: Rich Plan Summaries Without Extra Actions]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/native-ci-integration"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/profiles">profiles</a> and <a class="" href="https://pr-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/ci">Native CI Overview</a> — feature overview and architecture</li>
<li class=""><a class="" href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/ci/planfile-storage">Planfile Storage</a> — store and verify planfiles across CI pipeline stages</li>
</ul>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[98% Complexity Reduction in describe stacks]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-stacks-complexity-reduction"/>
        <updated>2026-03-15T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>nitrocode</name>
            <uri>https://github.com/nitrocode</uri>
        </author>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.5× Faster Deep Merge for Stack Processing]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/faster-deep-merge"/>
        <updated>2026-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos stack processing is now up to 3.5× faster for deep-merge operations — the hot path]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>nitrocode</name>
            <uri>https://github.com/nitrocode</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
        <category label="Core" term="Core"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Structured Component Dependencies]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/dependencies-components"/>
        <updated>2026-03-14T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/dependencies/components">Component Dependencies documentation</a> for complete details.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[EKS Kubeconfig Authentication: Native kubectl Access Without the AWS CLI]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/eks-kubeconfig-authentication"/>
        <updated>2026-03-13T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>Ben Smith</name>
            <uri>https://github.com/Benbentwo</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Required Identities for Multi-Account Components]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-required-concurrent-identities"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos identities now support required: true, enabling automatic authentication of multiple identities before Terraform runs — without prompting.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI-Powered Analysis for Atmos Commands with the Global --ai Flag]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ai-powered-analysis-with-global-ai-flag"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Add --ai to any Atmos command and get instant AI-powered analysis of the output. Successful plans get]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai">AI Configuration</a> — Full configuration reference</li>
<li class=""><a class="" href="https://pr-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai/skills">AI Skills</a> — Available skills for domain-specific analysis</li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Global `ignore_missing_template_values` for Stack Imports]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/global-ignore-missing-template-values"/>
        <updated>2026-03-09T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Atmos AI: Your Infrastructure-Aware AI Assistant]]></title>
        <id>https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai</id>
        <link href="https://pr-2282.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/introducing-atmos-ai"/>
        <updated>2026-03-07T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/cli/configuration/ai">Configuration Guide</a> - Complete configuration reference</li>
<li class=""><a class="" href="https://pr-2282.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-2282.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-2282.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-2282.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-2282.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-2282.atmos-docs.ue2.dev.plat.cloudposse.org/ai/mcp-server">MCP Server</a> - Claude Desktop integration</li>
<li class=""><a class="" href="https://pr-2282.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>
        <author>
            <name>Atmos Team</name>
            <uri>https://github.com/cloudposse/atmos</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
</feed>