feat(store): add atmos store CRUD CLI and type: store workflow step @osterman (#2858)
## what- Adds
atmos store— a new CLI command group (set/get/delete/list) for raw CRUD access to any store backend configured understores:inatmos.yaml(AWS SSM, AWS Secrets Manager, HashiCorp Vault, Azure Key Vault, GCP Secret Manager, Redis, Artifactory, 1Password, Keychain, GitHub Actions). Unlikeatmos secret, no declaration is required — any key can be read, written, or deleted directly by name, optionally scoped to a stack and component. - Adds a
type: storeworkflow step that writes a value from a workflow, custom command, or hook — usable automatically as a hook too via the existing generickind: stepbridge, with no extra wiring. - Both close the write-side gap next to the existing read-only
!store/!store.getYAML functions, so pipeline metadata (an image tag from a build step, a build number, a deployment marker) can be handed off to a completely different stack or component. - Includes unit tests for the new
pkg/store.Servicefacade, thecmd/storecommand family, and thestorestep handler, plus CLI/website docs, a changelog post, and a roadmap milestone.
why
- Store backends previously supported reads only (
!store/!store.get); the only existing write path was a single Terraform-output-specific hook (kind: store), so anything else needing to be written into a store meant scripting around Atmos with a cloud CLI. - This gives Atmos a native, declaration-free CRUD surface and a first-class workflow step for the common build → push → record-value → later-read pattern, without requiring the value to be formally declared as a secret.
references
- N/A
Summary by CodeRabbit
-
New Features
- Added experimental
atmos storecommands to set, get, list, and delete values across configured backends. - Added scoping, interactive or stdin input, deletion confirmation, raw output, multiple formats, key enumeration, and secret-value masking.
- Added
type: storeworkflow steps for writing templated values. - Added Terraform output and refresh lifecycle hooks for store integrations.
- Added experimental
-
Documentation
- Added CLI, configuration, workflow, hooks, and usage documentation with examples and backend limitations.
-
Tests
- Added comprehensive coverage for store commands, workflow behavior, and Terraform hooks.
Add tfmigrate support for Terraform components @osterman (#2534)
## what- Add
atmos terraform migrate plan,apply, andlistfor running user-authoredtfmigratemigrations in Terraform component context. - Add
kind: tfmigratelifecycle hooks with dynamic/static modes, toolchain resolution, Terraform/OpenTofu exec path wiring, and same-identity auth handling. - Export stack/component/workspace-scoped history variables and supported Terraform backend settings so users can configure durable
tfmigratehistory storage. - Update schemas, PRD, command docs, hook docs, roadmap, and changelog for the new migrate command family and history persistence limitation.
why
- Terraform state migrations need to run after Atmos auth, source/workdir provisioning, generated files, init, and workspace selection so automation matches normal Terraform operations.
- Rerun-safe automation depends on durable
tfmigratehistory storage, so Atmos now documents and exposes the values users need without taking on history persistence in v1.
references
Summary by CodeRabbit
- New Features
- Added experimental
atmos terraform migrate plan,apply, andlistcommands. - Added
tfmigratelifecycle hooks with dynamic and explicit execution modes. - Added migration history support for local, S3, and GCS backends.
- Added affected-component workflows and configurable migration output.
- Added experimental
- Bug Fixes
- Improved hook validation, dry-run handling, terminal color precedence, and provider resolution.
- Missing migration directories now safely produce no-op results.
- Documentation
- Added CLI guidance, migration patterns, advanced examples, and help pages.
- Tests
- Added comprehensive unit, integration, and end-to-end coverage.
feat(vendor): native component updater PR workflow @osterman (#2756)
validation
Manually tested end-to-end as a real user — following --help/docs, in isolated sandboxes, and against a real repository (cloudposse/infra-live):
- Opened two real pull requests exercising both the default and the full
vendor.ci.pull_requestconfig surface (title/body templates, labels, draft, reviewers, assignees) — #1701, #1702 (left as drafts, not merged). - That testing surfaced and fixed 5 real bugs along the way:
--pull-requestcreated a pull request but never printed its URL in the default table output.atmos.yaml'svendor.update.*/vendor.ci.*config (groups, execution mode, PR title/labels/draft/reviewers) was silently ignored — read from the wrongviperinstance instead of the parsed config.--alldouble-counted every component when a repo vendors exclusively viacomponent.yamland leaves an unused component type (e.g.packer) unconfigured.- A pull request's link was discarded entirely when a post-creation step failed (hit for real: GitHub rejecting a review request from the PR's own author).
- SBOM's
oci-artifactscoverage entry always claimed "complete" regardless of whether any OCI artifact existed in the project.
- Also manually verified
atmos vendor verify/clean/--refresh-lock/--lock-enforcement(all three modes) andatmos sbom generate(CycloneDX vs. SPDX, NTIA mode, experimental gating, upload-outside-CI) in isolated sandboxes. - Added
ATMOS_PRO_GITHUB_TOKEN(the tokengithub/stsmints) to the Component Updater's GitHub token precedence, soatmos auth exec --identity <github-sts-identity> -- atmos vendor update --pull-requestgets a token that triggers downstream Actions workflows on the PR it opens — unlike the defaultGITHUB_TOKEN, which GitHub excludes from re-triggering workflows.
references
- Component Updater PRD
Summary by CodeRabbit
- New Features
- Added experimental
atmos sbom generatewith provenance/NTIA modes, SPDX/CycloneDX output, and optional CI artifact upload. - Added native
atmos vendor update --pull-requestworkflows with component/group selection and deterministic PR publishing. - Added
atmos vendor verify,atmos vendor clean, andvendor.lock.yamldrift protection. - Added lock refresh/enforcement options, semver-range resolution, and improved source provenance metadata.
- Added experimental
- Bug Fixes
- Improved cancellation handling and transient OCI decompression recovery.
- Documentation
- Expanded SBOM, vendoring, lockfile, and component-updater guidance.
feat(workflow): support tags and labels selectors @zack-is-cool (#2857)
## what- Enable
--tagsand--labelsonatmos workflow, forwarding them to nestedtype: atmossteps alongside optional--stack. - Preserve selector forwarding for parallel and matrix workflow controls.
- Document the feature, publish its changelog post, and add its workflow-roadmap milestone.
why
- Target existing workflows by component metadata without duplicating workflows or reconstructing their commands manually.
references
- Closes #2852
validation
go test ./internal/exec -run TestExecuteWorkflow_ForwardsCommandLineFilters -count=1go test ./pkg/workflow -run 'TestAppendAtmosStepFlags|TestControlCommandExecutorExecuteAtmos' -count=1go test ./cmd/workflow -run TestWorkflowSelectorFlags -count=1git diff --check
Summary by CodeRabbit
-
New Features
- Added
--tagsand--labelsselectors to workflow commands. - Selectors are forwarded to nested Atmos steps, including parallel and matrix workflows.
- Selectors can be combined with
--stackwhile preserving workflow ordering and execution behavior.
- Added
-
Documentation
- Updated CLI references with selector options and usage examples.
- Added workflow selector guidance to the blog and roadmap.
🚀 Enhancements
fix(config): resolve git-root base_path for --config/--config-path @osterman (#2864)
## what- Fixes
pkg/config/load_config_args.goso that loading configuration via--config/--config-pathalso applies git-root discovery for an empty (or.)base_path, matching the plain auto-discovery flow inLoadConfig(). - Adds a regression test (
TestLoadConfigFromCLIArgs_AppliesGitRootBasePath) that reproduces the bug and verifiesbase_pathnow resolves correctly. - Bumps the
fast-uritransitive dependency (website) from 3.1.4 to 3.1.5 to remediate a high-severity host-confusion vulnerability (GHSA-7p8r-x3mc-p8w7 / CVE-2026-18446), flagged by Dependabot after this branch was pushed.
why
loadConfigFromCLIArgs()never calledapplyGitRootBasePath(), unlike the mainLoadConfig()auto-discovery path. As a result, a project withbase_path: ''inatmos.yamlresolved correctly via plain auto-discovery but leftbase_pathempty when the identical config was loaded via--config, breaking component/stack path resolution (e.g.atmos terraform test) withError: failed to find import.- The
fast-uribump addresses a live Dependabot alert (a patch-level version bump, not blocked by.github/dependabot.yml's major-version ignore policy) surfaced automatically after pushing this branch.
references
- closes #2863
Summary by CodeRabbit
-
Bug Fixes
- Configuration loaded through command-line options now resolves an empty or
"."base path to the Git repository root. - Configuration loading continues when repository root discovery encounters an error.
- Improved ZIP extraction safety by blocking path traversal and preventing writes outside the intended destination.
- Improved error reporting for ZIP directory and file creation failures.
- Configuration loaded through command-line options now resolves an empty or
-
Tests
- Added coverage for configuration base-path resolution and ZIP extraction security and failure handling.
fix(auth): prevent Azure CLI cache corruption for guest users @aknysh (#2861)
## what- Skip the Azure CLI cache write-back entirely when credentials originated from the
azure/cliprovider — az's own cache is authoritative, and writing back what came from az is what corrupted it. - Record the originating auth method on
AzureCredentials(cli/device_code/oidc) so the write-back can be gated per provider kind. - Capture MSAL's real home account ID in the
azure/device-codeprovider (silent and interactive flows) and use it in both Azure CLI cache writers (UpdateAzureCLIFilesand the provider-levelupdateAzureCLICache), falling back to the previous{oid}.{tenant}derivation when unavailable. - Replace the
azure/subscriptionidentity's field-by-field credential copy with a struct copy plus explicit overrides, and add a reflection-based regression test that fails if any futureAzureCredentialsfield is dropped by the wrap. - Isolate
TestNewMSALCache's default-path case from the real~/.azure.
why
- After
atmos auth login, the Azure CLI cache write-back created an MSAL Account entry withhome_account_idderived as{oid}.{target-tenant}and hardcodedaccount_source: "device_code". For guest (B2B) users the home tenant differs from the target tenant, so az ended up with two Account entries for the same username and failed every subsequent command withFound multiple accounts with the same username(azure-cli#20168) — includingaz account get-access-token, which theazure/cliprovider itself shells out to. In other words, oneatmos auth loginbroke both az and the next atmos login for any guest user. - Reproduced and verified end to end against a real tenant where the operator is a B2B guest: before the fix,
az login→atmos auth login→ az broken; after the fix, az stays healthy, the cache keeps exactly one Account entry, and the persisted credentials carryauth_methodso the gate holds across credential caching. - The subscription identity's field-by-field copy silently dropped the new fields before they reached the cache writer (found only by the end-to-end test), which is why the copy is now structural and guarded by a reflection test.
references
- Azure/azure-cli#20168 (the az failure mode this triggered)
Summary by CodeRabbit
New Features
- Azure credentials now retain authentication method and account identity details.
- Improved support for guest and cross-tenant Azure accounts during authentication and token caching.
- Subscription-based authentication preserves provider credential settings while applying subscription-specific values.
Bug Fixes
- Azure CLI authentication no longer unexpectedly modifies CLI credential cache files.
- Corrected account identification and tenant details for guest-user authentication.
- Improved cache path handling across different environments.