Skip to content

feat: Add interactive file generation for terraform, helmfile, and packer#1971

Merged
aknysh merged 21 commits intomainfrom
osterman/generate-example
Jan 22, 2026
Merged

feat: Add interactive file generation for terraform, helmfile, and packer#1971
aknysh merged 21 commits intomainfrom
osterman/generate-example

Conversation

@osterman
Copy link
Member

@osterman osterman commented Jan 15, 2026

Summary

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

What Changed

Core Features

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

Files Modified

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

Test Plan

  1. Test interactive prompting without arguments:

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

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

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

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

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

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

    make testacc

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

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

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

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

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

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

@osterman osterman requested review from a team as code owners January 15, 2026 01:07
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 15, 2026

📝 Walkthrough

Walkthrough

Adds interactive prompting for component/stack selection to terraform generate files, just-in-time (JIT) file generation for Terraform/Helmfile/Packer before path validation, deterministic HCL/.tfvars rendering with labeled-block support, generation summaries, extensive tests, an example project, and docs/site updates.

Changes

Cohort / File(s) Summary
Command Logic
cmd/terraform/generate/files.go
Replace strict component→stack validation with interactive prompts (shared.PromptForComponent, shared.PromptForStack), add shell completion (shared.ComponentsArgCompletion), and retain routing to ExecuteForAll/ExecuteForComponent.
Execution Integration
internal/exec/terraform.go, internal/exec/helmfile.go, internal/exec/packer.go
Add pre-validation JIT auto-generation when component schema AutoGenerateFiles is enabled and not dry-run: create component dir and call generator before path existence checks.
File Generation Core
pkg/terraform/generate/file_generator.go
Implement .tfvars serializer, labeled-block rendering, deterministic key ordering, Go→cty conversions, HCL writers, content-diff detection (Created/Updated/Skipped), relative-path messaging, and emitSummary.
Generate Flow (single-component)
pkg/terraform/generate/generate.go
Ensure component directory exists (mkdir) before generating files for a single component (non-dry-run).
Schema
pkg/schema/schema.go
Add AutoGenerateFiles bool to Helmfile and Packer component structs (YAML/JSON/mapstructure tags).
Examples
examples/generate-files/* (atmos.yaml, stacks/..., README.md, .gitignore)
Add a full example project demonstrating generation, templates, stacks, and generated artifacts.
Tests & Snapshots
tests/test-cases/generate-files.yaml, tests/snapshots/*.stdout.golden, cmd/terraform/generate/generate_test.go
Add comprehensive generate-files integration tests; update golden snapshots to include auto_generate_files: false; add files command validation unit tests.
Unit Tests (generator)
pkg/terraform/generate/file_generator_test.go, file_generator_internal_test.go
Add extensive tests for labeled HCL blocks, TFVars output, formatting, template rendering, edge cases, and processClean/processGenerate behaviors.
Docs & Site
website/blog/2026-01-15-interactive-file-generation.mdx, website/docs/cli/commands/terraform/generate/files.mdx, website/plugins/file-browser/index.js, website/src/data/roadmap.js, website/docs/cli/configuration/devcontainer.mdx
Add blog post, embed working example in docs, register generate-files tag/docs mapping, and add roadmap milestone.
Snapshots (describe outputs)
tests/snapshots/*
Add auto_generate_files: false to helmfile/packer sections in multiple describe snapshots.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant CLI as "atmos terraform generate files"
    participant Prompter as "shared Prompter"
    participant Loader as "Atmos Config Loader"
    participant Generator as "File Generator"
    participant FS as "Filesystem"
    participant Summary as "Summary Emitter"

    User->>CLI: run command (no args)
    CLI->>Prompter: PromptForComponent()
    Prompter-->>CLI: component
    CLI->>Prompter: PromptForStack()
    Prompter-->>CLI: stack
    CLI->>Loader: load component config
    Loader-->>CLI: config (+ generate section)
    alt AutoGenerateFiles enabled & not dry-run
        CLI->>FS: mkdir component dir
        FS-->>CLI: ok
        CLI->>Generator: generateFilesForComponent(component, stack)
        Generator->>Generator: render templates, serialize (.tf/.tfvars/.json/.md)
        Generator->>FS: write/read files
        Generator-->>CLI: results
    end
    CLI->>Summary: emitSummary(results)
    Summary-->>User: display change summary
Loading
sequenceDiagram
    participant Exec as "ExecuteTerraform/Helmfile/Packer"
    participant Config as "AtmosConfig"
    participant Component as "Component Schema"
    participant Generator as "FileGenerator"
    participant FS as "Filesystem"

    Exec->>Config: check AutoGenerateFiles
    Config-->>Exec: enabled?
    alt enabled & not dry-run
        Exec->>Component: Get generate section
        Component-->>Exec: generate config?
        alt generate present
            Exec->>FS: mkdir component dir
            FS-->>Exec: ok
            Exec->>Generator: generateFilesForComponent(...)
            Generator-->>Exec: files generated
        end
    end
    Exec->>Exec: continue with path validation & provisioning
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • osterman
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main feature: adding interactive file generation capability across three provisioners (terraform, helmfile, packer). It's specific and directly reflects the core changes in the PR.
Docstring Coverage ✅ Passed Docstring coverage is 94.74% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch osterman/generate-example

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added the size/xl Extra large size PR label Jan 15, 2026
@mergify
Copy link

mergify bot commented Jan 15, 2026

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.

@github-actions
Copy link

github-actions bot commented Jan 15, 2026

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

None

@osterman osterman added the minor New features that do not break anything label Jan 15, 2026
@github-actions
Copy link

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry - Add a blog post in website/blog/YYYY-MM-DD-feature-name.mdx
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

…cker

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

Key features:
- Auto-generate files BEFORE path validation when auto_generate_files is enabled, allowing components to be JIT created
- Add interactive prompting for component and stack selection (like terraform backend command)
- Make file generation idempotent by comparing existing content before writing
- Use deterministic output with sorted map keys to ensure reproducible file generation
- Show individual files changed plus a summary line in success output
- Add comprehensive example in examples/generate-files/ demonstrating the feature

Changes:
- pkg/terraform/generate/file_generator.go: Add idempotent generation, sorted keys, summary output
- pkg/terraform/generate/generate.go: Add directory creation before file generation
- cmd/terraform/generate/files.go: Add interactive prompting for component/stack
- internal/exec/terraform.go: Add auto-generation during terraform execution
- internal/exec/helmfile.go: Add auto-generation during helmfile execution
- internal/exec/packer.go: Add auto-generation during packer execution
- pkg/schema/schema.go: Add AutoGenerateFiles config for helmfile and packer
- examples/generate-files/: Add complete working example with terraform configurations

This enables the full file generation workflow where users can define file templates in stack configuration and have them automatically generated and managed by atmos.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@osterman osterman force-pushed the osterman/generate-example branch from 8293a22 to 59e8305 Compare January 15, 2026 22:31
@github-actions
Copy link

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry - Add a blog post in website/blog/YYYY-MM-DD-feature-name.mdx
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

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: 9

🤖 Fix all issues with AI agents
In `@cmd/terraform/generate/files.go`:
- Around line 59-88: The list helpers (listTerraformComponents,
listStacksForComponent, listAllStacks) build an empty ConfigAndStacksInfo and
call InitCliConfig, which ignores config-selection flags; change each helper
signature to accept cmd *cobra.Command, create a ConfigAndStacksInfo variable,
call flags.ParseGlobalFlags(cmd, &v) to populate it, then pass that populated v
into InitCliConfig (and any subsequent calls) so --base-path, --config,
--config-path, and --profile are honored, mirroring the established pattern used
elsewhere.

In `@examples/generate-files/README.md`:
- Around line 139-158: The README example’s ASCII tree code block is missing a
language specifier; update the fenced code block surrounding the project
structure (the triple backticks before/after the tree in
examples/generate-files/README.md) to include a plain-text language identifier
(e.g., change ``` to ```text or ```plaintext) so markdown renders the ASCII
diagram correctly.

In `@internal/exec/helmfile.go`:
- Around line 92-109: Auto-generation currently runs unconditionally and can
mutate files during dry-run or when components are locked/abstract; gate the
mkdir and generateFilesForComponent call behind a dry-run check and ensure
locked/abstract metadata checks run before this block. Specifically, update the
branch that checks atmosConfig.Components.Helmfile.AutoGenerateFiles and
tfgenerate.GetGenerateSectionFromComponent to first short-circuit if info.DryRun
is true (skip os.MkdirAll and generateFilesForComponent) and/or move the
existing locked/abstract validation for the component above this auto-generation
block so generation only runs for non-dry-run, non-locked, non-abstract
operations; keep references to os.MkdirAll(componentPath) and
generateFilesForComponent(&atmosConfig, &info, componentPath) when applying the
gate.
- Around line 92-107: Add trailing periods to the comment list lines and replace
the two fmt.Errorf returns so they wrap the canonical static errors from
errors/errors.go (e.g., use the package error constants instead of raw messages)
while preserving the original error via %w; specifically, update the error
returns in the block that checks
atmosConfig.Components.Helmfile.AutoGenerateFiles (around
tfgenerate.GetGenerateSectionFromComponent) so the os.MkdirAll failure return
and the generateFilesForComponent failure return wrap the appropriate errors
from errors/errors.go (reference the mkdir failure at the os.MkdirAll call and
the generation failure at generateFilesForComponent) using fmt.Errorf with %w to
include the underlying mkdirErr and genErr.

In `@internal/exec/packer.go`:
- Around line 82-97: Add trailing periods to each item in the comment list
(lines describing auto_generate_files and generate section) so comments end with
punctuation; replace the two raw fmt.Errorf returns with wrapped, lint-compliant
errors using the predefined error variables from errors/errors.go (e.g., wrap
the mkdir failure with the component-directory error constant and the generation
failure with the auto-generate error constant) by using fmt.Errorf("%w: %v",
errors.ErrCreateComponentDir, mkdirErr) and fmt.Errorf("%w: %v",
errors.ErrAutoGenerateFiles, genErr) (or the project's preferred wrapping
helper), keeping references to atmosConfig.Components.Packer.AutoGenerateFiles,
tfgenerate.GetGenerateSectionFromComponent, os.MkdirAll, and
generateFilesForComponent to locate the change.
- Around line 82-99: Auto-generation currently runs even during dry-run and
before abstract/locked checks; gate it so it never mutates state or filesystem
in dry-run. Wrap the existing block checking
atmosConfig.Components.Packer.AutoGenerateFiles and calling
tfgenerate.GetGenerateSectionFromComponent and generateFilesForComponent with a
check for !info.DryRun, and ensure any metadata/abstract/locked guards (the code
that inspects component metadata and lock/abstract status) run before this
auto-generation block; also avoid calling os.MkdirAll(componentPath) when
info.DryRun is true (skip mkdir and generateFilesForComponent in dry-run).

In `@internal/exec/terraform.go`:
- Around line 220-235: Update the comment list lines under the auto-generate
block to end with periods to satisfy godot, and replace direct fmt.Errorf wraps
that return raw mkdirErr/genErr with wrapped sentinel errors from
errors/errors.go: when failing to create the component directory (os.MkdirAll)
wrap the underlying mkdirErr with the appropriate exported sentinel (e.g.,
errors.ErrAutoGenerateFiles or the matching sentinel) using fmt.Errorf("%w: %v",
errors.ErrAutoGenerateFiles, mkdirErr), and do the same for
generateFilesForComponent errors (wrap genErr with the same or a more specific
sentinel). Ensure you reference the existing symbols
atmosConfig.Components.Terraform.AutoGenerateFiles,
tfgenerate.GetGenerateSectionFromComponent, os.MkdirAll, and
generateFilesForComponent and keep the existing nolint comments.
- Around line 214-237: The auto-generation block (checking
atmosConfig.Components.Terraform.AutoGenerateFiles and calling
tfgenerate.GetGenerateSectionFromComponent, os.MkdirAll, and
generateFilesForComponent) mutates disk even during dry-run and before
lock/abstract checks; update the logic to short-circuit when info.DryRun is true
(i.e., only proceed with mkdir/generation if !info.DryRun) and/or move the
metadata/lock/abstract validation to run before GetComponentPath/auto-generation
so generation is skipped for mutating subcommands and dry-run flows; reference
GetComponentPath, info.ComponentSection,
tfgenerate.GetGenerateSectionFromComponent, os.MkdirAll, and
generateFilesForComponent to locate and adjust the conditional gating.

In `@pkg/terraform/generate/file_generator.go`:
- Around line 512-536: The fmt.Errorf calls in writeLabeledBlocks (the two error
returns that currently use //nolint:err113) must be replaced by wrapped errors
using the static sentinel (errUtils.ErrInvalidConfig); change each
fmt.Errorf(...) to wrap errUtils.ErrInvalidConfig using Go error wrapping (e.g.,
fmt.Errorf("%w: labeled block <desc> expects a map, got %T",
errUtils.ErrInvalidConfig, ...)) so you preserve the dynamic details
(firstLabel/secondLabel and the actual type) while classifying the error as
ErrInvalidConfig; update both the single-label and double-label error returns in
writeLabeledBlocks accordingly.
🧹 Nitpick comments (4)
examples/generate-files/.gitignore (1)

4-8: Consider ignoring generated .tfvars files as well.

With TFVars generation now supported, the example workflow may emit .tfvars artifacts; adding it here helps prevent accidental commits.

🧹 Suggested update
 # Terraform
 .terraform/
 *.tfstate*
 *.tfvars.json
+*.tfvars
 backend.tf.json
pkg/terraform/generate/file_generator.go (1)

116-178: Sort summary file lists for stable CLI output.

The created/updated/deleted slices inherit map iteration order, so output order can vary. Sorting before printing keeps the UI deterministic.

♻️ Suggested update
 	relDir := relativePath(componentDir)
 
+	sort.Strings(createdFiles)
+	sort.Strings(updatedFiles)
+	sort.Strings(deletedFiles)
+
 	// Show individual files that changed.
 	for _, f := range createdFiles {
 		_ = ui.Successf("Created `%s/%s`", relDir, f)
 	}
pkg/terraform/generate/generate.go (1)

253-257: Error handling could surface failures more visibly.

Logging errors and continuing is reasonable for batch processing, but callers won't know if any components failed. Consider returning aggregated errors or a summary count.

internal/exec/terraform.go (1)

214-237: Avoid double generation when auto-generation already ran.

With this early generation plus the later generateFilesForComponent call, generation can execute twice (extra work + duplicate UI output). Consider tracking a autoGenerated flag and skipping the later call when it already ran.

♻️ Sketch of a flag-based approach
-	// Auto-generate files BEFORE path validation when:
+	autoGenerated := false
+	// Auto-generate files BEFORE path validation when:
 	if atmosConfig.Components.Terraform.AutoGenerateFiles { //nolint:nestif
 		generateSection := tfgenerate.GetGenerateSectionFromComponent(info.ComponentSection)
 		if generateSection != nil {
 			// Ensure component directory exists for file generation.
 			if mkdirErr := os.MkdirAll(componentPath, 0o755); mkdirErr != nil { //nolint:revive
 				return fmt.Errorf("failed to create component directory for auto-generation: %w", mkdirErr)
 			}
 			// Generate files before path validation.
 			if genErr := generateFilesForComponent(&atmosConfig, &info, componentPath); genErr != nil {
 				return fmt.Errorf("failed to auto-generate files: %w", genErr)
 			}
+			autoGenerated = true
 		}
 	}
// Later, before the existing generateFilesForComponent call:
if !autoGenerated {
    if err := generateFilesForComponent(&atmosConfig, &info, workingDir); err != nil { ... }
}
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 806f2e1 and 59e8305.

📒 Files selected for processing (15)
  • cmd/terraform/generate/files.go
  • examples/generate-files/.gitignore
  • examples/generate-files/README.md
  • examples/generate-files/atmos.yaml
  • examples/generate-files/stacks/catalog/demo.yaml
  • examples/generate-files/stacks/deploy/dev.yaml
  • examples/generate-files/stacks/deploy/prod.yaml
  • internal/exec/helmfile.go
  • internal/exec/packer.go
  • internal/exec/terraform.go
  • pkg/schema/schema.go
  • pkg/terraform/generate/file_generator.go
  • pkg/terraform/generate/file_generator_internal_test.go
  • pkg/terraform/generate/file_generator_test.go
  • pkg/terraform/generate/generate.go
🧰 Additional context used
📓 Path-based instructions (4)
**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*.go: Use Viper for managing configuration, environment variables, and flags in CLI commands
Use interfaces for external dependencies to facilitate mocking and consider using testify/mock for creating mock implementations
All code must pass golangci-lint checks
Follow Go's error handling idioms: use meaningful error messages, wrap errors with context using fmt.Errorf("context: %w", err), and consider using custom error types for domain-specific errors
Follow standard Go coding style: use gofmt and goimports to format code, prefer short descriptive variable names, use kebab-case for command-line flags, and snake_case for environment variables
Document all exported functions, types, and methods following Go's documentation conventions
Document complex logic with inline comments in Go code
Support configuration via files, environment variables, and flags following the precedence order: flags > environment variables > config file > defaults
Provide clear error messages to users, include troubleshooting hints when appropriate, and log detailed errors for debugging

**/*.go: All comments must end with periods (enforced by godot linter) in Go code
Organize imports into three groups separated by blank lines, sorted alphabetically: Go stdlib, 3rd-party (NOT cloudposse/atmos), then Atmos packages with maintained aliases (cfg, log, u, errUtils)
All errors MUST be wrapped using static errors defined in errors/errors.go - use errors.Join for combining errors, fmt.Errorf with %w for context, and errors.Is() for error checking
Never manually create mocks - use go.uber.org/mock/mockgen with //go:generate directives in Go code
Keep files small and focused - under 600 lines with one cmd/impl per file, co-locate tests, never use //revive:disable:file-length-limit
Use colors from pkg/ui/theme/colors.go for all UI theming in Go code
Code must be compatible with Linux, macOS, and Windows - use SDKs over binaries, use filepath.Join() instead of h...

