Skip to content

Fix helmfile CLI - #8

Merged
Andriy Knysh (aknysh) merged 3 commits into
masterfrom
fix-helmfile
Nov 29, 2020
Merged

Andriy Knysh (aknysh) merged 3 commits into
masterfrom
fix-helmfile

Conversation

@aknysh

Copy link
Copy Markdown
Member

what

  • Add region to kubeconfig commands
  • Add helmfile-command job

why

  • These features were left behind during the transition to stacks

@aknysh
Andriy Knysh (aknysh) merged commit 28edfa2 into master Nov 29, 2020
@aknysh
Andriy Knysh (aknysh) deleted the fix-helmfile branch November 29, 2020 22:32
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Nov 5, 2025
- Changed auth_parser.go to use cmd.Flags().Changed('duration')
- More reliable than checking non-empty string
- Correctly handles --duration='' vs no flag
- Prevents false positives from empty string values

Addresses code review item #8
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Dec 18, 2025
- Fix Comment #6: Update ErrPermissionDenied message to be concise
- Fix Comment #7: Update ErrNoComponentsWithTags to mention tags
- Fix Comment #8: Wire NoColor from global persistent flags
- Fix Comment #9/#14: Replace direct os.Stdout/Stderr with ui/data abstractions
- Fix Comment #10: Remove direct viper.BindEnv, use os.LookupEnv for TERM
- Fix Comment #11: Use data.Write in writeOutput function
- Fix Comment #13: Add Intro component to diff.mdx (replace :::note)
- Fix Comment #15: Use ui.Warningf in executeComponentVendorDiff stub
- Fix Comment #21/#22: Fix broken documentation links in diff.mdx
- Add test I/O initialization for data.Write() and ui.Infof() calls

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Dec 21, 2025
- Fix Comment #6: Update ErrPermissionDenied message to be concise
- Fix Comment #7: Update ErrNoComponentsWithTags to mention tags
- Fix Comment #8: Wire NoColor from global persistent flags
- Fix Comment #9/#14: Replace direct os.Stdout/Stderr with ui/data abstractions
- Fix Comment #10: Remove direct viper.BindEnv, use os.LookupEnv for TERM
- Fix Comment #11: Use data.Write in writeOutput function
- Fix Comment #13: Add Intro component to diff.mdx (replace :::note)
- Fix Comment #15: Use ui.Warningf in executeComponentVendorDiff stub
- Fix Comment #21/#22: Fix broken documentation links in diff.mdx
- Add test I/O initialization for data.Write() and ui.Infof() calls

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Dec 26, 2025
- Fix Comment #6: Update ErrPermissionDenied message to be concise
- Fix Comment #7: Update ErrNoComponentsWithTags to mention tags
- Fix Comment #8: Wire NoColor from global persistent flags
- Fix Comment #9/#14: Replace direct os.Stdout/Stderr with ui/data abstractions
- Fix Comment #10: Remove direct viper.BindEnv, use os.LookupEnv for TERM
- Fix Comment #11: Use data.Write in writeOutput function
- Fix Comment #13: Add Intro component to diff.mdx (replace :::note)
- Fix Comment #15: Use ui.Warningf in executeComponentVendorDiff stub
- Fix Comment #21/#22: Fix broken documentation links in diff.mdx
- Add test I/O initialization for data.Write() and ui.Infof() calls

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 2, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 4, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 5, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 22, 2026
- Add duration overflow guard in ParseDuration (Comment #6)
- Fix non-workdir re-provisioning: skip metadata check for non-workdir targets (Comments #7, #11)
- Detect version removal: trigger re-provisioning when version is removed (Comments #8, #14)
- Fix blog date 2025 → 2026 (Comments #9, #16)
- Surface metadata read failures as warnings in ListWorkdirs (Comment #10)
- Add periods to comment block in needsProvisioning (Comment #12)
- Treat .atmos-only directories as empty in isNonEmptyDir (Comment #13)
- Skip .atmos during source walk in syncSourceToDest (Comment #15)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 23, 2026
- Add duration overflow guard in ParseDuration (Comment #6)
- Fix non-workdir re-provisioning: skip metadata check for non-workdir targets (Comments #7, #11)
- Detect version removal: trigger re-provisioning when version is removed (Comments #8, #14)
- Fix blog date 2025 → 2026 (Comments #9, #16)
- Surface metadata read failures as warnings in ListWorkdirs (Comment #10)
- Add periods to comment block in needsProvisioning (Comment #12)
- Treat .atmos-only directories as empty in isNonEmptyDir (Comment #13)
- Skip .atmos during source walk in syncSourceToDest (Comment #15)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Erik Osterman (Cloud Posse) (osterman) added a commit that referenced this pull request Jan 24, 2026
- Add duration overflow guard in ParseDuration (Comment #6)
- Fix non-workdir re-provisioning: skip metadata check for non-workdir targets (Comments #7, #11)
- Detect version removal: trigger re-provisioning when version is removed (Comments #8, #14)
- Fix blog date 2025 → 2026 (Comments #9, #16)
- Surface metadata read failures as warnings in ListWorkdirs (Comment #10)
- Add periods to comment block in needsProvisioning (Comment #12)
- Treat .atmos-only directories as empty in isNonEmptyDir (Comment #13)
- Skip .atmos during source walk in syncSourceToDest (Comment #15)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Andriy Knysh (aknysh) added a commit that referenced this pull request Feb 5, 2026
…2010)

* fix: JIT source provisioning now takes precedence over local components

When both source.uri and provision.workdir.enabled are configured on a
component, the JIT source provisioner now always runs, even if a local
component already exists. This ensures that source + workdir provisioning
always vendors from the remote source to the workdir path, respecting the
version specified in stack config rather than using a potentially stale
local component.

Added regression test to verify source provisioning takes precedence when
both local component and source config are present.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* feat: version-aware JIT source provisioning with TTL-based cleanup

- Implement intelligent re-provisioning for remote sources based on version/URI changes
- Add incremental local sync with per-file checksum comparison using SyncDir
- Support TTL-based cleanup for stale workdirs via duration parsing
- Move workdir metadata from flat file to .atmos/metadata.json for better organization
- Track source_uri, source_version, and last_accessed timestamps
- Add new CLI flags: --expired, --ttl, --dry-run for workdir clean command
- Update workdir list and show commands with version and access information
- Extract duration parsing to new pkg/duration package for reusability

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

* refactor: Reduce cyclomatic and cognitive complexity in workdir/source packages

- Extract helper functions to reduce function complexity:
  - duration.go: Use maps for unit multipliers and keywords, extract parseInteger/parseWithSuffix/parseKeyword
  - provision_hook.go: Extract isNonEmptyDir and checkMetadataChanges
  - clean.go: Extract checkWorkdirExpiry, getLastAccessedTime, getModTimeFromEntry
  - fs.go: Extract syncSourceToDest, fileNeedsCopy, deleteRemovedFiles
  - workdir.go: Extract validateComponentPath, computeContentHash, create localMetadataParams struct

- Pass localMetadataParams by pointer to avoid hugeParam warning

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

* docs: Update source-provisioning example to use demo-library

Replace terraform-null-label (which is a module, not a component) with
demo-library components that can actually be run with terraform apply.

The example now demonstrates both source types:
- weather: LOCAL source (../demo-library/weather)
- ipinfo: REMOTE source (github.com/cloudposse/atmos//examples/demo-library/ipinfo)

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

* fix: Address PR review comments for JIT source provisioning

- Add duration overflow guard in ParseDuration (Comment #6)
- Fix non-workdir re-provisioning: skip metadata check for non-workdir targets (Comments #7, #11)
- Detect version removal: trigger re-provisioning when version is removed (Comments #8, #14)
- Fix blog date 2025 → 2026 (Comments #9, #16)
- Surface metadata read failures as warnings in ListWorkdirs (Comment #10)
- Add periods to comment block in needsProvisioning (Comment #12)
- Treat .atmos-only directories as empty in isNonEmptyDir (Comment #13)
- Skip .atmos during source walk in syncSourceToDest (Comment #15)

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

* fix: Update golden snapshot for atmos describe config

Add the new provision.workdir section to the expected output,
matching the new JIT source provisioning configuration schema.

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

* fix: Address additional PR review comments

- Guard against int64 overflow in parseWithSuffix (Comment #2)
- Branch metadata writing by source type - local vs remote (Comment #3)
- Add permission checks to fileNeedsCopy for mode changes (Comment #4)

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

* test: Add tests to improve coverage for workdir and source provisioning

Adds comprehensive tests for:
- CleanExpiredWorkdirs with mock filesystem
- formatDuration for human-readable output
- getLastAccessedTime with atime fallback to mtime
- checkWorkdirExpiry with valid/corrupt/missing metadata
- isLocalSource for local vs remote URI detection

Also fixes linter issues:
- godot: Fix comment in duration.go
- revive: Refactor formatWithOptions to map-based dispatch

Addresses CodeRabbit comment #1 requesting improved patch coverage.

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

* fix: Return wrapped error from ReadMetadata instead of warning

Changes error handling in ListWorkdirs to return a wrapped error when
ReadMetadata fails, surfacing permission/corruption issues to callers.
Directories without metadata (metadata == nil) still skip silently.

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

* test: Improve test coverage and address CodeRabbit review comments

- Add metadata_test.go with tests for UpdateLastAccessed and readMetadataUnlocked
- Add buildLocalMetadata tests covering all timestamp preservation branches
- Add cleanExpiredWorkdirs and CleanExpiredWorkdirs tests
- Fix ListWorkdirs to skip invalid metadata instead of failing entire operation
- Fix zero timestamp display to show "-" instead of "0001-01-01"
- Fix isLocalSource to use filepath.IsAbs for Windows path support
- Fix godot lint issues in log_utils.go

Coverage improvements:
- pkg/provisioner/workdir: 82.1% -> 88.1%
- cmd/terraform/workdir: 58.7% -> 92.2% (function coverage)
- UpdateLastAccessed: 0% -> 84.2%
- readMetadataUnlocked: 0% -> 100%
- buildLocalMetadata: 57% -> 100%
- cleanExpiredWorkdirs: 0% -> 100%

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

* test: Add JIT source provisioning tests for destroy and init commands

Add test coverage to confirm that JIT source provisioning correctly
takes precedence over local components for all terraform subcommands,
not just plan. These tests verify that when:
- source.uri is configured
- provision.workdir.enabled: true
- A local component exists at components/terraform/<component>/

The workdir is populated from the remote source, NOT copied from
the local component. This confirms the fix in ExecuteTerraform()
works universally for destroy and init commands.

Uses table-driven test pattern to avoid code duplication.

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

* test: Expand JIT source tests to cover all terraform subcommands

Expand table-driven test to verify JIT source provisioning works for
all 22 terraform subcommands that operate on a component with a stack:

Core execution: apply, deploy, destroy, init, workspace
State/resource: console, force-unlock, get, graph, import, output,
                refresh, show, state, taint, untaint
Validation/info: metadata, modules, providers, test, validate

All commands correctly trigger JIT source provisioning when:
- source.uri is configured
- provision.workdir.enabled: true
- A local component exists

The workdir is populated from remote source, not local component.

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

* test: Improve test coverage and address CodeRabbit review comments

- Make tests fail-fast instead of silently skipping when files don't exist
- Verify context.tf exists (proving remote source was used)
- Assert main.tf does NOT exist (proving local component wasn't copied)
- Remove unused strings import
- Update roadmap with JIT source provisioning precedence milestone
- Update vendoring initiative progress from 86% to 89%

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

* fix: Add JIT source provisioning to generate commands (#2019)

- Add JIT source provisioning to terraform generate varfile
- Add JIT source provisioning to terraform generate backend
- Add JIT source provisioning to helmfile generate varfile
- Add JIT source provisioning to packer output
- Update golden snapshot for secrets-masking_describe_config test

The generate commands were missing JIT source provisioning that exists
in ExecuteTerraform(), causing them to fail with JIT-vendored components.
This fix adds the same pattern to all affected commands.

Closes #2019

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

* docs: Add automatic component refresh milestone to roadmap

Add new milestone to Vendoring & Resilience initiative:
- "Automatic component refresh on version changes"
- Links to PR #2010 and version-aware-jit-provisioning blog post
- Update progress from 89% to 95%

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

* test: Improve test coverage and address CodeRabbit review comments

- Add tests for workdir clean command edge cases
- Add tests for workdir show command scenarios
- Add duration parsing tests for TTL validation
- Add filesystem tests for workdir operations
- Add metadata lock tests for Unix file locking

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

* fix: Windows test compatibility and improve error hint accuracy

- Skip permission-based tests on Windows (Unix permissions not supported)
  - TestFileNeedsCopy_DifferentPermissions
  - TestCopyFile_PreservesPermissions
  - TestServiceProvision_WriteMetadataFails (read-only dirs work differently)
- Use actual componentPath in error hint instead of hardcoded path

Addresses CodeRabbit review feedback.

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

* fix: Address CodeRabbit review comments

- Wrap auto-provision error with ErrSourceProvision sentinel (packer_output.go)
- Add error wrapping with ErrWorkdirMetadata in Windows metadata loader
- Document circular import limitation preventing cmd.NewTestKit usage

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

* fix: Use runtime.GOOS instead of os.Getenv for Windows detection

GOOS is a compile-time constant, not a runtime environment variable.
os.Getenv("GOOS") returns empty unless explicitly set.

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

* chore: Ignore flaky kubernetes.io URLs in link checker

The kubernetes.io domain frequently has connection failures/timeouts
in CI, causing spurious link check failures.

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

* test: Improve JIT source test assertions with explicit failure

Instead of silently passing when main.tf doesn't exist, the tests now:
- Explicitly fail if main.tf exists (unexpected)
- Read and check for LOCAL_VERSION_MARKER to provide better diagnostics
- Use t.Fatalf to fail fast with clear error messages

Addresses CodeRabbit feedback about test assertion clarity.

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

* test: improve coverage for JIT source provisioning

Add comprehensive tests for:

- pkg/provisioner/workdir/metadata.go:
  - MetadataPath function
  - WriteMetadata with all fields populated
  - ReadMetadata new location priority over legacy
  - UpdateLastAccessed preserves all fields

- pkg/provisioner/workdir/clean.go:
  - checkWorkdirExpiry for expired/non-expired workdirs
  - getModTimeFromEntry
  - findExpiredWorkdirs with mixed workdirs
  - CleanExpiredWorkdirs with empty base path
  - Clean with Expired option precedence
  - formatDuration edge cases

- pkg/provisioner/workdir/fs.go:
  - DefaultPathFilter.Match with patterns
  - SyncDir with nested directories
  - SyncDir updating changed files

- pkg/provisioner/source/provision_hook.go:
  - checkMetadataChanges with version scenarios
  - isNonEmptyDir edge cases
  - needsProvisioning for non-workdir targets
  - writeWorkdirMetadata source type detection
  - writeWorkdirMetadata preserving ContentHash

Coverage improvements:
- workdir package: ~79% → 92.5%
- source package: ~76% → 83.6%

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

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Co-authored-by: aknysh <andriy.knysh@gmail.com>
Copilot AI added a commit that referenced this pull request Mar 22, 2026
… stacks

Critical #1: Fail closed when --stack filter finds no matching raw manifests
Critical #2: Normalize non-glob relative imports to absolute paths in buildImportGraph
High #3: Use cfg.TerraformSectionName/cfg.HelmfileSectionName in L-05
High #4: Key L-02 baseVars by '<stack>/<component>' to prevent cross-stack collisions
High #5: Add test for ATMOS_LINT_RULE env binding in cmd/lint
High #6: Build StackNameToFileIndex in LintStacks for reliable L-08 file attribution
Medium #7: Add CohesionMaxGroups to schema for configurable L-05 threshold
Medium #8: Add golden test for rulesRelNorm consistency with L-07 relNorm
Medium #9: Clarify L-03 depth semantics (node-count vs edge-count) in description
Low #12: Add ui.Error call before returning from renderLintJSON error path
Update authors.yml to fix duplicate nitrocode entry (RB, CEO @ Infralicious)

Co-authored-by: nitrocode <7775707+nitrocode@users.noreply.github.com>
Agent-Logs-Url: https://github.com/cloudposse/atmos/sessions/9708e2c0-9c09-48c8-a447-323fe5ad065d
Andriy Knysh (aknysh) added a commit that referenced this pull request May 12, 2026
…1919)

* Fix markdown code fence in Nerd Fonts installation instructions (#1917)

* Simplify Nerd Fonts installation instructions

Removed Homebrew tap and search commands from installation instructions. Cask-fonts has been deprecated.

* Fix markdown code fence formatting

The previous commit accidentally removed the opening code fence when deleting
the deprecated Homebrew tap commands.

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

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

---------

Co-authored-by: Matt Topper <matt.topper@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Andriy Knysh <aknysh@users.noreply.github.com>

* Address PR review comments for auth registry refactor

- Fix Comment #3: Parse global flags before InitCliConfig in all auth
  commands by adding BuildConfigAndStacksInfo helper to pkg/flags and
  cmd/auth/helpers.go

- Fix Comment #4: Add guard for empty selectable array in configure.go
  to prevent index out of bounds when no AWS user identities found

- Fix Comment #5: Remove duplicate IdentityFlagName constants by using
  cfg.IdentityFlagName from pkg/config/const.go as canonical source

- Remove unused schema imports from login.go, exec.go, shell.go
- Remove unnecessary nolint:gosec directives from env.go

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

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

* Fix NoOptDefVal preprocessing for identity flag in auth commands

The identity flag uses Cobra's NoOptDefVal feature which only works with
equals syntax (--identity=value), not space-separated syntax (--identity value).
This caused explicit identity values to be ignored, falling back to interactive
selection which fails without a TTY.

Fix by adding NoOptDefVal preprocessing in preprocessCompatibilityFlags() to
rewrite --identity value → --identity=value before Cobra parses. This ensures
explicit identity values work correctly in all environments (CI, piped output,
redirected stdin).

Fixes:
- TestInteractiveIdentitySelection/explicit_identity_value_should_work_even_with_piped_output
- TestExplicitIdentityAlwaysWorks/with_CI=true

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

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

* Add documentation for --identity flag placement best practices

Document recommended usage patterns for the --identity flag:
- Use equals syntax (--identity=admin) for clarity
- Place flag before -- separator and positional arguments
- Both auth and terraform command docs updated

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

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

* Address PR review comments: constants and security annotations

1. Remove redundant constant aliases in cmd/identity_helpers.go
   - Use cfg.IdentityFlagName and cfg.IdentityFlagSelectValue directly
   - Eliminates duplicate definitions (CodeRabbit feedback)

2. Add CodeQL suppression comments in cmd/auth/env.go
   - Document intentional credential output for shell sourcing
   - Add codeql[go/clear-text-logging] annotations
   - Similar to aws configure export-credentials behavior

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

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

* Add --identity flag documentation to global flags reference

Document the --identity flag in the Command-Specific Flags section:
- Available in auth, terraform, and describe commands
- Supports multiple modes: explicit value, interactive selector, disabled
- Add ATMOS_IDENTITY environment variable reference
- Include flag placement best practice tip (equals syntax recommended)

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

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

* Refactor preprocessing architecture with preprocessArgs orchestrator

Separate NoOptDefVal preprocessing and compatibility flag translation into
sibling operations orchestrated by a new preprocessArgs() function.

Architecture:
- preprocessArgs() orchestrates all argument preprocessing
- preprocessNoOptDefValFlags() rewrites --flag value → --flag=value for NoOptDefVal flags
- preprocessCompatibilityFlags() separates Atmos flags from pass-through flags

Key fixes:
- Call SetArgs when NoOptDefVal changes args but no compat flags exist
- This ensures --identity value works correctly for auth commands

New pkg/flags/preprocess/ package:
- Pipeline interface for extensible preprocessing
- NoOptDefValPreprocessor with fixed hasSeparatedValue() using strings.Contains
- FlagInfo interface to avoid circular imports

Tests:
- All auth tests pass (29 tests)
- All preprocess package tests pass
- Pager tests skip gracefully when TTY unavailable

Also fixes pre-existing lint errors in:
- errors/errors.go: Add ErrComponentPathNotFound sentinel
- internal/exec/helmfile.go: Use sentinel errors instead of dynamic errors
- internal/exec/stack_processor_merge.go: Use %w instead of %v for errors
- pkg/downloader/file_downloader.go: Use %w instead of %v for errors
- internal/exec/path_utils_test.go: Use constants for paths with separators

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

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

* Address PR review comments

- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

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

* Add unit tests for cmd/auth package to improve coverage

Add 15 new test files covering pure functions and mock-based tests:
- helpers_test.go: formatDuration, displayAuthSuccess, BuildConfigAndStacksInfo
- whoami_test.go: redactHomeDir, sanitizeEnvMap, buildWhoamiTableRows, validateCredentials
- list_test.go: parseCommaSeparatedNames, filter functions, render functions
- env_test.go: outputEnvAsExport, outputEnvAsDotenv
- login_test.go: authenticateIdentity with MockAuthManager
- shell_test.go: getSeparatedArgs, viper fallback tests
- exec_test.go: getSeparatedArgsForExec, executeCommandWithEnv
- console_test.go: resolveIdentityName, retrieveCredentials, resolveConsoleDuration
- auth_test.go: AuthCommandProvider, GetIdentityFromFlags
- completion_test.go: completion functions
- validate_test.go: command structure
- identity_resolution_test.go: shared identity resolution test helper
- user/user_test.go: AuthUserCmd structure
- user/configure_test.go: command structure
- user/helpers_test.go: selectAWSUserIdentities, extractAWSUserInfo

Coverage improved from ~25.57% to ~36.2% for cmd/auth package.

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

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

* Fix cross-platform compatibility for exec tests

- Replace Unix-specific "true" command with cross-platform "go version"
- Move "false" command test to exec_unix_test.go with build constraint
- Addresses CodeRabbit review comment about Windows compatibility

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

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

* test: Add tests for --profile flag in auth commands (fixes #1973)

Add tests to verify that the --profile global flag is properly extracted
into ProfilesFromArg when using auth exec and auth shell commands.

Test cases:
- Single profile (--profile dev)
- Multiple profiles (--profile dev --profile staging)
- No profile
- Profile with special characters (us-east-1/prod)
- Environment variable fallback (ATMOS_PROFILE)

These tests verify the fix for issue #1973 where --profile didn't work
with auth exec and auth shell commands.

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

* docs: Reorganize terraform usage examples into distinct sections

Split the "Clean Examples" section into three distinct subsections:
- Clean Examples: terraform clean commands only
- Workspace Examples: terraform workspace commands
- Additional Flag Examples: plan commands with --/--append-user-agent flags

This improves documentation readability by grouping related commands together.

Addresses CodeRabbit review comment on PR #1919.

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

* test: Regenerate auth command golden snapshots

Update snapshots for auth command refactoring:
- auth exec --help: Updated usage format and added aws CLI example
- auth invalid-command: Removed ecr-login from valid subcommands list

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

* fix: Windows test failures and website build

- Make TestRedactHomeDir cross-platform using filepath.Join
- Make TestRedactHomeDirWithOsPathSeparator use consistent path construction
- Fix TestFormatExpiration flaky assertion (timing-dependent)
- Add missing File component import to terraform/usage.mdx

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

* fix: Add IsExperimental method to AuthCommandProvider

The CommandProvider interface now requires IsExperimental() after main
branch updates. This fixes CI build failures across Linux, macOS, and
Windows by implementing the required interface method.

Auth commands return true as they are part of Pro Features.

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

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* [autofix.ci] apply automated fixes (attempt 3/3)

* [autofix.ci] apply automated fixes

* fix: Address CodeRabbit review comments for auth-registry-refactor

- Remove undocumented IDENTITY env var fallback (comment #10)
  Only ATMOS_IDENTITY is documented and should be used

- Make HOME path test cases OS-portable (comment #11)
  Use filepath.Join instead of hardcoded Unix paths in tests

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

* chore: Regenerate golden snapshots for experimental auth command

The auth command now returns IsExperimental() = true, which adds:
- [EXPERIMENTAL] tag in command listings
- Experimental feature warning message in stderr output

Regenerated all affected golden snapshots to match the new output.

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

* fix: Address CodeRabbit review findings in auth commands

- console.go: Use data.Writeln/ui.Writef/ui.Success/ui.Warning instead of
  fmt.Fprintf(os.Stdout/Stderr) to follow Atmos I/O conventions
- env.go: Wrap config/manager init errors with sentinel errors
  (ErrFailedToInitializeAtmosConfig, ErrFailedToInitializeAuthManager)
- exec.go: Remove duplicate os.Environ() in executeCommandWithEnv; use
  envpkg.ConvertMapToSlice since prepareAuthenticatedEnv already includes
  the full OS environment
- helpers.go: Stop scanning for --help at "--" separator so pass-through
  commands like `atmos auth exec -- terraform --help` work correctly
- logout.go: Fix misleading --all-realms flag description to accurately
  reflect keychain cleanup scope

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: Migrate auth commands from legacy u.Print* to ui/data layer and fix test failures

Replace all antiquated u.PrintfMarkdownToTUI/u.PrintfMessageToTUI calls in auth commands
with the proper ui.MarkdownMessagef/ui.Writef functions. Replace u.PrintAsJSON with
data.WriteJSON. Add missing Realm row to displayAuthSuccess output. Regenerate golden
snapshots to match corrected stderr output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(auth): port main features to refactored cmd/auth package

Backports features from main's cmd/auth_*.go that were not yet present in
HEAD's refactored cmd/auth/* tree. Each item references the upstream PR.

cmd/auth/env.go (#1984):
- Add `--format=github` for $GITHUB_ENV with heredoc multiline support.
- Add `--format=env` (lowercase env-style key=value).
- Add `-o, --output-file` flag (with $GITHUB_ENV auto-detect for github).
- Route formatting through pkg/env.Output() while keeping outputEnvAsExport
  and outputEnvAsDotenv helpers for unit-test coverage.
- Bind ATMOS_AUTH_ENV_FORMAT and ATMOS_AUTH_ENV_OUTPUT_FILE env vars.
- Extract loadAuthManagerForEnv, resolveIdentityNameForEnv, loginIfNeeded,
  resolveEnvOutputTarget, and resolveEnvOutputFile helpers to keep
  executeAuthEnvCommand within complexity and length budgets.

cmd/auth/login.go (provider fallback, #2333):
- Change authenticateIdentity signature to (whoami, needsProviderFallback,
  err). On ErrNoIdentitiesAvailable / ErrNoDefaultIdentity, return the
  fallback flag instead of wrapping; caller routes to provider auth.
- Treat ErrUserAborted as a clean abort (no ErrAuthenticationFailed wrap).
- Add getProviderForFallback / promptForProvider / isInteractive helpers
  for the auto-provision-identities first-login path.
- Wire maybeOfferProfileFallbackOnAuthConfigError around identity-flow
  errors.

cmd/auth/exec.go, cmd/auth/shell.go:
- Surface identity-resolution errors through
  maybeOfferProfileFallbackOnAuthConfigError so a stale base profile no
  longer dead-ends with `no default identity`.

Tests:
- env_test.go: add TestGitHubEnvAutoDetect (auto-detect $GITHUB_ENV +
  heredoc framing), update TestSupportedFormats to expect 5 formats.
- login_test.go: update TestAuthenticateIdentity for the new
  needsProviderFallback signal; add ErrNoIdentitiesAvailable case.
- integration_test.go (new): TestAuthEnvFormatCompletion,
  TestAuthWhoamiOutputCompletion, TestAuthCommandCompletion_FlagInheritance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* updates

* [autocommit] formatting fixes

* test(auth): add regression tests for issues #1973 and #2392

Both issues are addressed by the cmd/auth/* registry refactor + terraform
StandardParser registration of --identity. These tests guard the contracts
so a future regression cannot reintroduce either silent flag-drop bug.

Issue #1973 (--profile global flag silently dropped on auth exec/shell):
- cmd/auth/exec_test.go::TestAuthExec_ProfileFlagAppliedToConfig
- cmd/auth/shell_test.go::TestAuthShell_ProfileFlagAppliedToConfig

  Both call BuildConfigAndStacksInfo(cmd, v) — the helper that exec.go
  and shell.go now use before cfg.InitCliConfig — and assert that the
  --profile values round-trip into ConfigAndStacksInfo.ProfilesFromArg
  for single, multiple, and absent profile cases.

Issue #2392 (--identity silently dropped on atmos terraform plan):
- internal/exec/cli_utils_test.go::TestProcessCommandLineArgs_TerraformIdentityFlag_Issue2392

  Reproduces the bug-report arg shape verbatim — `terraform plan
  account-map -s core-gbl-root --identity core-root/admin` — and asserts
  ProcessCommandLineArgs populates info.Identity = "core-root/admin".

- internal/exec/terraform_execute_helpers_auth_test.go::TestSetupTerraformAuth_IdentityFlagPropagatesToAuthCreator

  Builds a merged auth config containing both a `default: true` identity
  ("core-identity/devops") and a non-default identity ("core-root/admin")
  and asserts that setupTerraformAuth passes the explicit --identity
  value verbatim to the auth manager creator — not the profile default.
  This is the exact override that the issue described as silently
  happening at v1.216.0.

- internal/exec/terraform_execute_helpers_auth_test.go::TestSetupTerraformAuth_EmptyIdentity_AllowsAutoDetection

  Inverse guard: with no --identity flag, info.Identity is empty and the
  creator receives the empty string so pkg/auth.resolveIdentityName can
  auto-detect the profile default. Prevents an over-eager fix from
  breaking the default-identity path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* updates

* test(auth): boost cmd/auth coverage from 33% to 47%

Adds focused unit tests for the testable helpers exposed by the cmd/auth
registry refactor. Targets the lowest-coverage files flagged by Codecov:

cmd/auth/auth.go (CommandProvider getters):
- TestAuthCommandProvider_OptionalMethods covers GetPositionalArgsBuilder,
  GetCompatibilityFlags, GetAliases, IsExperimental.
- TestGetAuthCmd_ReturnsAuthCmd guards the public accessor used by cmd/ai
  to attach subcommands.

cmd/auth/env.go (env command helpers):
- TestResolveEnvOutputFile covers all four branches of the GitHub auto-
  detect: non-github pass-through, explicit output-file, $GITHUB_ENV
  detect, and the missing-GITHUB_ENV error sentinel.
- TestResolveEnvOutputTarget exercises viper-backed format/output-file
  resolution including the bash default and the github auto-detect.
- TestLoginIfNeeded covers cache-hit (no Authenticate), missing-cache
  (Authenticate triggered), ErrUserAborted unwrapping, and generic-
  error wrapping with ErrAuthenticationFailed.
- TestResolveIdentityNameForEnv covers the explicit-flag, viper-fallback,
  default-auto-detect, and __SELECT__ interactive paths.

cmd/auth/console.go (browser isolation helpers):
- TestConsoleSessionDir asserts the deterministic XDG path is stable
  across calls, diverges by identity, and diverges by realm.
- TestResolveConsoleIsolated covers default false, auth.console.isolated
  config honoured, flag overrides config in both directions.
- TestPrintConsoleHelpers smoke-covers printConsoleURL and printConsoleInfo
  with full + showURL=true paths.
- TestRetrieveCredentials_NoCredentialsAvailable covers the
  ErrAuthConsole sentinel for the no-credentials-anywhere branch.

cmd/auth/login.go (provider-fallback helpers):
- TestGetProviderForFallback covers ErrNoProvidersAvailable for empty
  list, single-provider auto-select (no prompt), and multi-provider
  non-interactive ErrNoDefaultProvider.
- TestIsInteractive guards determinism (same env → same answer).

cmd/auth/whoami.go (whoami helpers):
- TestAddGCPReauthExplanation covers nil pass-through, unrelated-error
  pass-through, invalid_grant alone (no enrichment), and invalid_grant
  + invalid_rapt enrichment with gcloud reauth hint.
- TestPrintWhoamiJSON_RedactsCredentials guards the contract that the
  JSON output never mutates the caller's Environment map.
- TestPrintWhoamiHuman covers valid/invalid/no-expiration table render.

cmd/auth/list.go (list command helpers):
- TestParseFilterFlags covers the default, --providers (with comma
  list), --identities (with comma list), and the mutually-exclusive
  ErrMutuallyExclusiveFlags branch.
- TestRenderOutput_InvalidFormatErrors guards the default-case
  ErrInvalidFlag path.
- TestListFlagCompletions_NoConfig covers the no-atmos.yaml early-return
  path of listProvidersFlagCompletion / listIdentitiesFlagCompletion.

cmd/auth/logout.go (new logout_test.go):
- TestBuildKeychainDeletionMessage covers the pure prompt formatter.
- TestConfirmKeychainDeletion_ForceShortCircuit covers --force bypass.
- TestConfirmKeychainDeletion_NonTTYWithoutForceErrors covers the
  ErrKeychainDeletionRequiresConfirmation branch.
- TestDetectExternalCredentials covers GCP/Azure/AWS env-var detection.
- TestBuildLogoutOptions covers the empty-config, identities+providers,
  and provider-cascade-label branches.
- TestExecuteLogoutOption_InvalidType covers ErrInvalidLogoutOption.
- TestDiscoverRealms covers missing dir (no error), no-provider-subdir
  filter, and aws/azure realm reporting.

cmd/auth/completion.go (completion helpers):
- TestIdentityFlagCompletion covers the no-atmos.yaml branch.
- TestAddIdentityCompletion_NoFlag covers the no-flag-registered no-op.

cmd/auth/user/helpers.go (form-builder helper):
- TestBuildCredentialFormField covers all six branches: YAML-managed
  Note, DefaultValue pre-fill, password mode, optional, custom
  ValidateFunc wired, description message wired.

Infra:
- New testmain_test.go initialises pkg/data and pkg/ui formatters once
  for the package so tests that exercise printWhoamiJSON/printWhoamiHuman
  don't panic with "data.InitWriter() must be called".
- Snapshot tests/snapshots/TestCLICommands_atmos_auth_validate_--verbose
  picks up an env-dependent debug line drop (gh CLI not authenticated).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* style: apply gofumpt v0.10 multiline call wrapping

CI's pre-commit hook installs `gofumpt@latest` which is now v0.10.0.
That release tightened the multiline-call rule: when arguments span
multiple lines, the function name + opening paren go on their own
line and the closing paren goes on its own line as well. Local toolchain
was on v0.9.1 which didn't enforce this, so the changes only surfaced
on CI.

Files affected (only PR-touched files reformatted):

- cmd/auth/env.go: env.Output(...) call.
- cmd/describe_dependents.go: getRunnableDescribeDependentsCmd(...) call.
- cmd/describe_stacks.go: PersistentFlags().StringP(...) call.

No behaviour change. Matches the auto-fix diff produced by the
cloudposse/github-action-pre-commit job.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(auth): boost cmd/auth coverage from 47% to 69%

Adds smoke and branch-coverage tests across the auth command tree to lift
patch coverage from the post-merge baseline (47.8%) to ~69%.

Orchestrator smoke tests (no-atmos.yaml tempdir, no-panic contract):
- TestExecuteAuthLoginCommand_SmokeNoConfig
- TestExecuteAuthWhoamiCommand_SmokeNoConfig
- TestExecuteAuthListCommand_SmokeNoConfig
- TestExecuteAuthValidateCommand_SmokeNoConfig
- TestExecuteAuthConsoleCommand_SmokeNoConfig
- TestExecuteAuthEnvCommand_SmokeNoConfig
- TestExecuteAuthExecCommand_SmokeNoConfig
- TestExecuteAuthShellCommand_SmokeNoConfig
- TestExecuteAuthLogoutCommand_SmokeNoConfig
- TestExecuteAuthUserConfigureCommand_SmokeNoConfig (cmd/auth/user)

These cover the config-load error wrap path in each orchestrator and
guard against panics for invalid setup. Where a specific error sentinel
is documented (e.g. ErrInvalidAuthConfig, ErrFailedToInitializeAtmosConfig,
ErrAuthConsole), the test asserts the wrap when an error surfaces.

loadAuthManager* helpers (config init + auth manager init):
- TestLoadAuthManager_SmokeFromEmptyTempDir (whoami)
- TestLoadAuthManagerForEnv_SmokeFromEmptyTempDir (env)
- TestLoadAuthManagerForList_SmokeFromEmptyTempDir (list)
- TestInitializeAuthManager_SmokeFromEmptyTempDir (console)
- TestSuggestProfilesForAuth_NoProfilesReturnsNil

prepareShellEnvironment (cmd/auth/shell.go) — mocked-AuthManager test
covering cache-hit, fresh-auth-success, ErrUserAborted, generic-error
wrap with ErrAuthenticationFailed, PrepareShellEnvironment error, and
atmosConfig.Env propagation through MergeGlobalEnv:
- TestPrepareShellEnvironment (six subtests)

prepareAuthenticatedEnv (cmd/auth/exec.go) — smoke from empty tempdir:
- TestPrepareAuthenticatedEnv_SmokeNoConfig

Display + handleBrowserOpen helpers (smoke):
- TestDisplayExternalCredentialWarnings (with-warnings + clean branch)
- TestDisplayBrowserWarning (first-call + cached-skip branches)
- TestHandleBrowserOpen (skipOpen=true, nil opener, success, error)

Logout perform helpers — mocked AuthManager branch coverage:
- TestPerformIdentityLogout_NotFound (ErrIdentityNotInConfig)
- TestPerformIdentityLogout_DryRun (no Logout call)
- TestPerformProviderLogout_NotFound (missing provider in config)
- TestPerformLogoutAll_DryRun (no LogoutAll call)
- TestPerformLogoutAll_Success (happy path, two identities)

renderOutput dispatcher coverage:
- TestRenderOutput_AllValidFormats covers all 9 valid format branches
  (table/tree/json/yaml/graphviz/dot/mermaid/markdown/md).

Coverage summary:
- cmd/auth: 47.6% → 69.7%
- cmd/auth/user: 51.0% → 58.7%
- combined: 47.8% → 68.9%

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(auth): address review comments and push coverage from 47% to 78%

Addresses CodeRabbit review comments and substantially increases test
coverage of the cmd/auth package using a shared mock-auth fixture.

Review fixes:
- cmd/auth/completion.go, cmd/auth/list.go: all five shell-completion
  helpers now honour --base-path, --config, --config-path, and --profile
  by routing through BuildConfigAndStacksInfo(cmd, v) instead of using
  an empty ConfigAndStacksInfo{}.
- cmd/auth/console.go: --print-only now propagates the data.Writeln
  write error so broken-pipe / stdout failures exit non-zero. The
  empty-identity branch of resolveIdentityName now uses multi-%w so
  ErrNoDefaultIdentity stays in the chain for the profile-fallback
  dispatcher.
- cmd/auth/exec.go: prepareAuthenticatedEnv now returns []string
  directly (was []string → map → []string round-trip) so environment
  ordering is preserved and Windows drive-scoped vars (=C:=...) don't
  collide on the empty key.
- cmd/auth/shell.go: fail fast when positional args are not preceded
  by `--` (`atmos auth shell bash` previously silently dropped "bash").
- cmd/auth/logout.go: add cobra.MaximumNArgs(1) so extra positional
  args are rejected up front.
- cmd/auth/validate.go: wrap config-load failure with the static
  ErrFailedToInitializeAtmosConfig sentinel.
- cmd/auth/login.go: introduce isInteractiveFn package var so
  getProviderForFallback tests can force the non-interactive branch
  deterministically.
- cmd/auth/markdown/*.md: every opening fence now has the `shell`
  language identifier (MD040). The `$ ` prefix on commands is kept
  for consistency with the rest of cmd/markdown/.
- cmd/auth/user/configure.go: switch user-facing messages from
  fmt.Fprintf(cmd.ErrOrStderr()) to ui.Writef / ui.Writeln per the
  I/O layer convention.
- cmd/identity_helpers.go: add the missing perf.Track in
  CreateAuthManagerFromIdentityWithStackScan to match its sibling
  helpers.

Coverage improvements (cmd/auth 47.6% → 79.3%; combined 47.8% → 77.8%):

New shared helpers (helpers_test.go):
- setupMockAuthFixture(t): writes a minimal atmos.yaml wired to the
  mock/aws provider and isolates keyring + XDG env to a tempdir, used
  by 9 deep-coverage tests to exercise the full orchestrator pipeline
  without touching the host's credential store.
- runProfileFlagAppliedRegressionTest(t, commandName): shared
  table-driven driver for the issue #1973 regression so the
  exec_test.go and shell_test.go wrappers feed the same cases through
  one body (and dupl-lint stays clean).
- newTestCommandWithGlobalParser: parser-returning variant of the
  global-flags helper so regression tests can drive the real
  Cobra → Viper binding path (cmd.ParseFlags → BindFlagsToViper).

End-to-end orchestrator tests against the mock fixture:
- TestExecuteAuthEnvCommand_WithMockAuth
- TestExecuteAuthLoginCommand_WithMockAuth
- TestExecuteAuthListCommand_WithMockAuth / _JSONFormat
- TestExecuteAuthValidateCommand_WithMockAuth
- TestExecuteAuthWhoamiCommand_WithMockAuth
- TestExecuteAuthConsoleCommand_WithMockAuth (covers
  ErrProviderNotSupported for mock/aws)
- TestExecuteAuthLogoutCommand_WithMockAuthDryRun
- TestPrepareAuthenticatedEnv_WithMockAuth (asserts AWS_PROFILE +
  AWS_REGION injection)
- TestExecuteAuthExecCommand_NoCommand (ErrNoCommandSpecified guard)

Logout perform-helper branch coverage:
- TestPerformIdentityLogout_Success / _PartialLogout / _LogoutError
- TestPerformProviderLogout_Success / _DryRun
- TestExecuteLogoutOption_DispatchAll / _DispatchIdentity / _DispatchProvider
- TestPerformInteractiveLogout_NoIdentities (empty-identities branch)
- TestPerformLogoutAllRealms_NoRealms / _DryRun / _RealRemove

Pure / smoke helpers:
- TestRetrieveCredentials_InlineCredentials (success path)
- TestPromptForProvider_EmptyList (ErrNoProvidersAvailable guard)
- TestExecuteCommandWithEnv_NonZeroExit (errUtils.ExitCodeError
  propagation via the test-binary subprocess pattern)
- TestExecuteCommandWithEnv_WithValidCommand rewritten to use
  os.Executable() + _ATMOS_AUTH_TEST_EXIT_OK=1 (cross-platform,
  no PATH dependency on `go` / `true` / `false`).
- Subprocess env-flag handlers added to TestMain.

Test infrastructure:
- TestAuthExec_ProfileFlagAppliedToConfig and the shell equivalent
  now use --profile=devops style CLI args + ParseFlags +
  BindFlagsToViper, exercising the full production binding chain
  rather than seeding viper directly.
- Identity-resolution shared test table gains a "flag takes
  precedence over env" case so the precedence rule (flags > env >
  default) is regression-covered for both auth shell and auth exec.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(auth): address review comments — fence repair, helpers, sentinel

Addresses six CodeRabbit review comments from the latest batch:

1. cmd/auth/console_test.go — drop tautological constant tests.
   TestConsoleLabelWidth and TestConsoleOutputFormat just asserted that
   a literal equals itself. The constants are exported but only used
   internally; not part of an external API contract.

2. cmd/auth/console_test.go — fragile test-name dispatch.
   TestResolveConsoleDuration's "invalid provider duration format" case
   keyed its assertion off tt.name. Renaming the case would silently
   skip the error check. Added an explicit `expectParseError bool`
   field; switch case now keys off that.

3. cmd/auth/exec_test.go — single-case table replaced.
   TestGetSeparatedArgsForExec was a one-case table that duplicated the
   sibling TestGetSeparatedArgsForExec_EmptyCommand. Rewrote with five
   meaningful cases (no separator, positional-without-sep, separator+
   single command, separator+command+args, separator-only). Deleted the
   now-redundant sibling test.

4. cmd/auth/env_test.go — safe stdout-capture helper.
   Five sites used the same fragile capture pattern: if require.NoError
   aborted before restoration, os.Stdout stayed redirected and the read
   end of os.Pipe was never closed. Added captureStdout(t) helper in
   helpers_test.go that registers t.Cleanup to guarantee restoration
   and close both pipe ends even when intervening assertions abort.
   All five sites now use `read := captureStdout(t)` / `output := read()`.

5. cmd/auth/env_test.go — replace hardcoded Unix paths with t.TempDir().
   Three paths (/tmp/out.sh, /explicit/path, /path/to/.env) replaced
   with filepath.Join(t.TempDir(), ...) so the tests don't bake in a
   Unix separator.

6. cmd/auth/markdown/atmos_auth_console_usage.md +
   cmd/auth/markdown/atmos_auth_logout_usage.md — fix malformed
   closers. An earlier awk script that added the shell language
   identifier to opening fences had a state-machine flaw on files that
   already mixed labeled/unlabeled fences; six closing fences across
   two files were rewritten as ```shell instead of plain ```. Repaired
   to keep the rest of the doc rendering correctly. Audited all four
   auth markdown files; the other two were already correctly paired.

7. cmd/auth/logout_test.go + sibling _WithMockAuth tests — add a
   cmd-state isolation helper. Tests that mutate package-level
   auth*Cmd via ParseFlags could leak flag.Changed / flag values to
   subsequent tests. cmd.NewTestKit isn't reachable from cmd/auth
   without a circular import, so added a local equivalent
   resetAuthCmdFlags(t, cmd) that snapshots and restores every flag's
   (Value, Changed) pair via t.Cleanup. Applied to all 8 tests that
   ParseFlags a shared cmd: TestExecuteAuthLogoutCommand_SmokeNoConfig
   and _WithMockAuthDryRun (the two reviewer-flagged sites), plus
   _WithMockAuth variants for console, env, exec
   (TestPrepareAuthenticatedEnv_WithMockAuth + TestExecuteAuthExecCommand_NoCommand),
   list (tree + JSON), login, validate, whoami.

8. cmd/auth/shell.go — tighten the pre-dash arg check and fix the hint.
   The previous check only caught the no-separator case; `atmos auth
   shell bash -- -lc env` had ArgsLenAtDash() == 1 and slipped through
   while getSeparatedArgs silently dropped "bash". Condition is now
   `dashIndex == -1 || dashIndex > 0` so positional args appearing
   before "--" are also rejected. The error message no longer suggests
   `-- bash` (which would just feed "bash" as the first arg to the
   default shell) — it points at `--shell` for the shell-binary
   override and "--" only for the shell args.
   Extracted into validateAuthShellArgs to keep executeAuthShellCommand
   under the 60-line revive limit. Added TestValidateAuthShellArgs with
   5 subtests covering the three acceptable and two rejected arg
   shapes plus the ErrInvalidArguments sentinel contract.

9. cmd/auth/shell.go + cmd/auth/exec.go — wrap PrepareShellEnvironment
   failures with a static sentinel. Both helpers had a raw
   fmt.Errorf("failed to prepare ...: %w", err) that didn't satisfy the
   repo-wide "All errors MUST be wrapped using static errors defined in
   errors/errors.go" rule. Added new sentinel
   errUtils.ErrPrepareShellEnvironment and applied to both call sites.
   Updated TestPrepareShellEnvironment to assert the sentinel is in the
   chain (errors.Is) plus the original underlying error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(auth): apply resetAuthCmdFlags across all smoke tests for state isolation

Add `resetAuthCmdFlags(t, cmd)` to every test that uses a package-level
`auth*Cmd` so flag/Changed state cannot leak across tests under shuffled
runs. This is the in-package equivalent of `cmd.NewTestKit(t)` —
`cmd/auth` cannot import `cmd` (cmd/root.go blank-imports cmd/auth) and
`NewTestKit` is `_test.go`-scoped, so the local helper enforces the same
auto-cleanup contract via t.Cleanup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Matt Topper <matt.topper@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Andriy Knysh <aknysh@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: aknysh <andriy.knysh@gmail.com>
Co-authored-by: atmos-pro[bot] <atmos-pro[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants