feat: report CLI exceptions to Atmos Pro with metadata and Pact @osterman (#3220)
## what- Automatically report CLI exceptions to Atmos Pro from eligible GitHub Actions runs when Pro is enabled, with explicit opt-out, fresh OIDC authentication, masking, bounded delivery and shutdown, separate Sentry destinations, unprefixed metadata tags, and shared execution IDs.
- Extend the existing Atmos consumer Pact with success/401 envelope contracts and CI verification; add configuration schemas, regression tests, usage documentation, release notes, roadmap, and edition migration notes.
why
- Connect failures to their stack, component, team, and execution without manual reporter setup while preserving command exit codes; existing Pro-enabled stacks gain automatic reporting and can retain prior behavior through the opt-out.
references
- Validated all 23 Pact interactions, race and CLI/configuration tests, lint, workflow syntax, binary and website builds; Pro provider verification and persisted-tag assertions remain tracked in #3219.
Summary by CodeRabbit
- New Features
- Added automatic CLI exception reporting to Atmos Pro for eligible GitHub Actions runs when Pro is enabled. Reports include execution and component context, with sensitive values masked.
- Added
settings.pro.errors.enabledand theATMOS_PRO_ERRORS_ENABLEDenvironment variable to control reporting independently. Reporting can be disabled without changing command exit codes or existing Sentry destinations.
- Documentation
- Added setup, eligibility, configuration, GitHub OIDC requirements, and opt-out guidance for Atmos Pro exception reporting.
Resolve toolchains from project configuration without changing pins @osterman (#3215)
## what- Preserve
.tool-versionsduring automatic installs, enforce existing artifact checksums, record missing lock entries, and add opt-in frozen lockfile configuration for CI. - Resolve configured toolchain paths against the project base and honor
ATMOS_TOOLCHAIN_FILE_PATHandATMOS_TOOLCHAIN_INSTALL_PATHduring explicit installs, automatic dependencies, and Atmos self-bootstrap. - Use the active project configuration for bootstrap and default to XDG storage outside projects, while honoring explicit installation paths. Include regression tests, configuration docs, migration notes, a changelog, and a roadmap update.
why
- Prevent incidental dependency edits and working-directory files while keeping installation metadata reproducible.
references
- Closes #3213
- Validation: Go build, affected package tests, focused race tests, lint, and website production build
Summary by CodeRabbit
- New Features
- Added frozen lockfile mode, which requires complete URL and checksum entries for the requested tool and platform, including cached tools, and prevents lockfile updates.
- Added environment settings for toolchain install paths and frozen lockfile mode.
- Improvements
- Relative toolchain paths now resolve from the project directory, even when commands run elsewhere.
- Automatic installs preserve declared tool versions and existing matching lockfile entries, recording missing entries after successful installation.
- Atmos version bootstrapping uses active project settings, or an XDG cache location when run outside a project.
- Documentation
- Updated toolchain configuration and installation guidance for path resolution and frozen installs.
π Enhancements
fix: restore TUI startup and defer list/describe authentication @osterman (#3212)
## what- Restore the interactive picker for bare
atmoswhen stacks exist, retain help for stackless projects, and preserve CLI/environment configuration overrides. - Make list/describe evaluation demand-driven through a shared
pkg/deferredcontract with subsystem-owned auth, store, secret, and stack adapters; oneAuthManagerowns deferred/disabled state and cached authentication instead of parallel resolver fields and caller flags. - Keep provider error classification in providers, preserve explicit-identity failures, isolate caches and concurrent store/secret reads by authentication scope, and add deterministic regressions and documentation.
why
- Unused values must never authenticate; requested unavailable values should render
(computed)according to warn/silent policy while strict mode remains fatal.
references
Summary by CodeRabbit
-
New Features
- Running
atmoswithout a subcommand opens the interactive picker when stack configuration is available and both input and output are interactive; otherwise, help is shown. - List and describe commands evaluate requested values on demand. Unused fields and columns no longer trigger authentication or evaluate unrelated values.
- Unavailable implicit credentials can be handled according to the commandβs error mode: show computed values with a warning, omit the warning, or fail.
- Running
-
Bug Fixes
- Explicit identity selection, including through
ATMOS_IDENTITY, is validated before processing; authentication failures are no longer silently skipped. - AWS access-denied responses remain authorization errors rather than being reported as unavailable credentials.
- Authentication and authorization errors during deferred store lookups are no longer replaced by configured defaults.
- Cached Terraform outputs are isolated by authentication context to prevent values from being reused across identities.
- Explicit identity selection, including through
fix(describe-affected): cover all component types (deleted helm/kubernetes + ansible/container/emulator) @aknysh (#3204)
> Consolidated PR: this supersedes #3202 (deleted native helm/kubernetes) and adds the ansible/container/emulator coverage from #3203. #3202 has been closed in favor of this one so the team reviews a single PR.what
atmos describe affectednow evaluates the full eight-type canonical set of component types in both its added/modified and deleted paths β matchingdescribe component/describe dependents.
why
describe affectedwas the outlier: its added/modified path (processStackAffected) and deleted path (detectDeletedComponents) each enumerated a partial, hardcoded type list, so changed/deleted components of the missing types were silently unreported β breaking CI/CD pipelines built on it.- #3199: an added native Helm component was detected but a deleted one wasn't (added path had helm/kubernetes; deleted path didn't).
- #3203:
ansible/container/emulatorwere absent from both paths.
changes
- Shared
deletableComponentTypes= the full 8 types, so the deleted path stays in sync with the added/modified path. - Replaced the byte-identical
processHelmfileComponentsIndexed/processPackerComponentsIndexedwith a genericprocessSimpleComponentsIndexed(componentType, ...); routes helmfile/packer/ansible/container/emulator through it viasimpleAffectedComponentTypes. terraform/kubernetes/helm keep dedicated processors (Spacelift/Atlantis, k8s manifests, helm values files). emulatorhas no filesystem source tree (getComponentBasePathreturns ""): empty path pattern, folder-change detection skipped; ansible/container base paths added to the pattern cache, relevant-files switch, and base-path index;BuildComponentPathresolves ansible/container.- Index each changed file under every containing base path (nested-base-path case).
- File/folder dependency checks run even without a
settingssection; settings-equality guarded on presence (!= nil), so an emptiedsettings: {}is still reported.
tests
- Deleted: all 8 types detected; native helm (component + entire-stack); ComponentPath populated for ansible/container, empty for emulator; abstract/malformed skipped.
- Added/modified: vars+env changes for ansible/container/emulator (assert both
stack.varsandstack.env); settings-section + emptied-settings cases; file dependency without settings; pattern cache resolves ansible/container and returns empty for emulator.
scope note
ansible/container/emulator component-instance first-class fields (e.g. container image/build/run, emulator driver) are not compared β no such schema exists yet (those kinds are upcoming; driver lives on container workflow steps). The section-check mechanism already covers the standard sections these components use.
references
- Closes #3199
- Closes #3203
- Supersedes #3202
- Custom (non-built-in) component types remain out of scope β follow-up #3208.
validation
go build ./...go test ./internal/exec/ -run 'Affected|DetectDeleted|IsAbstract|ProcessComponents|ComponentPathPattern'atmos lint --changed(0 issues)
Summary by CodeRabbit
- New Features
describe affecteddetects added, modified, and deleted Ansible, container, and emulator components, alongside existing component types, including native Helm and Kubernetes deletions.- Ansible and container source-file changes are matched to their components. Emulator components are evaluated without requiring a source directory.
- Changes within nested component paths can be reported for each matching component.
- File and folder dependencies are checked even when a component has no settings section.
- Added, modified, emptied, and removed settings sections are detected as changes.
fix(terraform): wrap and pretty-print --ui attribute values @osterman (#3216)
## what- Wrap Terraform
--uiattribute values within the terminal width, preserve tree rails and aligned attribute headers, align scalar continuations afterβ, and place multiline documents beneath their attribute headers at every terminal width. - Detect and pretty-print JSON/YAML strings with existing syntax-highlighting settings while retaining update diffs, sensitive/unknown placeholders, replacement annotations, and configured collapsing.
why
- Long KMS policy strings overflowed during a demo, causing terminal wrapping to lose indentation and interrupt the left rail; explicit Unicode/ANSI-aware wrapping preserves the complete content.
references
- Validation: KMS regression coverage at 60/80/120/180 columns, Terraform UI and tree tests (94.4% UI coverage), streaming-executor tests, custom lint (zero issues), and the website production build.
Summary by CodeRabbit
- Improvements
- Terraform dependency-tree output formats attribute changes with aligned values and readable diffs for structured or multiline content.
- Long values wrap without losing content, and column alignment accounts for Unicode characters.
- Sensitive and not-yet-known values are clearly labeled.
- Structured JSON and YAML values can be syntax-highlighted when enabled.
- Terraform dependency-tree output respects the active terminal width and formatting settings.