Files:

  • pkg/terraform/generate/file_generator_internal_test.go
  • pkg/schema/schema.go
  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
  • pkg/terraform/generate/generate.go
  • pkg/terraform/generate/file_generator_test.go
  • cmd/terraform/generate/files.go
  • pkg/terraform/generate/file_generator.go
**/*_test.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*_test.go: Every new feature must include comprehensive unit tests targeting >80% code coverage for all packages
Use table-driven tests for testing multiple scenarios in Go
Include integration tests for command flows and test CLI end-to-end when possible with test fixtures

Prefer unit tests with mocks over integration tests - use interfaces and dependency injection for testability, generate mocks with go.uber.org/mock/mockgen, use table-driven tests, target >80% coverage

Files:

  • pkg/terraform/generate/file_generator_internal_test.go
  • pkg/terraform/generate/file_generator_test.go
**/{pkg,internal,cmd}/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Add defer perf.Track(atmosConfig, "pkg.FuncName")() plus blank line to all public functions, using nil if no atmosConfig param - exceptions: trivial getters/setters, command constructors, simple factories, functions delegating to tracked functions

Files:

  • pkg/terraform/generate/file_generator_internal_test.go
  • pkg/schema/schema.go
  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
  • pkg/terraform/generate/generate.go
  • pkg/terraform/generate/file_generator_test.go
  • cmd/terraform/generate/files.go
  • pkg/terraform/generate/file_generator.go
