feat: CLI AI providers — use Claude Code, Codex CLI, or Gemini CLI instead of API tokens @aknysh (#2280)
what
- Add 3 new CLI AI providers that invoke locally installed AI tools as subprocesses:
claude-code,codex-cli,gemini-cli - MCP pass-through for CLI providers — configured MCP servers are automatically passed to the CLI tool via its native config format
- ATMOS_ env var injection* for Codex CLI MCP servers (they don't inherit parent process env)
- No API keys needed — CLI providers reuse the user's existing subscription (Claude Pro/Max, ChatGPT Plus/Pro, Google account free tier)
Available CLI Providers
| Provider | Config Key | Binary | Auth | MCP Support |
|---|---|---|---|---|
| Claude Code | claude-code
| claude
| Claude Pro/Max subscription | Full |
| OpenAI Codex | codex-cli
| codex
| ChatGPT Plus/Pro subscription | Full |
| Gemini CLI | gemini-cli
| gemini
| Google account (free tier) | Blocked for personal accounts |
MCP Pass-Through
Each provider uses its native config format:
| Provider | Config Method | Approval Flag |
|---|---|---|
| Claude Code | --mcp-config <temp-file>
| --dangerously-skip-permissions
|
| Codex CLI | Write to ~/.codex/config.toml (backup/restore)
| --dangerously-bypass-approvals-and-sandbox
|
| Gemini CLI | .gemini/settings.json in cwd
| --approval-mode auto_edit
|
Quick Start
ai:
enabled: true
default_provider: "claude-code" # or "codex-cli" or "gemini-cli"
providers:
claude-code:
max_turns: 10brew install --cask claude-code && claude auth login
atmos ai ask "What did we spend on EC2 last month?"See It in Action
All outputs below are from a real AWS account.
Claude Code — Security Posture
$ atmos ai ask "What is our security posture in us-east-2 region?"
ℹ MCP servers configured: 8 (config: /tmp/atmos-mcp-config.json)
ℹ AI provider: claude-code
👽 Thinking...
## Security Posture Summary for us-east-2
### ✅ Enabled Security Services (2/6)
GuardDuty - Fully operational
• Status: ENABLED
• Active data sources: CloudTrail, DNS Logs, VPC Flow Logs,
S3 Logs, EKS Audit Logs, RDS Login Events
• Current findings: None (clean)
Inspector - Partially enabled
• Status: ENABLED but no scan types active
### ❌ Disabled Security Services (4/6)
1. IAM Access Analyzer - Not configured
2. Security Hub - Not enabled
3. Trusted Advisor - Error checking status
4. Macie - Not enabled
### Key Recommendations
High Priority:
1. Enable Security Hub for centralized findings aggregation
2. Enable IAM Access Analyzer
3. Enable at least one Inspector scan type
Codex CLI — EC2 Billing
$ atmos ai ask "What did we spend on EC2 last month in each region?"
ℹ MCP servers configured: 8 (in ~/.codex/config.toml)
ℹ AI provider: codex-cli
👽 Thinking...
For last month, I used the previous calendar month:
March 1, 2026 through April 1, 2026.
EC2 spend by region:
• us-east-2: $88.10
Cost Explorer returned only us-east-2 for Amazon Elastic Compute
Cloud - Compute, so that appears to be the only region with EC2
spend in that period.
Both providers automatically selected the right MCP server and returned answers from real AWS data — no manual server selection needed.
why
Why run Claude Code through Atmos instead of the other way around?
Both directions work — you can start a Claude Code session and call Atmos inside it, or use Atmos to invoke Claude Code. Here's when each approach makes sense:
Starting Claude Code → calling Atmos (via MCP server)
claude
# Then inside Claude Code: @atmos-expert "list all stacks"How it works: Claude Code connects to the Atmos MCP server (atmos mcp start) and uses Atmos tools directly from the IDE.
Best for:
- Long interactive coding sessions where you need AI + infrastructure context
- IDE-driven workflows (Claude Code in VS Code, Cursor, etc.)
- When you want Claude Code's full toolset (file editing, bash, web search) alongside Atmos tools
- Exploratory work — "help me understand and modify this infrastructure"
Limitations:
- Requires setting up the MCP server in your IDE config (
.claude/mcp.json) - Only has access to native Atmos tools — no external AWS MCP servers (billing, security, IAM) unless you configure them separately in Claude Code's own MCP config
- Auth credentials for AWS MCP servers must be configured manually in the IDE config
Atmos → starting Claude Code (this PR)
atmos ai ask "What did we spend on EC2 last month?"How it works: Atmos invokes claude -p as a subprocess, passing MCP servers with auth credentials pre-configured.
Best for:
- Quick one-shot queries from the terminal (
atmos ai ask) - When you need external MCP servers (AWS billing, security, IAM, CloudTrail) with automatic auth
- CI-adjacent workflows — scripting AI analysis into your workflow
- Multi-provider switching — same question to Claude Code, Codex, or Gemini
- Teams that manage MCP servers centrally in
atmos.yaml— one config, every developer gets the same tools
Key advantage — centralized MCP + auth orchestration:
# atmos.yaml — one config for the whole team
mcp:
servers:
aws-billing:
command: uvx
args: ["awslabs.billing-cost-management-mcp-server@latest"]
identity: "readonly" # Atmos Auth handles SSO → credentials automatically
auth:
providers:
aws-sso:
kind: aws/iam-identity-center
start_url: "https://your-org.awsapps.com/start"
identities:
readonly:
kind: aws/permission-set
provider: aws-sso
principal:
permission_set: "ReadOnlyAccess"
account:
id: "123456789012"When you run atmos ai ask, Atmos:
- Authenticates via SSO (once, cached)
- Generates MCP config with credential injection (
atmos auth exec -i readonly --) - Injects toolchain PATH so
uvxis available - Passes everything to Claude Code via
--mcp-config - Claude Code uses AWS MCP tools with real credentials — zero manual setup
With the "Claude Code first" approach, each developer would need to manually configure AWS credentials, MCP server paths, and toolchain binaries in their personal IDE config.
Summary
| Claude Code → Atmos | Atmos → Claude Code | |
|---|---|---|
| Setup | MCP server in IDE config | atmos.yaml (shared)
|
| Auth | Manual per-developer | Centralized via Atmos Auth |
| External MCP | Manual config per tool | Automatic from atmos.yaml
|
| Toolchain | Must install uvx globally
| Atmos Toolchain manages it |
| Best for | IDE coding sessions | Terminal queries, team workflows |
| Multi-provider | Claude only | Claude, Codex, Gemini |
| CI/CD | Not practical | atmos ai exec with JSON output
|
They're complementary, not competing. Use Claude Code directly for coding sessions in your IDE. Use atmos ai ask/chat for quick infrastructure queries with centralized MCP + auth. Both can be configured in the same project.
Additional motivation
- Many developers already have Claude Code or Codex installed with active subscriptions ($20-200/mo). CLI providers let them reuse that investment instead of purchasing separate API tokens.
- CLI providers handle their own tool execution loop, which means they can use all their built-in tools (file search, code editing, web browsing) alongside MCP-provided AWS tools.
- This completes the AI provider ecosystem: 7 API providers + 3 CLI providers = 10 total providers.
Key Findings During Implementation
Codex CLI
-cflag overrides do NOT register MCP servers as tools — must write to~/.codex/config.toml--full-autoonly auto-approves file writes, not MCP tool calls — need--dangerously-bypass-approvals-and-sandbox- JSONL output uses
item.type="agent_message"withitem.textdirectly (not documented"message"with nestedcontent[]) - MCP servers don't inherit parent env —
ATMOS_*vars must be explicitly injected
Gemini CLI
- MCP is blocked server-side for ALL personal Google accounts (
oauth-personalauth) regardless of subscription tier - This is a Google infrastructure restriction (proxy
cloudcode-pa.googleapis.comhas MCP feature flag disabled) - The Atmos implementation is complete — MCP will work when Google enables it for personal accounts
- Switching to API key auth enables MCP but loses the free-tier benefit (equivalent to existing
geminiAPI provider)
New Files
Code
pkg/ai/agent/claudecode/— Claude Code CLI provider with MCP pass-throughpkg/ai/agent/codexcli/— OpenAI Codex CLI provider with~/.codex/config.tomlbackup/restore and ATMOS_* injectionpkg/ai/agent/geminicli/— Gemini CLI provider with.gemini/settings.jsonin cwdpkg/mcp/client/mcpconfig.go— Shared MCP config generation (env uppercasing, PATH dedup, toolchain injection)
Documentation
- Blog post:
website/blog/2026-04-01-ai-cli-providers.mdx - Example:
examples/ai-claude-code/— Complete example with AWS MCP servers and automatic auth - PRD:
docs/prd/atmos-ai-local-providers.md(v1.6) - Website docs updated:
ai/ai.mdx,ai/troubleshooting.mdx,cli/configuration/ai/index.mdx,cli/configuration/ai/providers.mdx,cli/configuration/mcp/index.mdx,cli/commands/ai/ask.mdx,cli/commands/ai/exec.mdx,cli/commands/ai/usage.mdx - Roadmap: 4 shipped milestones added to
ai-assistantinitiative
Tests
- 40+ unit tests across all three CLI provider packages
- Coverage: claudecode 63%, codexcli 72%, geminicli 66%, mcp/client 83%, base 88%
references
- PRD:
docs/prd/atmos-ai-local-providers.md - Blog:
website/blog/2026-04-01-ai-cli-providers.mdx - Example:
examples/ai-claude-code/ - Claude Code CLI Reference
- OpenAI Codex CLI
- Gemini CLI
Summary by CodeRabbit
-
New Features
- Added three CLI AI providers: Claude Code, Codex CLI, and Gemini CLI (use local CLI subscriptions; no API keys)
- CLI providers support MCP pass-through (Atmos forwards configured MCP servers to the CLI)
- New per-provider settings: binary, max_turns, max_budget_usd, allowed_tools, full_auto
- UI now displays the selected AI provider
- New example project demonstrating Claude Code CLI usage and Terraform VPC example
-
Documentation
- New quick-starts, guides, troubleshooting, and PRD updates distinguishing API vs CLI providers and MCP pass-through workflows
feat: Zero-config CI base detection for describe affected @osterman (#2241)
what
- Add auto-detection of the base commit in CI environments when
ci.enabledis true, eliminating verbose--ref/--shaflag wiring in GitHub Actions workflows - Introduce unified
--baseflag as a single replacement for the confusingly-named--refand--shaflags (both pointed to the base commit) - Extend the CI Provider interface with
ResolveBase()method for provider-agnostic base resolution - Implement GitHub Actions base resolution covering all event types: PR open/sync, PR closed/merged, push, force-push, and merge group
- Implement generic provider with
ATMOS_CI_BASE_REFenv var support for local testing - Deprecate
--refand--shaas hidden aliases
why
- Users had to write verbose, error-prone shell expressions to wire
--refand--shain GitHub Actions workflows - The flag names were confusing — both
--refand--shareferred to the base commit, but their names didn't convey this - With
ci.enabled, Atmos should auto-detect the base commit from CI environment variables, achieving zero-config operation - Provider-agnostic architecture allows future GitLab CI, Jenkins, etc. implementations without changing the core logic
references
- PRD:
docs/prd/native-ci/framework/base-resolution.md - Blog post:
website/blog/2026-03-21-describe-affected-auto-detection.mdx - Docusaurus docs updated:
website/docs/cli/commands/describe/describe-affected.mdx - Roadmap milestone added to CI/CD Simplification initiative
Summary by CodeRabbit
-
New Features
- Unified --base flag for specifying the comparison base
- Automatic base commit detection in CI when ci.enabled is true, with GitHub Actions support
- ATMOS_CI_BASE_REF environment override for local testing
-
Deprecated
- --ref and --sha flags deprecated; use --base instead
-
Documentation
- Updated CLI docs, blog post, examples, and roadmap entry describing flag precedence and CI auto-detection
-
Tests
- Added extensive unit/integration tests covering base resolution and CI scenarios
-
Chores
- CI provider registry reset helper added
feat: MCP server integrations — connect Atmos to external MCP servers @aknysh (#2267)
what
- Connect Atmos to external MCP servers (AWS, GCP, Azure, custom) and use their tools in
atmos ai ask,atmos ai chat, andatmos ai exec - Add CLI MCP management commands:
atmos mcp list,tools,test,status,restart,start,export - Add smart server routing — automatically selects only the MCP servers relevant to the user's question using a lightweight routing call to the configured AI provider
- Add
--mcpflag on all AI commands for manual server selection (supports--mcp aws-iam,aws-billingand--mcp aws-iam --mcp aws-billing), env varATMOS_AI_MCP - Add
atmos mcp exportto emit.mcp.jsonfor Claude Code / Cursor / IDE integration - Add Atmos Auth integration —
identityfield on server config for automatic credential injection (references identities from theauthsection) - Add toolchain integration — resolves
uvx/npxfrom.tool-versionsbefore starting servers - Add
BridgedToolpattern to wrap external MCP tools as native Atmostools.Toolinterface - Add human-readable tool names in output (
aws-iam → list_rolesinstead ofaws-iam__list_roles) - Add tool execution display to
atmos ai askoutput via MarkdownFormatter - Add configurable
ai.max_tool_iterations(default 25, was hardcoded 10) to support complex multi-tool queries - Add complete example with 8 pre-configured AWS MCP servers at
examples/mcp/ - Add comprehensive documentation: MCP Configuration, MCP Commands, AI Landing Page
why
- Leverage the ecosystem — 100+ MCP servers exist for AWS, GCP, Azure, databases, monitoring, CI/CD. Instead of reimplementing cloud provider functionality, Atmos orchestrates existing MCP servers
- Parity with AI tools — Claude Code, Cursor, Windsurf all manage MCP servers. Atmos should too
- Speed — Installing an AWS MCP server takes seconds. Building equivalent functionality takes weeks
- Composability — Users can mix native Atmos tools (describe stacks, validate) with external tools (AWS billing, security, IAM) in the same AI conversation
references
- PRD:
docs/prd/atmos-mcp-integrations.md - Blog post:
website/blog/2026-03-29-mcp-server-integrations.mdx - Example:
examples/mcp/— complete working example with 8 AWS MCP servers - AWS MCP Servers — 20+ servers for the AWS ecosystem
- MCP Protocol Specification
See It in Action
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.
List configured servers
$ atmos mcp list
NAME STATUS DESCRIPTION
─────────────────────────────────────────────────────────────────────────────────────────
aws-api stopped AWS API — direct AWS CLI access with security controls
aws-billing stopped AWS Billing — billing summaries and payment history
aws-cloudtrail stopped AWS CloudTrail — event history and API call auditing
aws-docs stopped AWS Documentation — search and fetch AWS docs
aws-iam stopped AWS IAM — role/policy analysis and access patterns
aws-knowledge stopped AWS Knowledge — managed AWS knowledge base (remote)
aws-pricing stopped AWS Pricing — real-time pricing and cost analysis
aws-security stopped AWS Security — Well-Architected security posture assessment
Explore tools from a server
$ atmos mcp tools aws-security
TOOL DESCRIPTION
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
CheckSecurityServices Verify if selected AWS security services are enabled in the specified region and account.
GetSecurityFindings Retrieve security findings from AWS security services.
GetStoredSecurityContext Retrieve security services data that was stored in context from a previous CheckSecurityServices call.
CheckStorageEncryption Check if AWS storage resources have encryption enabled.
ListServicesInRegion List all AWS services being used in a specific region.
CheckNetworkSecurity Check if AWS network resources are configured for secure data-in-transit.
Test server connectivity
$ atmos mcp test aws-docs
✓ Server started successfully
✓ Initialization handshake complete
✓ 4 tools available
✓ Server responds to ping
Ask AI — documentation search (smart routing selects aws-knowledge)
$ atmos ai ask "How do I configure S3 bucket lifecycle rules?"
ℹ MCP routing selected 1 of 8 servers: aws-knowledge
ℹ MCP server "aws-knowledge" started (6 tools)
ℹ Registered 6 tools from 1 MCP server(s)
ℹ AI tools initialized: 16
👽 Thinking...
Configuring S3 Bucket Lifecycle Rules
S3 lifecycle rules automate object management by transitioning objects between
storage classes, archiving, or expiring them...
## Tool Executions (1)
1. ✅ aws-knowledge → aws.search_documentation (2874ms)
Ask AI — billing analysis (smart routing selects aws-billing)
$ atmos ai ask "Show our billing summary for the past 2 months"
ℹ MCP routing selected 1 of 8 servers: aws-billing
ℹ MCP server "aws-billing" started (25 tools)
ℹ Registered 25 tools from 1 MCP server(s)
ℹ AI tools initialized: 35
👽 Thinking...
## 📊 AWS Billing Summary — February & March 2026
Service │ Feb 2026 │ Mar 2026 │ Change
──────────────────────────────────────────┼──────────┼───────────┼──────────
Amazon Virtual Private Cloud │ $309.53 │ $261.17 │ ▼ $48.36
EC2 - Other │ $88.12 │ $123.39 │ ▲ $35.27
...
## Tool Executions (1)
1. ✅ aws-billing → cost-explorer (381ms)
Ask AI — security posture across all regions (smart routing selects aws-api + aws-security)
$ atmos ai ask "Is GuardDuty enabled in all regions?"
ℹ MCP routing selected 2 of 8 servers: aws-api, aws-security
ℹ MCP server "aws-api" started (2 tools)
ℹ MCP server "aws-security" started (6 tools)
ℹ Registered 8 tools from 2 MCP server(s)
ℹ AI tools initialized: 18
👽 Thinking...
## ❌ GuardDuty is NOT Enabled in All Regions
GuardDuty is only enabled in 1 out of 34 regions checked.
### ✅ Enabled (1 region)
Region │ Detector ID
───────────┼────────────────────────────────────
us-east-2 │ <detector-id-redacted>
### ❌ Not Enabled (33 regions)
Region │ Region │ Region
────────────────┼────────────────┼────────────────
ap-south-1 │ ap-south-2 │ ap-southeast-1
eu-central-1 │ eu-west-1 │ us-east-1
us-west-2 │ ... │
### 🔒 Recommendations
1. Enable GuardDuty in all active regions
2. Use delegated administrator via AWS Organizations
3. Prioritize us-east-1, us-west-2, eu-west-1 immediately
## Tool Executions (4)
1. ✅ aws-api → call_aws (400ms)
2. ✅ aws-api → call_aws (14ms)
3. ✅ aws-api → call_aws (7ms)
4. ✅ aws-api → call_aws (9450ms)
Ask AI — IAM audit (smart routing selects aws-iam)
$ atmos ai ask "List all IAM roles with admin access"
ℹ MCP routing selected 1 of 8 servers: aws-iam
ℹ MCP server "aws-iam" started (29 tools)
ℹ Registered 29 tools from 1 MCP server(s)
ℹ AI tools initialized: 39
👽 Thinking...
## 🔐 IAM Roles with Admin Access
### 1. ✅ Direct AdministratorAccess Policy (4 attachments)
Role Name │ Description │ Trust Principal
──────────────────────────────────────────────────┼────────────────────────────────────────────────┼───────────────────────────
AWSReservedSSO_AdministratorAccess_... │ Allow Full Administrator access to the account │ AWS SSO (SAML Federation)
AWSReservedSSO_RootAccess_... │ Centralized root access to member accounts │ AWS SSO (SAML Federation)
AWSReservedSSO_TerraformApplyAccess_... │ Full Terraform state and account access │ AWS SSO (SAML Federation)
AWSReservedSSO_TerraformApplyAccess-Core_... │ Full Terraform access (core backend) │ AWS SSO (SAML Federation)
### 🛡️ Security Recommendations
1. Review SSO assignments for AdministratorAccess and RootAccess roles.
2. Audit TerraformApplyAccess roles — ensure MFA/session policies are enforced.
3. Monitor tfstate roles — cross-account trust across 14 accounts.
4. Enable CloudTrail for AssumeRole calls on high-privilege roles.
## Tool Executions (2)
1. ✅ aws-iam → list_roles (314ms)
2. ✅ aws-iam → list_policies (174ms)
Check status of all servers
$ atmos mcp status
NAME STATUS TOOLS DESCRIPTION
─────────────────────────────────────────────────────────────────────────────────────────
aws-api running 2 AWS API — direct AWS CLI access with security controls
aws-billing running 25 AWS Billing — billing summaries and payment history
aws-cloudtrail running 5 AWS CloudTrail — event history and API call auditing
aws-docs running 4 AWS Documentation — search and fetch AWS docs
aws-iam running 29 AWS IAM — role/policy analysis and access patterns
aws-knowledge running 6 AWS Knowledge — managed AWS knowledge base (remote)
aws-pricing running 9 AWS Pricing — real-time pricing and cost analysis
aws-security running 6 AWS Security — Well-Architected security posture assessment
Summary by CodeRabbit
-
New Features
- External MCP server support with new mcp commands: list, tools, test, status, restart, export
- New --mcp / ATMOS_AI_MCP flag for ai ask/chat/exec to select servers (overrides routing)
- Smart MCP routing to choose relevant servers per prompt
- Human-friendly tool names in AI responses
- Configurable AI request timeouts and max tool‑iteration limits
-
Documentation
- Extensive MCP and AI integration docs, examples, and an AWS MCP example
🚀 Enhancements
fix: add process-level credential cache @AleksandrMatveev (#2272)
what
- Added a process-level in-memory credential cache (
sync.Map) toauthenticateChain()that stores successfully authenticated credentials keyed by realm + chain identity - When a subsequent authentication request matches the same realm and chain within the same CLI invocation, the cached credentials are returned (after expiration validation) without making additional API calls
- The previous fix (dbcba35) that skips cached target identity credentials in keyring/file storage remains intact - this cache layer sits above it
why
- The previous fix correctly prevented stale cached credentials from being returned by always forcing re-authentication of the target identity (e.g., AssumeRole). However, during
atmos describe affected, each!terraform.stateYAML function resolution creates a newAuthManagerviaresolveAuthManagerForNestedComponent, and each one triggers a full AssumeRole API call - This caused
atmos describe affectedto degrade from ~2 minutes to ~17 minutes due to N redundant STS AssumeRole calls for N components sharing the same auth chain - The in-memory cache is inherently safe: unlike keyring/file caches that persist across processes and may contain stale data from different auth mechanisms (e.g., pod credentials vs. role credentials), process-scoped credentials were authenticated during the current invocation and are guaranteed correct
- Cached entries are validated against the existing expiration buffer (
minCredentialValidityBuffer= 15m) before reuse, and the cache resets naturally when the process exits
references
Summary by CodeRabbit
-
New Features
- Process-level in-memory credential cache to speed repeated authentications and share valid credentials across instances.
- Automatic detection and removal of expired/invalid cached credentials with transparent re-authentication.
- Ability to reset the process credential cache.
-
Tests
- Tests verifying cache hits, isolation by realm/chain, expiration handling, and cache reset behavior.
fix: use allowlist DTO for instance uploads to prevent sensitive data leakage @milldr (#2269)
## What - Introduce `dtos.UploadInstance` as an allowlist struct with only the fields Atmos Pro needs - Convert `schema.Instance` → `UploadInstance` at the upload boundary in `list_instances.go` - Sanitize `settings.pro` to handle `map[interface{}]interface{}` from YAML for JSON compatibilityFields included in upload (allowlist)
component— instance identificationstack— instance identificationcomponent_type— terraform or helmsettings.pro— drift detection configuration (enabled flag, detect/remediate workflows)
Fields excluded (never serialized)
vars— can contain secretsenv— can contain secrets and credentialsbackend— contains role ARNs and bucket namessource— not used by Atmos Prometadata— not used by Atmos Pro- All
settingskeys exceptpro— not used by Atmos Pro
Why
- Previously,
InstancesUploadRequestused[]schema.Instancewhich included all sections from the stack config envandvarscan contain secrets that should never leave the CI environment- Nested YAML maps in the excluded fields produce
map[interface{}]interface{}types thatencoding/jsoncannot marshal, causingatmos list instances --uploadto fail withjson: unsupported type: map[interface {}]interface {} - Using an allowlist DTO ensures new fields added to
schema.Instanceare never inadvertently uploaded
Summary by CodeRabbit
Release Notes
- Refactor
- Optimized instance upload payloads by streamlining the data structure to include only essential configuration fields (component, stack, component type, and settings).
- Enhanced upload efficiency by automatically filtering and extracting pro-specific settings before transmission.
refactor(auth): move ECR login from auth to aws namespace (ATMOS-37) @Benbentwo (#2144)
what
- Move
atmos auth ecr-logincommand toatmos aws ecr loginunder the AWS namespace - Create new
cmd/aws/ecr/package with parent ECR command and login subcommand - Move ECR login tests to new package structure (16 tests, all passing)
- Relocate documentation from
auth/toaws/command directory - Update all cross-references in tutorials, blog posts, and internal design docs
why
The auth namespace must remain provider-agnostic per CLI design principles. AWS-specific commands like ECR login belong under the atmos aws namespace hierarchy, following the established pattern with atmos aws eks update-kubeconfig. This ensures the auth namespace is not polluted by provider- or service-specific commands and maintains a clean separation between generic auth operations and cloud-specific integrations.
references
Closes #ATMOS-37
Acceptance criteria from ATMOS-37:
- ✅ No AWS- or ECR-specific commands exist directly under
atmos auth - ✅ Command structure aligns with interface-based design
- ✅ CLI help and docs reflect the updated command hierarchy
Summary by CodeRabbit
-
New Features
- Moved ECR login into the AWS namespace as atmos aws ecr login, added top-level ecr subcommand, introduced a command-local --identity flag, and retained multi-registry --registry support.
-
Tests
- Removed legacy test suite and added a comprehensive test suite validating the new command wiring, flags, argument flows, and auth-manager behavior.
-
Documentation
- Updated CLI docs, tutorials, PRD, and blog examples to reference atmos aws ecr login.
-
Chores
- Added new sentinel errors for clearer ECR login failure and identity-selection reporting.
fix(auth): skip identity resolution in describe when functions disabled @johncblandii (#2262)
what
- Skip identity resolution in all four describe commands (
describe component,describe stacks,describe affected,describe dependents) when--process-functions=false - Use
cmd.Flags().Changed(IdentityFlagName)instead ofidentityName != ""so that only an explicit--identityCLI flag bypasses the guard —ATMOS_IDENTITYenv vars no longer trigger auth when functions are disabled - Add 10 regression tests covering: auth skipped when functions disabled, env var doesn't bypass guard, explicit
--identityflag forces auth, and unit tests for theChangedvs env var distinction
why
- When all YAML functions are disabled via
--process-functions=false, describe commands were still attempting identity resolution (SSO login, credential fetching, etc.) - YAML functions (
!terraform.state,!terraform.output) are the only consumers of auth credentials during describe — no functions means no auth needed - The original guard treated env vars (
ATMOS_IDENTITY) as equivalent to explicit CLI flags, causing auth to run even when the user only wanted raw config inspection - This caused unnecessary authentication prompts/errors in CI and local development
references
- Affects
cmd/describe_component.go,cmd/describe_stacks.go,cmd/describe_affected.go,cmd/describe_dependents.go
Summary by CodeRabbit
-
Bug Fixes
- Describe commands now skip unnecessary authentication resolution unless YAML functions processing is enabled or an identity flag was explicitly provided, avoiding spurious auth errors and improving reliability.
-
Tests
- Added regression tests covering auth-skip behavior across describe commands and verifying explicit identity-flag vs environment-variable semantics.
-
Refactor
- Reworked describe command wiring to improve dependency injection and execution plumbing for component description.
fix: add actionable hints and doc links to Atmos Pro API errors @osterman (#2264)
## what- Wrap all Atmos Pro API errors in the Error Builder pattern with status-specific hints and documentation links
- Add
ui.Success/ui.Errormessages when--uploadcompletes or fails (previously silent on success, swallowed on failure) - Consolidate fragmented hints into self-contained statements (each hint gets its own lightbulb icon)
- Remove duplicate quickstart links from 404 hints
- Replace
fmt.Errorferror wrapping witherrors.Join+buildProAPIErroracross all Pro API paths (uploads, lock/unlock, OIDC exchange)
why
- Users seeing a 403 from Atmos Pro had no guidance on what to do — the error message was opaque (e.g.
API request failed with status 403). The most common cause is per-repo permissions not being configured. - Each HTTP status now links to the most relevant Atmos Pro doc page:
- 403 → Permissions + Quickstart
- 401 → GitHub Workflows + Authentication
- 404 → Install
- 5xx → Troubleshooting
- Successful uploads were completely silent — users had no confirmation the upload worked
- Upload failures were silently swallowed (
log.Warnonly) — now they surface as proper errors with hints
references
- Triggered by user report: 403 on
atmos describe affected --uploadwith no actionable guidance - Atmos Pro docs: https://atmos-pro.com/docs/learn/permissions
Summary by CodeRabbit
-
Bug Fixes
- API errors now include richer context (HTTP status, operation, trace IDs) and status-specific troubleshooting hints; non-JSON responses include a troubleshooting link. Token exchange and lock/unlock failures surface improved, consistent error information.
-
New Features
- User-facing success and error notifications when uploading affected stacks.
-
Tests
- Added tests validating status-specific hints, non-JSON error handling, and trace ID presence.