Skip to content

Conversation

osterman
Copy link
Member

@osterman osterman commented Aug 28, 2025

what

  • Implement comprehensive schema validation and documentation system for all Atmos configuration files
  • Add unified deprecation infrastructure with consistent warning messaging
  • Create complete JSON schemas for CLI, Stack, Workflow, and Vendor configurations
  • Provide comprehensive example files showcasing all configuration options
  • Update documentation to include interactive schema viewers and examples
  • Add support for new color terminal setting while maintaining backward compatibility

why

  • Improved Developer Experience: Comprehensive schemas enable IDE autocompletion, validation, and inline documentation
  • Better Documentation: Interactive schema viewers and complete examples help users understand all available options
  • Consistent Deprecation Handling: Unified deprecation warnings provide clear migration paths for deprecated features
  • Future-Proof Configuration: New color field replaces no_color with proper boolean semantics
  • Validation Support: JSON schemas enable validation tools and CI/CD integration
  • Comprehensive Coverage: All configuration types now have complete schema documentation

Implementation Details

Deprecation Infrastructure

  • Created NotifyDeprecatedField utility for consistent deprecation warnings across the codebase
  • Standardized message format: `old.path` is deprecated; use `new.path` instead
  • Updated existing deprecations in cmd/docs.go to use new utility function
  • Backward compatibility maintained for ATMOS_NO_COLOR and deprecated settings

Schema Enhancements

  • CLI Schema (cli.json): Added all missing root-level sections including version, aliases, stores, schemas, templates, integrations, complete settings with terminal, telemetry, pro configurations
  • Stack Schema (stack.json): Added Packer component support with full component lifecycle definitions
  • Workflow Schema (workflow.json): Added retry configuration with exponential backoff support (max_attempts, backoff_strategy, initial_delay, etc.)
  • Vendor Schema: Verified completeness of vendoring manifest schema

Terminal Configuration Updates

  • Added color field to Terminal struct as preferred replacement for no_color
  • Environment variable support for ATMOS_COLOR while maintaining ATMOS_NO_COLOR compatibility
  • Automatic migration logic converts no_color: true to color: false with deprecation warnings

Comprehensive Examples

  • atmos.yaml: 322 lines showcasing all CLI configuration options with inline documentation and deprecation comments
  • stack.yaml: 364 lines demonstrating Terraform, Helmfile, and Packer components with advanced features
  • vendor.yaml: 296 lines showing various source types (GitHub, GitLab, S3, local) and configurations
  • workflow.yaml: 363 lines with retry strategies, complex workflows, and real-world examples

Documentation Integration

  • Interactive Schema Viewers: All schema documentation now includes JSONSchemaViewer components
  • Complete Examples: Added comprehensive example files using <File> component for proper rendering
  • Raw Loader Integration: Uses \!\!raw-loader\! for embedding YAML content in documentation

Technical Changes

Core Files Modified

  • pkg/utils/deprecation.go - New deprecation utility function
  • pkg/schema/schema.go - Added Color field to Terminal struct
  • pkg/config/config.go - Added deprecation handling logic with automatic migration
  • pkg/config/load.go - Added ATMOS_COLOR environment variable binding
  • cmd/docs.go - Updated to use new deprecation function

Schema Files

  • Complete rewrite of website/static/schemas/atmos/1.0/cli.json (727 lines)
  • Enhanced website/static/schemas/atmos/1.0/stack.json with Packer support (822 lines)
  • Updated website/static/schemas/atmos/1.0/workflow.json with retry configuration (88 lines)
  • Verified website/static/schemas/atmos/1.0/vendor.json completeness (102 lines)

Example Files

  • website/static/examples/schemas/atmos.yaml - Comprehensive CLI configuration example
  • website/static/examples/schemas/stack.yaml - Complete stack manifest example
  • website/static/examples/schemas/vendor.yaml - Vendor configuration with multiple source types
  • website/static/examples/schemas/workflow.yaml - Advanced workflow configurations with retry

Documentation Updates

  • website/docs/schemas/cli.mdx - Added interactive schema viewer and complete example
  • website/docs/schemas/stack.mdx - Enhanced with comprehensive stack examples
  • website/docs/schemas/vendor.mdx - Added vendoring examples and documentation
  • website/docs/schemas/workflow.mdx - Added workflow examples with retry configurations

Testing & Validation

  • Build successful - All code compiles without errors
  • Deprecation warnings functional - Tested with deprecated no_color setting
  • Backward compatibility verified - ATMOS_NO_COLOR environment variable still works
  • Schema validation - All JSON schemas are valid and comprehensive
  • Example files tested - All example configurations are syntactically correct

Migration Guide

For users with deprecated settings:

Replace no_color with color

# OLD (deprecated)
settings:
  terminal:
    no_color: true

# NEW (preferred)  
settings:
  terminal:
    color: false

Update docs settings

# OLD (deprecated)
settings:
  docs:
    max-width: 120
    pagination: true

# NEW (preferred)
settings:
  terminal:
    max_width: 120
    pager: true

Breaking Changes

None - all changes maintain backward compatibility with deprecation warnings.

references

  • Closes schema validation and documentation gaps
  • Enhances developer experience with comprehensive examples
  • Implements unified deprecation strategy for future configuration changes
  • Provides foundation for advanced IDE integration and validation tooling

Summary by CodeRabbit

  • New Features

    • Stack naming now uses name_template (Go templates); name_pattern deprecated.
    • Terminal color option added (configurable via ATMOS_COLOR) with automatic migration notices.
    • JSON Schemas for CLI, Stack, Vendor, and Workflow added with interactive examples in docs.
  • Documentation

    • New Schemas section/pages and many docs updated to reflect templates, examples, and improved guidance.
  • Chores

    • CI job added to verify schema checksums.

- Add NotifyDeprecatedField utility function for consistent deprecation warnings
- Update Terminal struct to include Color field alongside deprecated NoColor
- Add deprecation handling logic for no_color and docs settings
- Add ATMOS_COLOR environment variable binding
- Update CLI JSON schema with all missing sections including telemetry, pro, packer, etc.
- Mark deprecated fields in schema with deprecated: true
- Add Packer support to stack.json schema
- Add retry configuration to workflow.json schema
- Create comprehensive example files for all schemas:
  - atmos.yaml with all configuration options and deprecation comments
  - stack.yaml with all component types and advanced features
  - vendor.yaml with various source types and configurations
  - workflow.yaml with retry configurations and complex workflows
- Fix NotifyDeprecatedField to use correct logging function
- Update all schema documentation files to include comprehensive examples
- Test deprecation warnings and backward compatibility
- Verify build and functionality

All phases complete:
✅ Phase 1: Merged main branch and resolved conflicts
✅ Phase 2: Created deprecation infrastructure
✅ Phase 3: Updated schema structures and environment bindings
✅ Phase 4: Updated all JSON schemas (CLI, Stack, Workflow, Vendor)
✅ Phase 5: Created comprehensive example files
✅ Phase 6: Updated documentation with examples
✅ Phase 7: Validated and tested implementation
@osterman osterman requested a review from a team as a code owner August 28, 2025 05:34
@osterman osterman self-assigned this Aug 28, 2025
@github-actions github-actions bot added the size/xl Extra large size PR label Aug 28, 2025
@mergify mergify bot added the triage Needs triage label Aug 28, 2025
Copy link

mergify bot commented Aug 28, 2025

Important

Cloud Posse Engineering Team Review Required

This pull request modifies files that require Cloud Posse's review. Please be patient, and a core maintainer will review your changes.

To expedite this process, reach out to us on Slack in the #pr-reviews channel.

@mergify mergify bot added the needs-cloudposse Needs Cloud Posse assistance label Aug 28, 2025
Copy link

mergify bot commented Aug 28, 2025

Warning

This PR exceeds the recommended limit of 1,000 lines.

Large PRs are difficult to review and may be rejected due to their size.

Please verify that this PR does not address multiple issues.
Consider refactoring it into smaller, more focused PRs to facilitate a smoother review process.

return flags
}

// handleDeprecatedSettings handles deprecated configuration fields and migrates them to new locations

Check failure

Code scanning / golangci-lint

Comment should end in a period Error

Comment should end in a period
Copy link
Contributor

coderabbitai bot commented Aug 28, 2025

📝 Walkthrough

Walkthrough

Renames stack/cluster naming keys from pattern→template across configs/docs/tests; adds Terminal.Color and deprecation migration/notifications; binds ATMOS_COLOR env var; adds JSON Schemas, example manifests, site pages, and CSS; introduces schema checksum CI job; removes root atmos.yaml.

Changes

Cohort / File(s) Summary
CI: Schema checksum verification
.github/workflows/test.yml
New job computes MD5 checksums for Atmos schema files and fails if multiple distinct checksums are found.
Root config removal
atmos.yaml
Deleted file body (root atmos.yaml removed).
Config migration & env binding
pkg/config/config.go, pkg/config/load.go
Add handleDeprecatedSettings called in InitCliConfig to migrate deprecated fields (no_color→color, docs.max-width→terminal.max_width, docs.pagination→terminal.pager) and bind ATMOS_COLOR env var.
Deprecation helper & usage
pkg/utils/deprecation.go, cmd/docs.go
New NotifyDeprecatedField(old,new) function; docs command now uses it instead of direct log.Warn calls.
Schema / structs
pkg/schema/schema.go
Add Terminal.Color (*bool); update struct tags for cluster_name_template / name_template.
Name pattern → template (core + pkg manifests)
pkg/*/atmos.yaml, internal/*, errors/errors.go, internal/exec/*, internal/exec/utils.go, internal/exec/spacelift_utils.go, pkg/spacelift/*, pkg/vender/*, pkg/*
Rename keys cluster_name_pattern → cluster_name_template and stacks.name_pattern → stacks.name_template; update related env var docs in many pkg manifests and adjust error/help messages and callers to reference the new keys. Mostly string/tag/docs changes.
Examples & fixtures
examples/**/atmos.yaml, examples/**/component.yaml, tests/fixtures/**/atmos.yaml, tests/fixtures/**/stack.yml, tests/snapshots/*
Bulk rename name_pattern→name_template in examples and test fixtures; reorganize some example commands (e.g., localstack, atlantis); update test snapshots.
Docs: CLI, concepts, stacks, workflows, vendor
`website/docs/**/*.(mdx
md)`
Docs: JSON Schema pages & site integration
website/docs/schemas/*.mdx, website/sidebars.js, website/docusaurus.config.js, website/package.json, website/src/css/custom.css
Add schema MDX pages (CLI, Stack, Vendor, Workflow), register docusaurus-json-schema-plugin, add sidebar Schemas category, CSS tweaks including details.json-schema-viewer rule, and add dependency.
Website static schemas & examples
website/static/schemas/atmos/1.0/*.json, website/static/examples/schemas/*
Add CLI/Stack/Vendor/Workflow JSON Schemas and large example YAML manifests (atmos, stack, vendor, workflow).
Docs: command help / UI strings
cmd/aws_eks_update_kubeconfig.go, demo/screengrabs/scripts/*, pkg/aws/*_test.go, pkg/config/config_test.go, various website components
Update help text, screengrab samples, tests and docs to reference cluster_name_template / name_template.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant CLI as atmos CLI
  participant Loader as Config Loader
  participant Migrator as handleDeprecatedSettings
  participant Utils as NotifyDeprecatedField
  participant App as App runtime

  User->>CLI: run command
  CLI->>Loader: InitCliConfig()
  Loader->>Loader: load config (viper/unmarshal)
  Loader->>Migrator: handleDeprecatedSettings(&cfg)
  Migrator->>Utils: NotifyDeprecatedField(old,new)*
  note right of Utils #dfe7ff: logs deprecation warnings
  Migrator-->>Loader: mutated cfg
  Loader->>App: checkConfig(cfg) and continue startup
  App-->>User: execute command using migrated cfg
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch schema-page

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbit in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbit in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbit gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbit read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbit help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbit ignore or @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbit summary or @auto-summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbit or @auto-title anywhere in the PR title to generate the title automatically.

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 30

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (11)
website/docs/schemas/schemas.mdx (1)

13-14: Update Atmos schema links to new static locations and names
Replace all references to /schemas/atmos/atmos-manifest/1.0/atmos-manifest.json with /schemas/atmos/1.0/stack.json and change link text from “Atmos Manifest JSON Schema” to “Atmos Stack JSON Schema” (occurrences in docs/schemas/schemas.mdx at lines 13, 32, 37, 38, 49, 58, 59).

website/docs/cli/configuration/configuration.mdx (3)

264-276: Document new terminal.color and deprecate no_color in this section.

Per PR objectives, we introduced settings.terminal.color (with ATMOS_COLOR) and deprecated no_color. Please add it here.

Apply:

   <dt>`settings.terminal`</dt>
   <dd>
     Specifies how content is displayed in the terminal.
 
     The following settings are supported:
     <dl>
+      <dt>`color`</dt>
+      <dd>Controls ANSI color output. Allowed values: <code>auto</code> (default), <code>on</code>, <code>off</code>. Can also be set via <code>ATMOS_COLOR</code> or <code>--color</code>. <em>Deprecated</em>: <code>settings.terminal.no_color</code>, <code>ATMOS_NO_COLOR</code>, and <code>NO_COLOR</code> are still honored but emit deprecation warnings.</dd>
       <dt>`max_width`</dt>
       <dd>The maximum width for displaying content in the terminal.</dd>
 
       <dt>`pager`</dt>
       <dd>When enabled, displays long content in a pager instead of directly in the terminal.</dd>
     </dl>
   </dd>

I can also update the default config snippet to show color: auto and move no_color under a deprecated note.


769-805: Duplicate environment-variables table; remove this copy and add ATMOS_COLOR to the primary table.

This second table repeats the same content and will confuse readers. Also add ATMOS_COLOR and fix the apply_auto_approve description in the main table.

Apply (remove the duplicate block):

- | Variable                                              | YAML Path                                       | Description                                                                                                                                                                                                                  |
- | :---------------------------------------------------- | :---------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | ATMOS_CLI_CONFIG_PATH                                 | N/A                                             | Where to find `atmos.yaml`. Path to a folder where `atmos.yaml` CLI config file is located (e.g. `/config`)                                                                                                                  |
- | ATMOS_BASE_PATH                                       | base_path                                       | Base path to `components` and `stacks` folders                                                                                                                                                                               |
- | ATMOS_VENDOR_BASE_PATH                                | vendor.base_path                                | Path to vendor configuration file or directory containing vendor files. If a directory is specified, all .yaml files in the directory will be processed in lexicographical order. Supports both absolute and relative paths. |
- | ATMOS_COMPONENTS_TERRAFORM_COMMAND                    | components.terraform.command                    | The executable to be called by Atmos when running Terraform commands                                                                                                                                                       |
- | ATMOS_COMPONENTS_TERRAFORM_BASE_PATH                  | components.terraform.base_path                  | Base path to Terraform components                                                                                                                                                                                            |
- | ATMOS_COMPONENTS_TERRAFORM_APPLY_AUTO_APPROVE         | components.terraform.apply_auto_approve         | If set to `true`, auto-generate Terraform backend config files when executing `atmos terraform` commands                                                                                                                     |
- | ATMOS_COMPONENTS_TERRAFORM_DEPLOY_RUN_INIT            | components.terraform.deploy_run_init            | Run `terraform init` when executing `atmos terraform deploy` command                                                                                                                                                         |
- | ATMOS_COMPONENTS_TERRAFORM_INIT_RUN_RECONFIGURE       | components.terraform.init_run_reconfigure       | Run `terraform init -reconfigure` when executing `atmos terraform` commands                                                                                                                                                  |
- | ATMOS_COMPONENTS_TERRAFORM_INIT_PASS_VARS             | components.terraform.init.pass_vars             | Pass the generated varfile to `terraform init` using the `--var-file` flag. [OpenTofu supports passing a varfile to `init`](https://opentofu.org/docs/cli/commands/init/#general-options) to dynamically configure backends  |
- | ATMOS_COMPONENTS_TERRAFORM_AUTO_GENERATE_BACKEND_FILE | components.terraform.auto_generate_backend_file | If set to `true`, auto-generate Terraform backend config files when executing `atmos terraform` commands                                                                                                                     |
- | ATMOS_COMPONENTS_HELMFILE_COMMAND                     | components.helmfile.command                     | The executable to be called by Atmos when running Helmfile commands                                                                                                                                                        |
- | ATMOS_COMPONENTS_HELMFILE_BASE_PATH                   | components.helmfile.base_path                   | Path to helmfile components                                                                                                                                                                                                  |
- | ATMOS_COMPONENTS_HELMFILE_USE_EKS                     | components.helmfile.use_eks                     | If set to `true`, download `kubeconfig` from EKS by running `aws eks update-kubeconfig` command before executing `atmos helmfile` commands                                                                                   |
- | ATMOS_COMPONENTS_HELMFILE_KUBECONFIG_PATH             | components.helmfile.kubeconfig_path             | Path to write the `kubeconfig` file when executing `aws eks update-kubeconfig` command                                                                                                                                       |
- | ATMOS_COMPONENTS_HELMFILE_HELM_AWS_PROFILE_PATTERN    | components.helmfile.helm_aws_profile_pattern    | Pattern for AWS profile to use when executing `atmos helmfile` commands                                                                                                                                                      |
- | ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN        | components.helmfile.cluster_name_pattern        | Pattern for EKS cluster name to use when executing `atmos helmfile` commands                                                                                                                                                 |
- | ATMOS_COMPONENTS_PACKER_COMMAND                       | components.packer.command                       | The executable to be called by Atmos when running Packer commands                                                                                                                                                        |
- | ATMOS_COMPONENTS_PACKER_BASE_PATH                     | components.packer.base_path                     | Path to Packer components                                                                                                                                                                                                  |
- | ATMOS_STACKS_BASE_PATH                                | stacks.base_path                                | Base path to Atmos stack manifests                                                                                                                                                                                           |
- | ATMOS_STACKS_INCLUDED_PATHS                           | stacks.included_paths                           | List of paths to use as top-level stack manifests                                                                                                                                                                            |
- | ATMOS_STACKS_EXCLUDED_PATHS                           | stacks.excluded_paths                           | List of paths to not consider as top-level stacks                                                                                                                                                                            |
- | ATMOS_STACKS_NAME_PATTERN                             | stacks.name_pattern                             | Stack name pattern to use as Atmos stack names                                                                                                                                                                               |
- | ATMOS_STACKS_NAME_TEMPLATE                            | stacks.name_template                            | Stack name Golang template to use as Atmos stack names                                                                                                                                                                       |
- | ATMOS_WORKFLOWS_BASE_PATH                             | workflows.base_path                             | Base path to Atmos workflows                                                                                                                                                                                                 |
- | ATMOS_SCHEMAS_JSONSCHEMA_BASE_PATH                    | schemas.jsonschema.base_path                    | Base path to JSON schemas for component validation                                                                                                                                                                           |
- | ATMOS_SCHEMAS_OPA_BASE_PATH                           | schemas.opa.base_path                           | Base path to OPA policies for component validation                                                                                                                                                                           |
- | ATMOS_SCHEMAS_ATMOS_MANIFEST                          | schemas.atmos.manifest                          | Path to JSON Schema to validate Atmos stack manifests. For more details, refer to [Atmos Manifest JSON Schema](/cli/schemas)                                                                                                 |
- | ATMOS_LOGS_FILE                                       | logs.file                                       | The file to write Atmos logs to. Logs can be written to any file or any standard file descriptor, including `/dev/stdout`, `/dev/stderr` and `/dev/null`). If omitted, `/dev/stdout` will be used                            |
- | ATMOS_LOGS_LEVEL                                      | logs.level                                      | Logs level. Supported log levels are `Trace`, `Debug`, `Info`, `Warning`, `Off`. If the log level is set to `Off`, Atmos will not log any messages (note that this does not prevent other tools like Terraform from logging) |
- | ATMOS_SETTINGS_LIST_MERGE_STRATEGY                    | settings.list_merge_strategy                    | Specifies how lists are merged in Atmos stack manifests. The following strategies are supported: `replace`, `append`, `merge`                                                                                                |
- | ATMOS_VERSION_CHECK_ENABLED                           | version.check.enabled                           | Enable/disable Atmos version checks for updates to the newest release                                                                                                                                                        |
- | ATMOS_GITHUB_TOKEN                                    | N/A                                             | Bearer token for GitHub API requests, enabling authentication for private repositories and higher rate limits                                                                                                                |
- | ATMOS_BITBUCKET_TOKEN                                 | N/A                                             | App password for Bitbucket API requests is set to avoid rate limits. Unauthenticated Requests are limited to 60 requests per hour across all API resources.                                                                  |
- | ATMOS_BITBUCKET_USERNAME                              | N/A                                             | Username for Bitbucket authentication. Takes precedence over BITBUCKET_USERNAME.                                                                                                                                             |
- | ATMOS_GITLAB_TOKEN                                    | N/A                                             | Personal Access Token (PAT) for GitLab authentication. Unauthenticated users are limited to 6 requests per minute per IP address for certain endpoints, while authenticated users have higher thresholds.                    |

Then, in the primary table above (lines 732–768), please:

  • Add a row:
| ATMOS_COLOR | settings.terminal.color | Controls ANSI color output. Allowed: `auto`, `on`, `off`. Deprecated: `ATMOS_NO_COLOR` / `NO_COLOR`; see migration notes. |
  • Fix description for ATMOS_COMPONENTS_TERRAFORM_APPLY_AUTO_APPROVE to: “If set to true, pass -auto-approve to apply operations.”

I can push a patch updating both the table and the default config snippet.


121-126: Default config still shows no_color; add color and mark no_color deprecated.

Align the example with the new setting and deprecation policy.

 settings:
   terminal:
-    no_color: false # Disable color output (Can also be set using 'ATMOS_NO_COLOR' or 'NO_COLOR' ENV var or '--no-color' command-line argument)
+    color: auto     # Controls color output: auto|on|off (also via 'ATMOS_COLOR' or '--color')
+    # no_color: false # Deprecated; still supported for backward compatibility ('ATMOS_NO_COLOR' / 'NO_COLOR' / '--no-color')
     max_width: 120  # Maximum width for terminal output
     pager: true     # Use pager for long output

Happy to update related mentions throughout the page.

examples/demo-atlantis/atmos.yaml (2)

91-101: Atlantis workflow uses atmos terraform instead of terraform; likely breaks Atlantis runner.

Atlantis executes Terraform directly. Recommend reverting to terraform and add workspace fallback to avoid failures on first run.

-            - run: atmos terraform init -input=false
+            - run: terraform init -input=false
-            - run: atmos terraform workspace select $WORKSPACE
+            - run: terraform workspace select $WORKSPACE || terraform workspace new $WORKSPACE

79-86: apply_requirements is nested under autoplan; should be a sibling per Atlantis schema.

Current structure will be ignored/misparsed.

         autoplan:
           enabled: true
           when_modified:
             - "**/*.tf"
             - "varfiles/$PROJECT_NAME.tfvars"
-          apply_requirements:
-            - "approved"
+        apply_requirements:
+          - "approved"
website/docs/core-concepts/vendor/vendor-manifest.mdx (2)

197-201: Fix YAML quoting in env token example (currently invalid).

Double quotes inside a double-quoted YAML string must be escaped. Use single quotes around the whole string or escape the inner quotes.

Apply one of:

-    source: "git::https://{{env "GITHUB_TOKEN"}}@github.com/some-org/some-private-repo/terraform/vpc.git?ref={{.Version}}"
+    source: 'git::https://{{env "GITHUB_TOKEN"}}@github.com/some-org/some-private-repo/terraform/vpc.git?ref={{.Version}}'

or

-    source: "git::https://{{env "GITHUB_TOKEN"}}@github.com/some-org/some-private-repo/terraform/vpc.git?ref={{.Version}}"
+    source: "git::https://{{env \"GITHUB_TOKEN\"}}@github.com/some-org/some-private-repo/terraform/vpc.git?ref={{.Version}}"

229-230: CLI flag typo.

Use --component (no space) to match the actual flag name. You already use -c elsewhere.

-  The `component` attribute in each source is optional. It's used in the `atmos vendor pull -- component <component>` command if the component is passed in. In this case, Atmos will vendor only the specified component instead of vendoring all the artifacts configured in the `vendor.yaml` manifest.
+  The `component` attribute in each source is optional. It's used in the `atmos vendor pull --component <component>` command if the component is passed in. In this case, Atmos will vendor only the specified component instead of vendoring all the artifacts configured in the `vendor.yaml` manifest.
pkg/config/load.go (1)

231-249: Avoid direct os.Getenv for ATMOS_CLI_CONFIG_PATH (use Viper)

Matches our guideline and past learning. Bind and read via viper.

-func readEnvAmosConfigPath(v *viper.Viper) error {
-	atmosPath := os.Getenv("ATMOS_CLI_CONFIG_PATH")
+func readEnvAmosConfigPath(v *viper.Viper) error {
+	atmosPath := v.GetString("cli.config_path")
 	if atmosPath == "" {
 		return nil
 	}
 	err := mergeConfig(v, atmosPath, CliConfigFileName, true)
 	if err != nil {
 		switch err.(type) {
 		case viper.ConfigFileNotFoundError:
-			log.Debug("config not found ENV var ATMOS_CLI_CONFIG_PATH", "file", atmosPath)
+			log.Debug("config not found ENV var ATMOS_CLI_CONFIG_PATH", "file", atmosPath)
 			return nil
 		default:
 			return err
 		}
 	}
 	log.Debug("Found config ENV", "ATMOS_CLI_CONFIG_PATH", atmosPath)
 
 	return nil
 }

Add this binding in setEnv (outside this range):

bindEnv(v, "cli.config_path", "ATMOS_CLI_CONFIG_PATH")

I can open a follow-up PR to apply this across other os.Getenv uses.

pkg/schema/schema.go (1)

203-211: Add omitempty to Color tags and implement ResolveColor

Color pointer currently emits null without omitempty—update pkg/schema/schema.go (lines 208–209):

-    NoColor bool  `yaml:"no_color" json:"no_color" mapstructure:"no_color"`
-    Color   *bool `yaml:"color"     json:"color"     mapstructure:"color"`
+    NoColor bool  `yaml:"no_color"        json:"no_color"        mapstructure:"no_color"`
+    Color   *bool `yaml:"color,omitempty" json:"color,omitempty" mapstructure:"color"`

Add outside this block:

// ResolveColor decides final color setting with precedence: Color > NoColor > default(true).
func (t Terminal) ResolveColor() bool {
    if t.Color != nil {
        return *t.Color
    }
    if t.NoColor {
        return false
    }
    return true
}

Ensure all consumers use ResolveColor() for consistent behavior.

pkg/config/config.go (1)

73-87: Rename flagKeyValue to flags and add --color support

  • Change flagKeyValue := parseFlags()flags := parseFlags() and use if v, ok := flags[...] to avoid shadowing.
  • Add handling for a new --color flag:
    if v, ok := flags["color"]; ok {
      c := v != "false"
      atmosConfig.Settings.Terminal.Color = &c
    }
  • Wire the ATMOS_COLOR env var (with precedence flags > env > config > defaults) for full consistency.
♻️ Duplicate comments (1)
pkg/utils/deprecation.go (1)

9-9: Doc comment should end with a period.

Matches golangci-lint “comment should end in a period.”

Apply:

-// NotifyDeprecatedField logs a deprecation warning for a configuration field
+// NotifyDeprecatedField logs a deprecation warning for a configuration field.
🧹 Nitpick comments (43)
website/package.json (1)

33-34: Pin docusaurus-json-schema-plugin to an exact version

Plugin wiring confirmed in website/docusaurus.config.js (themes: […, 'docusaurus-json-schema-plugin']) and docs use <JSONSchemaViewer>. To reduce build drift, lock the version in package.json:

-    "docusaurus-json-schema-plugin": "^1.12.2",
+    "docusaurus-json-schema-plugin": "1.12.2",
website/docs/cli/configuration/configuration.mdx (3)

283-289: Deprecation note: link to the replacement.

Add a forward link to the new settings.terminal.color to guide readers.

-    <Admonition type="warning" title="Deprecated">
-      The `settings.docs` section is deprecated and will be removed in a future version. Please use `settings.terminal` instead.
-    </Admonition>
+    <Admonition type="warning" title="Deprecated">
+      The <code>settings.docs</code> section is deprecated and will be removed in a future version. Use <code>settings.terminal</code>, including <code>settings.terminal.color</code>, instead.
+    </Admonition>

810-812: Tighten grammar for clarity.

- (in the case of `atmos terraform shell`, the Terraform or Tofu CLI) natively, while still being configured for a
- specific component and stack. To accomplish this, and to provide visibility and context to the user regarding the
- configuration, Atmos may set the following environment variables in the spawned shell:
+ (for `atmos terraform shell`, the Terraform or Tofu CLI) natively while configured for a specific component and stack.
+ To provide visibility and context, Atmos sets the following environment variables in the spawned shell:

49-52: Admonition syntax is fine; keep title style consistent.

We use title-cased tip titles elsewhere; “Pro-Tip” is fine if we stick to it repo-wide.

examples/demo-component-versions/atmos.yaml (1)

25-28: Commands block: fine; consider adding a success check.

If this is shown in docs, a simple guard helps.

   - name: "test"
     description: "Run all tests"
     steps:
-      - atmos vendor pull --everything
+      - atmos vendor pull --everything || { echo "vendor pull failed"; exit 1; }

If you prefer cross-platform portability, I can rewrite this using an Atmos workflow.

.github/workflows/test.yml (2)

583-586: Harden checksum collection (spaces/newlines safe, early exit on errors)

Use NUL-delimited paths and fail fast; avoids edge cases with filenames.

Apply:

-      - name: Compute checksums of Atmos schema files
-        run: |
-          git ls-files '*/atmos-manifest.json' 'website/static/schemas/atmos/1.0/stack.json' | sort | xargs md5sum > checksums.txt
-          cat checksums.txt
+      - name: Compute checksums of Atmos schema files
+        shell: bash
+        run: |
+          set -euo pipefail
+          git ls-files -z '*/atmos-manifest.json' 'website/static/schemas/atmos/1.0/stack.json' \
+            | sort -z \
+            | xargs -0 -I{} md5sum "{}" > checksums.txt
+          cat checksums.txt

587-595: Add explicit check for “no files found” to produce clearer failures

Currently this fails indirectly; make it obvious.

-      - name: Verify all schema checksums are identical
-        run: |
-          if [ "$(cut -d ' ' -f1 < checksums.txt | sort -u | wc -l)" -ne 1 ]; then
+      - name: Verify all schema checksums are identical
+        shell: bash
+        run: |
+          set -euo pipefail
+          if [ ! -s checksums.txt ]; then
+            echo "❌ No schema files matched; nothing to verify."
+            exit 1
+          fi
+          if [ "$(cut -d ' ' -f1 < checksums.txt | sort -u | wc -l)" -ne 1 ]; then
             echo "❌ Atmos schema checksum mismatch detected!"
             cat checksums.txt
             exit 1
           fi
           echo "✅ All Atmos schema files have matching checksums."
examples/demo-helmfile/atmos.yaml (1)

86-93: Consider removing .terraform dirs in reset

Commonly useful in demos to fully clean local state.

       - name: "reset"
         description: Delete all local state files
         steps:
-          - find . -type f -name "*.tfstate" -delete
-          - echo "Deleted all state files"
+          - find . -type f -name "*.tfstate" -delete
+          - find . -type d -name ".terraform" -prune -exec rm -rf {} +
+          - echo "Deleted all Terraform state and .terraform directories"
pkg/spacelift/atmos.yaml (1)

213-213: Unify comment style for booleans.

Drop backticks around true for consistency across examples.

-    verbose: false # Set to `true` to see verbose outputs
+    verbose: false # Set to true to see verbose output
pkg/vender/atmos.yaml (1)

213-213: Tighten the verbose comment.

Use plain true; also minor grammar.

-    verbose: false # Set to `true` to see verbose outputs
+    verbose: false # Set to true to see verbose output
pkg/validate/atmos.yaml (1)

182-182: Inline boolean comment style.

Align with plain-text boolean and singular noun.

-    verbose: false # Set to `true` to see verbose outputs
+    verbose: false # Set to true to see verbose output
website/static/schemas/atmos/1.0/vendor.json (1)

1-9: Add $id for resolvable schema URL.

Improves tooling, caching, and cross-ref from docs.

 {
     "$schema": "https://json-schema.org/draft/2020-12/schema",
+    "$id": "https://atmos.tools/schemas/atmos/1.0/vendor.json",
     "title": "Atmos Vendor Config",
     "description": "Schema for Atmos vendoring manifest",
     "fileMatch": [
website/src/css/custom.css (2)

7-10: Deduplicate .navbar__title font-size rule.

Two identical blocks; keep one to reduce specificity noise.

Apply (remove the second block):

-.navbar__title {
-  font-size: 2em;
-}

Also applies to: 32-34


275-287: Normalize dark-theme selectors.

You mix html[data-theme="dark"] and [data-theme="dark"]. Prefer one form for consistent specificity (suggest: [data-theme="dark"] …).

Example:

-html[data-theme="dark"] {
+[data-theme="dark"] {
   --docsearch-searchbox-background: #121526 !important;
 }

Also applies to: 289-291

pkg/workflow/atmos.yaml (1)

57-58: Good migration to stacks.name_template; align Go-template spacing for consistency.

Functionally fine. Recommend adding spaces inside delimiters for consistency with other samples.

-  name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
+  name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
examples/demo-atlantis/atmos.yaml (1)

30-46: Nit: duplicate “Generating varfiles...” message; second should mention backends.

Avoid confusing logs.

-          - echo "Generating varfiles..."
+          - echo "Generating backends..."
pkg/component/atmos.yaml (1)

62-63: Good rename; standardize template spacing.

Functional OK; prefer spaced delimiters for readability.

-  name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
+  name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
pkg/generate/atmos.yaml (1)

57-58: Good rename; standardize template spacing.

Same nit as elsewhere.

-  name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
+  name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
pkg/aws/atmos.yaml (1)

57-58: Good rename; standardize template spacing.

Align with other samples.

-  name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
+  name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
website/docs/core-concepts/vendor/vendor-manifest.mdx (1)

157-165: Add note about --everything TTY behavior (non-interactive).

Per prior learnings, “atmos vendor pull --everything” uses TTY for TUI but is not interactive. Add a one-liner to prevent confusion.

 # atmos vendor pull --everything
+# (Runs with a TTY for TUI output but is non-interactive.)

Used retrieved learnings from PR #768.

website/static/schemas/atmos/1.0/workflow.json (1)

20-23: Tighten validation: require at least one step and forbid unknown root keys.

Steps should not be empty; root already disallows additional props (good). Add minItems for clarity.

       "steps": {
         "type": "array",
         "description": "The list of steps to execute in the workflow.",
+        "minItems": 1,
         "items": {
   },
-  "required": ["steps"]
+  "required": ["steps"]

Also applies to: 83-88

examples/demo-vendoring/atmos.yaml (2)

37-41: Good illustrative command; add brief note on TTY behavior (non-interactive).

This mirrors the vendor docs; consider adding the same clarifier comment to avoid confusion.

   steps:
-      - atmos vendor pull --everything
+      - atmos vendor pull --everything # uses TTY for TUI, non-interactive

1-41: Optional: showcase new terminal.color setting in examples.

Since the PR introduces color (and deprecates no_color), adding it here helps adoption.

 logs:
   file: "/dev/stderr"
   level: Info
+
+terminal:
+  color: auto  # valid: on|off|auto; honors ATMOS_COLOR
website/static/examples/schemas/vendor.yaml (2)

215-224: Private repo example should show authenticated go-getter form.

Demonstrate git:: and token via env to prevent copy/paste confusion.

-    - component: private-module
-      source: github.com/mycompany-private/terraform-modules.git//vpc
+    - component: private-module
+      source: 'git::https://{{env "GITHUB_TOKEN"}}@github.com/mycompany-private/terraform-modules.git//vpc?ref={{.Version}}'
       version: v1.0.0
       targets:
         - components/terraform/private/vpc

296-296: Add trailing newline.

Satisfy linters and POSIX tools.

-        - examples
\ No newline at end of file
+        - examples
+
examples/demo-localstack/atmos.yaml (2)

72-78: Consider a short wait after reset

Optional: add a health check or brief sleep after bringing services back up to avoid races for immediate follow-up commands.


90-97: LGTM: terraform reset

Simple and clear. Consider also removing .terraform/ dirs if desired, but that’s optional.

website/static/schemas/atmos/1.0/stack.json (1)

2-4: Set a canonical $id matching the published path

Current $id points to schemastore. Use your hosted URL for stability/versioning.

-  "$id": "https://json.schemastore.org/atmos-manifest.json",
+  "$id": "https://atmos.tools/schemas/atmos/1.0/stack.json",
pkg/utils/deprecation.go (1)

3-7: Decouple logging to ease testing and future swaps.

Consider accepting a Logger interface (or exposing a package-level Logger var) to avoid hard-coding charmbracelet/log in utils and to simplify unit tests.

website/static/examples/schemas/stack.yaml (3)

10-13: Align example context with declared vars to avoid confusion.

vars.environment is set to ue1, but the import context sets environment: dev. Suggest using ue1 here (or rename to stage where appropriate) so examples are internally consistent.

-  - path: "orgs/{{ .vars.tenant }}/{{ .vars.environment }}"
+  - path: "orgs/{{ .vars.tenant }}/{{ .vars.environment }}"
     context:
       tenant: acme
-      environment: dev
+      environment: ue1

24-24: Trim trailing whitespace.

YAMLlint flags trailing spaces on many lines; please strip them to keep linters green.

Run: yamllint -s website/static/examples/schemas/stack.yaml


364-364: Add newline at EOF.

POSIX style and yamllint require a trailing newline.

-        command: atmos validate stacks
+        command: atmos validate stacks
+
website/static/schemas/atmos/1.0/cli.json (2)

468-476: Deprecation copy is clear; consider adding default semantics for color.

Schema says “default: true” in description but not via a default field. Add "default": true if that’s the intended behavior.

-              "color": {
-                "type": "boolean",
-                "description": "Enable colored output (default: true)"
-              },
+              "color": {
+                "type": "boolean",
+                "description": "Enable colored output.",
+                "default": true
+              },

516-531: Match deprecation labels to codebase paths.

Use docs.max-width and docs.pagination to match the actual legacy keys used in Go code and examples.

-          "docs": {
+          "docs": {
             "type": "object",
-            "description": "DEPRECATED: Documentation settings (moved to settings.terminal)",
+            "description": "DEPRECATED: Documentation settings (moved to settings.terminal).",
             "deprecated": true,
             "properties": {
-              "max-width": {
+              "max-width": {
                 "type": "integer",
-                "description": "DEPRECATED: Use 'settings.terminal.max_width' instead",
+                "description": "DEPRECATED: Use 'settings.terminal.max_width' instead.",
                 "deprecated": true
               },
               "pagination": {
                 "type": "boolean",
-                "description": "DEPRECATED: Use 'settings.terminal.pager' instead",
+                "description": "DEPRECATED: Use 'settings.terminal.pager' instead.",
                 "deprecated": true
               }
             }
           },
website/static/examples/schemas/atmos.yaml (2)

9-10: Vendor base_path should be a directory, not a file.

Using a file path here is confusing given the comment; point to a directory.

 vendor:
-  base_path: "./vendor.yaml"  # Can be a single file or directory
+  base_path: "./vendor"       # Can be a single file or directory

130-139: Update static example to use the canonical hosted schema URL
Replace the local manifest path with the remote URL to prevent path drift.

website/static/examples/schemas/atmos.yaml (lines 136–139)

   atmos:
-    manifest: "stacks/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json"
-    # Or use remote schema:
-    # manifest: "https://atmos.tools/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json"
+    # Use the canonical hosted schema URL:
+    manifest: "https://atmos.tools/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json"
website/static/examples/schemas/workflow.yaml (3)

17-21: Avoid redundant per-step stack when top-level stack is set.

You set stack: prod at the workflow level; omit per-step stack unless you need overrides. Repeat for other steps in this workflow.

     - name: deploy-vpc
       command: terraform apply vpc
-      stack: prod
       type: terraform

167-171: Same redundancy across steps.

Remove duplicate stack: prod on these steps as well unless differing from the top-level value.

Also applies to: 172-176, 177-181, 182-186


313-316: ELB vs ELBv2 API.

aws elb is Classic; most prod stacks use elbv2. Verify which API you want to exemplify.

-      command: "aws elb deregister-instances-from-load-balancer --load-balancer-name prod-lb --instances $(kubectl get nodes -o jsonpath='{.items[*].spec.providerID}' | sed 's/aws:\/\/\/.*\///g')"
+      command: "aws elbv2 deregister-targets --target-group-arn arn:aws:elasticloadbalancing:... --targets Id=$(kubectl get nodes -o jsonpath='{.items[*].spec.providerID}' | sed 's/aws:\/\/\/.*\///g')"
website/docs/core-concepts/stacks/stacks.mdx (4)

19-21: Tighten language and fix capitalization.

“Blueprints” should be singular; simplify the next sentence to active voice.

-Stacks define the complete configuration of an environment. Think of Stacks like an architectural "Blueprints" composed of one or more [Components](/core-concepts/components) configurations and defined using a [standardized YAML configuration](#schema).
+Stacks define the complete configuration of an environment. Think of Stacks like an architectural “blueprint” composed of one or more [Components](/core-concepts/components) and defined using a [standardized YAML configuration](#schema).
-Then by running the `atmos` command, you can automate and orchestrate the deployment of loosely coupled [components](/core-concepts/components), such as Terraform "root" modules. By doing this, it enables scalable infrastructure-as-code configurations, allowing environments to inherit from one or more common bases (child stacks) by importing configuration that gets deep-merged, thus minimizing config duplication and manual effort.
+Running the `atmos` command orchestrates deployment of loosely coupled [components](/core-concepts/components) (e.g., Terraform “root” modules). This enables scalable infrastructure-as-code where environments inherit from one or more bases by importing configuration that gets deep‑merged, minimizing duplication.

52-67: Clarify deprecation wording and fix phrasing.

Replace “optionated interpolations” and make the deprecation guidance crisp.

-  It **only** supports the following optionated interpolations, and therefore is not recommended. Use `name_template` instead.
+  It supports only the following limited interpolations and is therefore not recommended. Use `name_template` instead.
-  :::important Deprecated
-  The `name_pattern` is deprecated and will be removed in a future release. Please use `name_template` instead.
-  :::
+  :::important Deprecated
+  `stacks.name_pattern` is deprecated and will be removed in a future release. Migrate to `stacks.name_template`.
+  :::

Also applies to: 68-93


221-226: Clarify comments in the components example.

Minor copy tweak for concision.

-    sometool: # "sometool" can be any tool (typically "terraform" or "helmfile")
-      somecomponent: # "somecomponent" is the name of any component managed by that tool
+    sometool: # Any tool, typically "terraform" or "helmfile"
+      somecomponent: # Component name managed by that tool

169-176: Active voice and punctuation in the File example lead-in.

Smooth the prose.

-# Top-level environment variables are inherited by every single component.
+# Top-level environment variables are inherited by every component.

Comment on lines 47 to 50
if maxWidth == 0 && atmosConfig.Settings.Docs.MaxWidth > 0 {
maxWidth = atmosConfig.Settings.Docs.MaxWidth
log.Warn("'settings.docs.max-width' is deprecated and will be removed in a future version. Please use 'settings.terminal.max_width' instead")
u.NotifyDeprecatedField("settings.docs.max-width", "settings.terminal.max_width")
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Fix field path and deprecation label; add lint suppression.

Docs live at atmosConfig.Docs, not atmosConfig.Settings.Docs. Also, the deprecated key is docs.max-width (not settings.docs.max-width). Add a targeted SA1019 suppression since this is an intentional migration fallback.

- if maxWidth == 0 && atmosConfig.Settings.Docs.MaxWidth > 0 {
-   maxWidth = atmosConfig.Settings.Docs.MaxWidth
-   u.NotifyDeprecatedField("settings.docs.max-width", "settings.terminal.max_width")
- }
+ //nolint:staticcheck // SA1019: intentional fallback for deprecated docs.max-width during migration.
+ if maxWidth == 0 && atmosConfig.Docs.MaxWidth > 0 {
+   maxWidth = atmosConfig.Docs.MaxWidth
+   u.NotifyDeprecatedField("docs.max-width", "settings.terminal.max_width")
+ }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if maxWidth == 0 && atmosConfig.Settings.Docs.MaxWidth > 0 {
maxWidth = atmosConfig.Settings.Docs.MaxWidth
log.Warn("'settings.docs.max-width' is deprecated and will be removed in a future version. Please use 'settings.terminal.max_width' instead")
u.NotifyDeprecatedField("settings.docs.max-width", "settings.terminal.max_width")
}
//nolint:staticcheck // SA1019: intentional fallback for deprecated docs.max-width during migration.
if maxWidth == 0 && atmosConfig.Docs.MaxWidth > 0 {
maxWidth = atmosConfig.Docs.MaxWidth
u.NotifyDeprecatedField("docs.max-width", "settings.terminal.max_width")
}
🤖 Prompt for AI Agents
In cmd/docs.go around lines 47 to 50 update the fallback to read from
atmosConfig.Docs instead of atmosConfig.Settings.Docs, change the deprecated key
passed to u.NotifyDeprecatedField from "settings.docs.max-width" to
"docs.max-width" (keep the replacement "settings.terminal.max_width"), and add a
targeted linter suppression for SA1019 on this intentional fallback (e.g. a
//nolint:SA1019 comment) so the migration fallback compiles without lint noise.

excluded_paths:
- "**/_defaults.yaml"
name_pattern: "{stage}"
name_template: "{{ .vars.stage }}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Confirm consumers have migrated to stacks.name_template.

Rename looks good. Please verify all examples/docs no longer reference name_pattern.


🏁 Script executed:

#!/bin/bash
# Find lingering references across repo
rg -n --glob '!.git' -C2 '\bname_pattern\b'

Length of output: 49320


Replace all lingering name_pattern references with name_template

  • examples/demo-stacks/component.yaml (line 21)
  • website/static/examples/schemas/atmos.yaml (line 61) and related JSON schemas
  • website/src/components/Screengrabs/demo-stacks/start-your-project.html (line 48)
  • All occurrences in docs under docs/ (troubleshoot, quick-start, advanced, design-patterns, core-concepts, CLI configuration)
  • Tests and fixtures that still set name_pattern in atmos.yaml or snapshots
🤖 Prompt for AI Agents
examples/demo-vendoring/atmos.yaml around line 17: the project still uses the
legacy key name_pattern in multiple places; replace all instances with
name_template and ensure consumers expect template syntax. Search and replace
name_pattern -> name_template in the listed files
(examples/demo-stacks/component.yaml line 21,
website/static/examples/schemas/atmos.yaml and related JSON schemas,
website/src/components/... start-your-project.html line 48, all docs under
docs/), update any JSON schema definitions to accept name_template instead of
name_pattern (and adjust examples/validation), update
code/tests/fixtures/snapshots that set name_pattern to use name_template and
regenerate snapshots/tests as needed so validation and rendering use the new
key.

Comment on lines 36 to 47
"spec": {
"type": "object",
"description": "Specification of the vendoring configuration",
"properties": {
"imports": {
"type": "array",
"description": "List of imports for the vendoring configuration",
"items": {
"type": "string"
}
},
"sources": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Tighten spec and imports.

  • Disallow unknown keys under spec.
  • If imports present, require at least one and no dupes.
       "spec": {
         "type": "object",
         "description": "Specification of the vendoring configuration",
         "properties": {
           "imports": {
             "type": "array",
             "description": "List of imports for the vendoring configuration",
-            "items": {
-              "type": "string"
-            }
+            "items": { "type": "string" },
+            "minItems": 1,
+            "uniqueItems": true
           },

…and after the imports/sources properties:

-        },
-        "required": ["sources"]
+        },
+        "required": ["sources"],
+        "additionalProperties": false
       }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"spec": {
"type": "object",
"description": "Specification of the vendoring configuration",
"properties": {
"imports": {
"type": "array",
"description": "List of imports for the vendoring configuration",
"items": {
"type": "string"
}
},
"sources": {
"spec": {
"type": "object",
"description": "Specification of the vendoring configuration",
"properties": {
"imports": {
"type": "array",
"description": "List of imports for the vendoring configuration",
"items": { "type": "string" },
"minItems": 1,
"uniqueItems": true
},
"sources": {
… // existing sources schema
}
},
"required": ["sources"],
"additionalProperties": false
}
🤖 Prompt for AI Agents
website/static/schemas/atmos/1.0/vendor.json lines 36-47: tighten the schema by
disallowing unknown keys under "spec" (set additionalProperties: false on the
spec object) and constrain the "imports" array so that if it is present it must
contain at least one entry and no duplicates (set minItems: 1 and uniqueItems:
true on the imports items). Add these constraints after the imports/sources
properties block so the schema enforces no extra keys under spec and validates
imports contain one or more unique strings.

- Add period to end of comment in NotifyDeprecatedField function
- Fix cmd/docs.go to check atmosConfig.Docs.Pagination when terminal.pager is not set
- Fix typo: "lockstack" to "LocalStack" in demo-localstack/atmos.yaml
- Replace all instances of name_pattern with name_template across codebase
- Add staticcheck lint suppressions for deprecated field access in config.go
- Add additionalProperties constraints and array validation to vendor.json schema
- Update workflow.json $id from schemastore.org to atmos.tools domain

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
if !pager && atmosConfig.Settings.Docs.Pagination {
pager = atmosConfig.Settings.Docs.Pagination
log.Warn("'settings.docs.pagination' is deprecated and will be removed in a future version. Please use 'settings.terminal.pager' instead")
if !pager && atmosConfig.Docs.Pagination {

Check failure

Code scanning / golangci-lint

SA1019: atmosConfig.Docs.Pagination is deprecated: this has moved to settings.terminal.pagination Error

SA1019: atmosConfig.Docs.Pagination is deprecated: this has moved to settings.terminal.pagination
pager = atmosConfig.Settings.Docs.Pagination
log.Warn("'settings.docs.pagination' is deprecated and will be removed in a future version. Please use 'settings.terminal.pager' instead")
if !pager && atmosConfig.Docs.Pagination {
pager = atmosConfig.Docs.Pagination

Check failure

Code scanning / golangci-lint

SA1019: atmosConfig.Docs.Pagination is deprecated: this has moved to settings.terminal.pagination Error

SA1019: atmosConfig.Docs.Pagination is deprecated: this has moved to settings.terminal.pagination

if len(GetStackNamePattern(&atmosConfig)) < 1 {
return errors.New("stack name pattern must be provided in `stacks.name_pattern` CLI config or `ATMOS_STACKS_NAME_PATTERN` ENV variable")
return errors.New("stack name pattern must be provided in `stacks.name_template` CLI config or `ATMOS_STACKS_NAME_PATTERN` ENV variable")

Check failure

Code scanning / golangci-lint

do not define dynamic errors, use wrapped static errors instead: "errors.New("stack name pattern must be provided in stacks.name_template CLI config or ATMOS_STACKS_NAME_PATTERN ENV variable")" Error

do not define dynamic errors, use wrapped static errors instead: "errors.New("stack name pattern must be provided in stacks.name\_template CLI config or ATMOS\_STACKS\_NAME\_PATTERN ENV variable")"
}
} else {
return configAndStacksInfo, errors.New("'stacks.name_pattern' or 'stacks.name_template' needs to be specified in 'atmos.yaml' CLI config")
return configAndStacksInfo, errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml' CLI config")

Check failure

Code scanning / golangci-lint

do not define dynamic errors, use wrapped static errors instead: "errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml' CLI config")" Error

do not define dynamic errors, use wrapped static errors instead: "errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml' CLI config")"
// handleDeprecatedSettings handles deprecated configuration fields and migrates them to new locations
func handleDeprecatedSettings(cfg *schema.AtmosConfiguration) {
// Handle deprecated no_color
//nolint:staticcheck // SA1019: NoColor is deprecated but we need to check it for migration

Check warning

Code scanning / golangci-lint

directive //nolint:staticcheck // SA1019: NoColor is deprecated but we need to check it for migration is unused for linter "staticcheck" Warning

directive //nolint:staticcheck // SA1019: NoColor is deprecated but we need to check it for migration is unused for linter "staticcheck"
if len(stackNamePattern) == 0 {
return "",
errors.New("stack name pattern must be provided in 'stacks.name_pattern' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable")
errors.New("stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable")

Check failure

Code scanning / golangci-lint

do not define dynamic errors, use wrapped static errors instead: "errors.New("stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable")" Error

do not define dynamic errors, use wrapped static errors instead: "errors.New("stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable")"
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 19

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (10)
website/docs/core-concepts/projects/configuration/configuration.mdx (1)

93-105: Fix duplicated option label; restore legacy entry as deprecated

Second item should be the legacy option (stacks.name_pattern) and marked deprecated. Current text repeats name_template.

 <dl>
   <dt>`stacks.name_template` (newer format, more powerful)</dt>
   <dd>
     The name template allows you to define a custom Go template to format the stack name. This is useful when you want to use a different naming convention for your stacks.
   </dd>
-  <dt>`stacks.name_template` (old format, still supported)</dt>
+  <dt>`stacks.name_pattern` (legacy format, deprecated)</dt>
   <dd>
     The name pattern relies strictly on variables (`var.namespace`, `var.tenant`, `var.environment`, `var.stage`)
     to identify the stack.  It does not support any other variables.
 
-    You'll still see this in many of the examples, but we recommend using the newer `name_template` format.
+    You'll still see this in many of the examples, but we recommend using the newer `name_template` format.
   </dd>
 </dl>
website/docs/quick-start/advanced/provision.md (1)

78-80: Inconsistent file extension with other docs; prefer .tfvars.json.

Elsewhere (e.g., simple/provision.mdx) you use .tfvar.json. Terraform’s canonical JSON var file suffix is .tfvars.json. Recommend aligning here.

Apply:

- - And lastly, Atmos writes the final deep-merged variables into a `.tfvar` file in the component directory and then
+ - And lastly, Atmos writes the final deep-merged variables into a `.tfvars.json` file in the component directory and then
pkg/config/config.go (1)

83-87: Fix flag parsing bug and shadowing for --no-color.

Current code shadows flagKeyValue and treats mere presence of --no-color as true, even when set to false. Replace with explicit value check.

Apply:

-  if flagKeyValue, ok := flagKeyValue["no-color"]; ok || flagKeyValue == "true" {
-    atmosConfig.Settings.Terminal.NoColor = true
-  } else if flagKeyValue == "false" {
-    atmosConfig.Settings.Terminal.NoColor = false
-  }
+  if v, ok := flagKeyValue["no-color"]; ok {
+    // --no-color (no value) is parsed as "true" by parseFlags
+    atmosConfig.Settings.Terminal.NoColor = (v == "true")
+  }
pkg/config/config_test.go (1)

479-488: Assert no-color behavior.

We already pass expectetdNoColor in cases; assert it.

 			atmosConfig := &schema.AtmosConfiguration{}
 			setLogConfig(atmosConfig)
 			assert.Equal(t, test.expectedLogLevel, atmosConfig.Logs.Level)
+			assert.Equal(t, test.expectetdNoColor, atmosConfig.Settings.Terminal.NoColor)
pkg/vender/atmos.yaml (1)

1-350: Rename pkg/vender to pkg/vendor – the sole occurrence of “vender” conflicts with the standard “vendor” naming used elsewhere and in documentation.

website/docs/cli/commands/describe/describe-component.mdx (1)

118-121: Fix grammar: “are shows” → “are shown”.

User-facing docs. Tighten the sentence.

-    any issues, the warnings and errors are shows in the `terraform_config.diagnostics` section
+    any issues, the warnings and errors are shown in the `terraform_config.diagnostics` section
website/docs/cli/configuration/stacks.mdx (1)

39-49: Correct option names and priority note.

It should be “name_pattern or name_template”, with name_template taking precedence.

-  # To define Atmos stack naming convention, use either `name_template` or `name_template`.
-  # `name_template` has higher priority (if `name_template` is specified, `name_template` will be ignored).
-  # `name_template` uses the predefined context tokens {namespace}, {tenant}, {environment}, {stage}.
-  # `name_template` can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
-  name_template: "{tenant}-{environment}-{stage}"
+  # To define the naming convention, use either `name_pattern` (legacy) or `name_template` (recommended).
+  # `name_template` has higher priority (if `name_template` is specified, `name_pattern` will be ignored).
+  # `name_pattern` uses predefined tokens: {namespace}, {tenant}, {environment}, {stage}.
+  # `name_pattern` can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
+  name_pattern: "{tenant}-{environment}-{stage}"
   # `name_template` is a Golang template.
@@
-  # `name_template` can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var
+  # `name_template` can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var
   # name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
tests/fixtures/scenarios/complete/atmos.yaml (1)

67-75: Fix copy/paste mistakes and clarify deprecation.

The text repeats name_template and points to NAME_PATTERN incorrectly. Suggest:

-  # To define Atmos stack naming convention, use either `name_template` or `name_template`.
-  # `name_template` has higher priority (if `name_template` is specified, `name_template` will be ignored).
-  # `name_template` can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
-  # name_template: "{tenant}-{environment}-{stage}"
+  # To define Atmos stack naming convention, use either `name_template` (preferred) or `name_pattern` (deprecated).
+  # `name_template` has higher priority (if `name_template` is specified, `name_pattern` will be ignored).
+  # `name_template` can be set using 'ATMOS_STACKS_NAME_TEMPLATE' (preferred) or 'ATMOS_STACKS_NAME_PATTERN' (deprecated) ENV var
+  # name_pattern: "{tenant}-{environment}-{stage}"
website/docs/cli/configuration/configuration.mdx (2)

121-126: Update terminal.no_color → terminal.color + deprecation note.

PR introduces the new color setting and back-compat for ATMOS_NO_COLOR. The default config should reflect this to avoid confusing readers.

Proposed replacement snippet (outside current hunk):

settings:
  terminal:
    # Color output: "auto" | "always" | "never"
    # Can also be set using 'ATMOS_COLOR' (preferred). 'ATMOS_NO_COLOR' and 'NO_COLOR' are deprecated but supported.
    color: auto
    max_width: 120
    pager: true

Optionally add an Admonition near here noting that no_color is deprecated in favor of color.


769-805: Duplicate env var table block — remove the second copy.

The table repeats starting at “Variable | YAML Path | Description”. Trim the duplicate to avoid drift.

- | Variable                                              | YAML Path                                       | Description
- | :---------------------------------------------------- | :---------------------------------------------- | :
- ... (entire repeated block) ...
♻️ Duplicate comments (15)
pkg/config/utils.go (1)

659-662: Fix env var name and use a static sentinel error (per linter).

Message references ATMOS_STACKS_NAME_PATTERN while config key is stacks.name_template. Use the new env var (keep pattern only in deprecation messaging) and return a static error var instead of inline errors.New.

Apply within this range:

-        return "",
-            errors.New("stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable")
+        return "", ErrStacksNameTemplateMissing

Add this near the top of the file (after imports):

var ErrStacksNameTemplateMissing = errors.New(
    "stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_TEMPLATE' ENV variable (ATMOS_STACKS_NAME_PATTERN is deprecated)",
)
internal/exec/aws_eks_update_kubeconfig.go (1)

137-139: Use wrapped sentinel error and fix stale/contradictory wording (template vs pattern, ENV name).

Replace the dynamic errors.New(...) with a wrapped, package-level sentinel and update the message to reference stacks.name_template and ATMOS_STACKS_NAME_TEMPLATE.

-			if len(GetStackNamePattern(&atmosConfig)) < 1 {
-				return errors.New("stack name pattern must be provided in `stacks.name_template` CLI config or `ATMOS_STACKS_NAME_PATTERN` ENV variable")
-			}
+			if len(GetStackNamePattern(&atmosConfig)) < 1 {
+				return fmt.Errorf("aws eks update-kubeconfig: %w", ErrMissingStackNameTemplate)
+			}

Add this sentinel (outside the range, near imports):

var ErrMissingStackNameTemplate = errors.New("stack name template must be provided in `stacks.name_template` CLI config or `ATMOS_STACKS_NAME_TEMPLATE` env var")

Run to find other stale references:

#!/bin/bash
rg -nP 'ATMOS_STACKS_NAME_PATTERN|name_pattern\b'
pkg/config/config.go (3)

128-135: Remove unused nolint on NoColor.

staticcheck does not flag NoColor usage; the suppression is reported as unused.

-	//nolint:staticcheck // SA1019: NoColor is deprecated but we need to check it for migration

137-143: Correct deprecation labels for docs fields.

Labels should reference docs.max-width (old) → settings.terminal.max_width (new).

-	//nolint:staticcheck // SA1019: Docs.MaxWidth is deprecated but we need to check it for migration
+	//nolint:staticcheck // SA1019: intentionally reading deprecated cfg.Docs.MaxWidth for migration.
 	if cfg.Docs.MaxWidth > 0 && cfg.Settings.Terminal.MaxWidth == 0 {
 		cfg.Settings.Terminal.MaxWidth = cfg.Docs.MaxWidth
-		u.NotifyDeprecatedField("settings.docs.max-width", "settings.terminal.max_width")
+		u.NotifyDeprecatedField("docs.max-width", "settings.terminal.max_width")
 	}

144-149: Correct deprecation labels for docs.pagination.

Align message with old/new paths and retain precise suppression.

-	//nolint:staticcheck // SA1019: Docs.Pagination is deprecated but we need to check it for migration
+	//nolint:staticcheck // SA1019: intentionally reading deprecated cfg.Docs.Pagination for migration.
 	if cfg.Docs.Pagination && cfg.Settings.Terminal.Pager == "" {
 		cfg.Settings.Terminal.Pager = "on"
-		u.NotifyDeprecatedField("settings.docs.pagination", "settings.terminal.pager")
+		u.NotifyDeprecatedField("docs.pagination", "settings.terminal.pager")
 	}
cmd/docs.go (2)

47-50: Fix deprecated path lookup; add SA1019 suppression.

Fallback should read from root Docs (not Settings.Docs), label should be docs.max-width, and we should silence SA1019 since this is an intentional migration path.

- if maxWidth == 0 && atmosConfig.Settings.Docs.MaxWidth > 0 {
-   maxWidth = atmosConfig.Settings.Docs.MaxWidth
-   u.NotifyDeprecatedField("settings.docs.max-width", "settings.terminal.max_width")
- }
+ //nolint:staticcheck // SA1019: intentional fallback for deprecated docs.max-width during migration.
+ if maxWidth == 0 && atmosConfig.Docs.MaxWidth > 0 {
+   maxWidth = atmosConfig.Docs.MaxWidth
+   u.NotifyDeprecatedField("docs.max-width", "settings.terminal.max_width")
+ }

109-113: Align replacement label with schema; add SA1019 suppression.

Use settings.terminal.pagination to match schema docs and suppress SA1019 on the intentional fallback.

- if !pager && atmosConfig.Docs.Pagination {
-   pager = atmosConfig.Docs.Pagination
-   u.NotifyDeprecatedField("docs.pagination", "settings.terminal.pager")
- }
+ //nolint:staticcheck // SA1019: intentional fallback for deprecated docs.pagination during migration.
+ if !pager && atmosConfig.Docs.Pagination {
+   pager = atmosConfig.Docs.Pagination
+   u.NotifyDeprecatedField("docs.pagination", "settings.terminal.pagination")
+ }

Quick check to ensure no stray labels remain:

#!/bin/bash
rg -n -C2 -e 'settings\.docs\.max-width|settings\.docs\.pagination|docs\.max-width|docs\.pagination|settings\.terminal\.(pager|pagination)' cmd pkg
website/static/schemas/atmos/1.0/workflow.json (1)

43-81: Lock down retry schema and validate duration-like strings

Forbid unknown keys and validate durations for the delay/elapsed fields.

             "retry": {
               "type": "object",
               "description": "Retry configuration for the step",
+              "additionalProperties": false,
               "properties": {
                 "max_attempts": {
                   "type": "integer",
                   "description": "Maximum number of retry attempts",
                   "minimum": 1
                 },
                 "backoff_strategy": {
                   "type": "string",
                   "description": "Backoff strategy for retries",
                   "enum": ["constant", "linear", "exponential"]
                 },
                 "initial_delay": {
                   "type": "string",
-                  "description": "Initial delay between retries (e.g., '1s', '500ms')"
+                  "description": "Initial delay between retries (e.g., '1s', '500ms')",
+                  "pattern": "^[0-9]+(ms|s|m|h)$"
                 },
                 "max_delay": {
                   "type": "string",
-                  "description": "Maximum delay between retries"
+                  "description": "Maximum delay between retries",
+                  "pattern": "^[0-9]+(ms|s|m|h)$"
                 },
                 "random_jitter": {
                   "type": "number",
                   "description": "Random jitter to add to delay",
                   "minimum": 0,
                   "maximum": 1
                 },
                 "multiplier": {
                   "type": "number",
                   "description": "Multiplier for exponential backoff",
                   "minimum": 1
                 },
                 "max_elapsed_time": {
                   "type": "string",
-                  "description": "Maximum elapsed time for all retries"
+                  "description": "Maximum elapsed time for all retries",
+                  "pattern": "^[0-9]+(ms|s|m|h)$"
                 }
               }
             }
website/static/examples/schemas/atmos.yaml (5)

179-179: Remove “v” prefix from terraform_version

Atlantis expects plain semver.

-        terraform_version: "v1.5.0"
+        terraform_version: "1.5.0"

1-322: YAML lint: trailing spaces and missing newline at EOF

Cleanup trailing spaces and ensure a single newline at EOF to satisfy yamllint.

#!/bin/bash
# Strip trailing whitespace and ensure newline at EOF
sed -i -e 's/[[:space:]]\+$//' -e '$a\' website/static/examples/schemas/atmos.yaml

# Optional: run yamllint if available
yamllint website/static/examples/schemas/atmos.yaml || true

76-80: Fix incorrect glob patterns in editorconfig excludes

Use directory-aware globs.

     exclude:
       - "vendor/**"
-      - "**.tfstate"
-      - "**.terraform/**"
+      - "**/*.tfstate"
+      - "**/.terraform/**"

303-311: .Flags.region is referenced but not defined

Add a region flag so TF_VAR_region resolves.

         flags:
           - name: stack
             shorthand: s
             description: Stack name
             required: true
+          - name: region
+            shorthand: r
+            description: AWS region (e.g., us-east-2)
+            required: false
         env:
           - key: TF_VAR_region
             value: "{{ .Flags.region }}"

319-322: Fix helmfile component name mismatch

Use nginx-ingress to match earlier definition.

-          - atmos helmfile apply nginx -s {{ .Flags.stack }}
+          - atmos helmfile apply nginx-ingress -s {{ .Flags.stack }}
website/docs/core-concepts/stacks/stacks.mdx (1)

101-115: Make CLI example match the provided name_template.

Use a full tenant-env-stage slug consistent with earlier template.

-This will use the `tenant`, `environment`, and `stage` variables from the component's configuration in the stack to compute the stack name.
-
-For example, using the slug, we can reference a stack like this when applying the `vpc` stack in the `us2-dev` environment:
+This computes the stack name from the `tenant`, `environment`, and `stage` variables.
+
+For example, with `tenant=acme`, `environment=ue2`, and `stage=dev`, the slug is `acme-ue2-dev`. Apply the `vpc` component in that stack:
 
 ```bash