cmd/**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

cmd/**/*.go: Use Cobra's recommended command structure with a root command and subcommands, implementing each command in a separate file under cmd/ directory
Provide comprehensive help text for all commands and flags, include examples in command help, and follow Go's documentation conventions in Cobra command definitions
Provide meaningful feedback to users and include progress indicators for long-running operations in CLI commands

Files:

  • cmd/terraform/generate/files.go
🧠 Learnings (57)
📓 Common learnings
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
📚 Learning: 2025-12-21T04:10:29.030Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1891
File: internal/exec/describe_affected.go:468-468
Timestamp: 2025-12-21T04:10:29.030Z
Learning: In Go, package-level declarations (constants, variables, types, and functions) are visible to all files in the same package without imports. During reviews in cloudposse/atmos (and similar Go codebases), before suggesting to declare a new identifier, first check if it already exists in another file of the same package. If it exists, you can avoid adding a new declaration; if not, proceed with a proper package-level declaration. 

Applied to files:

  • pkg/terraform/generate/file_generator_internal_test.go
  • pkg/schema/schema.go
  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
  • pkg/terraform/generate/generate.go
  • pkg/terraform/generate/file_generator_test.go
  • cmd/terraform/generate/files.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-12-08T14:26:16.972Z
Learnt from: pkbhowmick
Repo: cloudposse/atmos PR: 828
File: pkg/schema/schema.go:98-100
Timestamp: 2024-12-08T14:26:16.972Z
Learning: The `ListConfig` columns array in the `Components` struct can be empty.

Applied to files:

  • pkg/schema/schema.go
📚 Learning: 2024-12-07T16:16:13.038Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 825
File: internal/exec/helmfile_generate_varfile.go:28-31
Timestamp: 2024-12-07T16:16:13.038Z
Learning: In `internal/exec/helmfile_generate_varfile.go`, the `--help` command (`./atmos helmfile generate varfile --help`) works correctly without requiring stack configurations, and the only change needed was to make `ProcessCommandLineArgs` exportable by capitalizing its name.

Applied to files:

  • internal/exec/helmfile.go
  • pkg/terraform/generate/generate.go
  • examples/generate-files/atmos.yaml
  • cmd/terraform/generate/files.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-09-29T02:20:11.636Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1540
File: internal/exec/validate_component.go:117-118
Timestamp: 2025-09-29T02:20:11.636Z
Learning: The ValidateComponent function in internal/exec/validate_component.go had its componentSection parameter type refined from `any` to `map[string]any` without adding new parameters. This is a type safety improvement, not a signature change requiring call site updates.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/packer.go
  • cmd/terraform/generate/files.go
📚 Learning: 2024-12-12T15:17:45.245Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 808
File: examples/demo-atmos.d/atmos.d/tools/helmfile.yml:10-10
Timestamp: 2024-12-12T15:17:45.245Z
Learning: In `examples/demo-atmos.d/atmos.d/tools/helmfile.yml`, when suggesting changes to `kubeconfig_path`, ensure that the values use valid Go template syntax.

