github cloudposse/atmos v1.205.0

7 hours ago
Fix documentation URL redirects and link checker configuration @osterman (#2021)

what

  • Fixed 9 documentation files with redirecting URLs to canonical forms
  • Updated outdated external documentation links (Docker CLI, freedesktop XDG spec, AWS IAM, GitHub branches)
  • Updated GitHub PR references from /issues/ to /pull/ for #1447 and #1489
  • Added link checker exceptions for expected redirect behaviors (GitHub/CDN/auth redirects)

why

  • Link checker fails on redirect chains; updating to canonical URLs resolves checker failures
  • Ensures documentation references remain valid as external sites reorganize their docs
  • GitHub branch master → main migration in upstream terraform-aws-components
  • Properly configures link checker to allow intentional redirects (auth flows, API aliases, CDN paths)

references

  • Related to fixing broken documentation links identified by automated link checking

Summary by CodeRabbit

  • Documentation

    • Normalized URLs and markdown link formatting across README and docs for consistency and accuracy.
    • Updated several reference links in product requirement docs and added a "Related PRDs" subsection where applicable.
  • Chores

    • Expanded link-checker exclusions to ignore additional redirect patterns and external service URLs to reduce false positives.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: export AWS_REGION from atmos auth env when configured @osterman (#1955)

what

  • Export AWS_REGION and AWS_DEFAULT_REGION from the Environment() method of all AWS identities
  • Region is only exported when explicitly configured, not default fallback values
  • Enables external tools (aws cli, direct terraform, etc.) to access region after sourcing atmos auth env

why

When using atmos auth env to export credentials for external tools (aws cli, direct terraform runs), users also need access to the configured region. This completes the credential export for external tool usage.

Note: For atmos commands (atmos terraform plan, etc.), region is automatically injected - no sourcing required.

references

Related to auth environment variable configuration. Blog post and PRD documentation included.

Summary by CodeRabbit

Release Notes

  • New Features

    • AWS_REGION and AWS_DEFAULT_REGION environment variables now exported from atmos auth env when region is configured in identity settings
    • Azure Portal console access support added
  • Documentation

    • Updated profile structure to directory-based format
    • Enhanced authentication configuration documentation for multiple identity types
    • Clarified provider and identity configuration options
  • CLI Changes

    • profile-list command output simplified; removed TYPE column

✏️ Tip: You can customize this high-level summary in your review settings.

Implement custom secrets masking patterns and fix output routing @osterman (#1972)

what

  • Added registerCustomMaskPatterns() to load user-defined patterns and literals from atmos.yaml config
  • Updated masker to support custom replacement strings from config settings
  • Fixed all output paths to route through io layer for automatic secret masking
  • Created examples/secrets-masking/ directory demonstrating the feature with test configs and components

why

Secrets matching user-defined patterns are now automatically masked across all CLI output (terraform, logs, auth commands, docs, help text, etc.), preventing accidental exposure while maintaining the ability to customize masking behavior per environment.

references

Implements custom pattern/literal loading for the secrets masking feature that was already configured in the schema but not being loaded or applied.

Summary by CodeRabbit

  • New Features

    • Global secrets masking: configurable enable/disable, custom regex patterns, literal values, and configurable replacement text; applied across CLI, logs, docs and tooling.
    • Added an Example Creator agent to generate self-contained demo examples and mocks.
  • Documentation

    • Expanded secrets-masking docs, new agent guide, embedded examples, updated examples list, and a blog post announcing custom masking.
  • Tests

    • New/updated test cases and snapshots to reflect masking behavior.
  • Chores

    • Visible telemetry notice with opt-out instructions.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Skip CODEOWNERS validation when file not modified @osterman (#2016)

what

  • Added tj-actions/changed-files step to detect if .github/CODEOWNERS was modified in the PR
  • Only run CODEOWNERS validation checks when the file actually changed or on manual workflow_dispatch triggers
  • Prevents unnecessary validation overhead for PRs that don't touch the CODEOWNERS file

why

  • The CODEOWNERS validation should only run when the file is actually modified
  • This reduces CI overhead and prevents friction for unrelated PRs
  • Always allow manual validation via workflow_dispatch for verification purposes

references

  • Uses tj-actions/changed-files@v45 - a widely-used, well-maintained action for detecting changed files
feat: Atmos bugfixes and enhancements from vhs-demo-videos branch @osterman (#1954)

what

  • Add atmos list aliases subcommand for viewing CLI command aliases
  • Add query normalization and simplified syntax for atmos list components
  • Support installing multiple tools in a single atmos toolchain install command
  • Add markdown rendering extensions (admonitions, badges, highlights, linkify, muted)
  • Fix inline code spacing in markdown rendering
  • Add terraform output format improvements
  • Update roadmap component with demo links support
  • Various documentation updates across CLI commands

why

  • These improvements enhance the CLI user experience with better list filtering and multi-tool installation
  • The markdown extensions enable richer terminal output formatting
  • Documentation updates ensure consistency across command reference pages
  • These changes were developed alongside the vhs-demo-videos feature but are independent core improvements

references

  • Extracted from osterman/vhs-demo-videos branch (excluding demo infrastructure: tools/director/, pkg/ffmpeg/, pkg/vhs/, demos/)

Summary by CodeRabbit

  • New Features

    • Added atmos list aliases to show built-in + configured aliases.
    • atmos toolchain install accepts multiple tools in one command.
    • List commands can page output when enabled; Terraform output gains a table format.
    • Rich Markdown rendering: admonitions, badges, highlights, muted text.
    • Demo video embeds added across CLI docs.
  • Improvements

    • List/vendor tables show Tags; stacks expose extracted vars for templates.
    • Better terminal color/profile and optional force-color handling.

✏️ Tip: You can customize this high-level summary in your review settings.

Auto-scroll sidebar to active item on navigation @osterman (#2009)

what

  • Added SidebarScrollHandler component to automatically scroll the sidebar to show the active menu item
  • Component triggers on route changes and waits for sidebar DOM updates before scrolling
  • Uses smooth animation to center the active link in the sidebar viewport

why

When navigating to design patterns or other sections that share sidebars with references, Docusaurus's autoCollapseCategories feature expands/collapses categories. Previously, the active item would end up off-screen. This fix ensures the active menu item is always visible and centered in the sidebar.

references

Fixes the sidebar navigation issue where design pattern pages weren't scrolled into focus when the sidebar changed.

Summary by CodeRabbit

  • New Features
    • The sidebar now automatically scrolls to highlight the active navigation link when navigating between pages, improving visibility of your current location in the documentation.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add interactive file generation for terraform, helmfile, and packer @osterman (#1971)

Summary

Adds comprehensive support for atmos terraform generate files with auto-generation enabled during component execution for all provisioners (terraform, helmfile, packer).

What Changed

Core Features

  • Auto-generate files BEFORE path validation when auto_generate_files is enabled, allowing components to be JIT (Just-In-Time) created from stack configuration
  • Interactive prompting for component and stack selection (like terraform backend command)
  • Idempotent file generation - compares existing content before writing to avoid unnecessary updates
  • Deterministic output - uses sorted map keys to ensure reproducible file generation across runs
  • Enhanced UI - shows individual files changed plus a summary line with counts

Files Modified

  • pkg/terraform/generate/file_generator.go - Core idempotent generation logic with sorted keys and summary output
  • pkg/terraform/generate/generate.go - Directory creation before file generation
  • cmd/terraform/generate/files.go - Interactive prompting for component/stack selection
  • internal/exec/terraform.go - Auto-generation during terraform execution
  • internal/exec/helmfile.go - Auto-generation during helmfile execution
  • internal/exec/packer.go - Auto-generation during packer execution
  • pkg/schema/schema.go - Config support for helmfile and packer auto-generation
  • examples/generate-files/ - Complete working example with terraform configurations

Test Plan

  1. Test interactive prompting without arguments:

    atmos -C examples/generate-files terraform generate files
    # Should prompt for component, then stack
  2. Test with component argument only:

    atmos -C examples/generate-files terraform generate files demo
    # Should prompt for stack only
  3. Test with all arguments (no prompting):

    atmos -C examples/generate-files terraform generate files demo -s dev
    # Should generate without prompting
  4. Test idempotency (run twice):

    atmos -C examples/generate-files terraform generate files demo -s dev
    atmos -C examples/generate-files terraform generate files demo -s dev
    # Second run should show "unchanged" files
  5. Test auto-generation during terraform plan:

    cd examples/generate-files
    atmos terraform plan demo -s dev
    # Should auto-generate files before validation
  6. Test helmfile and packer:

    atmos -C examples/generate-files helmfile diff demo -s dev
    atmos -C examples/generate-files packer build demo -s dev
    # Both should auto-generate files if needed
  7. Run test suite:

    make testacc

Summary by CodeRabbit

  • New Features

    • Interactive prompts (with shell completion) to select component and stack when generating files; JIT auto-generation for Terraform, Helmfile, and Packer before validation; deterministic HCL/.tfvars output and per-file create/update/skip summaries.
  • Documentation

    • New blog post, CLI docs, working example, and embedded demos for file-generation workflows.
  • Tests

    • Broadly expanded tests covering generation, .tfvars, labeled blocks, formatting, templates, and edge cases.
  • Chores

    • Added example project, README, and ignore/config files for the generate-files demo.

✏️ Tip: You can customize this high-level summary in your review settings.

docs: Remove non-existent CLI flags from profiles blog post @osterman (#2004)

what

Removed non-existent CLI flags (--sentry-enabled, --terminal-width, --markdown-style) from the blog post examples. Fixed incorrect config keys (widthmax_width). Now accurately shows the real problem: scattered environment variables across CI/CD systems.

why

The examples were showing CLI flags that don't exist in Atmos, which could mislead users. These settings are configuration-only via atmos.yaml or profiles, not CLI flags. The corrected examples now focus on the actual pain point that Profiles solve.

references

Follows investigation of hallucinated flags in documentation examples.

Summary by CodeRabbit

  • Documentation
    • Updated blog post to reflect environment variable-based configuration approach instead of CLI flags.
    • Expanded content on profile benefits including version control and composability.
    • Updated configuration examples and terminology throughout.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Enhance source list commands with optional filters @osterman (#1996)

what

  • Made --stack flag optional for atmos terraform source list and atmos list sources commands
  • Added optional [component] positional argument to filter by component name or folder
  • Added dynamic Folder column that appears only when component folder differs from instance name
  • Added Type column to atmos list sources for multi-type visibility

why

  • Improves UX by allowing users to list sources across all stacks without specifying --stack
  • Follows Atmos naming conventions with optional positional arguments for filtering
  • Better visibility when dealing with derived components using metadata.component

references

Implements enhancements outlined in the source provisioner PRD for comprehensive source listing capabilities.

Summary by CodeRabbit

  • New Features

    • Added unified atmos list sources to list component sources across Terraform, Helmfile, and Packer with optional component/stack filtering and multiple output formats.
  • Documentation

    • Expanded docs and examples for the new command and per-type variants; added blog post and roadmap entry.
  • Improvements

    • Dynamic output columns and improved user-facing messages; enhanced error context extraction and inline markdown formatting.
  • Tests

    • Comprehensive tests added for listing, extraction, filtering, sorting, rendering, and error scenarios.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add --format=github for terraform output and unified pkg/env package @osterman (#1985)

what

  • Created unified pkg/env/ package for environment variable formatting (env, dotenv, bash, github formats)
  • Created pkg/github/actions/env/ package with GitHub Actions environment file helpers
  • Added --format=github support for atmos terraform output that writes to $GITHUB_OUTPUT
  • Eliminated code duplication between cmd/env and pkg/terraform/output by refactoring to use pkg/env
  • All output formats now consistently sort keys alphabetically for deterministic output

why

  • Reduces code maintenance burden by consolidating format logic into a single package
  • Enables GitHub Actions workflows to directly consume terraform outputs
  • Supports multiline values via heredoc syntax for GitHub Actions compatibility
  • Provides flexible options pattern for key transformation (uppercase, flatten with separator)

references

Part of environment variable formatting consolidation effort.

Summary by CodeRabbit

  • New Features

    • Added --format=github to export Terraform outputs to GitHub Actions ($GITHUB_OUTPUT or custom file)
    • Unified environment-variable formatting across formats (env, dotenv, bash, github) with options for uppercase keys, flattening, and export-prefix control
  • Documentation

    • Added docs and examples for GitHub Actions integration and sharing outputs between workflow steps

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add multi-package support and fix toolchain add help text @osterman (#1979)

what

  • Support multiple tools in a single atmos toolchain add command
  • Default version to latest when omitted (e.g., atmos toolchain add terraform)
  • Fixed help examples to use @ syntax (tool@version) instead of incorrect space-separated syntax
  • Updated CLI documentation and removed phantom --file flag references
  • Added comprehensive tests for multi-package and latest-version-default behavior

why

The help text was showing incorrect space-separated syntax (<tool-name> <version>) which didn't match the actual command behavior that uses @ syntax (tool@version). Users also couldn't add multiple tools efficiently. This fix aligns the UX with other similar CLIs and improves productivity for users managing toolchains.

references

Related to improving the toolchain command usability and fixing the discrepancy between documented and actual command syntax.

Summary by CodeRabbit

  • New Features

    • Add accepts multiple tool[@Version] args (version defaults to latest); new --tool-versions flag. Env supports a new github format and --output/-o (auto-uses GITHUB_PATH); path acts as an env alias for PATH emission.
  • Bug Fixes

    • Clearer, actionable errors and hints for missing tools and unknown commands.
    • More resilient release fetching with retries and backoff.
    • Improved ANSI-aware formatting/whitespace handling for CLI output.
  • Documentation

    • CLI docs and blog updated with GitHub Actions PATH examples and usage.
  • Tests

    • Expanded unit tests across toolchain commands, env/path emitters, formatting, and ANSI trimming.

✏️ Tip: You can customize this high-level summary in your review settings.

Allow locals to access `settings`, `vars`, and `env` from the same file. Add `locals` design patterns. Add Atmos YAML functions support in `locals` @aknysh (#1994)

what

  • Enable locals to access .settings, .vars, and .env sections from the same YAML file during template resolution
  • Add template context (settings, vars, env) to the locals resolver so locals can reference these sections
  • Only add context to template processing when locals are present (preserving existing behavior for files without locals)
  • Merge section-specific settings/vars/env with global values (not replace) so global keys are preserved
  • Add YAML functions support in locals (!env, !exec, !store, !terraform.state, !terraform.output)
  • Update documentation with error handling, common pitfalls, workarounds for optional values, and YAML functions
  • Add examples/locals example demonstrating the feature
  • Add Locals Design Patterns documentation
  • Add blog posts announcing the enhancements

why

  • The PRD for file-scoped locals explicitly shows examples of locals accessing .vars from the same file
  • YAML functions in locals enable powerful patterns like fetching values from terraform state or environment variables
  • This enables useful patterns like:
    settings:
      substage: dev
    locals:
      domain: '{{ .settings.substage }}.example.com'
  • Cross-file access (from imported files) remains unsupported by design - locals are file-scoped
  • Clear error messages help users understand when template references fail

YAML Functions in Locals

Locals support all Atmos YAML functions for dynamic value resolution:

Function Description Example
!env Environment variables !env API_ENDPOINT
!exec Command execution !exec git rev-parse --short HEAD
!store Store lookups !store secrets/db .password
!terraform.state Terraform state queries !terraform.state vpc .vpc_id
!terraform.output Terraform outputs !terraform.output vpc .vpc_id

Example:

locals:
  # Fetch from environment variable
  api_endpoint: !env API_ENDPOINT
  
  # Combine with Go templates
  api_url: "https://{{ .locals.api_endpoint }}/api/v1"

components:
  terraform:
    myapp:
      vars:
        api_url: "{{ .locals.api_url }}"

Blog Posts

  1. Locals Context Access (2026-01-19-locals-context-access-and-design-patterns.mdx)

    • Enhancement allowing locals to access settings/vars/env from same file
    • File-scoped context explanation
  2. YAML Functions in Locals (2026-01-20-locals-yaml-functions.mdx)

    • Support for !env, !exec, !store, !terraform.state, !terraform.output in locals
    • Examples and use cases

Error Handling Behavior

When a template reference cannot be resolved, Atmos produces a hard error with a clear message rather than silently returning an empty string or passing through the literal template syntax:

Scenario Result
{{ .settings.foo }} when settings doesn't exist Error: map has no entry for key 'settings'
{{ .settings.foo }} when settings exists but no foo Error: map has no entry for key 'foo'
{{ .settings.foo }} when both exist ✅ Resolves to the value

Workarounds for optional values:

locals:
  # Using 'with' for conditional access
  safe_region: '{{ with .settings }}{{ .region }}{{ else }}us-west-2{{ end }}'
  
  # Using index with default
  domain: '{{ index .settings "region" | default "us-west-2" }}.example.com'

Example

A new examples/locals example demonstrates the feature:

cd examples/locals

# See how locals are resolved
atmos describe component myapp -s dev

# View all resolved locals
atmos describe locals myapp -s dev

Output:

vars:
  environment: development
  full_name: acme-development-dev
  name: acme
  tags:
    Environment: development
    ManagedBy: Atmos
    Namespace: acme
    Team: platform

Summary of Changes

Code Changes:

  • pkg/locals/resolver.go:
    • Added templateContext field and WithTemplateContext method to pass settings/vars/env during resolution
    • Added YamlFunctionProcessor callback type and WithYamlFunctionProcessor method for YAML function support
    • Updated resolveString to detect and process YAML functions (strings starting with !)
  • internal/exec/stack_processor_locals.go:
    • Build and pass template context with settings/vars/env from the stack config
    • Added localsResolveOptions struct and createYamlFunctionProcessor for YAML function processing
    • Fixed buildSectionTemplateContext to merge section values with global values (not replace)
    • Added mergeStringAnyMaps helper for shallow merging
  • internal/exec/stack_processor_utils.go:
    • Extract settings/vars/env from raw YAML and add to context only when locals are present
    • Updated to use Atmos YAML unmarshaling for proper custom tag handling
  • errors/errors.go: Added ErrLocalsYamlFunctionFailed sentinel error

Test Changes:

  • Added new integration tests: TestLocalsSettingsAccessSameFile, TestLocalsSettingsAccessDescribeStacks, TestLocalsSettingsAccessNotCrossFile
  • Added test fixture tests/fixtures/scenarios/locals-settings-access/ demonstrating same-file access
  • Added test fixture tests/fixtures/scenarios/locals-settings-cross-file/ demonstrating cross-file access error
  • Added advanced tests: TestLocalsNestedSettingsAccess, TestLocalsEnvironmentVariableAccess, TestLocalsHelmfileSectionLocals
  • Added test fixture tests/fixtures/scenarios/locals-advanced/ for nested values and helmfile section locals
  • Converted context-access unit tests to table-driven format (TestExtractLocalsFromRawYAML_ContextAccess)
  • Added unit tests for merge behavior (TestMergeStringAnyMaps, TestBuildSectionTemplateContext_MergesBehavior)
  • Added TestLocalsWithYamlFunctionsEnv for YAML functions in locals
  • Added test fixture tests/fixtures/scenarios/locals-yaml-functions/ for YAML function testing

Documentation Changes:

  • Added "Accessing Other Sections" section explaining what template context is available
  • Added "Processing Order" section explaining why cross-file access doesn't work
  • Added "Component-Level Locals" section with inheritance from base components
  • Added "Scope Merging for Settings and Vars" section explaining merge behavior
  • Added "Debugging Locals" section with troubleshooting guidance
  • Added "YAML Functions in Locals" section with examples for !env, !exec, !store, !terraform.state, !terraform.output
  • Added "Error Handling" section with:
    • Unresolved template reference behavior (produces error, not empty string)
    • Common error scenarios table
    • Handling optional values with Go template conditionals
    • Cross-file access error explanation and solutions
  • Updated "Locals vs Vars" comparison table with "Cross-File Access" row
  • Added best practice for using vars for cross-file sharing

Blog Posts Added:

  • website/blog/2026-01-19-locals-context-access-and-design-patterns.mdx
  • website/blog/2026-01-20-locals-yaml-functions.mdx

Example Added:

  • examples/locals/ - Minimal example demonstrating locals feature:
    • Basic locals and dependency resolution
    • Accessing settings/vars from same file
    • Building computed values (name_prefix, full_name, tags)
    • File-scoped isolation between dev and prod stacks

Dependency Updates:

  • Updated google.golang.org/api from retracted v0.258.0 to v0.260.0

Summary by CodeRabbit

  • New Features

    • Locals now access .settings, .vars, and .env from the same file during resolution
    • YAML function support in locals (e.g., !env, !exec, !store, !terraform.state, !terraform.output)
  • Documentation

    • Major docs and blog updates with processing diagrams, examples, guidance, and warnings
  • Tests

    • Extensive new tests and fixtures covering locals scope, YAML functions, env access, cross-file cases, and edge conditions
  • Examples

    • New examples demonstrating locals usage and try-it workflows
  • Chores

    • Multiple dependency patch bumps and NOTICE license URL updates

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add command aliases for vendor and workflow list @osterman (#1981)

What

Added bidirectional command aliases so users can use both atmos vendor list and atmos list vendor interchangeably, and atmos workflow list and atmos list workflows interchangeably. Refactored vendor command to use CommandProvider pattern to support aliases.

Why

Users naturally expect list commands under the parent command (e.g., atmos vendor list), while Atmos organizes all list commands under atmos list. This bidirectional aliasing improves discoverability and follows the existing pattern used for atmos list themesatmos theme list. Demo tapes can now use intuitive command forms.

References

Related to demo tape cleanup where atmos vendor list and atmos workflow list were changed to cat vendor.yaml and atmos describe workflows respectively due to missing commands.

Summary by CodeRabbit

  • New Features

    • Added command aliases: atmos vendor listatmos list vendor and atmos workflow listatmos list workflows.
    • Introduced a top-level vendor command with pull and diff subcommands (with their flags).
  • Bug Fixes / UX

    • CLI help updated to show workflow [command] indicating it accepts subcommands.
  • Refactor

    • Reorganized vendor command implementation for cleaner structure.

✏️ Tip: You can customize this high-level summary in your review settings.

Indent bullet points in error messages @osterman (#1999)

what

  • Add 2-space indentation to bullet points in error messages for better visual hierarchy
  • Apply list indentation consistently in both TTY and ASCII rendering modes

why

  • Indented bullet lists are easier to scan and improve readability
  • Error messages with indented lists provide clearer visual structure to users

references

  • Related to error message styling improvements
Enable make readme target to use atmos docs generate @osterman (#1988) ## what
  • Switched make readme from a disabled stub to using the atmos docs generate readme command
  • README.md is now regenerated from README.yaml and remote template when running make readme

why

The atmos docs generate readme command is fully implemented and working. Enabling the makefile target allows developers to regenerate the README.md following the documented workflow (edit README.yaml → run make readme).

references

Implements the intended workflow where make readme generates README.md from data sources and templates, consistent with the modern docs generation infrastructure in Atmos.

Summary by CodeRabbit

  • Documentation

    • Expanded README introduction with a fuller description of Atmos and cloud/tooling use cases.
    • Moved/added Developer Tools guidance into the development docs (duplicated content present) and removed it from the README.
    • Updated copyright year to 2026.
  • Chores

    • Readme generation now runs as part of the build process.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Conditionally set GOFLAGS for git worktrees @osterman (#1986)

what

Automatically detect git worktrees and set GOFLAGS="-buildvcs=false" to prevent build failures. In worktrees, the .git directory is in a different location (.git/worktrees/<name>), causing the VCS build metadata to fail unless explicitly disabled.

why

Developers using git worktrees were experiencing build failures or unexpected behavior. This change makes the build process worktree-aware without affecting non-worktree repositories.

references

Related to git worktree development workflow improvements.

Summary by CodeRabbit

Release Notes

  • Chores
    • Improved build system configuration for enhanced compatibility with development environments.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Packer directory-based template support and improvements @aknysh (#1982)

what

  • Directory-based Packer templates: Atmos now defaults the template to . (current directory) when not specified, allowing Packer to load all *.pkr.hcl files from the component directory automatically. This aligns with HashiCorp's recommended multi-file configuration patterns.
  • Configuration validation: Added checkPackerConfig() validation to both ExecutePacker and ExecutePackerOutput functions, ensuring Packer base path is configured before execution.
  • Cleanup file leak fix: Implemented proper defer pattern for variable file cleanup to prevent file leaks on early errors.
  • Abstract and locked component protection: Added checks to prevent packer build on abstract (metadata.type: abstract) and locked (metadata.locked: true) components while allowing read-only commands like validate and inspect.
  • Error message consistency: Standardized error message quoting style across Packer files (using single quotes consistently).
  • New ErrMissingPackerBasePath error: Added dedicated error type for missing Packer configuration.
  • Comprehensive troubleshooting documentation: Added new troubleshooting guide covering common Packer issues and solutions.
  • Improved godoc comments: Added comprehensive documentation to PackerFlags struct and its fields.
  • Test coverage improvements:
    • Added TestExecutePacker_Fmt for the fmt command
    • Added TestExecutePacker_ComponentMetadata for abstract/locked component handling
    • Added TestCheckPackerConfig for configuration validation
    • Added captureStdout test helper to reduce code duplication
    • Added test for missing Packer base path in ExecutePackerOutput

why

  • Fixes GitHub issue #1937: Users following HashiCorp's best practice of organizing Packer configurations across multiple files (variables.pkr.hcl, main.pkr.hcl, etc.) encountered "Unsupported attribute" errors because Atmos only loaded a single template file.
  • Improved reliability: The cleanup fix and configuration validation prevent resource leaks and provide better error messages.
  • Consistency with Terraform: The abstract/locked component protection matches the behavior already implemented for Terraform components.
  • Better developer experience: The troubleshooting documentation and improved error messages help users resolve issues faster.

references

Summary of Changes

New Features

  • Directory-based template loading (default to . when no template specified)
  • Multi-file Packer component support

Bug Fixes

  • Variable file cleanup on early errors (defer pattern)
  • Configuration validation before execution

Improvements

  • Abstract/locked component protection for packer build
  • Standardized error messages
  • Comprehensive troubleshooting documentation
  • Test coverage expansion
  • Code documentation (godoc comments)

Test Plan

  • All existing Packer tests pass
  • New tests for directory mode, fmt command, metadata handling
  • Configuration validation tests
  • Linter passes with 0 issues

Summary by CodeRabbit

Release Notes

  • New Features

    • Packer now defaults to directory mode, automatically loading all *.pkr.hcl files from the component directory without requiring explicit template configuration.
    • Template parameter is now optional; use --template flag or settings.packer.template to override.
  • Documentation

    • Added comprehensive Packer troubleshooting guide.
    • Enhanced documentation with directory mode usage examples and best practices.
    • Added blog article explaining directory-based template support.
  • Tests

    • Added extensive integration and unit test coverage for Packer commands.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add experimental feature transparency and controls @osterman (#1940)

what

  • Introduce <Experimental /> badge component for marking features as experimental
  • Introduce <FirstReleased /> badge component for version tracking
  • Create "Experimental Features" policy page explaining maturity levels
  • Mark experimental features across documentation with transparency badges
  • Add configurable experimental feature handling (silence, disable, warn, error)
  • Add ATMOS_EXPERIMENTAL environment variable and settings.experimental config
  • Mark terraform backend, terraform workdir, and toolchain commands as experimental
  • Fix stacks documentation sidebar sorting (alphabetical)
  • Fix toolchain sidebar label capitalization
  • Improve Experimental badge with react-icons and button behavior
  • Update flag-handler agent with experimental feature documentation

why

Provide users with clear visibility into feature maturity to set expectations.
Experimental features may change APIs, need community feedback, or lack stability
guarantees. This change aligns with the project's commitment to transparency.

Users can now control how experimental features behave:

  • silence - Run without notification
  • warn - Show notification, continue (default)
  • error - Show notification, exit with error
  • disable - Block experimental commands entirely

references

Summary by CodeRabbit

  • New Features

    • Experimental features system with four handling modes (silence, warn, disable, error) and CLI visibility badges
    • Unreleased docs tracking and an "Unreleased" page/list with celebratory UI when all docs are released
    • New UI badges: Experimental and First released indicators; Experimental features listing in roadmap/docs
  • Documentation

    • New docs for experimental feature controls and unreleased content; experimental indicators added across CLI/docs
  • Configuration

    • settings.experimental option with environment override (ATMOS_EXPERIMENTAL)

✏️ Tip: You can customize this high-level summary in your review settings.

feat: Add Devcontainers to hero section typing animation @osterman (#1975)

Summary

  • Adds "Devcontainers" to the animated typing list in the website's hero section
  • Updates accessibility text for screen readers

Test plan

  • Website builds successfully (npm run build)
  • Verify "Devcontainers" appears in the typing animation cycle on the landing page
feat: Add file-browser plugin for examples directory @osterman (#1969)

what

  • Add Docusaurus plugin to scan /examples/ directory and generate crawlable routes for all files
  • Create React components for GitHub-style file browser with sidebar navigation
  • Support syntax highlighting for code files and markdown rendering for documentation
  • Generate "View on GitHub" links for each file
  • Fix duplicate breadcrumbs, table border radius clipping, and content width inconsistencies

why

Provides users a way to explore example projects directly on the site with full-text search via Algolia. Makes examples more discoverable and improves the documentation experience by showing code examples alongside guides.

references

Implements the file browser for the /examples/ directory as a reusable Docusaurus plugin that can be used for other documentation browsing needs.

Summary by CodeRabbit

  • New Features

    • Added a GitHub-style file browser to the docs with breadcrumb navigation, sidebar tree, file viewer, and "View on GitHub" links.
    • Added an "Examples" item to the site navbar.
  • Documentation

    • Added comprehensive README guides for many example projects (Atlantis, Component Versions, Context, Helmfile, Schemas, Stacks, Vendoring, Workflows, Quick Start).
  • Style

    • Improved syntax highlighting and YAML code styling site-wide.

✏️ Tip: You can customize this high-level summary in your review settings.

🚀 Enhancements

fix: resolve relative component_path against BasePath for --chdir support @aknysh (#2029)

what

  • Fix path resolution issue in pkg/terraform/output/executor.go where relative component_path was not resolved against atmosConfig.BasePath
  • Add comprehensive unit tests to increase test coverage from 88.4% to 92.9%
  • Add integration tests for --chdir flag path resolution scenarios
  • Add documentation describing the issue, root cause analysis, and fix

why

  • User-reported regression: In Atmos v1.195.0+, users encountered backend.tf.json: no such file or directory errors when using the atmos.Component template function with --chdir flag or when running from a non-project-root directory
  • Root cause: buildComponentInfo() in describe_stacks.go returns component_path as a relative path (e.g., components/terraform/vpc), but pkg/terraform/output/executor.go used this path directly for file operations. When CWD differs from project root, the relative path doesn't resolve correctly
  • The fix: Resolve relative component_path against atmosConfig.BasePath before using it for file operations (backend generation, terraform init/output)

Changes Made

Fix (pkg/terraform/output/executor.go):

// Step 2.5: Resolve relative component path against atmosConfig.BasePath.
if config.ComponentPath != "" && !filepath.IsAbs(config.ComponentPath) {
    config.ComponentPath = filepath.Join(atmosConfig.BasePath, config.ComponentPath)
}

Test Coverage Improvements:

Function Before After
GetOutput 50.0% 89.5%
GetAllOutputs 80.0% 100%
fetchAndCacheOutputs 66.7% 93.3%
runInit 90.0% 100%
processOutputs 80.0% 100%
Package Total 88.4% 92.9%

Integration Tests Added (tests/test-cases/chdir.yaml):

  • atmos --chdir with describe stacks resolves component paths - Verifies describe stacks works from different directory
  • atmos --chdir with describe affected resolves paths correctly - Verifies describe affected works from different directory

references

  • Related PRs that may have exposed this latent bug:
    • #1644 - Add global --chdir flag for changing working directory
    • #1639 - Atmos Performance Optimization
  • Documentation: docs/fixes/describe-affected-component-path-resolution.md

Summary by CodeRabbit

  • Bug Fixes

    • Component path resolution now consistently respects project base paths, --chdir usage, and folder-prefix metadata to ensure correct working directory and backend resolution.
  • Documentation

    • Added a detailed guide describing the path-resolution issue, root cause, implemented fix approach, and verification steps.
  • Tests

    • Added extensive unit and end-to-end tests covering path resolution, --chdir scenarios, caching, backend behaviors, UI/error flows, and regression cases.

✏️ Tip: You can customize this high-level summary in your review settings.

feat: add spinner UI to validation commands @RoseSecurity (#1951)

what

  • Added spinner feedback to the authentication configuration validation in cmd/auth_validate.go, replacing plain output with progress and success/failure messages. Error handling was updated to work with the spinner's execution context.
  • Integrated spinner feedback into the EditorConfig validation command in cmd/validate_editorconfig.go, providing progress indication and improved error messaging. The dry-run mode continues to list files without a spinner.
  • Updated the YAML schema validation command in internal/exec/validate_schema.go to use a spinner for progress and results, refactoring the function to fit the spinner's execution pattern.

why

  • This introduces user interface improvements by adding spinner feedback to several validation commands, enhancing the user experience by providing visual progress indicators during long-running operations. The changes also restructure some error handling to work smoothly with the new spinner-based flow.

references

Summary by CodeRabbit

  • Enhancements

    • Validation commands now use a unified spinner and UI messaging for progress and verbose info. Added new EditorConfig-specific error sentinels.
  • Bug Fixes / Output

    • Success messages moved to stderr or silenced to reduce redundant prints. Validation failures surface richer, multi-line diagnostics via the spinner UI.
  • Tests

    • Updated snapshots and test cases for output channel changes, expanded error output, pager normalization, and added editorconfig validation tests.

✏️ Tip: You can customize this high-level summary in your review settings.

Fix YAML functions documentation and increase test coverage @aknysh (#2028)

what

  • Fixed incorrect .outputs. prefix in !terraform.state documentation examples
  • Fixed confusing component/output name collision in !terraform.output documentation
  • Fixed incorrect syntax in website/docs/functions/index.mdx (vpc.vpc_idvpc vpc_id)
  • Fixed broken link generation in doc-release-data plugin for index.mdx files with id: index
  • Added comprehensive test coverage for YAML functions:
    • YQ expression patterns (bracket notation, defaults, pipes)
    • !env function unit tests
    • !include integration tests
  • Added test fixtures for bracket notation with special characters (slashes, hyphens)

why

  • Users reported confusion with documentation examples that showed incorrect YQ expression syntax
  • A user reported issues with bracket notation containing forward slashes in map keys - investigation confirmed the syntax is correct but documentation needed clarification
  • The doc-release-data plugin incorrectly generated /index paths for files like functions/index.mdx with id: index, causing broken links on the /unreleased page
  • Test coverage for YAML functions was insufficient for edge cases like bracket notation with special characters

references

  • YQ Guide
  • YQ Recipes
  • Internal tracking document: docs/fixes/yaml-functions-yq-expressions.md
fix: toolchain error handling, binary naming, and platform detection @aknysh (#2027)

what

  • Glamour warning suppression: Suppress confusing "Warning: unhandled element" messages from glamour markdown renderer by redirecting stdout during rendering with thread-safe mutex protection
  • Improved HTTP 404 error messages: User-friendly error messages with platform-specific hints and context instead of nested "HTTP request failed: HTTP request failed:" pattern
  • Binary naming fix for 3-segment packages: kubectl correctly named kubectl instead of kubernetes (extracts binary name from last segment of Aqua package name like kubernetes/kubernetes/kubectl) via resolveBinaryName helper
  • Pre-flight platform compatibility check: Check supported_envs from Aqua registry before attempting download, providing immediate feedback instead of waiting for HTTP 404
  • Arch-only platform matching: Handle Aqua registry supported_envs entries like amd64 which mean "any OS with this architecture" (fixes helm/helm on Windows which uses ["darwin", "linux", "amd64"])
  • Platform-specific hints: WSL hints for Windows users, Rosetta 2 hints for macOS arm64 users, Docker suggestions for Linux-only tools on macOS, QEMU hints for Linux arm64 users
  • Non-existent tool error handling: Clear "tool not in registry" error when attempting to install tools that don't exist in any configured registry (e.g., replicatedhq/replicated which exists on GitHub but is not in Aqua registry)

why

  • Users were confused by glamour warnings that appeared in terminal output during error rendering
  • HTTP 404 errors for unsupported platforms were unhelpful and didn't explain why the download failed
  • kubectl binary naming issue broke scripts expecting the kubectl binary name
  • Users wasted time waiting for downloads to fail when the tool didn't support their platform
  • helm/helm failed on Windows because amd64 in supported_envs was treated as an OS name instead of architecture
  • Platform-specific workarounds (WSL, Rosetta, Docker) weren't suggested to users
  • The distinction between "tool not found" and "platform not supported" wasn't clear

references

  • Related to Windows toolchain fixes discovered during cross-platform testing
  • Uses Aqua registry supported_envs field for platform detection
  • Test fixture: tests/fixtures/scenarios/toolchain-aqua-tools/
  • Documentation: docs/fixes/toolchain-error-handling-and-binary-naming.md

Files Changed

Category Files
Error handling errors/errors.go, toolchain/installer/download.go
Platform detection toolchain/installer/platform.go, toolchain/installer/platform_test.go
Registry toolchain/registry/registry.go, toolchain/registry/aqua/aqua.go
Glamour fix pkg/ui/markdown/custom_renderer.go
Tests tests/toolchain_aqua_tools_test.go, toolchain/installer/download_test.go
Test fixture tests/fixtures/scenarios/toolchain-aqua-tools/

Platform Matching Logic

The isPlatformMatch function handles three Aqua registry supported_envs formats:

Format Example Matches
OS only darwin Any architecture on that OS
OS/arch darwin/amd64 Exact OS and architecture
Arch only amd64 Any OS with that architecture

This correctly handles entries like helm's ["darwin", "linux", "amd64"] where amd64 means "Windows amd64 is supported".

Test Coverage

Test Platform Description
TestToolchainAquaTools_KubectlBinaryNaming All Verifies kubectl installed as kubectl NOT kubernetes
TestToolchainAquaTools_InstallAllTools All Installs cross-platform tools; kots on Linux/macOS only
TestToolchainAquaTools_WindowsKotsPlatformError Windows Verifies platform error with WSL hint
TestToolchainAquaTools_NonExistentToolError All Verifies "not in registry" error
TestIsPlatformMatch All Tests OS-only, OS/arch, and arch-only matching
TestIsKnownArch All Tests recognition of Go architecture names
TestBuildPlatformNotSupportedError All Tests error building with hints
TestFormatPlatformError All Tests user-friendly error formatting

Summary by CodeRabbit

  • New Features

    • Pre‑flight platform checks with actionable hints (WSL, Rosetta, Docker, qemu)
    • Improved binary-name resolution for multi‑segment package identifiers
  • Bug Fixes

    • Enriched HTTP 404/download errors with OS/arch context and platform guidance
    • Windows: automatic .exe handling for raw binary URLs
    • Suppressed noisy renderer warnings during output
  • Tests

    • Expanded unit/integration fixtures covering naming, platform matching, and error scenarios
  • Documentation

    • Added guidance for toolchain error handling and binary naming

✏️ Tip: You can customize this high-level summary in your review settings.

docs: update describe stacks --component-types @kyledecot (#2020)

what

Updates the help menu for atmos describe stacks ... to denote that the --component-types flag supports packer.

why

Looks like this wasn't updated after Packer support was added.

references

N/A

Summary by CodeRabbit

Documentation

  • Updated the component-types flag help text to include "packer" as an additional supported component type.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Audit and fix broken links in README @osterman (#2013)

what

  • Fixed 15 broken /core-concepts/* links in README that returned 404 errors
  • Added 5 missing redirects to docusaurus.config.js for backward compatibility
  • Uncommented workflows redirect with corrected target URL
  • Created GitHub Action workflow (.github/workflows/link-check.yml) to automatically check .md files for broken links using lychee

why

GitHub reported 404 errors for several README links pointing to moved documentation pages. Adding redirects provides backward compatibility for external references, and the new link checker prevents future broken link regressions.

references

Related to: https://github.com/cloudposse/atmos/issues (README broken links audit)

Summary by CodeRabbit

  • New Features

    • Added automated link validation (CI workflow + local target) to catch broken Markdown links.
  • Documentation

    • Reorganized and updated many documentation links to new site structure for consistency.
    • Corrected external references to third-party docs and adjusted cross‑references across guides and examples.
    • Minor content alignments and added a Use Case bullet about service catalogs/landing zones.
  • Chores

    • Added link-check configuration and a Makefile target to run the checker locally.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Use toolchain.GetInstallPath() for PATH construction @osterman (#2015)

what

  • Ensures PATH points to where tools are actually installed (XDG path by default) instead of hardcoded .tools directory
  • Fixes issue where custom commands and workflows would use system-installed tools instead of toolchain-managed versions
  • Adds test to reproduce and validate the PATH mismatch bug

why

Tools are installed via toolchain.GetInstallPath() (defaults to ~/.local/share/atmos/toolchain), but BuildToolchainPATH() and NewInstaller() were using a hardcoded .tools default. This caused PATH to point to the wrong directory, making system-installed tools (like brew-installed helm) take precedence over the Atmos-managed versions.

references

Resolves issue where users had to work around the bug using atmos toolchain exec helm/helm -- instead of calling helm directly in custom commands.

Summary by CodeRabbit

  • Bug Fixes

    • Enhanced tool binary path resolution to consistently use the centralized toolchain installation path instead of hard-coded defaults, while maintaining backward compatibility with custom paths when configured
  • Tests

    • Added test coverage to verify PATH construction correctly includes the actual toolchain installation path for tool binaries

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Windows toolchain installation issues @aknysh (#2012)

what

  • Fix Windows toolchain installation failures where binaries were installed without .exe extension
  • Fix GitHub release download URLs to include .exe for raw binaries on Windows (following Aqua behavior)
  • Fix archive extraction for tools like helm that have .exe binaries inside archives
  • Fix hint message to show PowerShell Invoke-Expression syntax instead of Unix eval on Windows
  • Improve .atmos.d directory detection to differentiate permission errors from not-found errors
  • Extend archive extension detection to include .tar.xz, .tar.bz2, .7z, and other formats
  • Add integration tests for Windows toolchain functionality
  • Update CLI documentation with PowerShell examples

why

Users reported multiple issues when using atmos toolchain install on Windows:

  1. Binary without .exe extension - Installing tools like terraform resulted in binaries without .exe extension, causing terraform --version to hang indefinitely
  2. Download URL missing .exe - Tools like jq that have standalone Windows binaries (e.g., jq-windows-amd64.exe) failed to download because the URL was constructed without .exe
  3. Archive extraction failures - Tools like helm that ship as archives (.tar.gz, .zip) failed because the extractor looked for windows-amd64/helm instead of windows-amd64/helm.exe
  4. Wrong shell hint - The hint message showed Unix eval $(...) syntax instead of PowerShell Invoke-Expression syntax

Architecture

Centralized Windows Extension Handling

Following Aqua's Windows support approach, Windows executables need the .exe extension to be found by os/exec.LookPath. We use a single centralized function:

// EnsureWindowsExeExtension appends .exe to the binary name on Windows if not present.
func EnsureWindowsExeExtension(binaryName string) string {
    if runtime.GOOS == "windows" && \!strings.HasSuffix(strings.ToLower(binaryName), ".exe") {
        return binaryName + ".exe"
    }
    return binaryName
}

Download URL Handling by Tool Type

Tool Type Download URL .exe Handling
github_release Automatic: Adds .exe on Windows for raw binaries (assets without archive extensions like .tar.gz, .zip)
http Manual: The asset template must include .exe in the URL if needed

This matches Aqua's behavior where .exe is added to the download URL upfront during URL construction, not as a fallback after a 404 error.

Archive Extension Detection

Extended to recognize additional formats to avoid incorrectly appending .exe to archive URLs:

var archiveExtensions = []string{
    ".tar.gz", ".tgz", ".zip", ".gz",
    ".tar.xz", ".txz", ".tar.bz2", ".tbz", ".tbz2",
    ".bz2", ".xz", ".7z", ".tar", ".pkg",
}

Archive Extraction

When extracting from archives, the .exe fallback only runs on Windows (not on Unix) to avoid masking wrong-asset errors.

Fixes Applied

File Fix
toolchain/installer/installer.go Added EnsureWindowsExeExtension() centralized function
toolchain/installer/asset.go Adds .exe to GitHub release URLs for raw binaries on Windows; extended archive detection
toolchain/installer/extract.go Uses centralized function; .exe fallback only on Windows
toolchain/install_helpers.go Platform-aware hint message for PowerShell
pkg/config/load.go Differentiate stat errors from not-found for .atmos.d directories

Test Results (Windows)

All integration tests pass on Windows:

--- PASS: TestToolchainCustomCommands_InstallAllTools (14.04s)
--- PASS: TestToolchainCustomCommands_ToolsExecutable (12.33s)
--- PASS: TestToolchainCustomCommands_PathEnvOutput (10.09s)
--- PASS: TestToolchainCustomCommands_WindowsExeExtension (8.91s)
--- PASS: TestToolchainCustomCommands_CustomCommandsLoaded (8.31s)
--- PASS: TestToolchainCustomCommands_ExecuteWithDependencies (14.50s)
PASS

references

  • Full documentation: docs/fixes/windows-atmos-d-and-toolchain-issues.md
  • Test fixture: tests/fixtures/scenarios/toolchain-custom-commands
  • Integration tests: tests/toolchain_custom_commands_test.go

Summary by CodeRabbit

  • New Features

    • Tabbed Bash/Zsh and PowerShell examples for env/shell guidance.
    • Custom toolchain commands with dependency-driven tool installation and a Terraform test component.
  • Bug Fixes

    • Improved Windows executable handling (.exe normalization for downloads/installs).
    • Safer atmos.d/.atmos.d detection with clearer "no directory found" messages and adjusted log levels.
    • Platform-aware PATH export hints in installer output.
  • Documentation

    • Added Windows toolchain troubleshooting guide; updated CLI docs for cross-platform usage.
  • Tests

    • New unit and integration tests covering custom commands, toolchain installs, Windows behaviors, and env handling.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Imperative stack names now bypass template and pattern validation @osterman (#1970)

what

  • Stacks with explicit name field now correctly bypass name_template and name_pattern validation
  • Previously, stacks with explicit names that lacked template/pattern-required vars were silently skipped
  • Added regression test to prevent future regressions
  • Added example demonstrating imperative stack naming

why

The processStackContextPrefix function was processing name_template or name_pattern before checking if the stack had an explicit name field. According to the stack name identity spec, explicit names take absolute precedence and should skip template/pattern processing entirely.

how

Updated processStackContextPrefix to accept stackManifestName parameter and skip validation when an explicit name is present. This ensures the correct precedence order is enforced during component discovery in ProcessStacks.

references

  • Relates to stack name identity specification (docs/prd/stack-name-identity.md)
  • Test fixture: tests/fixtures/scenarios/stack-name-pattern-missing-vars/
  • Example: examples/stack-names/

Summary by CodeRabbit

  • New Features

    • Added a stack-names example workspace demonstrating explicit stack naming with precedence over filename-based names
    • Included example Terraform mock component and .gitignore for the example
  • Bug Fixes

    • Pattern validation failures now gracefully fall back to filename-based stack names instead of aborting
    • Improved CLI error hints when an invalid stack name is provided
  • Documentation

    • Added docs and an embedded "Stack Names" example describing naming rules and usage
  • Tests

    • Added tests and snapshots covering explicit naming, pattern-fallback behavior, and CLI outputs (including telemetry notice)

✏️ Tip: You can customize this high-level summary in your review settings.

fix: Describe Affected Detects Component File Changes. fix: Vendored components with `source` @aknysh (#2003)

what

  • Fixed atmos describe affected to correctly detect component file changes (Terraform, Helmfile, Packer)
  • Added gitRepoRoot parameter to path resolution logic to properly resolve relative paths from git diff
  • Fixed detection of components using source for vendoring (components without explicit component field)
  • A regression in previous Atmos releases caused changes to component files to not be detected in certain scenarios

why

Issue 1: Git repo root path resolution

  • Git diff returns file paths relative to the git repository root
  • The previous implementation used filepath.Abs() which resolves paths against the current working directory
  • When Atmos was run from a subdirectory (e.g., atmos -C examples/demo-stacks), paths would not match, causing component changes to go undetected

Issue 2: Vendored components with source

  • Components using source for just-in-time vendoring were not being detected
  • The affected detection required an explicit component field to determine which folder to monitor
  • Now defaults to using the component name (YAML key) when no explicit component field is specified

changes

Path resolution fix

  • newChangedFilesIndex() now accepts gitRepoRoot parameter
  • Relative paths from git diff are resolved against the git repo root, not the current working directory

Source component detection fix

  • Added GetComponentFolder() helper in stack_utils.go to consolidate component folder resolution logic
  • Modified BuildComponentPath() to accept optional fallback parameter
  • processTerraformComponentsIndexed(), processHelmfileComponentsIndexed(), processPackerComponentsIndexed() now use GetComponentFolder() which defaults to component name when component field is missing
  • This ensures components with source vendoring are properly tracked

test coverage

All three scenarios are covered by unit tests:

Scenario Test Coverage
metadata.component specified TestFindAffectedComponentFolderChanges/explicit_component_field
TestFindAffectedComponentFolderChanges/inherited_base_component
TestGetComponentFolder/returns_explicit_component_field_when_set
source specified (JIT vendoring) TestFindAffectedComponentFolderChanges/JIT_vendored_component_with_source_-_simple_config
TestFindAffectedComponentFolderChanges/JIT_vendored_component_with_source_-_full_config
TestFindAffectedHelmfileAndPackerComponents/Helmfile_JIT_vendored_with_source
TestFindAffectedHelmfileAndPackerComponents/Packer_JIT_vendored_with_source
source + workdir specified TestFindAffectedHelmfileAndPackerComponents/Terraform_with_source_and_workdir
TestFindAffectedHelmfileAndPackerComponents/Helmfile_with_source_and_workdir
TestFindAffectedHelmfileAndPackerComponents/Packer_with_source_and_workdir

Resolution flow

  1. metadata.component: mock → Stack processing sets componentSection["component"] = "mock"GetComponentFolder uses that value
  2. source only → No component field → GetComponentFolder falls back to componentName (YAML key)
  3. source + workdir → Same as 2 (see note below)

Why provision.workdir doesn't affect folder resolution

For describe affected, the workdir configuration doesn't change how component folders are resolved because:

  1. Workdir is runtime-only: The .workdir/ directory is created at runtime when you run atmos terraform plan/apply. It's a temporary copy of the component files.

  2. Workdir is not tracked in git: The .workdir/ directory is in .gitignore. Changes to files in .workdir/ don't appear in git diff.

  3. describe affected compares git branches: It looks at what files changed between commits/branches. Since workdir files aren't tracked, the detection happens on the source files:

    • For local components: components/terraform/<component>/
    • For vendored components with source: components/terraform/<component-name>/ (where files are vendored)
Source of truth (tracked in git)     →    Workdir (runtime, not tracked)
components/terraform/vpc-remote/     →    .workdir/terraform/dev-vpc-remote/
         ↑                                           ↑
   describe affected                          terraform runs here
   detects changes HERE

When you modify vendored component files in components/terraform/vpc-remote-workdir/, describe affected detects that change. The fact that at runtime those files get copied to .workdir/ doesn't matter for change detection.

references

Summary by CodeRabbit

  • Bug Fixes
    • Corrected affected-component detection when running from a repo root or subdirectory (e.g., using -C), improving path resolution.
    • Properly detect vendored (source-based) components and component folder/file changes across Terraform, Helmfile, and Packer.
  • Documentation
    • Added blog posts explaining the improved detection, vendoring behavior, and cross-platform path-handling guidance.

✏️ Tip: You can customize this high-level summary in your review settings.

fix: resolve --all flag prompting for component (issue #1945) @osterman (#1976)

what

  • Fixed critical bug where terraform commands with --all, --affected, --query, or --components flags would incorrectly prompt for component selection, then error
  • Root cause was applyOptionsToInfo being called after resolveAndPromptForArgs, preventing prompting logic from detecting multi-component flags
  • Added regression tests to prevent similar bugs in future

why

The --all flag must be applied to the info struct BEFORE checking whether to show interactive prompts. Otherwise, the prompting logic cannot determine that multi-component flags are set and incorrectly prompts for a component, which then conflicts with the multi-component flag validation.

references

closes #1945

Summary by CodeRabbit

  • New Features

    • Interactive prompts now respect CLI multi-component options earlier, preventing prompts when those flags are present.
  • Bug Fixes

    • Clear success messages when no components are affected or no query matches.
    • Dry-run now reports results and cleanly skips execution while indicating success.
  • Tests

    • Expanded coverage for multi-component flags, prompt-skipping, dry-run behavior, no-match cases, and related edge conditions.

✏️ Tip: You can customize this high-level summary in your review settings.

Fix double-hyphen (--) parsing in CLI commands @aknysh (#1990)

what

  • Fixed issue where args after -- (POSIX end-of-options marker) were incorrectly parsed by Cobra/pflag
  • The stack flag value was being corrupted when commands included -- followed by terraform flags like -consolidate-warnings=false
  • Added named constant endOfOptionsMarker to replace repeated "--" string literal (linting fix)

why

  • Commands like atmos terraform plan vpc --stack nonprod -- -consolidate-warnings=false were failing with corrupted stack values
  • The stack value would become olidate-warnings=false instead of nonprod because pflag was incorrectly parsing the -consolidate-warnings=false argument after --
  • Per POSIX convention, everything after -- should be passed through to the subprocess without being parsed by the CLI

references

Summary by CodeRabbit

  • Bug Fixes

    • Corrected command-line parsing so the "--" end-of-options marker properly isolates subsequent flags/args and prevents corruption of preceding values.
  • Tests

    • Added comprehensive tests and scenario fixtures covering various "--" usages to verify parsing, precedence, and edge cases; updated CLI error/help snapshots to reflect added workflows.
  • Chores

    • Bumped several Go module dependencies to newer patch/minor releases.

✏️ Tip: You can customize this high-level summary in your review settings.

Fix component menu to filter abstract and disabled components @osterman (#1977)

what

  • Interactive component selection menu now filters out abstract components (metadata.type: abstract)
  • Disabled components (metadata.enabled: false) are hidden from interactive prompts and tab completion
  • Stack-scoped filtering: only components in the specified stack appear when --stack is provided
  • Added helper functions isComponentDeployable() and filterDeployableComponents() to centralize filtering logic
  • Updated PromptForComponent() signature to accept stack parameter for stack-aware filtering

why

Previously, users would see all components from all stacks in the interactive menu, including abstract base components that serve as templates. This was confusing because abstract components cannot be deployed. The fix ensures only deployable, valid components appear in interactive prompts and shell completion, improving user experience and preventing errors.

references

Fixes component selection menu to correctly filter out non-deployable components.

Summary by CodeRabbit

  • New Features

    • Interactive component prompts and tab completion now filter by the specified stack and show only deployable components (excludes abstract/disabled)
  • Improvements

    • Prompt flow now asks for and validates the stack earlier, enabling stack-scoped component filtering and faster validation when a stack is supplied
  • Documentation

    • Added a blog post documenting component selection filtering behavior
  • Tests

    • Expanded tests covering deployability filtering, prompting, completions, and related utilities

✏️ Tip: You can customize this high-level summary in your review settings.

refactor: Remove error returns from ui.* functions @osterman (#1980)

what

  • Changed ui.Success, ui.Error, ui.Warning, ui.Info, ui.Write, ui.Markdown, and related functions to not return errors
  • Eliminated 210+ instances of the "dog sled" pattern (_ = ui.*) across the codebase
  • Functions now log write errors internally via log.Debug() instead of returning them

why

Errors from stderr writes are not meaningful for callers to handle. The io/Write API may fail for reasons beyond the caller's control (terminal buffering, redirect failures, etc.), but there's nothing actionable the caller can do. This matches the log.* pattern which already doesn't return errors.

references

Removes unnecessary error handling noise while maintaining the same output behavior.

Summary by CodeRabbit

  • Refactor

    • UI messaging made more resilient: status, warnings, and formatted output now log write failures internally instead of propagating errors, ensuring consistent user-facing messages.
  • Chores

    • Updated example build image version and underlying formatter/dependency updates.

✏️ Tip: You can customize this high-level summary in your review settings.

🤖 Automatic Updates

chore(deps): bump github.com/redis/go-redis/v9 from 9.12.1 to 9.17.2 @[dependabot[bot]](https://github.com/apps/dependabot) (#1989) Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.12.1 to 9.17.2.
Release notes

Sourced from github.com/redis/go-redis/v9's releases.

9.17.2

🐛 Bug Fixes

  • Connection Pool: Fixed critical race condition in turn management that could cause connection leaks when dial goroutines complete after request timeout (#3626) by @​cyningsun
  • Context Timeout: Improved context timeout calculation to use minimum of remaining time and DialTimeout, preventing goroutines from waiting longer than necessary (#3626) by @​cyningsun

🧰 Maintenance

  • chore(deps): bump rojopolis/spellcheck-github-actions from 0.54.0 to 0.55.0 (#3627)

Contributors

We'd like to thank all the contributors who worked on this release!

@​cyningsun and @​ndyakov

9.17.1

🐛 Bug Fixes

🧰 Maintenance

  • chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
  • chore(deps): bump actions/checkout from 5 to 6 (#3610)
  • chore(script): fix help call in tag.sh (#3606) by @​ndyakov

Contributors

We'd like to thank all the contributors who worked on this release!

@​marcoferrer and @​ndyakov

9.17.0

🚀 Highlights

Redis 8.4 Support

Added support for Redis 8.4, including new commands and features (#3572)

Typed Errors

Introduced typed errors for better error handling using errors.As instead of string checks. Errors can now be wrapped and set to commands in hooks without breaking library functionality (#3602)

New Commands

  • CAS/CAD Commands: Added support for Compare-And-Set/Compare-And-Delete operations with conditional matching (IFEQ, IFNE, IFDEQ, IFDNE) (#3583, #3595)
  • MSETEX: Atomically set multiple key-value pairs with expiration options and conditional modes (#3580)
  • XReadGroup CLAIM: Consume both incoming and idle pending entries from streams in a single call (#3578)
  • ACL Commands: Added ACLGenPass, ACLUsers, and ACLWhoAmI (#3576)
  • SLOWLOG Commands: Added SLOWLOG LEN and SLOWLOG RESET (#3585)
  • LATENCY Commands: Added LATENCY LATEST and LATENCY RESET (#3584)

... (truncated)

Changelog

Sourced from github.com/redis/go-redis/v9's changelog.

9.17.2 (2025-12-01)

🐛 Bug Fixes

  • Connection Pool: Fixed critical race condition in turn management that could cause connection leaks when dial goroutines complete after request timeout (#3626) by @​cyningsun
  • Context Timeout: Improved context timeout calculation to use minimum of remaining time and DialTimeout, preventing goroutines from waiting longer than necessary (#3626) by @​cyningsun

🧰 Maintenance

  • chore(deps): bump rojopolis/spellcheck-github-actions from 0.54.0 to 0.55.0 (#3627)

Contributors

We'd like to thank all the contributors who worked on this release!

@​cyningsun and @​ndyakov


Full Changelog: redis/go-redis@v9.17.1...v9.17.2

9.17.1 (2025-11-25)

🐛 Bug Fixes

🧰 Maintenance

  • chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
  • chore(deps): bump actions/checkout from 5 to 6 (#3610)
  • chore(script): fix help call in tag.sh (#3606) by @​ndyakov

Contributors

We'd like to thank all the contributors who worked on this release!

@​marcoferrer and @​ndyakov


Full Changelog: redis/go-redis@v9.17.0...v9.17.1

9.17.0 (2025-11-19)

🚀 Highlights

Redis 8.4 Support

Added support for Redis 8.4, including new commands and features (#3572)

Typed Errors

... (truncated)

Commits
  • d3e7d4c chore(release): v9.17.2 (#3629)
  • 665d0bf fix(pool): correct turn management in putIdleConn to prevent connection leaks...
  • 68d8c59 chore(release): v9.17.1 (#3617)
  • 932caa5 chore(deps): bump actions/stale from 9 to 10 (#3505)
  • b362eb7 fix(txpipeline) add wait to keyless commands list (#3615)
  • fd437ce chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
  • 8549116 chore(deps): bump actions/checkout from 5 to 6 (#3610)
  • 6390822 fix(time): remove cached time optimization (#3611)
  • 1bb9e0d chore(scripts: fix help call in tag.sh (#3606)
  • 5b0b228 chore(release): v9.17.0 (#3604)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Don't miss a new atmos release

NewReleases is sending notifications on new releases.