-atmos terraform apply vpc -s us2-dev
+atmos terraform apply vpc -s acme-ue2-dev

</blockquote></details>
<details>
<summary>internal/exec/utils.go (1)</summary><blockquote>

`287-288`: **Fix error text and use a static wrapped error**

Message repeats 'stacks.name_template' twice; it should mention 'stacks.name_pattern'. Also avoid dynamic errors; use the shared error value.


Apply:

```diff
-				return configAndStacksInfo, errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml' CLI config")
+				return configAndStacksInfo, errUtils.ErrMissingStackNameTemplateAndPattern

Ensure ErrMissingStackNameTemplateAndPattern’s text is "'stacks.name_template' or 'stacks.name_pattern' needs to be specified in 'atmos.yaml' CLI config".

Run to confirm the constant exists and message is correct:

#!/bin/bash
rg -nP 'ErrMissingStackNameTemplateAndPattern' -C2
rg -nP "'stacks\.name_template'.*'stacks\.name_pattern'" errors -C2
🧹 Nitpick comments (55)
tests/fixtures/scenarios/invalid-stacks/atmos.yaml (1)

17-17: Optional: annotate intent.

Add a short YAML comment explaining why this fixture is “invalid” to prevent future “fixes.”

tests/fixtures/scenarios/vendor2/atmos.yaml (1)

17-17: Add a legacy-compat test to assert deprecation path

Consider a companion fixture using stacks.name_pattern to assert deprecation notice and automatic migration still work, preventing regressions.

I can add a minimal fixture and test that expects a standardized warning and resolves to the same computed name. Want a patch?

tests/fixtures/scenarios/depends-on-with-stacks-name-pattern/atmos.yaml (1)

11-18: Rename fixture scenario and all “name-pattern” references to “name-template”

  • Rename directory
    tests/fixtures/scenarios/depends-on-with-stacks-name-pattern/
    tests/fixtures/scenarios/depends-on-with-stacks-name-template/ and update the path in internal/exec/describe_dependents_test.go:481
  • Replace all occurrences of stacks-name-pattern and name_pattern in snapshots, docs and code comments with stacks-name-template and name_template to align with the new config key
pkg/config/utils.go (7)

414-419: Correct quoting in user-facing error strings.

Missing leading quotes around env var names.

-        return errors.New("stack base path must be provided in 'stacks.base_path' config or ATMOS_STACKS_BASE_PATH' ENV variable")
+        return errors.New("stack base path must be provided in 'stacks.base_path' config or 'ATMOS_STACKS_BASE_PATH' ENV variable")
@@
-        return errors.New("at least one path must be provided in 'stacks.included_paths' config or ATMOS_STACKS_INCLUDED_PATHS' ENV variable")
+        return errors.New("at least one path must be provided in 'stacks.included_paths' config or 'ATMOS_STACKS_INCLUDED_PATHS' ENV variable")

537-545: Use the Flag constants consistently in logs.

Other logs use ...Flag; this one uses InitRunReconfigure. Align for consistency and to avoid unresolved identifiers.

-        log.Debug(cmdLineArg, InitRunReconfigure, configAndStacksInfo.InitRunReconfigure)
+        log.Debug(cmdLineArg, InitRunReconfigureFlag, configAndStacksInfo.InitRunReconfigure)

545-552: Same constant naming issue as above.

-        log.Debug(cmdLineArg, InitPassVars, configAndStacksInfo.InitPassVars)
+        log.Debug(cmdLineArg, InitPassVarsFlag, configAndStacksInfo.InitPassVars)

553-560: Same constant naming issue as above.

-        log.Debug(cmdLineArg, PlanSkipPlanfile, configAndStacksInfo.PlanSkipPlanfile)
+        log.Debug(cmdLineArg, PlanSkipPlanfileFlag, configAndStacksInfo.PlanSkipPlanfile)

867-870: Wrap underlying error with %w.

Use Go’s error wrapping for better context.

-    return "", fmt.Errorf("error reading directory %s: %v", dir, err)
+    return "", fmt.Errorf("error reading directory %s: %w", dir, err)

70-82: Variable naming is confusing.

allExcluded is true when nothing is excluded. Consider renaming to notExcluded or isAllowed for clarity.


212-222: Optional: emit deprecation notice when ATMOS_STACKS_NAME_PATTERN is set.

Given the new deprecation framework, consider notifying here to guide users to ATMOS_STACKS_NAME_TEMPLATE.

I can wire this to NotifyDeprecatedField if you confirm the helper’s signature.

website/docs/design-patterns/inline-component-customization.mdx (1)

68-72: Use Go-template example for name_template to avoid confusion

name_template is Go-templated; showing {stage} suggests legacy pattern semantics. Recommend using .vars.stage.

 stacks:
   base_path: "stacks"
-  name_template: "{stage}"
+  name_template: "{{ .vars.stage }}"
tests/fixtures/scenarios/basic/atmos.yaml (1)

15-15: Add a Go-templated fixture for name_template

Include at least one test fixture under tests/fixtures using

name_template: "{{ .vars.stage }}"

to exercise the Go templating code path.

tests/fixtures/scenarios/workflows/atmos.yaml (1)

17-17: Add a Go-templated workflows fixture
In tests/fixtures/scenarios/workflows, add a scenario mirroring atmos.yaml but with

name_template: "{{ .vars.stage }}"

to validate workflow handling of templated stack slugs.

internal/exec/aws_eks_update_kubeconfig.go (1)

173-175: Tighten comment and prefer ReplaceAll.

  • Comment is missing the closing brace/backtick.
  • Use strings.ReplaceAll instead of strings.Replace(..., -1).
-		// Add Component to allow the `cluster_name_template` in `atmos.yaml` to use `{component} token
-		context.Component = strings.Replace(kubeconfigContext.Component, "/", "-", -1)
+		// Add Component to allow the `cluster_name_template` in `atmos.yaml` to use `{component}` token
+		context.Component = strings.ReplaceAll(kubeconfigContext.Component, "/", "-")
website/docs/core-concepts/stacks/templates/functions/atmos.Component.mdx (1)

115-120: Fix duplicated reference; optionally mention deprecation status.

The tip repeats stacks.name_template. Recommend referencing the preferred key and optionally noting the deprecated one.

-    For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
-    sections in [`atmos.yaml` CLI config file](/cli/configuration/)
+    For more information on Atmos stack names and how to define them, refer to `stacks.name_template`
+    (and `stacks.name_pattern`, deprecated) in the [`atmos.yaml` CLI config file](/cli/configuration/).
website/docs/quick-start/advanced/create-atmos-stacks.mdx (1)

178-181: Good rename; add a note about the environment variable for completeness.

After mentioning name_template, add that it can be set via ATMOS_STACKS_NAME_TEMPLATE.

- command, the Atmos stack `plat-ue2-dev` is specified by the `-s` flag. By looking at `name_template: "{tenant}-{environment}-{stage}"`
+ command, the Atmos stack `plat-ue2-dev` is specified by the `-s` flag. By looking at `name_template: "{tenant}-{environment}-{stage}"`
+ (also configurable via the `ATMOS_STACKS_NAME_TEMPLATE` environment variable)
tests/fixtures/scenarios/atmos-configuration/atmos.d/tools/helmfile.yml (1)

13-14: Fix ENV var name to match the renamed key.

Comment still references ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN while the key is cluster_name_template.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
website/docs/cli/commands/aws/aws-eks-update-kubeconfig.mdx (1)

37-41: Say “using the template,” not “using the pattern.”

Key was renamed to cluster_name_template; the parenthetical should match. Minor copy fix.

-- `components.helmfile.cluster_name_template` in the `atmos.yaml` CLI config (and calculates the `--name` parameter using the pattern)
+- `components.helmfile.cluster_name_template` in the `atmos.yaml` CLI config (and calculates the `--name` parameter using the template)

Optional clarity tweak for the next bullet (grammar):

-`components.helmfile.kubeconfig_path` in the `atmos.yaml` CLI config the variables for the component in the provided stack
+`components.helmfile.kubeconfig_path` in the `atmos.yaml` CLI config, and the variables for the component in the provided stack
website/docs/design-patterns/multiple-component-instances.mdx (1)

93-93: Good rename to stacks.name_template; consider adding a brief migration callout.

Suggest a short note that name_pattern is deprecated and that ATMOS_STACKS_NAME_TEMPLATE is supported, to prevent confusion for users on older configs.

website/docs/design-patterns/layered-stack-configuration.mdx (1)

168-168: Rename looks right; add deprecation/env-var note for completeness.

A one-line admonition about name_pattern → name_template and ATMOS_STACKS_NAME_TEMPLATE would help readers upgrading.

website/docs/quick-start/simple/provision.mdx (1)

55-56: Keep extension consistent with advanced guide.

This uses .tfvar.json; recommend .tfvars.json for consistency and Terraform convention.

Apply:

- - And lastly, Atmos writes the final deep-merged variables into a `.tfvar.json` file in the component directory and then
+ - And lastly, Atmos writes the final deep-merged variables into a `.tfvars.json` file in the component directory and then
website/docs/design-patterns/component-catalog.mdx (1)

122-122: Rename to stacks.name_template is correct; add upgrade hint.

Consider a short note: “Previously stacks.name_pattern; still accepted but deprecated. Use ATMOS_STACKS_NAME_TEMPLATE to override.”

website/docs/quick-start/simple/configure-cli.mdx (1)

64-72: Use “template” terminology consistently

Nit: replace “pattern” with “template” in the explanatory text to match the renamed key.

-    Atmos uses “slugs” to refer to stacks, which are defined by the `name_template` setting.<br/>
-    Instead of relying on file names and locations, which can change, Atmos uses context variables (`namespace`, `tenant`, `environment`, `stage`)
-    to identify the stack. For example, with the command `atmos terraform apply myapp -s dev`,
-    Atmos interprets the slug `dev` using the pattern `{stage}` to locate the correct stack configuration
+    Atmos uses “slugs” to refer to stacks, which are defined by the `name_template` setting.<br/>
+    Instead of relying on file names and locations, which can change, Atmos uses context variables (`namespace`, `tenant`, `environment`, `stage`)
+    to identify the stack. For example, with the command `atmos terraform apply myapp -s dev`,
+    Atmos interprets the slug `dev` using the template `{stage}` to locate the correct stack configuration
website/docs/troubleshoot/errors.mdx (1)

35-41: Tighten grammar and casing

Lowercase “stack” and streamline the sentence.

-This means that your `name_template` declares a `tenant` is required, but not specified in the Stack configurations. Either specify a `tenant` in
-your `vars` for the Stack configuration, or remove the `{tenant}` from the `name_template`.
+This means your `name_template` declares a `tenant` is required, but none is specified in the stack configuration. Either specify a `tenant` in your vars for the stack configuration, or remove `{tenant}` from the `name_template`.
pkg/config/config.go (3)

90-123: Consider delegating flag/env handling to Cobra/Viper.

Manual parseFlags is brittle and duplicates Cobra/Viper capabilities used elsewhere. Not blocking, but worth consolidating.

Happy to draft a follow-up PR to wire logs-level/no-color via Cobra flags and Viper with proper precedence.


125-126: Style: end function comment with a period.

Satisfies linter complaint.

-// handleDeprecatedSettings handles deprecated configuration fields and migrates them to new locations
+// handleDeprecatedSettings handles deprecated configuration fields and migrates them to new locations.

125-149: Add targeted tests for deprecation migration.

We’re missing unit tests asserting:

  • no_color → color migration,
  • docs.max-width → settings.terminal.max_width,
  • docs.pagination → settings.terminal.pager.

Proposed additions:

func TestHandleDeprecatedSettings_Migrations(t *testing.T) {
	cfg := &schema.AtmosConfiguration{
		Docs: schema.Docs{
			MaxWidth:   120,
			Pagination: true,
		},
		Settings: schema.AtmosSettings{
			Terminal: schema.Terminal{
				NoColor: true,
			},
		},
	}
	handleDeprecatedSettings(cfg)

	// color is inverse of no_color
	require.NotNil(t, cfg.Settings.Terminal.Color)
	assert.Equal(t, false, *cfg.Settings.Terminal.Color)

	// docs migrations
	assert.Equal(t, 120, cfg.Settings.Terminal.MaxWidth)
	assert.Equal(t, "on", cfg.Settings.Terminal.Pager)
}
pkg/config/config_test.go (1)

444-448: Nit: fix typo in test field name.

expectetdNoColor → expectedNoColor.

If you prefer, I can submit a small follow-up to rename the field and update references in this table and assertions.

website/docs/core-concepts/projects/configuration/helmfile.mdx (2)

46-57: Wording: call it a “template” (Go template), not “pattern.”

Minor doc polish for the renamed key.

-  <dd>A naming pattern used to identify and select the Kubernetes cluster within the Helmfile configuration. This pattern helps automate the management of different clusters by matching their names based on the specified criteria.</dd>
+  <dd>A naming template (Go template) used to derive the Kubernetes cluster name within the Helmfile configuration.</dd>

64-73: Optional: mention the env var for parity with CLI.

Add a note that ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE can set this.

I can submit a docs tweak if desired.

tests/fixtures/scenarios/complete/stacks/catalog/terraform/test-component-override-2.yaml (1)

17-23: Align comments with new “template” terminology.

Update inline comments to avoid mixing “pattern” and “template”.

-          # `stack_name_template` overrides Spacelift stack names
-          # By specifying the following `stack_name_template`, the final Spacelift stack name will be
+          # `stack_name_template` overrides Spacelift stack names.
+          # By specifying the following `stack_name_template`, the final Spacelift stack name will be
           # `tenant1-ue2-dev-new-component` instead of `tenant1-ue2-dev-test-test-component-override-2`
-          # By default (if `stack_name_template` is not specified), the stack name is generated using the pattern {tenant}-{environment}-{stage}-{component}
+          # By default (if `stack_name_template` is not specified), the stack name is generated using the template {tenant}-{environment}-{stage}-{component}.
pkg/aws/atmos.yaml (1)

45-45: Update ENV var name to match the new template key.

Comment still mentions PATTERN; should be TEMPLATE.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
pkg/vender/atmos.yaml (1)

45-45: Update ENV var name to match the new template key.

Comment still mentions PATTERN; should be TEMPLATE.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
pkg/describe/atmos.yaml (1)

45-45: Update ENV var name to match the new template key.

Comment still mentions PATTERN; should be TEMPLATE.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
website/static/schemas/atmos/1.0/vendor.json (5)

1-11: Add $id for resolvability.

