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_REGIONandAWS_DEFAULT_REGIONfrom theEnvironment()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 envwhen region is configured in identity settings - Azure Portal console access support added
- AWS_REGION and AWS_DEFAULT_REGION environment variables now exported from
-
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 fromatmos.yamlconfig - 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-filesstep to detect if.github/CODEOWNERSwas modified in the PR - Only run CODEOWNERS validation checks when the file actually changed or on manual
workflow_dispatchtriggers - 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_dispatchfor 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 aliasessubcommand for viewing CLI command aliases - Add query normalization and simplified syntax for
atmos list components - Support installing multiple tools in a single
atmos toolchain installcommand - 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-videosbranch (excluding demo infrastructure: tools/director/, pkg/ffmpeg/, pkg/vhs/, demos/)
Summary by CodeRabbit
-
New Features
- Added
atmos list aliasesto show built-in + configured aliases. atmos toolchain installaccepts 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.
- Added
-
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_filesis enabled, allowing components to be JIT (Just-In-Time) created from stack configuration - Interactive prompting for component and stack selection (like
terraform backendcommand) - 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 outputpkg/terraform/generate/generate.go- Directory creation before file generationcmd/terraform/generate/files.go- Interactive prompting for component/stack selectioninternal/exec/terraform.go- Auto-generation during terraform executioninternal/exec/helmfile.go- Auto-generation during helmfile executioninternal/exec/packer.go- Auto-generation during packer executionpkg/schema/schema.go- Config support for helmfile and packer auto-generationexamples/generate-files/- Complete working example with terraform configurations
Test Plan
-
Test interactive prompting without arguments:
atmos -C examples/generate-files terraform generate files # Should prompt for component, then stack -
Test with component argument only:
atmos -C examples/generate-files terraform generate files demo # Should prompt for stack only -
Test with all arguments (no prompting):
atmos -C examples/generate-files terraform generate files demo -s dev # Should generate without prompting -
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 -
Test auto-generation during terraform plan:
cd examples/generate-files atmos terraform plan demo -s dev # Should auto-generate files before validation
-
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 -
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 (width → max_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
--stackflag optional foratmos terraform source listandatmos list sourcescommands - Added optional
[component]positional argument to filter by component name or folder - Added dynamic
Foldercolumn that appears only when component folder differs from instance name - Added
Typecolumn toatmos list sourcesfor 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 sourcesto list component sources across Terraform, Helmfile, and Packer with optional component/stack filtering and multiple output formats.
- Added unified
-
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=githubsupport foratmos terraform outputthat writes to$GITHUB_OUTPUT - Eliminated code duplication between
cmd/envandpkg/terraform/outputby refactoring to usepkg/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 addcommand - Default version to
latestwhen 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
--fileflag 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.envsections 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/localsexample 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
.varsfrom 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
-
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
-
YAML Functions in Locals (
2026-01-20-locals-yaml-functions.mdx)- Support for
!env,!exec,!store,!terraform.state,!terraform.outputin locals - Examples and use cases
- Support for
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 devOutput:
vars:
environment: development
full_name: acme-development-dev
name: acme
tags:
Environment: development
ManagedBy: Atmos
Namespace: acme
Team: platformSummary of Changes
Code Changes:
pkg/locals/resolver.go:- Added
templateContextfield andWithTemplateContextmethod to pass settings/vars/env during resolution - Added
YamlFunctionProcessorcallback type andWithYamlFunctionProcessormethod for YAML function support - Updated
resolveStringto detect and process YAML functions (strings starting with!)
- Added
internal/exec/stack_processor_locals.go:- Build and pass template context with settings/vars/env from the stack config
- Added
localsResolveOptionsstruct andcreateYamlFunctionProcessorfor YAML function processing - Fixed
buildSectionTemplateContextto merge section values with global values (not replace) - Added
mergeStringAnyMapshelper 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: AddedErrLocalsYamlFunctionFailedsentinel 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
TestLocalsWithYamlFunctionsEnvfor 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.mdxwebsite/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/apifrom 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 themes ↔ atmos 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 list↔atmos list vendorandatmos workflow list↔atmos list workflows. - Introduced a top-level
vendorcommand withpullanddiffsubcommands (with their flags).
- Added command aliases:
-
Bug Fixes / UX
- CLI help updated to show
workflow [command]indicating it accepts subcommands.
- CLI help updated to show
-
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 readmefrom a disabled stub to using theatmos docs generate readmecommand - 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.hclfiles from the component directory automatically. This aligns with HashiCorp's recommended multi-file configuration patterns. - Configuration validation: Added
checkPackerConfig()validation to bothExecutePackerandExecutePackerOutputfunctions, 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 buildon abstract (metadata.type: abstract) and locked (metadata.locked: true) components while allowing read-only commands likevalidateandinspect. - Error message consistency: Standardized error message quoting style across Packer files (using single quotes consistently).
- New
ErrMissingPackerBasePatherror: 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
PackerFlagsstruct and its fields. - Test coverage improvements:
- Added
TestExecutePacker_Fmtfor the fmt command - Added
TestExecutePacker_ComponentMetadatafor abstract/locked component handling - Added
TestCheckPackerConfigfor configuration validation - Added
captureStdouttest helper to reduce code duplication - Added test for missing Packer base path in
ExecutePackerOutput
- Added
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
- Closes #1937
- Blog post: Packer Directory-Based Templates for Multi-File Configurations
- Documentation:
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.hclfiles from the component directory without requiring explicit template configuration. - Template parameter is now optional; use
--templateflag orsettings.packer.templateto override.
- Packer now defaults to directory mode, automatically loading all
-
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_EXPERIMENTALenvironment variable andsettings.experimentalconfig - Mark
terraform backend,terraform workdir, andtoolchaincommands 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 notificationwarn- Show notification, continue (default)error- Show notification, exit with errordisable- Block experimental commands entirely
references
- /experimental - Experimental features policy
- /cli/configuration/settings/experimental - Configuration docs
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.gowhere relativecomponent_pathwas not resolved againstatmosConfig.BasePath - Add comprehensive unit tests to increase test coverage from 88.4% to 92.9%
- Add integration tests for
--chdirflag 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 directoryerrors when using theatmos.Componenttemplate function with--chdirflag or when running from a non-project-root directory - Root cause:
buildComponentInfo()indescribe_stacks.goreturnscomponent_pathas a relative path (e.g.,components/terraform/vpc), butpkg/terraform/output/executor.goused this path directly for file operations. When CWD differs from project root, the relative path doesn't resolve correctly - The fix: Resolve relative
component_pathagainstatmosConfig.BasePathbefore 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 directoryatmos --chdir with describe affected resolves paths correctly- Verifies describe affected works from different directory
references
- Related PRs that may have exposed this latent bug:
- 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.goto 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.statedocumentation examples - Fixed confusing component/output name collision in
!terraform.outputdocumentation - Fixed incorrect syntax in
website/docs/functions/index.mdx(vpc.vpc_id→vpc vpc_id) - Fixed broken link generation in
doc-release-dataplugin for index.mdx files withid: index - Added comprehensive test coverage for YAML functions:
- YQ expression patterns (bracket notation, defaults, pipes)
!envfunction unit tests!includeintegration 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-dataplugin incorrectly generated/indexpaths for files likefunctions/index.mdxwithid: index, causing broken links on the/unreleasedpage - 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
kubectlinstead ofkubernetes(extracts binary name from last segment of Aqua package name likekubernetes/kubernetes/kubectl) viaresolveBinaryNamehelper - Pre-flight platform compatibility check: Check
supported_envsfrom Aqua registry before attempting download, providing immediate feedback instead of waiting for HTTP 404 - Arch-only platform matching: Handle Aqua registry
supported_envsentries likeamd64which 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/replicatedwhich 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
kubectlbinary name - Users wasted time waiting for downloads to fail when the tool didn't support their platform
- helm/helm failed on Windows because
amd64insupported_envswas 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_envsfield 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
.toolsdirectory - 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
.exeextension - Fix GitHub release download URLs to include
.exefor raw binaries on Windows (following Aqua behavior) - Fix archive extraction for tools like helm that have
.exebinaries inside archives - Fix hint message to show PowerShell
Invoke-Expressionsyntax instead of Unixevalon Windows - Improve
.atmos.ddirectory 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:
- Binary without
.exeextension - Installing tools like terraform resulted in binaries without.exeextension, causingterraform --versionto hang indefinitely - 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 - Archive extraction failures - Tools like helm that ship as archives (
.tar.gz,.zip) failed because the extractor looked forwindows-amd64/helminstead ofwindows-amd64/helm.exe - Wrong shell hint - The hint message showed Unix
eval $(...)syntax instead of PowerShellInvoke-Expressionsyntax
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
namefield now correctly bypassname_templateandname_patternvalidation - 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 affectedto correctly detect component file changes (Terraform, Helmfile, Packer) - Added
gitRepoRootparameter to path resolution logic to properly resolve relative paths from git diff - Fixed detection of components using
sourcefor vendoring (components without explicitcomponentfield) - 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
sourcefor just-in-time vendoring were not being detected - The affected detection required an explicit
componentfield to determine which folder to monitor - Now defaults to using the component name (YAML key) when no explicit
componentfield is specified
changes
Path resolution fix
newChangedFilesIndex()now acceptsgitRepoRootparameter- Relative paths from git diff are resolved against the git repo root, not the current working directory
Source component detection fix
- Added
GetComponentFolder()helper instack_utils.goto consolidate component folder resolution logic - Modified
BuildComponentPath()to accept optional fallback parameter processTerraformComponentsIndexed(),processHelmfileComponentsIndexed(),processPackerComponentsIndexed()now useGetComponentFolder()which defaults to component name whencomponentfield is missing- This ensures components with
sourcevendoring 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
metadata.component: mock→ Stack processing setscomponentSection["component"] = "mock"→GetComponentFolderuses that valuesourceonly → Nocomponentfield →GetComponentFolderfalls back to componentName (YAML key)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:
-
Workdir is runtime-only: The
.workdir/directory is created at runtime when you runatmos terraform plan/apply. It's a temporary copy of the component files. -
Workdir is not tracked in git: The
.workdir/directory is in.gitignore. Changes to files in.workdir/don't appear ingit diff. -
describe affectedcompares 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)
- For local components:
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--componentsflags would incorrectly prompt for component selection, then error - Root cause was
applyOptionsToInfobeing called afterresolveAndPromptForArgs, 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
endOfOptionsMarkerto replace repeated"--"string literal (linting fix)
why
- Commands like
atmos terraform plan vpc --stack nonprod -- -consolidate-warnings=falsewere failing with corrupted stack values - The stack value would become
olidate-warnings=falseinstead ofnonprodbecause pflag was incorrectly parsing the-consolidate-warnings=falseargument after-- - Per POSIX convention, everything after
--should be passed through to the subprocess without being parsed by the CLI
references
- Closes #1967
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!
@cyningsunand@ndyakov9.17.1
🐛 Bug Fixes
- add wait to keyless commands list (#3615) by
@marcoferrer- fix(time): remove cached time optimization (#3611) by
@ndyakov🧰 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
@ndyakovContributors
We'd like to thank all the contributors who worked on this release!
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.Asinstead 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, andACLWhoAmI(#3576)- SLOWLOG Commands: Added
SLOWLOG LENandSLOWLOG RESET(#3585)- LATENCY Commands: Added
LATENCY LATESTandLATENCY 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!
@cyningsunand@ndyakov
Full Changelog: redis/go-redis@v9.17.1...v9.17.2
9.17.1 (2025-11-25)
🐛 Bug Fixes
- add wait to keyless commands list (#3615) by
@marcoferrer- fix(time): remove cached time optimization (#3611) by
@ndyakov🧰 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
@ndyakovContributors
We'd like to thank all the contributors who worked on this release!
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
d3e7d4cchore(release): v9.17.2 (#3629)665d0bffix(pool): correct turn management in putIdleConn to prevent connection leaks...68d8c59chore(release): v9.17.1 (#3617)932caa5chore(deps): bump actions/stale from 9 to 10 (#3505)b362eb7fix(txpipeline) add wait to keyless commands list (#3615)fd437cechore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)8549116chore(deps): bump actions/checkout from 5 to 6 (#3610)6390822fix(time): remove cached time optimization (#3611)1bb9e0dchore(scripts: fix help call in tag.sh (#3606)5b0b228chore(release): v9.17.0 (#3604)- Additional commits viewable in compare view
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 rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill 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 versionwill 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 dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)