docs: refactor terraform usage page @osterman (#1952)
## what- Refactored
terraform usage.mdxfrom 871 to 149 lines into a focused overview page - Added Multi-Component Operations sections to
terraform-plan,terraform-apply,terraform-deploy, andterraform-destroycommand pages - Moved 300+ lines of multi-component examples and flag documentation to individual command pages
- Eliminated 765 lines of duplicate content across documentation
why
The terraform usage page served as both a landing page and comprehensive reference, resulting in massive duplication. Multi-component operations documentation now lives in individual command pages where it's directly relevant, improving maintainability and following the pattern used by other command groups like describe.
references
Issue: Terraform usage page was not refactored after subcommands were broken out into separate pages.
Summary by CodeRabbit
- Documentation
- Added comprehensive multi-component operations documentation for terraform apply, deploy, and plan commands, covering filtering flags and deployment modes including affected components and query-based selection.
- Reorganized terraform usage documentation with a new Command Modes section, streamlined examples, and improved navigation for single and multi-component workflows.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Add data-driven roadmap slide deck with pagination @osterman (#1953)
## what- Created a new data-driven slide deck at
/slides/roadmapthat visualizes the Atmos product roadmap - Featured initiatives appear first, followed by other initiatives with progress bars
- Paginated milestone viewer with clickable dots and Shift+Left/Right keyboard navigation
- Styled milestones with status icons, badges for releases/docs, inline code formatting
- Progress bar visualization for initiative completion percentages
why
- Provides a modern, interactive way to present the Atmos roadmap to stakeholders and the community
- Data-driven from roadmapConfig ensures the slides stay in sync with product planning
- Paginated milestones allow initiatives to showcase multiple achievements without cluttering slides
- Keyboard navigation provides power-user experience alongside mouse interaction
references
- Roadmap data source:
website/src/data/roadmap.js - Slide deck system:
website/src/components/SlideDeck/
Summary by CodeRabbit
-
New Features
- Added "Atmos Roadmap 2025-2026" interactive slide deck with paginated milestone lists, status badges, progress bars, links, and presenter notes.
- Milestone pagination supports Shift+ArrowLeft/Right; holding Shift while paging no longer advances slides.
-
Style
- Extensive visual and responsive styling for slides: badges, icons, progress bars, pagination dots, typography, and layout refinements.
-
Other
- Updated roadmap theme title to "Reducing Tool Fatigue".
✏️ Tip: You can customize this high-level summary in your review settings.
🚀 Enhancements
fix: Fix Aqua registry factory and add darwin_all pattern support @osterman (#1948)
## what- Fix nil registry factory by injecting real Aqua registry factory
- Load configured registries from atmos.yaml in NewInstaller()
- Add Asset field to AquaPackage for github_release types
- Support platform-specific asset patterns (e.g., darwin_all)
- Add test for replicated darwin_all override pattern
- Move test fixtures to proper testdata directories
- Refactor FindTool to reduce complexity and improve logging
why
The installer subpackage refactoring broke registry lookups because defaultRegistryFactory.NewAquaRegistry() was returning nil. Additionally, NewInstaller() wasn't loading configured registries from atmos.yaml, preventing custom registry support. This fix properly injects a working registry factory and loads configuration during initialization.
references
Fixes toolchain registry factory issues from the installer subpackage refactoring work.
🤖 Generated with Claude Code
Summary by CodeRabbit
-
New Features
- Configurable toolchain registries with platform-specific overrides, OS/arch replacements, multi-file extraction and macOS .pkg handling
- Enhanced CLI help and explicit telemetry notice across toolchain commands
-
Documentation
- Added Aqua package manager README and expanded CLI docs with AWS CLI install example and templating/override guidance
-
Tests
- Large expansion of fixtures, snapshots and unit/integration tests covering registries, install/info/download/extract flows, and overrides
-
Style
- Minor workflow comment update (non-functional)
✏️ Tip: You can customize this high-level summary in your review settings.
fix(provenance): add regression tests and fix flag inheritance @osterman (#1949)
## what- Add comprehensive regression tests for line-level provenance tracking
- Fix flag inheritance regression where custom commands could not define flags that already exist on parent commands
- Custom commands can now declare
--stack,--verbose, or other existing flags when the type matches - Type mismatches still produce clear error messages (e.g., defining
--stackas bool when parent has it as string)
why
- Provenance output format needs regression tests to prevent accidental breakage of import chains, depth tracking, and source attribution
- PR #1947 introduced overly strict flag conflict checking that rejected valid use cases
- Custom commands legitimately need to use flags like
--stackand--verbosethat are defined elsewhere - The fix allows flag inheritance when types match (skip re-registration) while still catching actual conflicts (type mismatch)
references
- Fixes flag regression introduced in #1947
- Adds test fixtures:
tests/fixtures/scenarios/provenance-advanced/andtests/fixtures/scenarios/flag-inheritance/ - Test cases:
tests/test-cases/provenance-snapshots.yamlandtests/test-cases/flag-inheritance.yaml
Summary by CodeRabbit
-
New Features
- Custom commands now support flag inheritance with type-safety validation and conflict detection
- Custom commands can define their own
--versionflags independent of the global version flag - Configuration provenance tracking now displays where each setting originates in the stack hierarchy
- Enhanced
atmos list componentscommand shows unique components with stack counts
-
Configuration
- Updated list command configuration structure in atmos.yaml under new
list.components,list.instances, andlist.stackspaths
- Updated list command configuration structure in atmos.yaml under new
✏️ Tip: You can customize this high-level summary in your review settings.
fix: Resolve file-scoped locals in stack configurations @aknysh (#1939)
## what- Fixed file-scoped locals feature that was documented but not functional (GitHub issue #1933)
- Templates using
{{ .locals.* }}now correctly resolve to their defined values - Added proper integration of locals extraction into the stack processing pipeline
- Section-specific locals (
terraform:,helmfile:,packer:) correctly override global locals - Component-level locals with inheritance support via
metadata.inherits - Added
atmos describe localscommand to inspect and debug locals configurations--stackflag is required - locals are file-scoped, so a specific stack must be specified- Component-level output: shows merged locals available to a specific component
- Supports both logical stack names (e.g.,
prod-us-east-1) and file paths (e.g.,deploy/prod) - Output follows Atmos schema format (direct stack manifest format, can be used as valid YAML)
Example Output
Stack Locals (by file path or logical name)
# Using file path
atmos describe locals --stack deploy/dev
# Using logical stack name (derived from atmos.yaml name_template)
atmos describe locals --stack dev-us-east-1locals:
environment: dev
namespace: acme
name_prefix: acme-dev
full_name: acme-dev-us-east-1
tags:
Environment: dev
Namespace: acme
terraform:
locals:
backend_bucket: acme-dev-tfstate
tf_specific: terraform-onlyThe output is in direct stack manifest format - it can be redirected to a file and used as a valid stack manifest:
atmos describe locals -s dev --file locals.yamlComponent Locals
When a component is specified, the output shows the merged locals available to that component (global + section-specific + component-level + inherited from base components):
atmos describe locals vpc -s prod-us-east-1components:
terraform:
vpc:
locals:
backend_bucket: acme-prod-tfstate
environment: prod
namespace: acme
name_prefix: acme-prod
vpc_type: production
cidr_prefix: "10.0"Query Specific Values
# Query the namespace from locals
atmos describe locals -s deploy/dev --query '.locals.namespace'
# Output: acme
# Output as JSON
atmos describe locals -s dev --format jsonComponent-Level Locals with Inheritance
Components can define their own locals: section that inherits from base components:
components:
terraform:
vpc/base:
metadata:
type: abstract
locals:
vpc_type: standard
cidr_prefix: "10.0"
vpc/prod:
metadata:
inherits:
- vpc/base
locals:
vpc_type: production # Overrides base
vars:
cidr: "{{ .locals.cidr_prefix }}.0.0/16" # Uses inherited localLocals resolution order: Global → Section → Base Component → Component
Manual Testing Results
Test Fixture: locals-logical-names
Stack-level locals (using logical stack name):
cd tests/fixtures/scenarios/locals-logical-names
atmos describe locals --stack dev-us-east-1locals:
env_prefix: acme-dev
full_prefix: acme-dev-us-east-1
namespace: acme
terraform:
locals:
backend_bucket: acme-dev-tfstate
tf_only: terraform-specific-devStack-level locals (using file path):
atmos describe locals --stack deploy/devSame output as above.
Stack-level locals (JSON format):
atmos describe locals -s dev-us-east-1 --format json{
"locals": {
"env_prefix": "acme-dev",
"full_prefix": "acme-dev-us-east-1",
"namespace": "acme"
},
"terraform": {
"locals": {
"backend_bucket": "acme-dev-tfstate",
"tf_only": "terraform-specific-dev"
}
}
}Terraform component locals:
atmos describe locals vpc -s dev-us-east-1components:
terraform:
vpc:
locals:
backend_bucket: acme-dev-tfstate
env_prefix: acme-dev
full_prefix: acme-dev-us-east-1
namespace: acme
tf_only: terraform-specific-devHelmfile component locals:
atmos describe locals nginx -s prod-us-west-2components:
helmfile:
nginx:
locals:
env_prefix: acme-prod
full_prefix: acme-prod-us-west-2
hf_only: helmfile-specific-prod
namespace: acme
release_name: acme-prod-releaseTest Fixture: locals-component-level
Standalone component with its own locals:
cd tests/fixtures/scenarios/locals-component-level
atmos describe locals standalone -s dev-us-east-1components:
terraform:
standalone:
locals:
backend_bucket: acme-dev-tfstate
computed_ref: acme-dev
environment: dev
name_prefix: acme-dev
namespace: acme
standalone_value: standalone-only
tf_specific: terraform-onlyComponent inheriting from base with locals override (vpc/dev):
atmos describe locals vpc/dev -s dev-us-east-1components:
terraform:
vpc/dev:
locals:
backend_bucket: acme-dev-tfstate
cidr_prefix: "10.0" # inherited from base
environment: dev
extra_tag: dev-only # added in child
name_prefix: acme-dev
namespace: acme
tf_specific: terraform-only
vpc_type: development # overridden from "standard"Component inheriting from base without locals override (vpc/standard):
atmos describe locals vpc/standard -s dev-us-east-1components:
terraform:
vpc/standard:
locals:
backend_bucket: acme-dev-tfstate
cidr_prefix: "10.0" # inherited from base
environment: dev
name_prefix: acme-dev
namespace: acme
tf_specific: terraform-only
vpc_type: standard # inherited from basewhy
- The file-scoped locals feature was announced in v1.203.0 but the implementation was incomplete
ProcessStackLocals()existed but was never called during stack processing- The
.localscontext was not provided to template execution, causing templates to remain unresolved - Users reported that
{{ .locals.* }}templates showed raw template strings instead of resolved values
Technical Changes
- Added
extractLocalsFromRawYAML()- Parses YAML and extracts/resolves locals before template processing - Added
extractAndAddLocalsToContext()- Helper to add resolved locals to template context - Added
LocalsContext.MergeForTemplateContext()- Merges all scope levels into flat map for templates - Added section tracking flags -
HasTerraformLocals,HasHelmfileLocals,HasPackerLocalsto properly handle overrides - Added
atmos describe localscommand - Command to inspect locals for a specific stack with schema-compliant output - Added component-level locals extraction -
ComponentLocalsandBaseComponentLocalsfields in stack processing - Added component locals inheritance - Locals inherit from base components via
metadata.inherits - Direct output format - Output is in stack manifest format that can be used as valid YAML
Test Coverage
| Category | Count |
|---|---|
Unit tests (stack_processor_utils_test.go)
| 16 |
Unit tests (stack_processor_locals_test.go)
| 41 |
Unit tests (describe_locals_test.go)
| 40+ |
Unit tests (cmd/describe_locals_test.go)
| 12 |
Integration tests (cli_locals_test.go)
| 26 |
| Total | 135+ |
Key test areas:
extractLocalsFromRawYAML- 95.8% coverageProcessStackLocals- 100% coverageExtractAndResolveLocals- 100% coverage- Deep import chain tests (4-level: base → layer1 → layer2 → final)
- File-scoped behavior verification (locals NOT inherited across imports)
- Component-level locals with inheritance
- Logical stack name resolution
- Direct output format validation
Test Fixtures
tests/fixtures/scenarios/locals-deep-import-chain/- Tests file-scoped locals across deep import chainstests/fixtures/scenarios/locals-logical-names/- Tests logical stack name resolutiontests/fixtures/scenarios/locals-component-level/- Tests component-level locals with inheritance
Documentation
- CLI docs:
website/docs/cli/commands/describe/describe-locals.mdx - Blog post:
website/blog/2026-01-06-file-scoped-locals-fix.mdx - PRD:
docs/prd/file-scoped-locals.md
references
Summary by CodeRabbit
-
New Features
- Added a CLI command to describe merged locals per stack/component with format, file, and query options.
-
Bug Fixes
- File-scoped locals are now resolved before template processing, don’t leak across imports, and are stripped from final outputs.
-
Documentation
- New blog post and CLI docs explaining locals behavior, examples, and upgrade notes.
-
Tests
- Extensive unit/integration tests and fixtures covering locals resolution, scopes, inheritance, circular deps, and deep-import chains.
-
UX
- Improved CLI validation and clearer error messages (e.g., stack requirement).
✏️ Tip: You can customize this high-level summary in your review settings.