Helpful for tools and canonical identification.

 {
+  "$id": "https://atmos.tools/schemas/atmos/1.0/vendor.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",

27-35: Disallow empty metadata.name.

Prevent accidental empty strings.

         "name": {
           "type": "string",
-          "description": "Name of the vendoring configuration"
+          "description": "Name of the vendoring configuration",
+          "minLength": 1
         },

43-51: Disallow empty import entries.

Assure each string has content.

         "imports": {
           "type": "array",
           "description": "List of imports for the vendoring configuration",
-          "items": {
-            "type": "string"
-          },
+          "items": { "type": "string", "minLength": 1 },
           "minItems": 0,
           "uniqueItems": true
         },

59-70: Harden required string fields.

Enforce non-empty strings for component/source/version.

               "component": {
-                "type": "string",
+                "type": "string",
+                "minLength": 1,
                 "description": "Name of the component"
               },
               "source": {
-                "type": "string",
+                "type": "string",
+                "minLength": 1,
                 "description": "Source URL for the component. Supports Git, HTTP, S3, etc."
               },
               "version": {
-                "type": "string",
+                "type": "string",
+                "minLength": 1,
                 "description": "Version of the component to fetch"
               },

71-79: Disallow empty strings in targets.

Avoid [""] target arrays.

               "targets": {
                 "type": "array",
                 "description": "List of target paths where the component will be vendored",
-                "items": {
-                  "type": "string"
-                },
+                "items": { "type": "string", "minLength": 1 },
                 "minItems": 1,
                 "uniqueItems": true
               },
website/static/schemas/atmos/1.0/workflow.json (3)

3-3: Align $id with repo path/versioning

Use an Atmos-owned, path-stable $id that matches the file’s location/versioning.

-    "$id": "https://atmos.tools/schemas/workflow/1.0.0",
+    "$id": "https://atmos.tools/schemas/atmos/1.0/workflow.json",

20-24: Enforce non-empty workflows

Add minItems to ensure at least one step.

       "steps": {
         "type": "array",
         "description": "The list of steps to execute in the workflow.",
+        "minItems": 1,
         "items": {

39-42: Optional: constrain step.type

If step types are known (e.g., shell, script), consider an enum to improve IDE UX.

pkg/list/atmos.yaml (1)

45-46: Update ENV var hint to match renamed field

Comment still references CLUSTER_NAME_PATTERN. Rename to *_CLUSTER_NAME_TEMPLATE for consistency.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
pkg/component/atmos.yaml (1)

55-56: Update ENV var hint to match renamed field

Switch *_CLUSTER_NAME_PATTERN to *_CLUSTER_NAME_TEMPLATE.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
examples/quick-start-advanced/rootfs/usr/local/etc/atmos/atmos.yaml (1)

55-56: Update ENV var hint to match renamed field

Swap *_CLUSTER_NAME_PATTERN for *_CLUSTER_NAME_TEMPLATE.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
website/static/schemas/atmos/1.0/cli.json (1)

144-147: Clarify “cluster_name_template” description.

Say “Go template” not “Pattern” to match naming.

-              "cluster_name_template": {
-                "type": "string",
-                "description": "Pattern for cluster names"
-              }
+              "cluster_name_template": {
+                "type": "string",
+                "description": "Go template for cluster names"
+              }
website/docs/cli/configuration/stacks.mdx (1)

107-120: Fix equivalence sentence (template vs pattern).

-  - `name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"` defines the same name pattern for the top-level
-    Atmos stacks as `name_template: "{tenant}-{environment}-{stage}"` does
+  - `name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"` defines the same name as
+    `name_pattern: "{tenant}-{environment}-{stage}"`
examples/demo-localstack/atmos.yaml (2)

62-74: Capitalize “LocalStack” consistently.

Align with branding used elsewhere in the file.

-      - name: "down"
-        description: Stop localstack
+      - name: "down"
+        description: Stop LocalStack
@@
-      - name: "restart"
-        description: Restart localstack
+      - name: "restart"
+        description: Restart LocalStack
@@
-      - name: "reset"
-        description: Reset localstack (delete all data)
+      - name: "reset"
+        description: Reset LocalStack (delete all data)

79-88: Keep capitalization in status description.

-      - name: "status"
-        description: Show the status of LocalStack
+      - name: "status"
+        description: Show the status of LocalStack
pkg/spacelift/atmos.yaml (1)

41-46: Also advertise the new TEMPLATE env var alongside the legacy PATTERN.

Docs/code elsewhere in this PR add template-based keys and env vars. Recommend mentioning both:

  • Keep ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN (back-compat).
  • Add ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE (preferred).

Apply:

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_HELM_AWS_PROFILE_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_HELM_AWS_PROFILE_PATTERN' ENV var
     helm_aws_profile_pattern: "{namespace}-{tenant}-gbl-{stage}-helm"
-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' (preferred) or 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' (deprecated) ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
tests/fixtures/scenarios/complete/atmos.yaml (1)

55-56: Mirror env var rename for helmfile cluster name.

As with other docs, prefer TEMPLATE env var while keeping PATTERN for back-compat.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' (preferred) or 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' (deprecated) ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
website/docs/cli/configuration/configuration.mdx (2)

750-756: Expose TEMPLATE env vars and mark PATTERN as deprecated.

Align with other sections: show both for clarity.

-| ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN        | components.helmfile.cluster_name_template        | Pattern for EKS cluster name to use when executing `atmos helmfile` commands                                                                                                                                                                                        |
+| ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE       | components.helmfile.cluster_name_template       | Template for EKS cluster name used by `atmos helmfile` commands                                                                                                                                            |
+| ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN        | components.helmfile.cluster_name_template       | Deprecated alias for the same setting                                                                                                                                                                                          |
-| ATMOS_STACKS_NAME_PATTERN                             | stacks.name_template                             | Stack name pattern to use as Atmos stack names                                                                                                                                                                                                                      |
+| ATMOS_STACKS_NAME_TEMPLATE                            | stacks.name_template                            | Stack name Go template for Atmos stack names                                                                                                                                                                                                                        |
+| ATMOS_STACKS_NAME_PATTERN                             | stacks.name_template                            | Deprecated alias for the same setting                                                                                                                                                                                                                               |

810-812: Tighten wording for grammar/flow.

- (in the case of `atmos terraform shell`, the Terraform or Tofu CLI) natively, while still being configured for a
- specific component and stack. To accomplish this, and to provide visibility and context to the user regarding the
- configuration, Atmos may set the following environment variables in the spawned shell:
+ (for `atmos terraform shell`, the Terraform or Tofu CLI) natively while preserving the active component and stack.
+ To provide visibility and context, Atmos sets the following environment variables in the spawned shell:
website/docs/quick-start/advanced/configure-cli.mdx (1)

75-77: Mention the new TEMPLATE env var (and keep PATTERN for back-compat).

-  # Can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
-  name_template: "{tenant}-{environment}-{stage}"
+  # Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' (preferred) or 'ATMOS_STACKS_NAME_PATTERN' (deprecated) ENV var
+  name_template: "{tenant}-{environment}-{stage}"
examples/quick-start-advanced/atmos.yaml (1)

55-56: Note the TEMPLATE env var for helmfile cluster name.

Mirror the preferred/legacy env vars.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' (preferred) or 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' (deprecated) ENV var
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"

ErrMissingDocType = errors.New("doc-type argument missing")
ErrUnsupportedInputType = errors.New("unsupported input type")
ErrMissingStackNameTemplateAndPattern = errors.New("'stacks.name_pattern' or 'stacks.name_template' needs to be specified in 'atmos.yaml'")
ErrMissingStackNameTemplateAndPattern = errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml'")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Fix duplicated key and clarify preferred env var in error message

The message repeats 'stacks.name_template' and omits the preferred env var. Suggest clarifying preferred vs deprecated inputs.

Apply:

- ErrMissingStackNameTemplateAndPattern    = errors.New("'stacks.name_template' or 'stacks.name_template' needs to be specified in 'atmos.yaml'")
+ ErrMissingStackNameTemplateAndPattern    = errors.New("either 'stacks.name_template' (preferred) or deprecated 'stacks.name_pattern' must be specified in 'atmos.yaml', or set 'ATMOS_STACKS_NAME_TEMPLATE'")

Run to verify consistency across the repo and catch any lingering references:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "Search for old/new env vars and keys…"
rg -nP 'ATMOS_STACKS_NAME_(PATTERN|TEMPLATE)'
rg -nP 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_(PATTERN|TEMPLATE)'
rg -nP '\bname_pattern\b' --type go --type yml --type mdx --type yaml
echo "Check deprecation notifier usage for stacks name rename…"
rg -nP 'NotifyDeprecatedField\([^)]*name_pattern[^)]*name_template'
echo "Locate uses of ErrMissingStackNameTemplateAndPattern…"
rg -nP '\bErrMissingStackNameTemplateAndPattern\b' -n

Length of output: 9783


Update all remaining name_pattern references and error messages

  • pkg/config/utils.go (line 661) and internal/exec/aws_eks_update_kubeconfig.go (line 138) still use the old error text; replace with “either 'stacks.name_template' (preferred) or deprecated 'stacks.name_pattern', or set 'ATMOS_STACKS_NAME_TEMPLATE' ENV var.”
  • Docs, tests, and CLI examples in website/docs/... and fixtures reference ATMOS_STACKS_NAME_PATTERN and the old message; update them to mention deprecated vs preferred keys and the new ATMOS_STACKS_NAME_TEMPLATE ENV var.
🤖 Prompt for AI Agents
In errors/errors.go around line 36, the ErrMissingStackNameTemplateAndPattern
message is incorrect and must be updated to instruct users to use the preferred
or deprecated key or ENV var; change the error string to: "either
'stacks.name_template' (preferred) or deprecated 'stacks.name_pattern', or set
'ATMOS_STACKS_NAME_TEMPLATE' ENV var."; then propagate this exact wording to the
other occurrences noted in the review: update pkg/config/utils.go (around line
661) and internal/exec/aws_eks_update_kubeconfig.go (around line 138) to use the
same message, and also update docs, tests and fixtures referencing the old
ATMOS_STACKS_NAME_PATTERN text to mention the preferred vs deprecated keys and
the new ATMOS_STACKS_NAME_TEMPLATE ENV var.

Comment on lines 303 to 306
if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_pattern' config or " +
return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_template' config or " +
"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Make error message consistent with “template” and env var rename.

Use “template” consistently and reference ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE.

-		if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
-			return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_template' config or " +
-				"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
+		if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
+			return errors.New("Cluster name template must be provided in 'components.helmfile.cluster_name_template' config or " +
+				"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV variable")
 		}

Please verify that:

  • YAML tag for this field is cluster_name_template,
  • the env var binding is ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE.

Run:


🏁 Script executed:

#!/bin/bash
rg -nC2 'ClusterNamePattern|cluster_name_template|ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE|ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' \
  --internal --pkg --website

Length of output: 587


🏁 Script executed:

#!/bin/bash
rg -nC2 'ClusterNamePattern'
rg -nC2 'cluster_name_template'
rg -nC2 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE'
rg -nC2 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN'

Length of output: 38582


Use “template” in the error message but keep the existing PATTERN env var
internal/exec/helmfile.go:303-306

-	if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
-		return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_template' config or " +
-			"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
+	if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
+		return errors.New("Cluster name template must be provided in 'components.helmfile.cluster_name_template' config or " +
+			"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
 	}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_pattern' config or " +
return errors.New("Cluster name pattern must be provided in 'components.helmfile.cluster_name_template' config or " +
"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
}
if len(atmosConfig.Components.Helmfile.ClusterNamePattern) < 1 {
return errors.New("Cluster name template must be provided in 'components.helmfile.cluster_name_template' config or " +
"'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable")
}
🤖 Prompt for AI Agents
internal/exec/helmfile.go around lines 303-306: the error message currently uses
"pattern" but the code/config refers to a "template"; update the error string to
say "template" (e.g., "Cluster name template must be provided in
'components.helmfile.cluster_name_template' config or
'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV variable") while leaving
the existing ENV var name unchanged; keep wording and concatenation style
consistent and return the new error message.

excluded_paths:
- "**/_defaults.yaml"
name_pattern: "{dev}"
name_template: "{dev}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

name_template token looks invalid; use {stage} or a literal.

{dev} is not a supported token. This will fail schema/validation where only {namespace}, {tenant}, {environment}, {stage} are allowed.

-  name_template: "{dev}"
+  # Use a supported token:
+  name_template: "{stage}"
+  # Or hardcode a literal (no braces) if this scenario intentionally fixes the stack name:
+  # name_template: "dev"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
name_template: "{dev}"
# Use a supported token:
name_template: "{stage}"
# Or hardcode a literal (no braces) if this scenario intentionally fixes the stack name:
# name_template: "dev"
🤖 Prompt for AI Agents
In tests/fixtures/scenarios/atmos-cli-imports/configs.d/tools/stack.yml around
line 7, the name_template uses an unsupported token "{dev}"; replace it with a
supported token such as "{stage}" (or another allowed token like "{namespace}",
"{tenant}", "{environment}") or use a literal string value instead so the file
validates against the schema.

Comment on lines 54 to 56
# Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
cluster_name_pattern: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"
cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Align env var name with cluster_name_template (note deprecation)

Update the comment to the new env var and mention the deprecated one for clarity.

-    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN' ENV var
+    # Can also be set using 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE' ENV var (deprecated: 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN')
     cluster_name_template: "{namespace}-{tenant}-{environment}-{stage}-eks-cluster"

Verify support exists for the new env var (and optionally the deprecated one):


🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -nP 'ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_(TEMPLATE|PATTERN)'

Length of output: 3663


Add support for new env var ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE
Update pkg/config/utils.go to read ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE (falling back to ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN), adjust the debug log and pkg/config/utils_test.go, and update all docs, YAML fixtures and tables to reference the new var and mark PATTERN as deprecated.

🤖 Prompt for AI Agents
In tests/fixtures/scenarios/complete/rootfs/usr/local/etc/atmos/atmos.yaml
around lines 54 to 56, the config comment and cluster_name_template reference
the old ENV name; update code and tests to support the new
ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE while falling back to
ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN (deprecated). Modify
pkg/config/utils.go to first read
ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_TEMPLATE and if empty read
ATMOS_COMPONENTS_HELMFILE_CLUSTER_NAME_PATTERN, change the debug log to mention
the new var and note PATTERN is deprecated when used, update
pkg/config/utils_test.go to cover both env var cases and the
fallback/deprecation path, and update any docs, YAML fixture files and tables to
reference the new variable name and mark the PATTERN variant as deprecated.

Comment on lines 67 to 71
# Can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
# name_pattern: "{tenant}-{environment}-{stage}"
# name_template: "{tenant}-{environment}-{stage}"
# Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var
name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix env var in comment for stacks.name_template

Point to ATMOS_STACKS_NAME_TEMPLATE; optionally reference the deprecated variant.

-  # Can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
-  # name_template: "{tenant}-{environment}-{stage}"
-  # Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var
+  # Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var (deprecated: 'ATMOS_STACKS_NAME_PATTERN')
+  # name_template: "{tenant}-{environment}-{stage}"
   name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Can also be set using 'ATMOS_STACKS_NAME_PATTERN' ENV var
# name_pattern: "{tenant}-{environment}-{stage}"
# name_template: "{tenant}-{environment}-{stage}"
# Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var
name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
# Can also be set using 'ATMOS_STACKS_NAME_TEMPLATE' ENV var (deprecated: 'ATMOS_STACKS_NAME_PATTERN')
# name_template: "{tenant}-{environment}-{stage}"
name_template: "{{.vars.tenant}}-{{.vars.environment}}-{{.vars.stage}}"
🤖 Prompt for AI Agents
In tests/fixtures/scenarios/complete/rootfs/usr/local/etc/atmos/atmos.yaml
around lines 67 to 71, the comment above name_template references the wrong ENV
var; update the comment to point to ATMOS_STACKS_NAME_TEMPLATE (and optionally
include a note that ATMOS_STACKS_NAME_PATTERN is deprecated) so the commented
guidance matches the actual environment variable name used by the code.

Comment on lines +112 to 114
For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
sections in [`atmos.yaml` CLI config file](/cli/configuration/)
:::
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix duplicated reference and small grammar.

Use a single reference to the stacks.name_template section and correct the sentence.

-For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
-sections in [`atmos.yaml` CLI config file](/cli/configuration/)
+For more information on Atmos stack names and how to define them, refer to the `stacks.name_template`
+section in the [`atmos.yaml` CLI config file](/cli/configuration/).
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
sections in [`atmos.yaml` CLI config file](/cli/configuration/)
:::
For more information on Atmos stack names and how to define them, refer to the `stacks.name_template`
section in the [`atmos.yaml` CLI config file](/cli/configuration/).
:::
🧰 Tools
🪛 LanguageTool

[grammar] ~112-~112: There might be a mistake here.
Context: ...ame_templateandstacks.name_template sections in [atmos.yaml` CLI config fil...

(QB_NEW_EN)

🤖 Prompt for AI Agents
website/docs/core-concepts/stacks/templates/functions/atmos.Store.mdx around
lines 112-114: the sentence duplicates the `stacks.name_template` reference and
has awkward grammar; remove the duplicate reference so it only points once to
the `stacks.name_template` section and rewrite the sentence for clarity (e.g.,
"For more information on Atmos stack names and how to define them, refer to the
`stacks.name_template` section in the [`atmos.yaml` CLI config
file](/cli/configuration/)."), keeping the existing link and inline code
formatting.

Comment on lines +324 to 326
For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
sections in [`atmos.yaml` CLI config file](/cli/configuration/)
:::
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Correct reference: template + legacy pattern

The tip should reference stacks.name_template and legacy stacks.name_pattern (deprecated), not name_template twice.

-    For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
+    For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_pattern` (deprecated)
     sections in [`atmos.yaml` CLI config file](/cli/configuration/)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_template`
sections in [`atmos.yaml` CLI config file](/cli/configuration/)
:::
For more information on Atmos stack names and how to define them, refer to `stacks.name_template` and `stacks.name_pattern` (deprecated)
sections in [`atmos.yaml` CLI config file](/cli/configuration/)
🤖 Prompt for AI Agents
website/docs/core-concepts/stacks/yaml-functions/terraform.output.mdx around
lines 324 to 326: the tip currently references `stacks.name_template` twice;
update the text to reference `stacks.name_template` and the legacy/deprecated
`stacks.name_pattern` so it correctly points users to the current and legacy
config keys. Replace the second `stacks.name_template` with
`stacks.name_pattern` and keep wording that indicates `name_pattern` is
deprecated.

Comment on lines 16 to 21
### Error: `stack name pattern must be provided`

```console
stack name pattern must be provided in 'stacks.name_pattern' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable
stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable
```

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Correct heading and env var to “template”

The section title and console output should reference template and the new env var.

-### Error: `stack name pattern must be provided`
+### Error: `stack name template must be provided`

-```console
-stack name pattern must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable
-```
+```console
+stack name template must be provided in 'stacks.name_template' config or 'ATMOS_STACKS_NAME_TEMPLATE' ENV variable
+```
🤖 Prompt for AI Agents
In website/docs/troubleshoot/errors.mdx around lines 16 to 21, the heading and
example console output incorrectly use "name pattern" and the old env var;
update the heading and the console block to say "stack name template" and
replace 'ATMOS_STACKS_NAME_PATTERN' with 'ATMOS_STACKS_NAME_TEMPLATE' and ensure
the config key remains 'stacks.name_template' in the message.

Comment on lines +61 to +63
# name_template: "{tenant}-{environment}-{stage}" # DEPRECATED: Use name_template
name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Correct deprecation note

The deprecated key is name_pattern, not name_template.

-  # name_template: "{tenant}-{environment}-{stage}"  # DEPRECATED: Use name_template
+  # name_pattern: "{tenant}-{environment}-{stage}"  # DEPRECATED: Use name_template
   name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# name_template: "{tenant}-{environment}-{stage}" # DEPRECATED: Use name_template
name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
# name_pattern: "{tenant}-{environment}-{stage}" # DEPRECATED: Use name_template
name_template: "{{ .vars.tenant }}-{{ .vars.environment }}-{{ .vars.stage }}"
🤖 Prompt for AI Agents
In website/static/examples/schemas/atmos.yaml around lines 61 to 63, the
deprecation note incorrectly names the deprecated key as "name_template"; update
that comment to reference the correct deprecated key "name_pattern" (e.g.,
change "# name_template: ...  # DEPRECATED: Use name_template" to "#
name_pattern: ...  # DEPRECATED: Use name_template") so the comment accurately
reflects the deprecated key while keeping the suggested replacement.

Comment on lines +188 to +195
"name_template": {
"type": "string",
"description": "Pattern for stack names (legacy)"
},
"name_template": {
"type": "string",
"description": "Go template for stack names (preferred over name_template)"
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Duplicate key: “name_template” defined twice; introduce deprecated “name_pattern”.

JSON objects cannot have duplicate keys; first one is ignored. Align with deprecation plan.

-          "name_template": {
-            "type": "string",
-            "description": "Pattern for stack names (legacy)"
-          },
-          "name_template": {
+          "name_pattern": {
             "type": "string",
-            "description": "Go template for stack names (preferred over name_template)"
+            "description": "Legacy token-based pattern for stack names (use name_template instead)",
+            "deprecated": true
+          },
+          "name_template": {
+            "type": "string",
+            "description": "Go template for stack names (preferred over name_pattern)"
           }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"name_template": {
"type": "string",
"description": "Pattern for stack names (legacy)"
},
"name_template": {
"type": "string",
"description": "Go template for stack names (preferred over name_template)"
}
"name_pattern": {
"type": "string",
"description": "Legacy token-based pattern for stack names (use name_template instead)",
"deprecated": true
},
"name_template": {
"type": "string",
"description": "Go template for stack names (preferred over name_pattern)"
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 188-188: The key name_template was already declared.

This where a duplicated key was declared again.

If a key is defined multiple times, only the last definition takes effect. Previous definitions are ignored.

(lint/suspicious/noDuplicateObjectKeys)

🤖 Prompt for AI Agents
In website/static/schemas/atmos/1.0/cli.json around lines 188 to 195, there is a
duplicate "name_template" key; change the legacy entry to a new key
"name_pattern" (type: string) and update its description to indicate it's
deprecated/legacy (e.g., "Deprecated: pattern for stack names (legacy)"),
leaving the preferred "name_template" entry as-is; ensure there are no duplicate
keys after the rename.

@osterman osterman added the minor New features that do not break anything label Aug 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
minor New features that do not break anything needs-cloudposse Needs Cloud Posse assistance size/xl Extra large size PR triage Needs triage
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant