docs(dependencies): document dependencies.components for describe affected @osterman (#2391)
## what- Update
atmos describe affecteddocs to lead with the newdependencies.components(kind: file|folder+path:) format for path-based dependencies; keep a short backward-compat note pointing to legacysettings.depends_on. - Convert the dependents example on the
describe affectedpage fromsettings.depends_ontodependencies.components. - Correct the Merge Behavior section in
stacks/dependencies/components.mdx: the default is replace, not append; append requires opting in viasettings.list_merge_strategy: append. Add an "Opt-in append" subsection and link to thesettingsreference. - Add a migration callout under the schema in
stacks/dependencies/components.mdxclarifying thatnamespace/tenant/environment/stageare not supported in the new format — use a templatedstack:instead. - Rebalance
stacks/dependencies/index.mdxsodependencies.toolsanddependencies.componentsget equal billing in the intro, use cases, and component-dependencies subsection. Remove the duplicate Related Documentation entry and relabel the legacy link as "Legacysettings.depends_on". Add a link toatmos describe affected. - Extend the Atmos manifest JSON Schema (
website/static/schemas/...and the matching test fixture) sodependencies.componentsis allowed and validatescomponent,stack,kind,path. Previously rejected byadditionalProperties: false.
why
- The dedicated
dependencies.componentspage existed, but the highest-traffic surface (describe affected) and the JSON Schema still only documented/allowed the legacysettings.depends_onmap — driving users to the deprecated format and making the new format fail IDE/SchemaStore validation. - The merge-behavior description in
stacks/dependencies/components.mdxcontradicted the announcement blog and the actual code (internal/exec/describe_dependents_test.go:1093–1154confirms default = replace, append is opt-in viasettings.list_merge_strategy). Users following the docs would have built a wrong mental model of inheritance. - The migration story from
settings.depends_on(withnamespace/tenant/environment/stage) todependencies.components(with templatedstack:) was only discoverable via the migration table at the bottom of the page; surfacing it as a callout reduces confusion for users porting existing configs.
references
pkg/schema/dependencies.go— canonical field set fordependencies.componentsinternal/exec/describe_dependents_test.go:1093–1154— confirms default merge is replace, append requiressettings.list_merge_strategy: appendwebsite/blog/2026-03-14-dependencies-components.mdx— original announcement- Verified:
cd website && npm run buildsucceeds (no broken-link errors)
🤖 Generated with Claude Code
Summary by CodeRabbit
-
New Features
- Dependencies now support four top-level kinds: tools, components, files, and folders. Component-to-component relationships and explicit file/folder watch paths are first-class; describe-affected, describe-dependents, and CI workflows use the expanded surface while legacy formats remain supported.
-
Documentation
- Guides updated with examples, migration notes, canonical forms, merge semantics, and quick examples for cross-stack and path-based dependencies.
-
Tests
- Added coverage for the new surfaces, aliasing, deduplication, normalization, and v1/v2 equivalence.
fix(ci): repair Docker build and Homebrew formula bump in release workflow @aknysh (#2525)
## what- Replace the flaky upstream
install_kustomize.shscript in the Dockerfile with a direct download from GitHub Releases, pinned to kustomize v5.8.1 - Replace
mislav/bump-homebrew-formula-action@v3withdawidd6/action-homebrew-bump-formula@v7(SHA-pinned) for the Homebrew formula bump step
why
- The kustomize install script has known bugs (kubernetes-sigs/kustomize#5562) causing tar extraction failures (
tar: ./kustomize_v*_linux_amd64.tar.gz: Cannot open) during Docker image builds - The
mislav/bump-homebrew-formula-actionis broken because GitHub now returns HTTP 303 instead of 302 for tarball redirects, and the action hardcodesstatusCode == 302(mislav/bump-homebrew-formula-action#340, open/unfixed) - Both failures blocked the v1.219.0 release workflow (run #26131090357)
references
- https://github.com/cloudposse/atmos/actions/runs/26131090357/job/77908154273
- mislav/bump-homebrew-formula-action#340
- kubernetes-sigs/kustomize#5562
Summary by CodeRabbit
- Chores
- Updated build and deployment infrastructure, including CI/CD workflow configuration and Docker build process improvements for enhanced reliability and maintainability.
🚀 Enhancements
fix(hooks): persist interactive stack selection and auth context for PostRunE hooks @aknysh (#2520)
## what- Store hooks now fire when the stack is selected via the interactive prompt (not just when passed with
-s). - Store hooks can now read terraform outputs from S3 backends that require role assumption via
assume_role. - Auth context and auth manager from the main terraform execution are persisted and injected into PostRunE hook info so the hook's
terraform outputsubprocess has the correct credentials.
why
Two bugs in the store hooks execution path caused hooks to silently fail in common scenarios:
-
Interactive stack selection lost for hooks (#2432): When a user runs
atmos terraform apply componentand selects the stack from the interactive prompt, the selected stack value was stored in the localinfo.Stackbut never persisted to the Cobra flag set. PostRunE hooks re-parse args viaProcessCommandLineArgs, which reads fromcmd.Flags().GetString("stack")— still empty. The hook silently skipped because it saw no stack. Fix: after the interactive prompt fillsinfo.Stack, also set the Cobra flag viaf.Value.Set(stack)so downstream consumers can read it. -
Missing backend credentials for hook's terraform output (#2433): The store hook's
terraform outputsubprocess needs credentials to access the S3 state backend, which often requires a chained role assumption (e.g.,dev-role → tfstate-access-role). The mainExecuteTerraformsets up the full credential chain viasetupTerraformAuthandprepareComponentExecution, but it takesinfoby value — the populatedAuthContextandAuthManagerdon't flow back to the caller. The PostRunE hook creates a freshinfowith nil auth fields, so the output subprocess fails with "No valid credential sources found". Fix: persist the auth context viaSetLastAuthContextafterprepareComponentExecution, and inject it into the hook's freshinfoinrunHooksWithOutput.
references
- Closes #2432
- Closes #2433
- Related: #2428 (original consolidated issue, closed in favor of #2432 and #2433)
- Related: #2357 (auth resolver injection for hooks)
Summary by CodeRabbit
-
Bug Fixes
- Post-run hooks now preserve Terraform auth so store hooks and hooks triggered after interactive stack selection work when role-assumption is required.
-
Chores
- Bumped Go to 1.26.3, upgraded many dependencies, updated NOTICE license listings, and advanced app version to 1.220.0.
-
Tests
- Added tests for interactive component/stack prompts and auth-context persistence.
-
Documentation
- Added two docs describing the store-hook role-assumption issue and interactive-prompt hook behavior.
fix(auth): don't fall through to webflow when aws/user keyring read fails @osterman (#2470)
## what- Stop
atmos auth loginfrom silently falling back to browser-based OAuth2 webflow when anaws/useridentity HAS configured credentials but the keyring read fails (corrupted entry, missing fields, deserialization error, permission denied). - Distinguish two failure modes in
credentialsFromStore:ErrAwsUserNotConfigured(keyring miss — webflow remains an appropriate fallback) vs newErrAwsUserKeyringReadFailed(keyring reachable but unreadable — webflow is now skipped so the real error surfaces). - Promote the "starting browser-based authentication" message from
DebugtoInfoand include a hint pointing atatmos auth user configureandwebflow_enabled: false, so users see why the browser opened. - Fix a latent realm bug in
cmd/auth/user/configure.go: it was hardcodingstore.Store(alias, creds, "")while the login resolver readsRetrieve(i.name, i.realm). Withauth.realmorATMOS_AUTH_REALMset, configure wrote one slot and login read another. Configure now computes the realm the same waypkg/auth/manager.godoes. - Add regression test
TestUserIdentity_Authenticate_KeyringReadFailureSkipsWebflowthat primes the keyring with an incomplete entry and asserts the webflow callback server is never reached. TightenTestUser_credentialsFromStoreto assert the specific sentinel returned in each path. - Document the resolver order in
website/docs/cli/configuration/auth/identities.mdx: clarify that Atmos does not consult ambient AWS credentials (env vars,~/.aws/credentials, instance profiles) foraws/user, and call out the new keyring-read-failure diagnostic.
why
- Reported by Dan Miller in the Atmos community Slack: after upgrading past v1.214 he got redirected to the AWS sign-in browser flow even though he ran
atmos auth user configureand "had access keys." The only working escape wascredentials.webflow_enabled: false, which masked the real problem rather than fixing it. - The webflow path introduced in #2148 (v1.215) was the right design — webflow is a legitimate authentication tier for IAM users — but the resolver collapsed every keyring failure into a single "not configured" error, so a corrupted/unreadable keyring entry looked identical to a fresh install and the browser flow fired. The browser flow then 400'd against the AWS sign-in token endpoint with no indication that the real failure was reading the keyring.
- Restoring the design invariant ("if creds are provided, use them; never silently bypass them with webflow") requires distinguishing the two failure modes. Once distinguished, webflow is correctly gated and the Info-level diagnostic tells the user what Atmos saw.
- The realm hardcode was not Dan's trigger (his realm resolved to
""on both sides) but is a real latent foot-gun for anyone usingauth.realmfor credential isolation — fixing it here closes the gap before another report arrives.
references
- Slack thread: original report from Dan Miller in cloudposse community Slack (no public issue).
- PR #2148 — original OAuth2 PKCE webflow introduction (commit
4e32b532f, shipped in v1.215).
Summary by CodeRabbit
-
Bug Fixes
- Credential configuration now resolves the auth realm so saved credentials go to the correct slot.
- Keyring read failures (corrupted/unreadable entries) are reported and no longer silently fall back to browser auth; webflow is only used when credentials are genuinely absent.
- Better distinction between missing credentials and unreadable keyring data.
-
Documentation
- Clarified browser-based fallback conditions and what counts as static AWS user credentials.
-
Tests
- Added regression tests to ensure keyring read failures skip webflow.