Applied to files:

  • internal/exec/helmfile.go
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-07-05T20:59:02.914Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1363
File: internal/exec/template_utils.go:18-18
Timestamp: 2025-07-05T20:59:02.914Z
Learning: In the Atmos project, gomplate v4 is imported with a blank import (`_ "github.com/hairyhenderson/gomplate/v4"`) alongside v3 imports to resolve AWS SDK version conflicts. V3 uses older AWS SDK versions that conflict with newer AWS modules used by Atmos. A full migration to v4 requires extensive refactoring due to API changes and should be handled in a separate PR.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
  • cmd/terraform/generate/files.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Organize imports into three groups separated by blank lines, sorted alphabetically: Go stdlib, 3rd-party (NOT cloudposse/atmos), then Atmos packages with maintained aliases (`cfg`, `log`, `u`, `errUtils`)

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
📚 Learning: 2025-12-24T04:29:23.938Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1891
File: pkg/ci/terraform/templates/apply.md:17-17
Timestamp: 2025-12-24T04:29:23.938Z
Learning: In the cloudposse/atmos repository, Terraform CI templates (pkg/ci/terraform/templates/*.md) are rendered using TerraformTemplateContext (defined in pkg/ci/terraform/context.go), not the base ci.TemplateContext. TerraformTemplateContext provides top-level fields: .Resources (ci.ResourceCounts), .HasChanges() method, and .HasDestroy field, which are correctly accessed directly in templates without a .Result prefix.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/packer.go
  • examples/generate-files/README.md
  • examples/generate-files/stacks/catalog/demo.yaml
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-09-13T18:06:07.674Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 1466
File: toolchain/list.go:39-42
Timestamp: 2025-09-13T18:06:07.674Z
Learning: In the cloudposse/atmos repository, for UI messages in the toolchain package, use utils.PrintfMessageToTUI instead of log.Error or fmt.Fprintln(os.Stderr, ...). Import pkg/utils with alias "u" to follow the established pattern.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/packer.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/{pkg,internal,cmd}/**/*.go : Add `defer perf.Track(atmosConfig, "pkg.FuncName")()` plus blank line to all public functions, using `nil` if no atmosConfig param - exceptions: trivial getters/setters, command constructors, simple factories, functions delegating to tracked functions

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/packer.go
📚 Learning: 2024-10-28T01:51:30.811Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:329-332
Timestamp: 2024-10-28T01:51:30.811Z
Learning: In the Atmos Go code, when deleting directories or handling file paths (e.g., in `terraform_clean.go`), always resolve the absolute path using `filepath.Abs` and use the logger `u.LogWarning` for logging messages instead of using `fmt.Printf`.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/packer.go
  • pkg/terraform/generate/generate.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-11-12T03:16:02.910Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 775
File: internal/exec/template_funcs_component.go:157-159
Timestamp: 2024-11-12T03:16:02.910Z
Learning: In the Go code for `componentFunc` in `internal/exec/template_funcs_component.go`, the function `cleanTerraformWorkspace` does not return errors, and it's acceptable if the file does not exist. Therefore, error handling for `cleanTerraformWorkspace` is not needed.

Applied to files:

  • internal/exec/helmfile.go
  • internal/exec/terraform.go
  • internal/exec/packer.go
  • pkg/terraform/generate/generate.go
  • cmd/terraform/generate/files.go
📚 Learning: 2024-11-02T15:35:09.958Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 759
File: internal/exec/terraform.go:366-368
Timestamp: 2024-11-02T15:35:09.958Z
Learning: In `internal/exec/terraform.go`, the workspace cleaning code under both the general execution path and within the `case "init":` block is intentionally duplicated because the code execution paths are different. The `.terraform/environment` file should be deleted before executing `terraform init` in both scenarios to ensure a clean state.

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/generate.go
📚 Learning: 2024-10-27T04:41:49.199Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:215-223
Timestamp: 2024-10-27T04:41:49.199Z
Learning: In `internal/exec/terraform_clean.go`, the function `determineCleanPath` is necessary and should not be removed.

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/generate.go
📚 Learning: 2024-10-27T04:28:40.966Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:155-175
Timestamp: 2024-10-27T04:28:40.966Z
Learning: In the `CollectDirectoryObjects` function in `internal/exec/terraform_clean.go`, recursive search through all subdirectories is not needed.

Applied to files:

  • pkg/terraform/generate/generate.go
📚 Learning: 2024-11-24T19:13:10.287Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:407-416
Timestamp: 2024-11-24T19:13:10.287Z
Learning: In `internal/exec/terraform_clean.go`, when `getStackTerraformStateFolder` returns an error in the `handleCleanSubCommand` function, the error is logged, and the process continues without returning the error.

Applied to files:

  • pkg/terraform/generate/generate.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Never manually create mocks - use `go.uber.org/mock/mockgen` with `//go:generate` directives in Go code

Applied to files:

  • pkg/terraform/generate/generate.go
📚 Learning: 2026-01-09T04:49:35.038Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1907
File: demos/fixtures/acme/stacks/catalog/api.yaml:1-29
Timestamp: 2026-01-09T04:49:35.038Z
Learning: In the cloudposse/atmos demos/fixtures, components can provide Terraform outputs via `remote_state_backend.static` configuration blocks instead of traditional Terraform output blocks. This pattern is used for demo/fixture purposes to simulate cross-component state references without deploying actual infrastructure. The `!terraform.state` YAML function reads from these static backends.

Applied to files:

  • examples/generate-files/stacks/deploy/prod.yaml
  • examples/generate-files/.gitignore
  • examples/generate-files/README.md
  • examples/generate-files/stacks/deploy/dev.yaml
  • examples/generate-files/stacks/catalog/demo.yaml
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-03-18T12:26:25.329Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 1149
File: tests/snapshots/TestCLICommands_atmos_vendor_pull_ssh.stderr.golden:7-7
Timestamp: 2025-03-18T12:26:25.329Z
Learning: In the Atmos project, typos or inconsistencies in test snapshot files (such as "terrafrom" instead of "terraform") may be intentional as they capture the exact output of commands and should not be flagged as issues requiring correction.

Applied to files:

  • examples/generate-files/README.md
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-11-01T20:24:29.557Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1714
File: NOTICE:0-0
Timestamp: 2025-11-01T20:24:29.557Z
Learning: In the cloudposse/atmos repository, the NOTICE file is programmatically generated and should not be manually edited. Issues with dependency license URLs in NOTICE will be resolved when upstream package metadata is corrected.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-01-25T03:51:57.689Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.

Applied to files:

  • examples/generate-files/README.md
  • examples/generate-files/atmos.yaml
📚 Learning: 2024-11-25T17:17:15.703Z
Learnt from: RoseSecurity
Repo: cloudposse/atmos PR: 797
File: pkg/list/atmos.yaml:213-214
Timestamp: 2024-11-25T17:17:15.703Z
Learning: The file `pkg/list/atmos.yaml` is primarily intended for testing purposes.

Applied to files:

  • examples/generate-files/README.md
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-09-10T21:17:55.273Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 1466
File: toolchain/http_client_test.go:3-10
Timestamp: 2025-09-10T21:17:55.273Z
Learning: In the cloudposse/atmos repository, imports should never be changed as per samtholiya's coding guidelines.

Applied to files:

  • examples/generate-files/README.md
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-09-13T16:39:20.007Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 1466
File: cmd/markdown/atmos_toolchain_aliases.md:2-4
Timestamp: 2025-09-13T16:39:20.007Z
Learning: In the cloudposse/atmos repository, CLI documentation files in cmd/markdown/ follow a specific format that uses " $ atmos command" (with leading space and dollar sign prompt) in code blocks. This is the established project convention and should not be changed to comply with standard markdownlint rules MD040 and MD014.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2024-12-01T00:33:20.298Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 810
File: examples/tests/stacks/catalog/terraform/template-functions-test2/defaults.yaml:28-32
Timestamp: 2024-12-01T00:33:20.298Z
Learning: In `examples/tests/stacks/catalog/terraform/template-functions-test2/defaults.yaml`, `!exec atmos terraform output` is used in examples to demonstrate its usage, even though `!terraform.output` is the recommended approach according to the documentation.

Applied to files:

  • examples/generate-files/README.md
  • examples/generate-files/stacks/catalog/demo.yaml
  • examples/generate-files/atmos.yaml
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*_test.go : Every new feature must include comprehensive unit tests targeting >80% code coverage for all packages

Applied to files:

  • pkg/terraform/generate/file_generator_test.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*_test.go : Use table-driven tests for testing multiple scenarios in Go

Applied to files:

  • pkg/terraform/generate/file_generator_test.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*_test.go : Include integration tests for command flows and test CLI end-to-end when possible with test fixtures

Applied to files:

  • pkg/terraform/generate/file_generator_test.go
📚 Learning: 2025-01-25T15:21:40.413Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 808
File: examples/demo-atmos-cli-imports/atmos.yaml:8-8
Timestamp: 2025-01-25T15:21:40.413Z
Learning: In Atmos, when a directory is specified for configuration loading (e.g., in the `import` section of atmos.yaml), all files within that directory should be treated as Atmos configurations. Do not suggest restricting file extensions in directory-based glob patterns.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2025-01-08T19:01:32.938Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 899
File: examples/tests/test-vendor/test-components/main.tf:1-7
Timestamp: 2025-01-08T19:01:32.938Z
Learning: In the examples/tests directory of the atmos project, code examples are intentionally kept minimal and simple to facilitate understanding. Avoid suggesting additional complexity or validations that might make the examples harder to follow.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2025-12-13T03:21:35.786Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1813
File: cmd/terraform/shell.go:28-73
Timestamp: 2025-12-13T03:21:35.786Z
Learning: In Atmos, when calling cfg.InitCliConfig, you must first populate the schema.ConfigAndStacksInfo struct with global flag values using flags.ParseGlobalFlags(cmd, v) rather than passing an empty struct. The LoadConfig function (pkg/config/load.go) reads config selection fields (AtmosConfigFilesFromArg, AtmosConfigDirsFromArg, BasePath, ProfilesFromArg) directly from the ConfigAndStacksInfo struct, NOT from Viper. Passing an empty struct causes config selection flags (--base-path, --config, --config-path, --profile) to be silently ignored. Correct pattern: parse flags → populate struct → call InitCliConfig. See cmd/terraform/plan_diff.go for reference implementation.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2024-12-02T21:26:32.337Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 808
File: pkg/config/config.go:478-483
Timestamp: 2024-12-02T21:26:32.337Z
Learning: In the 'atmos' project, when reviewing Go code like `pkg/config/config.go`, avoid suggesting file size checks after downloading remote configs if such checks aren't implemented elsewhere in the codebase.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2024-12-03T05:29:07.718Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 810
File: internal/exec/terraform_utils.go:145-146
Timestamp: 2024-12-03T05:29:07.718Z
Learning: In the Atmos project, a 5-minute timeout in the `execTerraformOutput` function is acceptable for retrieving `terraform output` for a component in a stack.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2025-09-05T14:57:37.360Z
Learnt from: RoseSecurity
Repo: cloudposse/atmos PR: 1448
File: cmd/ansible.go:26-28
Timestamp: 2025-09-05T14:57:37.360Z
Learning: The Atmos codebase uses a consistent pattern for commands that delegate to external tools: `PersistentFlags().Bool("", false, doubleDashHint)` where doubleDashHint provides help text about using double dashes to separate Atmos options from native command arguments. This pattern is used across terraform, packer, helmfile, atlantis, aws, and ansible commands.

Applied to files:

  • examples/generate-files/atmos.yaml
📚 Learning: 2024-12-11T18:40:12.808Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 844
File: cmd/helmfile.go:37-37
Timestamp: 2024-12-11T18:40:12.808Z
Learning: In the atmos project, `cliConfig` is initialized within the `cmd` package in `root.go` and can be used in other command files.

Applied to files:

  • examples/generate-files/atmos.yaml
  • cmd/terraform/generate/files.go
📚 Learning: 2025-01-09T22:27:25.538Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 914
File: cmd/validate_stacks.go:20-23
Timestamp: 2025-01-09T22:27:25.538Z
Learning: The validate commands in Atmos can have different help handling implementations. Specifically, validate_component.go and validate_stacks.go are designed to handle help requests differently, with validate_stacks.go including positional argument checks while validate_component.go does not.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2024-12-07T16:19:01.683Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 825
File: internal/exec/terraform.go:30-30
Timestamp: 2024-12-07T16:19:01.683Z
Learning: In `internal/exec/terraform.go`, skipping stack validation when help flags are present is not necessary.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2024-11-16T17:30:52.893Z
Learnt from: pkbhowmick
Repo: cloudposse/atmos PR: 786
File: internal/exec/shell_utils.go:159-162
Timestamp: 2024-11-16T17:30:52.893Z
Learning: For the `atmos terraform shell` command in `internal/exec/shell_utils.go`, input validation for the custom shell prompt is not required, as users will use this as a CLI tool and any issues will impact themselves.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2024-10-21T17:51:53.976Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform.go:114-118
Timestamp: 2024-10-21T17:51:53.976Z
Learning: When `atmos terraform clean --everything` is used without specifying a component and without the `--force` flag, prompt the user for confirmation before deleting all components. Use the `--force` flag to skip the confirmation prompt.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-01-09T22:37:01.004Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 914
File: cmd/terraform_commands.go:260-265
Timestamp: 2025-01-09T22:37:01.004Z
Learning: In the terraform commands implementation (cmd/terraform_commands.go), the direct use of `os.Args[2:]` for argument handling is intentionally preserved to avoid extensive refactoring. While it could be improved to use cobra's argument parsing, such changes should be handled in a dedicated PR to maintain focus and minimize risk.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-10-07T00:25:16.333Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1498
File: website/src/components/Screengrabs/atmos-terraform-metadata--help.html:25-55
Timestamp: 2025-10-07T00:25:16.333Z
Learning: In Atmos CLI, subcommands inherit flags from their parent commands via Cobra's command inheritance. For example, `atmos terraform metadata --help` shows `--affected` and related flags inherited from the parent `terraform` command (defined in cmd/terraform.go), even though the metadata subcommand doesn't explicitly define these flags. This is expected Cobra behavior and auto-generated help screengrabs accurately reflect this inheritance.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*.go : Use Viper for managing configuration, environment variables, and flags in CLI commands

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Use `viper.BindEnv("ATMOS_VAR", "ATMOS_VAR", "FALLBACK")` for environment variables - ATMOS_ prefix required in Go code

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-12-13T03:21:27.620Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1813
File: cmd/terraform/shell.go:28-73
Timestamp: 2025-12-13T03:21:27.620Z
Learning: In Atmos, when initializing CLI config via cfg.InitCliConfig, always first populate the ConfigAndStacksInfo struct with global flag values by calling flags.ParseGlobalFlags(cmd, v) before LoadConfig. LoadConfig (pkg/config/load.go) reads config selection fields (AtmosConfigFilesFromArg, AtmosConfigDirsFromArg, BasePath, ProfilesFromArg) from the ConfigAndStacksInfo struct, not from Viper. Passing an empty struct causes the --base-path, --config, --config-path, and --profile flags to be ignored. Recommended pattern: parse flags → populate struct → call InitCliConfig. See cmd/terraform/plan_diff.go for reference implementation.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-08-29T20:57:35.423Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1433
File: cmd/theme_list.go:33-36
Timestamp: 2025-08-29T20:57:35.423Z
Learning: In the Atmos codebase, avoid using viper.SetEnvPrefix("ATMOS") with viper.AutomaticEnv() because canonical environment variable names are not exclusive to Atmos and could cause conflicts. Instead, use selective environment variable binding through the setEnv function in pkg/config/load.go with bindEnv(v, "config.key", "ENV_VAR_NAME") for specific environment variables.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-11-08T19:56:18.660Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1697
File: internal/exec/oci_utils.go:0-0
Timestamp: 2025-11-08T19:56:18.660Z
Learning: In the Atmos codebase, when a function receives an `*schema.AtmosConfiguration` parameter, it should read configuration values from `atmosConfig.Settings` fields rather than using direct `os.Getenv()` or `viper.GetString()` calls. The Atmos pattern is: viper.BindEnv in cmd/root.go binds environment variables → Viper unmarshals into atmosConfig.Settings via mapstructure → business logic reads from the Settings struct. This provides centralized config management, respects precedence, and enables testability. Example: `atmosConfig.Settings.AtmosGithubToken` instead of `os.Getenv("ATMOS_GITHUB_TOKEN")` in functions like `getGHCRAuth` in internal/exec/oci_utils.go.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2024-10-20T13:12:46.499Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 736
File: pkg/config/const.go:6-6
Timestamp: 2024-10-20T13:12:46.499Z
Learning: In `cmd/cmd_utils.go`, it's acceptable to have hardcoded references to `atmos.yaml` in logs, and it's not necessary to update them to use the `CliConfigFileName` constant.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-12-13T04:37:40.435Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: cmd/toolchain/get.go:23-40
Timestamp: 2025-12-13T04:37:40.435Z
Learning: In Go CLI command files using Cobra, constrain the subcommand to accept at most one positional argument (MaximumNArgs(1)) so it supports both listing all items (zero args) and fetching a specific item (one arg). Define and parse flags with a standard parser (e.g., flags.NewStandardParser()) and avoid binding flags to Viper (no viper.BindEnv/BindPFlag). This promotes explicit argument handling and predictable flag behavior across command files.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2024-11-13T21:37:07.852Z
Learnt from: Cerebrovinny
Repo: cloudposse/atmos PR: 764
File: internal/exec/describe_stacks.go:289-295
Timestamp: 2024-11-13T21:37:07.852Z
Learning: In the `internal/exec/describe_stacks.go` file of the `atmos` project written in Go, avoid extracting the stack name handling logic into a helper function within the `ExecuteDescribeStacks` method, even if the logic appears duplicated.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-08-16T23:32:40.412Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1405
File: internal/exec/describe_dependents_test.go:455-456
Timestamp: 2025-08-16T23:32:40.412Z
Learning: In the cloudposse/atmos Go codebase, `InitCliConfig` returns a `schema.AtmosConfiguration` value (not a pointer), while `ExecuteDescribeDependents` expects a `*schema.AtmosConfiguration` pointer parameter. Therefore, when passing the result of `InitCliConfig` to `ExecuteDescribeDependents`, use `&atmosConfig` to pass the address of the value.

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-08-16T23:33:07.477Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1405
File: internal/exec/describe_dependents_test.go:651-652
Timestamp: 2025-08-16T23:33:07.477Z
Learning: In the cloudposse/atmos Go codebase, ExecuteDescribeDependents expects a pointer to AtmosConfiguration (*schema.AtmosConfiguration), so when calling it with a value returned by cfg.InitCliConfig (which returns schema.AtmosConfiguration), the address-of operator (&) is necessary: ExecuteDescribeDependents(&atmosConfig, ...).

Applied to files:

  • cmd/terraform/generate/files.go
📚 Learning: 2025-10-10T23:51:36.597Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1599
File: internal/exec/terraform.go:394-402
Timestamp: 2025-10-10T23:51:36.597Z
Learning: In Atmos (internal/exec/terraform.go), when adding OpenTofu-specific flags like `--var-file` for `init`, do not gate them based on command name (e.g., checking if `info.Command == "tofu"` or `info.Command == "opentofu"`) because command names don't reliably indicate the actual binary being executed (symlinks, aliases). Instead, document the OpenTofu requirement in code comments and documentation, trusting users who enable the feature (e.g., `PassVars`) to ensure their terraform command points to an OpenTofu binary.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-06-23T02:14:30.937Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1327
File: cmd/terraform.go:111-117
Timestamp: 2025-06-23T02:14:30.937Z
Learning: In cmd/terraform.go, flags for the DescribeAffected function are added dynamically at runtime when info.Affected is true. This is intentional to avoid exposing internal flags like "file", "format", "verbose", "include-spacelift-admin-stacks", "include-settings", and "upload" in the terraform command interface, while still providing them for the shared DescribeAffected function used by both `atmos describe affected` and `atmos terraform apply --affected`.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: New config templates support Go templating with `FuncMap()` from `internal/exec/template_funcs.go`

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Code must be compatible with Linux, macOS, and Windows - use SDKs over binaries, use `filepath.Join()` instead of hardcoded path separators

Applied to files:

  • pkg/terraform/generate/file_generator.go
🧬 Code graph analysis (4)
internal/exec/helmfile.go (2)
pkg/schema/schema.go (1)
  • Helmfile (451-462)
pkg/terraform/generate/generate.go (1)
  • GetGenerateSectionFromComponent (261-274)
internal/exec/terraform.go (3)
pkg/terraform/generate/generate.go (2)
  • GetComponentPath (394-404)
  • GetGenerateSectionFromComponent (261-274)
pkg/utils/component_path_utils.go (1)
  • GetComponentPath (255-291)
pkg/schema/schema.go (1)
  • Terraform (414-437)
internal/exec/packer.go (2)
pkg/schema/schema.go (1)
  • Packer (464-471)
pkg/terraform/generate/generate.go (1)
  • GetGenerateSectionFromComponent (261-274)
pkg/terraform/generate/file_generator.go (1)
pkg/ui/formatter.go (1)
  • Successf (215-222)
🪛 LanguageTool
examples/generate-files/README.md

[typographical] ~9-~9: To join two clauses or introduce examples, consider using an em dash.
Context: ...m component including: - variables.tf - Variable definitions - outputs.tf - Ou...

(DASH_RULE)

🪛 markdownlint-cli2 (0.18.1)
examples/generate-files/README.md

139-139: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (11)
pkg/schema/schema.go (1)

451-471: Schema additions for Helmfile/Packer auto_generate_files look good.

The fields are documented and aligned with the Terraform schema.

pkg/terraform/generate/file_generator_internal_test.go (1)

847-857: Test update aligns with new HCL block expectation.

Looks consistent with the updated HCL rendering behavior.

examples/generate-files/README.md (1)

1-182: Documentation looks solid.

Clear structure covering content types, HCL generation nuances, template variables, and usage examples. The walkthrough in "Try It" section is helpful for onboarding.

examples/generate-files/stacks/deploy/dev.yaml (1)

1-17: LGTM.

Clean dev environment config with appropriate stage-specific values and debug feature flag.

pkg/terraform/generate/generate.go (2)

112-117: Directory creation logic is correct.

Creating the component directory before generation (only when not dry-run/clean) enables JIT component creation as intended. The 0o755 permissions are appropriate for directories.


7-18: Imports are well-organized.

Follows the three-group pattern: stdlib, 3rd-party, then Atmos packages with correct aliases.

examples/generate-files/stacks/deploy/prod.yaml (1)

1-18: LGTM.

Production config appropriately excludes debug features and includes monitoring and high-availability. Good contrast with dev.yaml.

examples/generate-files/atmos.yaml (2)

19-21: Note: /dev/stderr is Unix-specific.

This works for the demo but won't function on Windows. For examples, this is acceptable.


1-21: Minimal config demonstrates the feature well.

The auto_generate_files: true setting enables the new generation capability. Configuration is appropriately focused for a demo.

pkg/terraform/generate/file_generator_test.go (1)

476-758: Strong table-driven coverage for labeled blocks and TFVars.

Nice, focused assertions that match the new generator behavior.

examples/generate-files/stacks/catalog/demo.yaml (1)

1-96: Example config reads cleanly and showcases multiple generate modes.

Good reference for users and matches the PR goals.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Addresses review comments on PR #1971:

1. Prompt helpers now honor config-selection flags (--base-path, --config,
   --config-path, --profile) by using ParseGlobalFlags and building
   ConfigAndStacksInfo properly before InitCliConfig calls.

2. Added language specifier `text` to README code block for project structure.

3. Added dry-run guards to auto-generation in terraform.go, helmfile.go, and
   packer.go to prevent filesystem modifications during dry-run mode.

4. Fixed comment punctuation to satisfy godot linter (added trailing periods).

5. Replaced fmt.Errorf with errors.Join for proper error wrapping compliance,
   using static sentinel errors (ErrCreateDirectory, ErrFileOperation,
   ErrInvalidConfig) from errors/errors.go.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions
Copy link

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry - Add a blog post in website/blog/YYYY-MM-DD-feature-name.mdx
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

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: 2

🤖 Fix all issues with AI agents
In `@pkg/terraform/generate/file_generator.go`:
- Around line 457-465: The conversion error returned from toCtyValue should be
wrapped with the ErrInvalidConfig sentinel instead of returning the raw error;
update the error return in the block that currently does `return nil,
fmt.Errorf("error converting %s to tfvars: %w", key, err)` so it wraps
ErrInvalidConfig (e.g., fmt.Errorf("%w: error converting %s to tfvars: %v",
ErrInvalidConfig, key, err)) to follow the existing pattern used in this file
(see symbols toCtyValue, ErrInvalidConfig, and body.SetAttributeValue).
- Around line 238-255: The read error assigned to result.Error in
file_generator.go currently uses a plain fmt.Errorf; change it to wrap the
underlying readErr with the static sentinel errUtils.ErrFileOperation when
setting result.Error (preserve the existing message that includes ctx.filePath
and the original readErr) so callers can detect sentinel errors; update the
branch that handles non-IsNotExist readErr (the code referencing
existingContent, readErr, result.Error and ctx.filePath) to use the sentinel
wrapper instead of returning a raw fmt.Errorf.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 59e8305 and b320973.

📒 Files selected for processing (6)
  • cmd/terraform/shared/prompt.go
  • examples/generate-files/README.md
  • internal/exec/helmfile.go
  • internal/exec/packer.go
  • internal/exec/terraform.go
  • pkg/terraform/generate/file_generator.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • internal/exec/packer.go
  • internal/exec/helmfile.go
🧰 Additional context used
📓 Path-based instructions (3)
**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

**/*.go: Use Viper for managing configuration, environment variables, and flags in CLI commands
Use interfaces for external dependencies to facilitate mocking and consider using testify/mock for creating mock implementations
All code must pass golangci-lint checks
Follow Go's error handling idioms: use meaningful error messages, wrap errors with context using fmt.Errorf("context: %w", err), and consider using custom error types for domain-specific errors
Follow standard Go coding style: use gofmt and goimports to format code, prefer short descriptive variable names, use kebab-case for command-line flags, and snake_case for environment variables
Document all exported functions, types, and methods following Go's documentation conventions
Document complex logic with inline comments in Go code
Support configuration via files, environment variables, and flags following the precedence order: flags > environment variables > config file > defaults
Provide clear error messages to users, include troubleshooting hints when appropriate, and log detailed errors for debugging

**/*.go: All comments must end with periods (enforced by godot linter) in Go code
Organize imports into three groups separated by blank lines, sorted alphabetically: Go stdlib, 3rd-party (NOT cloudposse/atmos), then Atmos packages with maintained aliases (cfg, log, u, errUtils)
All errors MUST be wrapped using static errors defined in errors/errors.go - use errors.Join for combining errors, fmt.Errorf with %w for context, and errors.Is() for error checking
Never manually create mocks - use go.uber.org/mock/mockgen with //go:generate directives in Go code
Keep files small and focused - under 600 lines with one cmd/impl per file, co-locate tests, never use //revive:disable:file-length-limit
Use colors from pkg/ui/theme/colors.go for all UI theming in Go code
Code must be compatible with Linux, macOS, and Windows - use SDKs over binaries, use filepath.Join() instead of h...

Files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
  • pkg/terraform/generate/file_generator.go
**/{pkg,internal,cmd}/**/*.go

📄 CodeRabbit inference engine (CLAUDE.md)

Add defer perf.Track(atmosConfig, "pkg.FuncName")() plus blank line to all public functions, using nil if no atmosConfig param - exceptions: trivial getters/setters, command constructors, simple factories, functions delegating to tracked functions

Files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
  • pkg/terraform/generate/file_generator.go
cmd/**/*.go

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

cmd/**/*.go: Use Cobra's recommended command structure with a root command and subcommands, implementing each command in a separate file under cmd/ directory
Provide comprehensive help text for all commands and flags, include examples in command help, and follow Go's documentation conventions in Cobra command definitions
Provide meaningful feedback to users and include progress indicators for long-running operations in CLI commands

Files:

  • cmd/terraform/shared/prompt.go
🧠 Learnings (53)
📓 Common learnings
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.
Learnt from: Listener430
Repo: cloudposse/atmos PR: 825
File: internal/exec/helmfile_generate_varfile.go:28-31
Timestamp: 2024-12-07T16:16:13.038Z
Learning: In `internal/exec/helmfile_generate_varfile.go`, the `--help` command (`./atmos helmfile generate varfile --help`) works correctly without requiring stack configurations, and the only change needed was to make `ProcessCommandLineArgs` exportable by capitalizing its name.
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
Learnt from: osterman
Repo: cloudposse/atmos PR: 1599
File: internal/exec/terraform.go:0-0
Timestamp: 2025-10-11T19:11:58.965Z
Learning: For terraform apply interactivity checks in Atmos (internal/exec/terraform.go), use stdin TTY detection (e.g., `IsTTYSupportForStdin()` or checking `os.Stdin`) to determine if user prompts are possible. This is distinct from stdout/stderr TTY checks used for output display (like TUI rendering). User input requires stdin to be a TTY; output display requires stdout/stderr to be a TTY.
Learnt from: osterman
Repo: cloudposse/atmos PR: 1599
File: internal/exec/terraform.go:394-402
Timestamp: 2025-10-10T23:51:36.597Z
Learning: In Atmos (internal/exec/terraform.go), when adding OpenTofu-specific flags like `--var-file` for `init`, do not gate them based on command name (e.g., checking if `info.Command == "tofu"` or `info.Command == "opentofu"`) because command names don't reliably indicate the actual binary being executed (symlinks, aliases). Instead, document the OpenTofu requirement in code comments and documentation, trusting users who enable the feature (e.g., `PassVars`) to ensure their terraform command points to an OpenTofu binary.
📚 Learning: 2024-11-02T15:35:09.958Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 759
File: internal/exec/terraform.go:366-368
Timestamp: 2024-11-02T15:35:09.958Z
Learning: In `internal/exec/terraform.go`, the workspace cleaning code under both the general execution path and within the `case "init":` block is intentionally duplicated because the code execution paths are different. The `.terraform/environment` file should be deleted before executing `terraform init` in both scenarios to ensure a clean state.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2024-11-12T03:16:02.910Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 775
File: internal/exec/template_funcs_component.go:157-159
Timestamp: 2024-11-12T03:16:02.910Z
Learning: In the Go code for `componentFunc` in `internal/exec/template_funcs_component.go`, the function `cleanTerraformWorkspace` does not return errors, and it's acceptable if the file does not exist. Therefore, error handling for `cleanTerraformWorkspace` is not needed.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2024-10-27T04:41:49.199Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:215-223
Timestamp: 2024-10-27T04:41:49.199Z
Learning: In `internal/exec/terraform_clean.go`, the function `determineCleanPath` is necessary and should not be removed.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Organize imports into three groups separated by blank lines, sorted alphabetically: Go stdlib, 3rd-party (NOT cloudposse/atmos), then Atmos packages with maintained aliases (`cfg`, `log`, `u`, `errUtils`)

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2024-12-07T16:19:01.683Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 825
File: internal/exec/terraform.go:30-30
Timestamp: 2024-12-07T16:19:01.683Z
Learning: In `internal/exec/terraform.go`, skipping stack validation when help flags are present is not necessary.

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-10-10T23:51:36.597Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1599
File: internal/exec/terraform.go:394-402
Timestamp: 2025-10-10T23:51:36.597Z
Learning: In Atmos (internal/exec/terraform.go), when adding OpenTofu-specific flags like `--var-file` for `init`, do not gate them based on command name (e.g., checking if `info.Command == "tofu"` or `info.Command == "opentofu"`) because command names don't reliably indicate the actual binary being executed (symlinks, aliases). Instead, document the OpenTofu requirement in code comments and documentation, trusting users who enable the feature (e.g., `PassVars`) to ensure their terraform command points to an OpenTofu binary.

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-10-28T01:51:30.811Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:329-332
Timestamp: 2024-10-28T01:51:30.811Z
Learning: In the Atmos Go code, when deleting directories or handling file paths (e.g., in `terraform_clean.go`), always resolve the absolute path using `filepath.Abs` and use the logger `u.LogWarning` for logging messages instead of using `fmt.Printf`.

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-01-09T22:37:01.004Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 914
File: cmd/terraform_commands.go:260-265
Timestamp: 2025-01-09T22:37:01.004Z
Learning: In the terraform commands implementation (cmd/terraform_commands.go), the direct use of `os.Args[2:]` for argument handling is intentionally preserved to avoid extensive refactoring. While it could be improved to use cobra's argument parsing, such changes should be handled in a dedicated PR to maintain focus and minimize risk.

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-06-23T02:14:30.937Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1327
File: cmd/terraform.go:111-117
Timestamp: 2025-06-23T02:14:30.937Z
Learning: In cmd/terraform.go, flags for the DescribeAffected function are added dynamically at runtime when info.Affected is true. This is intentional to avoid exposing internal flags like "file", "format", "verbose", "include-spacelift-admin-stacks", "include-settings", and "upload" in the terraform command interface, while still providing them for the shared DescribeAffected function used by both `atmos describe affected` and `atmos terraform apply --affected`.

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-11-24T19:13:10.287Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:407-416
Timestamp: 2024-11-24T19:13:10.287Z
Learning: In `internal/exec/terraform_clean.go`, when `getStackTerraformStateFolder` returns an error in the `handleCleanSubCommand` function, the error is logged, and the process continues without returning the error.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2024-10-27T04:28:40.966Z
Learnt from: haitham911
Repo: cloudposse/atmos PR: 727
File: internal/exec/terraform_clean.go:155-175
Timestamp: 2024-10-27T04:28:40.966Z
Learning: In the `CollectDirectoryObjects` function in `internal/exec/terraform_clean.go`, recursive search through all subdirectories is not needed.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2025-10-07T00:25:16.333Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1498
File: website/src/components/Screengrabs/atmos-terraform-metadata--help.html:25-55
Timestamp: 2025-10-07T00:25:16.333Z
Learning: In Atmos CLI, subcommands inherit flags from their parent commands via Cobra's command inheritance. For example, `atmos terraform metadata --help` shows `--affected` and related flags inherited from the parent `terraform` command (defined in cmd/terraform.go), even though the metadata subcommand doesn't explicitly define these flags. This is expected Cobra behavior and auto-generated help screengrabs accurately reflect this inheritance.

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : All comments must end with periods (enforced by `godot` linter) in Go code

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*.go : Document complex logic with inline comments in Go code

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*.go : Follow Go's error handling idioms: use meaningful error messages, wrap errors with context using `fmt.Errorf("context: %w", err)`, and consider using custom error types for domain-specific errors

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : All errors MUST be wrapped using static errors defined in `errors/errors.go` - use `errors.Join` for combining errors, `fmt.Errorf` with `%w` for context, and `errors.Is()` for error checking

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*.go : Provide clear error messages to users, include troubleshooting hints when appropriate, and log detailed errors for debugging

Applied to files:

  • internal/exec/terraform.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-12-13T06:10:13.688Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: errors/errors.go:184-203
Timestamp: 2025-12-13T06:10:13.688Z
Learning: cloudposse/atmos: For toolchain work, duplicate/unused error sentinels in errors/errors.go should be cleaned up in a separate refactor PR and not block feature PRs; canonical toolchain sentinels live under toolchain/registry with re-exports in toolchain/errors.go.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2025-07-05T20:59:02.914Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1363
File: internal/exec/template_utils.go:18-18
Timestamp: 2025-07-05T20:59:02.914Z
Learning: In the Atmos project, gomplate v4 is imported with a blank import (`_ "github.com/hairyhenderson/gomplate/v4"`) alongside v3 imports to resolve AWS SDK version conflicts. V3 uses older AWS SDK versions that conflict with newer AWS modules used by Atmos. A full migration to v4 requires extensive refactoring due to API changes and should be handled in a separate PR.

Applied to files:

  • internal/exec/terraform.go
📚 Learning: 2025-12-21T04:10:29.030Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1891
File: internal/exec/describe_affected.go:468-468
Timestamp: 2025-12-21T04:10:29.030Z
Learning: In Go, package-level declarations (constants, variables, types, and functions) are visible to all files in the same package without imports. During reviews in cloudposse/atmos (and similar Go codebases), before suggesting to declare a new identifier, first check if it already exists in another file of the same package. If it exists, you can avoid adding a new declaration; if not, proceed with a proper package-level declaration. 

Applied to files:

  • internal/exec/terraform.go
  • cmd/terraform/shared/prompt.go
  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-12-13T03:21:27.620Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1813
File: cmd/terraform/shell.go:28-73
Timestamp: 2025-12-13T03:21:27.620Z
Learning: In Atmos, when initializing CLI config via cfg.InitCliConfig, always first populate the ConfigAndStacksInfo struct with global flag values by calling flags.ParseGlobalFlags(cmd, v) before LoadConfig. LoadConfig (pkg/config/load.go) reads config selection fields (AtmosConfigFilesFromArg, AtmosConfigDirsFromArg, BasePath, ProfilesFromArg) from the ConfigAndStacksInfo struct, not from Viper. Passing an empty struct causes the --base-path, --config, --config-path, and --profile flags to be ignored. Recommended pattern: parse flags → populate struct → call InitCliConfig. See cmd/terraform/plan_diff.go for reference implementation.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to **/*.go : Use Viper for managing configuration, environment variables, and flags in CLI commands

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to cmd/**/*.go : Provide comprehensive help text for all commands and flags, include examples in command help, and follow Go's documentation conventions in Cobra command definitions

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2024-12-07T16:16:13.038Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 825
File: internal/exec/helmfile_generate_varfile.go:28-31
Timestamp: 2024-12-07T16:16:13.038Z
Learning: In `internal/exec/helmfile_generate_varfile.go`, the `--help` command (`./atmos helmfile generate varfile --help`) works correctly without requiring stack configurations, and the only change needed was to make `ProcessCommandLineArgs` exportable by capitalizing its name.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to cmd/**/*.go : Use Cobra's recommended command structure with a root command and subcommands, implementing each command in a separate file under `cmd/` directory

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-09-29T15:47:10.908Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1540
File: internal/exec/terraform_cli_args_utils.go:64-73
Timestamp: 2025-09-29T15:47:10.908Z
Learning: In the Atmos codebase, viper.BindEnv is required for CLI commands in the cmd/ package, but internal utilities can use os.Getenv directly when parsing environment variables for business logic purposes. The requirement to use viper is specific to the CLI interface layer, not all environment variable access throughout the codebase.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-12-13T04:37:40.435Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: cmd/toolchain/get.go:23-40
Timestamp: 2025-12-13T04:37:40.435Z
Learning: In Go CLI command files using Cobra, constrain the subcommand to accept at most one positional argument (MaximumNArgs(1)) so it supports both listing all items (zero args) and fetching a specific item (one arg). Define and parse flags with a standard parser (e.g., flags.NewStandardParser()) and avoid binding flags to Viper (no viper.BindEnv/BindPFlag). This promotes explicit argument handling and predictable flag behavior across command files.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Use `viper.BindEnv("ATMOS_VAR", "ATMOS_VAR", "FALLBACK")` for environment variables - ATMOS_ prefix required in Go code

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-04-23T15:02:50.246Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1202
File: pkg/utils/yaml_func_exec.go:104-104
Timestamp: 2025-04-23T15:02:50.246Z
Learning: In the Atmos codebase, direct calls to `os.Getenv` should be avoided. Instead, use `viper.BindEnv` for environment variable access. This provides a consistent approach to configuration management across the codebase.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Commands MUST use `flags.NewStandardParser()` for command-specific flags and NEVER call `viper.BindEnv()` or `viper.BindPFlag()` directly

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-08-29T20:57:35.423Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1433
File: cmd/theme_list.go:33-36
Timestamp: 2025-08-29T20:57:35.423Z
Learning: In the Atmos codebase, avoid using viper.SetEnvPrefix("ATMOS") with viper.AutomaticEnv() because canonical environment variable names are not exclusive to Atmos and could cause conflicts. Instead, use selective environment variable binding through the setEnv function in pkg/config/load.go with bindEnv(v, "config.key", "ENV_VAR_NAME") for specific environment variables.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-11-08T19:56:18.660Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1697
File: internal/exec/oci_utils.go:0-0
Timestamp: 2025-11-08T19:56:18.660Z
Learning: In the Atmos codebase, when a function receives an `*schema.AtmosConfiguration` parameter, it should read configuration values from `atmosConfig.Settings` fields rather than using direct `os.Getenv()` or `viper.GetString()` calls. The Atmos pattern is: viper.BindEnv in cmd/root.go binds environment variables → Viper unmarshals into atmosConfig.Settings via mapstructure → business logic reads from the Settings struct. This provides centralized config management, respects precedence, and enables testability. Example: `atmosConfig.Settings.AtmosGithubToken` instead of `os.Getenv("ATMOS_GITHUB_TOKEN")` in functions like `getGHCRAuth` in internal/exec/oci_utils.go.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-12-13T06:19:17.739Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: pkg/http/client.go:0-0
Timestamp: 2025-12-13T06:19:17.739Z
Learning: In pkg/http/client.go, GetGitHubTokenFromEnv intentionally reads viper.GetString("github-token") to honor precedence of the persistent --github-token flag over ATMOS_GITHUB_TOKEN and GITHUB_TOKEN. Do not replace this with os.Getenv in future reviews; using Viper here is by design.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-02-18T13:18:53.146Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 1068
File: cmd/vendor_pull.go:31-31
Timestamp: 2025-02-18T13:18:53.146Z
Learning: Error checking is not required for cobra.Command.RegisterFlagCompletionFunc calls as these are static configurations done at init time.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-01-09T22:27:25.538Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 914
File: cmd/validate_stacks.go:20-23
Timestamp: 2025-01-09T22:27:25.538Z
Learning: The validate commands in Atmos can have different help handling implementations. Specifically, validate_component.go and validate_stacks.go are designed to handle help requests differently, with validate_stacks.go including positional argument checks while validate_component.go does not.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-02-09T14:38:53.443Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 992
File: cmd/cmd_utils.go:0-0
Timestamp: 2025-02-09T14:38:53.443Z
Learning: Error handling for RegisterFlagCompletionFunc in AddStackCompletion is not required as the errors are non-critical for tab completion functionality.

Applied to files:

  • cmd/terraform/shared/prompt.go
📚 Learning: 2025-09-10T22:38:42.212Z
Learnt from: Benbentwo
Repo: cloudposse/atmos PR: 1475
File: pkg/auth/identities/aws/user.go:141-145
Timestamp: 2025-09-10T22:38:42.212Z
Learning: The user confirmed that the errors package has an error string wrapping format, contradicting the previous learning about ErrWrappingFormat being invalid. The current usage of fmt.Errorf(errUtils.ErrWrappingFormat, errUtils.ErrAuthAwsFileManagerFailed, err) appears to be the correct pattern.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-04-04T02:03:23.676Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 1185
File: internal/exec/yaml_func_store.go:26-26
Timestamp: 2025-04-04T02:03:23.676Z
Learning: The Atmos codebase currently uses `log.Fatal` for error handling in multiple places. The maintainers are aware this isn't an ideal pattern (should only be used in main() or init() functions) and plan to address it comprehensively in a separate PR. CodeRabbit should not flag these issues or push for immediate changes until that refactoring is complete.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-01-07T20:38:09.618Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 896
File: cmd/editor_config.go:37-40
Timestamp: 2025-01-07T20:38:09.618Z
Learning: Error handling suggestion for `cmd.Help()` in `cmd/editor_config.go` was deferred as the code is planned for future modifications.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-09-10T22:38:42.212Z
Learnt from: Benbentwo
Repo: cloudposse/atmos PR: 1475
File: pkg/auth/identities/aws/user.go:141-145
Timestamp: 2025-09-10T22:38:42.212Z
Learning: ErrWrappingFormat is correctly defined as "%w: %w" in the errors package and is used throughout the codebase to wrap two error types together. The usage fmt.Errorf(errUtils.ErrWrappingFormat, errUtils.ErrAuthAwsFileManagerFailed, err) is the correct pattern when both arguments are error types.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-10-12T18:38:28.458Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 715
File: pkg/logger/logger.go:21-32
Timestamp: 2024-10-12T18:38:28.458Z
Learning: In Go code, avoid prefixing struct names with 'I' (e.g., `IError`) as it can be confusing, suggesting an interface. Use descriptive names for structs to improve code clarity.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-10-22T14:55:44.014Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1695
File: pkg/auth/manager.go:169-171
Timestamp: 2025-10-22T14:55:44.014Z
Learning: Go 1.20+ supports multiple %w verbs in fmt.Errorf, which returns an error implementing Unwrap() []error. This is valid and does not panic. Atmos uses Go 1.24.8 and configures errorlint with errorf-multi: true to validate this pattern.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2024-10-23T21:36:40.262Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 740
File: cmd/cmd_utils.go:340-359
Timestamp: 2024-10-23T21:36:40.262Z
Learning: In the Go codebase for Atmos, when reviewing functions like `checkAtmosConfig` in `cmd/cmd_utils.go`, avoid suggesting refactoring to return errors instead of calling `os.Exit` if such changes would significantly increase the scope due to the need to update multiple call sites.

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: New config templates support Go templating with `FuncMap()` from `internal/exec/template_funcs.go`

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to **/*.go : Code must be compatible with Linux, macOS, and Windows - use SDKs over binaries, use `filepath.Join()` instead of hardcoded path separators

Applied to files:

  • pkg/terraform/generate/file_generator.go
📚 Learning: 2025-03-18T12:26:25.329Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 1149
File: tests/snapshots/TestCLICommands_atmos_vendor_pull_ssh.stderr.golden:7-7
Timestamp: 2025-03-18T12:26:25.329Z
Learning: In the Atmos project, typos or inconsistencies in test snapshot files (such as "terrafrom" instead of "terraform") may be intentional as they capture the exact output of commands and should not be flagged as issues requiring correction.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-01-25T03:51:57.689Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-11-01T20:24:29.557Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1714
File: NOTICE:0-0
Timestamp: 2025-11-01T20:24:29.557Z
Learning: In the cloudposse/atmos repository, the NOTICE file is programmatically generated and should not be manually edited. Issues with dependency license URLs in NOTICE will be resolved when upstream package metadata is corrected.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2026-01-09T04:49:35.038Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1907
File: demos/fixtures/acme/stacks/catalog/api.yaml:1-29
Timestamp: 2026-01-09T04:49:35.038Z
Learning: In the cloudposse/atmos demos/fixtures, components can provide Terraform outputs via `remote_state_backend.static` configuration blocks instead of traditional Terraform output blocks. This pattern is used for demo/fixture purposes to simulate cross-component state references without deploying actual infrastructure. The `!terraform.state` YAML function reads from these static backends.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2024-12-01T00:33:20.298Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 810
File: examples/tests/stacks/catalog/terraform/template-functions-test2/defaults.yaml:28-32
Timestamp: 2024-12-01T00:33:20.298Z
Learning: In `examples/tests/stacks/catalog/terraform/template-functions-test2/defaults.yaml`, `!exec atmos terraform output` is used in examples to demonstrate its usage, even though `!terraform.output` is the recommended approach according to the documentation.

Applied to files:

  • examples/generate-files/README.md
📚 Learning: 2025-12-24T04:29:23.938Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1891
File: pkg/ci/terraform/templates/apply.md:17-17
Timestamp: 2025-12-24T04:29:23.938Z
Learning: In the cloudposse/atmos repository, Terraform CI templates (pkg/ci/terraform/templates/*.md) are rendered using TerraformTemplateContext (defined in pkg/ci/terraform/context.go), not the base ci.TemplateContext. TerraformTemplateContext provides top-level fields: .Resources (ci.ResourceCounts), .HasChanges() method, and .HasDestroy field, which are correctly accessed directly in templates without a .Result prefix.

Applied to files:

  • examples/generate-files/README.md
🧬 Code graph analysis (2)
cmd/terraform/shared/prompt.go (2)
pkg/schema/schema.go (1)
  • ConfigAndStacksInfo (737-834)
pkg/flags/global_registry.go (1)
  • ParseGlobalFlags (33-77)
pkg/terraform/generate/file_generator.go (2)
pkg/ui/formatter.go (1)
  • Successf (215-222)
errors/errors.go (1)
  • ErrInvalidConfig (58-58)
🪛 LanguageTool
examples/generate-files/README.md

[typographical] ~9-~9: To join two clauses or introduce examples, consider using an em dash.
Context: ...m component including: - variables.tf - Variable definitions - outputs.tf - Ou...

(DASH_RULE)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Acceptance Tests (macos)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (4)
examples/generate-files/README.md (1)

1-182: Docs are clear and align with the new generate flow.
Nice walkthrough and examples; no changes needed.

pkg/terraform/generate/file_generator.go (1)

108-202: Summary output + relative paths look solid.
Clearer user feedback and stable paths for logs.

cmd/terraform/shared/prompt.go (1)

95-112: Good: global flags now influence prompt/completion.
This keeps interactive selection consistent with --base-path, --config, --config-path, and --profile.

internal/exec/terraform.go (1)

214-238: Early auto-generation is safely gated.
Dry-run guard plus static error wrapping keeps this path predictable.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Add blog post announcing the interactive file generation feature:
- Interactive prompts for component/stack selection
- Cross-provisioner support (terraform, helmfile, packer)
- Idempotent generation and JIT component creation

Add roadmap milestone for "Interactive file generation for terraform,
helmfile, and packer" under the DX initiative.

Also address CodeRabbit review feedback by wrapping file operation errors
with errUtils.ErrFileOperation and conversion errors with
errUtils.ErrInvalidConfig for proper error sentinel compliance.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 16, 2026
Add the EmbedExample component to the terraform generate files
documentation page to showcase the generate-files example with
an interactive file browser.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman and others added 2 commits January 15, 2026 21:09
Add comprehensive test coverage for the terraform generate files command:
- Single component file generation
- All components file generation with --all flag
- Dry-run mode verification
- Idempotent generation (running twice doesn't recreate unchanged files)
- Clean flag to remove generated files
- Interactive behavior in CI environment
- HCL and JSON output validation

Uses existing terraform-generate-files test fixture.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add the EmbedExample component to the devcontainer configuration
documentation page to showcase both devcontainer examples:
- devcontainer (simple image-based example)
- devcontainer-build (custom Dockerfile example)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add TAGS_MAP and DOCS_MAP entries for the generate-files example
so it appears correctly in the examples browser with proper
categorization (Automation) and documentation links.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@codecov
Copy link

codecov bot commented Jan 17, 2026

Codecov Report

❌ Patch coverage is 74.56647% with 44 lines in your changes missing coverage. Please review.
✅ Project coverage is 75.30%. Comparing base (cdb3461) to head (0b17b5e).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
pkg/terraform/generate/file_generator.go 87.02% 9 Missing and 8 partials ⚠️
internal/exec/helmfile.go 0.00% 7 Missing ⚠️
internal/exec/packer.go 0.00% 6 Missing and 1 partial ⚠️
internal/exec/terraform.go 0.00% 6 Missing and 1 partial ⚠️
cmd/terraform/generate/files.go 77.77% 2 Missing and 2 partials ⚠️
pkg/terraform/generate/generate.go 33.33% 1 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1971      +/-   ##
==========================================
+ Coverage   75.28%   75.30%   +0.02%     
==========================================
  Files         785      785              
  Lines       72491    72645     +154     
==========================================
+ Hits        54573    54708     +135     
- Misses      14440    14456      +16     
- Partials     3478     3481       +3     
Flag Coverage Δ
unittests 75.30% <74.56%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
pkg/schema/schema.go 88.98% <ø> (ø)
pkg/terraform/generate/generate.go 98.08% <33.33%> (+1.96%) ⬆️
cmd/terraform/generate/files.go 55.88% <77.77%> (+30.42%) ⬆️
internal/exec/helmfile.go 9.95% <0.00%> (-0.35%) ⬇️
internal/exec/packer.go 60.38% <0.00%> (-2.88%) ⬇️
internal/exec/terraform.go 59.28% <0.00%> (-0.95%) ⬇️
pkg/terraform/generate/file_generator.go 89.96% <87.02%> (+3.33%) ⬆️

... and 4 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@mergify
Copy link

mergify bot commented Jan 17, 2026

💥 This pull request now has conflicts. Could you fix it @osterman? 🙏

@mergify mergify bot added the conflict This PR has conflicts label Jan 17, 2026
- Use filepath.Join for cross-platform path compatibility in emitSummary
- Add PR number to roadmap milestone for interactive file generation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 17, 2026
…mple

Resolved conflicts:
- cmd/terraform/shared/prompt.go: Kept main's filtering logic for deployable components
- website/src/data/roadmap.js: Kept both milestones (interactive file generation and component filtering)
- cmd/terraform/generate/files.go: Updated PromptForComponent call signature

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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: 2

🤖 Fix all issues with AI agents
In `@pkg/terraform/generate/file_generator.go`:
- Around line 40-45: The comment lines in the Terraform block type map (entries
keyed by "variable", "output", "provider", "module", "resource", "data" in
file_generator.go) are missing trailing periods and should be updated to end
with periods; update each inline comment (e.g., // variable "name" {}, //
resource "type" "name" {}, etc.) to include a final period, and apply the same
fix to the similar comment block around the other occurrence (the block
referenced at lines 509-518) so all comment lines conform to the godot linter
requirement.
- Around line 556-567: writeBlockBody (and writeHCLBlock) currently treats every
map[string]any as an unlabeled nested block (using AppendNewBlock) which causes
object attributes like tags to be rendered as blocks; change the logic in
writeBlockBody to detect when a map should be emitted as an attribute rather
than a block (use file context or a schema/marker you add to identify attribute
maps), and when it is an attribute convert the Go map to a cty.Value via the
existing toCtyValue()/mapToCtyObject() path and emit it with
body.SetAttributeValue(key, ctyVal) instead of AppendNewBlock; update
writeHCLBlock to propagate the attribute-vs-block hint into writeBlockBody and
add unit tests that assert .tf output renders maps as "key = { ... }" while
keeping existing block behavior for real nested blocks.

- Add trailing periods to comments per godot lint requirements
- Fix map attributes rendering as blocks instead of attributes
  Maps inside blocks like locals {} now render with = syntax (tags = {})
  instead of block syntax (tags {})
- Add test case validating map attribute rendering

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 21, 2026
@aknysh aknysh merged commit ce50ec3 into main Jan 22, 2026
57 checks passed
@aknysh aknysh deleted the osterman/generate-example branch January 22, 2026 18:22
@github-actions
Copy link

These changes were released in v1.204.1-rc.4.

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 size/xl Extra large size PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants