feat: add concurrent vendoring with edition-aware defaults @osterman (#3169)
## what- Add concurrent vendoring and update checks, ordered destination/receipt writes, shared toolchain progress with download and preparation milestones, cancellation-aware downloads and authentication, edition-aware flag/environment/configuration controls, lock-preserving cleanup, and per-package rollback on failed writes.
- Include the PRD, command/configuration/edition documentation, release note, roadmap entry, reproducible terminal demos, and isolated Git fixtures for reliable CI.
why
- Reduce download waits while preserving deterministic results and serial defaults for older edition pins.
- Validation: 93.5% changed-statement coverage, passing scoped race tests, lint, builds, and cast validation; the controlled eight-package fixture was 3.33× faster with four workers.
references
- Concurrent vendoring PRD
- Toolchain concurrency reference: #2758
- Merge preparation: align the edition journal date with the actual merge date
Summary by CodeRabbit
-
New Features
- Added concurrent vendor downloads, preparation, and update checks with ordered destination writes.
- Added
--max-concurrency, configuration, and environment-variable controls, defaulting to four workers. - Added progress reporting for active packages, download status, retries, and completion results.
- Added cancellation support and safer rollback when installation or lock recording fails.
vendor cleannow preserves lockfile entries for future reinstalls.
-
Documentation
- Added configuration guidance and examples for concurrent vendoring and progress behavior.
agent-skills: add auth migration sub-skills, fix undistributed path citations @osterman (#2740)
## what- Add seven
from-*reference guides to theatmos-migrationagent skill, mirroring its existing IaC migration references, for helping users migrate authentication tooling intoatmos auth:from-aws-config.md(~/.aws/config/credentials),from-gcp-config.md(gcloud),from-azure-config.md(az)from-leapp.md,from-granted.md,from-aws2saml.md(saml2aws),from-okta-cli.md(okta-aws-cli)
- Wire all seven into
SKILL.md's frontmatter, a new "Migrating Authentication" routing table, and "Additional Resources". - Each guide includes a verified
kind:/field mapping table, a CLI command-equivalence table, and an explanation of howatmos auth shell/exec/envinteract with (or deliberately avoid touching) each cloud's default config file. from-aws-config.mdalso covers theaws/userbrowser-based OAuth2 PKCE login fallback (no static keys required), native ECR/EKS integrations, andaws/assume-root.from-okta-cli.mddocuments partial support only:aws/saml+driver: Oktais a full replacement when an org allows direct password+MFA API auth, but there's no equivalent yet for OIDC device-flow,m2m, ordirectauth grants.- Fix a distribution bug across the whole
agent-skills/tree: only that directory ships to installed skill consumers (not the rest of the Atmos monorepo), so any skill citing apkg/...,cmd/...,docs/..., or localwebsite/...file path was pointing at something an installed skill can never read. Swept and fixed every instance, in both the new auth-migration guides and 7 pre-existing skills (atmos-kubernetes,atmos-helm,atmos-settings,atmos-steps,atmos-git,atmos-introspection,atmos-ai, andatmos-schemas— the bulk of it, 23 hits). Fixes either drop the path and keep the claim as prose, or swap in the real publicatmos.toolsURL (verified via frontmatterslugfields and existing site cross-links, not guessed from filenames).
why
- The skill previously only covered migrating Terraform/IaC into Atmos, with no guidance for the equally common "I already have credentials configured elsewhere" on-ramp question.
- Every command and field name cited was independently verified against the current schema and, for third-party tools, against upstream READMEs and live
aws/gcloud/az/ghoutput rather than relying on recall -- several early drafts had inaccuracies (a fabricatedgranted sso populatecommand, wrong flag names, an incorrect premise about Okta's AWS integration having two separate app types) that were caught and corrected during review. - Explicit gaps (Azure client-secret service principals/Managed Identity, GCP static key files,
credential_process, Okta OIDC device flow) are called out rather than papered over, so an agent following these guides doesn't promise users something Atmos can't do yet. - The repo-internal path citations were a real, previously-unnoticed bug:
docs/prd/atmos-agent-skills.mddocuments that onlyagent-skills/is distributed to installed skill consumers, so any citation outside it was dead on arrival for every user except contributors working inside this monorepo.
references
docs/prd/okta-auth-identity.md,docs/prd/aws-browser-auth.md,docs/prd/atmos-agent-skills.md
Summary by CodeRabbit
-
Documentation
- Added migration guides for AWS, GCP, Azure, Leapp, Granted, saml2aws, and okta-aws-cli authentication workflows.
- Clarified authentication migration paths, command equivalents, supported scenarios, and limitations.
- Updated AI, Git, Helm, Kubernetes, settings, introspection, and workflow guidance with clearer references and safer configuration recommendations.
- Documented the Floci emulator health-check fix and related troubleshooting details.
-
Bug Fixes
- Improved readiness checks for GCP and Azure emulator services.
fix(ci): grant timing summary PR comment permission @osterman (#3166)
## what- Grant the CI timing coordinator
pull-requests: writeand update Stopwatch's token description and permission documentation. - Validation:
atmos lint --changed,actionlint,git diff --check, and commit hooks passed; confirm comment creation and subsequent updates after the change reachesmain.
why
- The coordinator reaches PR comment creation but receives
403 Resource not accessible by integrationwithissues: writeandpull-requests: read. - Preserve timing behavior, trusted default-branch checkout, and the network policy; the separate StepSecurity alert still needs its event URL for investigation.
references
Summary by CodeRabbit
-
New Features
- CI timing summaries can now create and update pull-request comments with timing information.
-
Documentation
- Added guidance on required pull-request permissions for timing summaries.
- Documented troubleshooting steps for permission-related failures and how to verify that comments are created or updated successfully.
-
Configuration
- Updated the required token permissions to support writing pull-request comments.
test: serve cloudposse/atmos git sources from a local mirror @osterman (#3105)
## what- Serve
github.com/cloudposse/atmos.git//examples/...git sources in the acceptance suite from a local git-over-HTTP mirror of this checkout'sexamples/, built once inTestMain(tests/testhelpers/gitmirror): a bare repo published viagit init --bare+push, served bygit http-backendbehind anhttptestserver that validates a static token (atmos-test-mirror-token, plus any ambient CI token) with HTTP Basic auth, records every request, and rejects pushes. - Redirect with repo-scoped
insteadOfrules written to a temp gitconfig delivered viaGIT_CONFIG_GLOBAL, one rule per token in the exact userinfo form atmos hands git after injecting the token (https://x-access-token:<token>@github.com/cloudposse/atmos.git→http://x-access-token:<token>@127.0.0.1:<port>/cloudposse/atmos.git) plus the anonymous https/ssh forms. Fixtures keep their realgithub.comURLs;file_existsassertions are unchanged. - The harness sets the static
GITHUB_TOKENfor a case only when neither the case nor the environment provides one, so atmos never falls back togh auth token(an unknown token would miss the rules and silently go live). - Add
tests/testhelpers/gitconfigenv, an appendingGIT_CONFIG_COUNT/KEY_n/VALUE_nbuilder for the harness's per-testcredential.helper/extraheader entries. - Drop the
github_tokenprecondition (a ghcr/OCI probe) from the git-only vendor and demo cases; add an additiveatmos_vendor_pull_gitcase; make demo-vendoring's first case clean its workdir so repeated runs don't see stale output. - Fold
tests/jit_source_local_repo_test.gointogitmirror;tests/testhelpers.DefaultToolsnow reads pins from.tool-versions(all five had drifted). - No golden snapshot changes —
tests/snapshots/is byte-identical tomain.
why
- The vendor and demo cases cloned github.com on every shard, so a hosted-runner DNS/connect blip mid-clone failed the shard "several times a week" (
docs/fixes/2026-09-02-vendor-pull-dns-resolution-flake.md,2026-09-07-jit-source-network-flakes.md), and GitHub's recent unauthenticated-traffic protections add another source of 401/404-shaped failures. - Atmos is unaware of the mirror and runs the production code path. It sees the same URLs, runs the same detector, injects the token exactly as against real GitHub, and hands git the same URL; git does the rewrite. Delivering the rules through
GIT_CONFIG_GLOBAL(notGIT_CONFIG_*env) matters:pkg/downloader/custom_git_detector.goscans the env form for broker rewrites and would skip token injection — which is precisely the behavior change the golden snapshots would have caught, and now don't need to. - Serving over HTTP (not
file://) exercises git's real smart-HTTP transport and lets the mirror validate the credential; the 401-challenge path is proven end-to-end ingitmirror's own tests. The shared server allows anonymous fetches becausecloudposse/atmosis public and the fixture's explicitgit::https://source bypasses atmos's detector (no injection), exactly as in production. - Rules are repo-scoped on purpose: an owner-wide rule also captured terraform's own module fetch of
terraform-null-label(pinned to an upstream commit no mirror can reproduce) and failed theci_summaryplan cases. - Verified locally with the vendor/demo cases three ways — no ambient token, a dummy ambient token, and
HTTPS_PROXYpointed at a closed port (no GitHub reachable): all pass in each.
First PR of a stack; the later PRs add GitHub Enterprise Server support (#3107), live-GitHub canaries with ATMOS_TEST_OFFLINE (#3109), and a local GitHub HTTP façade for toolchain/registry/raw fetches.
references
docs/fixes/2026-09-07-jit-source-network-flakes.md(the local-repo precedent this generalizes)- https://github.com/orgs/community/discussions/206581
- Why now: GitHub's new protections against unauthenticated traffic (https://github.com/orgs/community/discussions/206581#discussioncomment-18269356) turn every unauthenticated fetch of a public repo into a flake or a 401; the same pressure shows up downstream in hashicorp/terraform#39130 (hashicorp/terraform#39130), where users ask for SSH module fetching because unauthenticated HTTPS to GitHub is now rate limited. Tests that hit github.com anonymously are no longer viable as a default; live access is a canary concern, not a per-PR one.
Summary by CodeRabbit
- Tests
- Added coverage for Git-based vendoring with
--tags=git, including credential-free and token-authenticated scenarios. - Expanded validation for authenticated and anonymous Git access, cloning, blocked write operations, proxy handling, and cross-platform environments.
- Test tooling now uses repository-pinned versions when available, with safe fallbacks.
- Added coverage for Git configuration merging and fresh vendor pulls.
- Added coverage for Git-based vendoring with
- Refactor
- Consolidated Git URI, mirror, and configuration helpers for consistent test execution.
- Documentation
- Documented the local Git mirror used by acceptance tests.
Reduce workflow noise with daily experimental warnings @osterman (#3164)
## what- Add per-feature
warn-dailycaching as an edition-aware default, preserve explicit overrides anderror/disableenforcement, and suppress repeated startup notices in child Atmos invocations. - Use explicit Markdown styles and color profiles, with regression tests, configuration docs, release notes, and a roadmap entry.
why
- Keep workflow and custom-command output readable while still warning when a different experimental feature is first used.
references
- Experimental settings
- Validation: Go build, command/config/edition/hook/startup/Markdown tests, changed-file lint, and website build
Summary by CodeRabbit
-
New Features
- Added
warn-daily, showing each experimental warning at most once every 24 hours. - Suppressed repeated startup notices in child command invocations.
- Preserved
warn,error, anddisablemodes.
- Added
-
Bug Fixes
- Improved Markdown styling consistency in color-capable and plain-text output.
-
Documentation
- Updated configuration guides, schemas, roadmap content, and release documentation to reflect the new default and warning behavior.
fix(test): resolve three CI flakes (packer fixture race, Windows subprocess cap, pro test race) @osterman (#3158)
## what- Give every
cmdpacker test that runs a realatmos packercommand its own private copy of the packer fixture (newpackerFixtureWorkDirhelper), instead of sharing the tracked fixture directory. - Lower the Windows subprocess-launch cap in
internal/ci/acceptancefrom 4 to 2. - Stop running
TestExecuteProLockandTestExecuteProUnlock(and their subtests) in parallel. - Add a fix-log:
docs/fixes/2026-09-13-ci-flakes-packer-fixture-windows-cap-pro-race.md.
why
Three flakes kept forcing reruns on 2026-09-12 and 2026-09-13, none caused by the code under test:
- Packer fixture race. Under the race job's
-shuffle=on -parallel=4,TestPackerInitCmdandTestPackerInspectCmdwrite and remove the same generatednonprod-aws-bastion.packer.vars.jsonin the shared fixture and one of them fails with "Failed to open file".TestPackerValidateCmdalready used a private copy for exactly this reason; the other tests now do the same. - Windows GC/allocator crash.
internal/ci/acceptancecrashed the Go runtime ("fatal error: found pointer to free object") four more times on Windows shard 3 on 2026-09-12 (runs 34699763477, 34703060789, and 34726124320 twice) despite the cap of 4 added in #3116. Halving the cap halves the concurrent allocation and syscall pressure that triggers the runtime race documented there. - Pro lock/unlock data race.
executeProLockandexecuteProUnlockwrite through the process-global UI writer; running both tests in parallel produced aDATA RACEon the race job (run 34726125072, shard 3/4). No per-test UI isolation seam exists inpkg/io/pkg/uithat is safe undert.Parallel(), so the two tests are serialized.
Test-only; no user-visible change.
references
- #3116 (the original Windows subprocess cap and its fix-log)
- Observed while landing the local-GitHub-mirror stack (#3105, #3107, #3109, #3122)
🤖 Generated with Claude Code
Summary by CodeRabbit
-
Bug Fixes
- Improved CI reliability by isolating Packer test fixtures for concurrent test runs.
- Reduced Windows acceptance-test subprocess concurrency to prevent intermittent crashes.
- Ensured Pro lock and unlock tests run serially to avoid shared output conflicts.
-
Documentation
- Added documentation describing the causes and verification of recent CI flakiness fixes.
feat: support conditional component dependencies @zack-is-cool (#3084)
## WhatAdd conditional component dependencies through dependencies.components[].required.
requireddefaults totrue.required: falsemakes an edge optional when its target is unavailable.- Existing dependency ordering is retained when a target is present.
Resolution Flow
flowchart TD
A[Read component dependency] --> B{Dependency parses and templates resolve?}
B -- no --> C[Error: identify declaring component and stack]
B -- yes --> D{Source component is in the selected closure?}
D -- no --> E[Do not validate this required target]
D -- yes --> F{required is false?}
F -- yes --> G{Target present and enabled?}
G -- yes --> H[Include optional edge]
G -- no --> I[Skip optional edge and continue]
F -- no --> J{Target present and enabled?}
J -- yes --> K[Include required edge]
J -- no --> L[Error: source component and stack, target component and stack, reason]
missing, disabled, and abstract targets all take the unavailable-target branch. An abstract target is reported as missing so every graph builder has the same typed error contract.
Scope Flow
flowchart TD
A[Terraform bulk command] --> B{Any stack, component, tag, label, query, or affected filter?}
B -- yes --> C[Select matching components]
C --> D[Expand requested dependency and dependent closure]
D --> E[Validate only closure sources]
B -- no --> F[Bare --all selects every component in every stack]
F --> G[Validate every source]
--all --stack dev
--all means every component inside the current filter scope, not every component in the repository.
flowchart TD
A[atmos terraform plan --all --stack dev] --> B[Select every dev component]
B --> C{Required target available?}
C -- yes --> D[Plan selected dev components]
C -- no --> E[Error with source, target, and reason]
F[Broken qa component] --> G[Excluded by --stack dev]
G --> H[Cannot block the dev command]
Bare --all
flowchart TD
A[atmos terraform plan --all] --> B[Select every component in every stack]
B --> C{Any selected required target missing, disabled, or abstract?}
C -- no --> D[Plan all components]
C -- yes --> E[Error with source, target, and reason]
Test Fixture Changes
The dependencies-components-inheritance fixture intentionally references network-baseline and security-group, but does not define either target. Those fixture entries now declare required: false.
This preserves the fixture purpose: verify that a child dependency list replaces inherited entries, without accidentally asserting that intentionally absent targets are required.
Verification
- Added scoped-graph regressions for required-target validation inside and outside the resolved closure.
- Added a Terraform preflight regression:
--all --stack devignores a broken required target inqa, while preserving strict validation fordev. - Added dependents coverage for path-only modern entries falling back to legacy component relationships.
- Updated list integration tests for the explicit optional fixture edges.
Release Artifacts
- Changelog:
conditional-component-dependencies - Roadmap milestone: Extensibility & Custom Components
Closes #3053
Summary by CodeRabbit
-
New Features
- Added optional component dependencies with
required: false, including templated values and custom delimiters. - Supports modern, cross-type, and cross-stack dependency declarations.
- Dependency listings identify optional relationships in tree, JSON, and YAML output.
- Selection-based commands validate dependencies within the selected scope.
- TFLint skips abstract and disabled components and unrequested dependency targets.
- Added optional component dependencies with
-
Bug Fixes
- Invalid dependency configurations now fail explicitly.
- Required unavailable targets return clear errors, while optional targets are skipped.
- Improved scoped and cross-stack dependent discovery.
-
Documentation
- Added guidance and examples for conditional component dependencies.
chore: add cred preventions within .gitignore @nitrocode (#3161)
## what- chore: add cred preventions within .gitignore
why
- Improve repohealth scores
references
- See #3160
Summary by CodeRabbit
- Chores
- Added ignore rules for private keys and credential files to help prevent them from being tracked.
feat(terraform): skip redundant terraform init via fingerprint-based smart auto-init @osterman (#3127)
## what- Adds fingerprint-based "smart auto-init":
terraform initis skipped when nothing that affects it (root config, lock file, CLI config, resolved binary, relevant env vars) has changed since the last successful init for a component. - Adds three new
components.terraform.initsettings —mode,reconfigure,upgrade(eachauto/always/never, defaultauto) — with matching--init-mode/--init-reconfigure/--init-upgradeflags andATMOS_COMPONENTS_TERRAFORM_INIT_*env vars. -reconfigureand-upgradeare now added only when warranted (backend change, or a Terraform/OpenTofu diagnostic requires it) instead of unconditionally on every init.- Adds one automatic retry when a skipped/under-flagged init turns out to have been wrong: a closed set of Terraform/OpenTofu diagnostics is recognized before any state read/write, init is re-run with the flags the diagnostic calls for, and the original command retries once. No state migration is ever performed implicitly.
- Applies uniformly to explicit CLI commands and the implicit init behind
!terraform.output/atmos.Component. - Documents migration from the legacy
init_run_reconfigureboolean:falsemaps toinit.reconfigure: never; the previous defaulttruenow maps toinit.reconfigure: auto(notalways) — the one deliberate default-behavior change, callable out explicitly in the docs and blog post.
why
- Issue #620 asked for Terragrunt-style Auto-Init: today, every
atmos terraformsubcommand —plan,apply,shell,destroy, and even the read path behind!terraform.output/atmos.Component— runs a fullterraform init -reconfigureunconditionally, soatmos terraform applyfollowed immediately byatmos terraform outputon the same component pays the full init cost twice for identical inputs. - Issue #1263 asked for automatic
-upgradehandling instead of requiring users to pass it by hand after every provider version bump. --skip-initalready exists but is all-or-nothing and per-invocation, with no middle ground between "always re-init" and "the user manually judges when it's safe to skip." A fingerprint-based skip rule with automatic recovery closes that gap safely.
references
- Closes #620
- Closes #1263
- PRD:
docs/prd/terraform-auto-init.md - Blog post:
website/blog/2026-09-11-smart-terraform-init.mdx - Docs:
/cli/commands/terraform/init#automatic-initialization,/cli/configuration/components/terraform#configuration-reference
Summary by CodeRabbit
-
New Features
- Terraform/OpenTofu initialization now runs automatically only when needed.
- Added
auto,always, andnevercontrols for initialization, reconfiguration, and upgrades through configuration, flags, and environment variables. - Initialization failures can trigger one corrective init and retry.
- Added initialization overrides to Terraform output and shell commands.
--skip-initremains available for one-time opt-out; workspace selection and creation still perform required initialization.
-
Documentation
- Updated Terraform command, configuration, environment-variable, and usage documentation, including legacy-setting guidance and upgrade-default details.
🚀 Enhancements
fix(helm): harden plugin provisioning and reuse the Atmos CI cache @osterman (#3167)
## whatHarden the existing Atmos Helm plugin installer against transient download failures and incomplete installs. CI declares Helm Diff in stack configuration and reuses the existing Atmos toolchain cache.
- Delegate every plugin installation to Helm, preserving plugin hooks and their final-directory paths. Retry transient failures at most three times with 15-/30-second backoffs and clean partial installations between attempts.
- Serialize installs sharing a managed directory. Record successful hooks and metadata validation in a source/version receipt; repair older incomplete installs. Restore the previous plugin after failed replacement, retaining its backup if rollback fails.
- Warm stack-declared plugins in the existing platform build jobs and verify the restored cache in consumers using direct
atmos helm plugin install --component ci-plugins --stack devcommands. Hash the stack pins into the cache key; preserve shard counts and parallelism. - Fix the source invocation-guard regression using
workdir.BuildPath, a loopback source, and assertions for zero downloads, preserved fixture contents, and the expected guard. - Update the Helm and Helmfile skills to document declarative plugins, automatic provisioning, cache reuse, and the distinction between native Helm's embedded diff library and Helmfile's CLI plugin.
why
The source-cache regression seeded an obsolete path and unexpectedly cloned GitHub, failing on DNS in #3001. A repeated Helm Diff release download returned HTTP 500 before tests in #3000. These failures belong in Atmos's existing provisioning and plugin paths.
The installer remains generic: Helm controls repository installation and hooks. Validation checks plugin metadata and completed-install receipts; it does not run plugin-specific binary version commands. No custom setup action, shell wrapper, or separate artifact transport is needed.
Public commands and application APIs are unchanged. This PR targets main; existing CloudFormation branches and PRs remain unchanged.
validation
- Source invocation-guard regression passed with
-race -count=10 -shuffle=on; full source/workdir tests also passed with race detection. - Plugin and Helm CLI tests passed with
-race -shuffle=on, covering transient recovery, exhaustion, cleanup, cancellation, metadata/receipt validation, custom plugin names, concurrency, rollback, and preserved file modes. - Local changed executable-line coverage: 89.08% (204/229). Codecov remains authoritative for CI patch coverage.
- Generic installer lint and actionlint passed. Both modified skills passed the skill validator.
- Real stack-declared installation passed on macOS ARM with Helm v3.21.4. A second invocation with an unreachable HTTP/HTTPS proxy reused the completed installation successfully.
- Final-commit Linux/macOS/Windows CI and CodeRabbit review are pending.
references
- Failure context: #3000
- Implementation and regression details
Summary by CodeRabbit
-
New Features
- Configure Helm and Helmfile CLI plugins declaratively, with inheritance and configurable merge strategies.
- Atmos now installs declared plugins automatically before Helm or Helmfile operations.
- Plugin installations use Helm’s standard hooks and support pinned versions, receipts, retries, locking, and rollback recovery.
- Helmfile plugin configuration and usage guidance is now available in the documentation.
-
Bug Fixes
- Improved handling of failed, incomplete, stale, and concurrent plugin installations.
- Preserved existing working plugins when replacement installations fail.
- Command cancellation is now respected during plugin operations.
-
CI
- CI installs declared plugins through Atmos and shares them through an updated cache.
fix(emulator): floci health check no longer requires curl @osterman (#3171)
## what- Fix
flociHealthCheck(pkg/emulator/driver/floci.go) to use the floci image's own/usr/local/bin/healthcheck.shreadiness script when present, falling back to the previouscurl-based probe only for older images that don't ship the script. A failing native probe is never masked by a curl fallback. - Add
TestFlociHealthCheck_Readiness(pkg/emulator/driver/floci_health_test.go) covering native-only success, native failure not falling back to curl, legacy curl-only success, and legacy curl-only failure. - Add a fix record at
docs/fixes/2026-09-15-floci-health-check-curl-missing.md.
why
- The minimal GCP and Azure floci images dropped
curl. Since the health check probed exclusively withcurl, it failed to execute at all against those images (the emulator was reachable; the check itself couldn't run), breakingatmos emulator upagainst those images and the floci E2E jobs in CI. - Because every open PR whose CI spins up the GCP/Azure floci emulator hits this, the fix is landed on its own so it can merge to
mainquickly and unblock CI everywhere, rather than waiting on a larger, unrelated PR that happens to bundle the same fix.
references
- Failing job that surfaced this: https://github.com/cloudposse/atmos/actions/runs/34981357896/job/104426326374
docs/fixes/2026-08-31-floci-azure-health-check-race.md— prior, unrelated floci health-check incident (TCP-accepted-before-HTTP-ready race), already fixed.
Summary by CodeRabbit
-
Bug Fixes
- Floci health checks now use the image’s native readiness probe when available.
- Native probe failures are reported directly without falling back.
- Images without a native probe now use a TCP connectivity check instead of curl, supporting both HTTP and TLS endpoints.
- Health checks no longer treat arbitrary HTTP responses, such as 404 errors, as healthy.
-
Documentation
- Added documentation covering the updated health-check behavior and validation results.
Fix cast themes, standardize spinners, and render Braille glyphs @osterman (#3165)
## what- Apply the active theme and terminal color profile to progress bars, with dedicated gradient colors restoring Atmos’s original purple → pink, standardize Dot spinners, refresh semantic and Markdown styles, and draw Braille cells without font fallback.
- Fit playback to the recorded terminal width so progress bars and counts remain visible in narrow players; paint full cells without SVG edge seams.
- Add regression coverage and progress-color validation, regenerate 15 casts, repair KICS/Kubernetes recording setup, isolate the vendoring test from GitHub downloads and shared fixture writes, and repair Floci readiness checks for images that no longer include curl.
why
- Fix color loss, inconsistent spinners, and missing-glyph boxes while preserving caller styling and playback timing.
references
- Validation: affected Go tests and lint, 29 player tests, production website build, and browser checks; interactive-menu and Helmfile casts remain unchanged because of existing CLI and local Kubernetes failures.
- Companion Apps playback and artifact fixes: https://github.com/cloudposse-corp/apps/pull/1735
Summary by CodeRabbit
-
New Features
- Terminal interfaces now consistently follow the active theme, including tables, status indicators, Terraform output, authentication screens, and AI chat views.
- Progress bars support theme-specific gradient colors, with customizable start and end colors.
- Shared spinner and progress displays provide more consistent themed output.
- Cast Player now renders Braille graphics and automatically fits recordings to the available terminal width.
-
Bug Fixes
- Improved terminal cast rendering for solid progress blocks and cleanup before final prompts.
- Improved emulator readiness checks across HTTP and TLS listeners.
fix: honor ATMOS_PROCESS_TEMPLATES/ATMOS_PROCESS_FUNCTIONS in describe affected @aknysh (#3162)
## whatatmos describe affectednow honors theATMOS_PROCESS_TEMPLATESandATMOS_PROCESS_FUNCTIONS
environment variables, matching the--process-templates/--process-functionsCLI flags.- Precedence is CLI flag > environment variable > default, consistent with the rest of Atmos.
- Adds unit tests for the resolver (default no-op, each env var, CLI-wins-over-env, direct Viper
key, and the unregistered-flag no-op) plus an end-to-end test proving the env var reaches
DescribeAffectedCmdArgs.ProcessYamlFunctions. - Adds a fix doc under
docs/fixes/.
why
- The two flags already worked, and these same env vars are honored by the
list,terraform,
andterraform generatecommand families — butdescribe affectedsilently ignored them, so
the only way to toggle template/function processing there was to pass the CLI flags explicitly. - Root cause: the flags were registered as raw Cobra
PersistentFlagsand read back only when
cmd.Flags().Changed(name)is true. Setting an environment variable never flips a Cobra flag's
Changedbit, so env-sourced values were dropped before reaching the affected computation. - This is the natural knob for CI:
ATMOS_PROCESS_FUNCTIONS=falseskips the credential-backed
YAML functions (!store,!terraform.state,!terraform.output) during affected detection —
which is a Git-config diff that does not need their resolved values — letting the affected job
run without credentials. Not being able to set it via the environment was the gap. - The fix mirrors the existing
--error-modepattern (cmd/describe_error_mode_flag.go): a
minimalflags.StandardParserwithWithEnvVarsregisters the flags and binds the env vars
(namespaced under thedescribeViper prefix to avoid colliding with thelistfamily's bare
keys), and a resolve step writes the env-sourced value back onto the Cobra flag so the existing
legacy reader picks it up. All binding goes throughpkg/flags— no direct
viper.BindEnv/viper.BindPFlag(Forbidigo-compliant).
references
- Fix doc:
docs/fixes/2026-09-13-describe-affected-process-env-vars.md - Follows the established single-flag
StandardParserpattern incmd/describe_error_mode_flag.go
(which addedATMOS_DESCRIBE_ERROR_MODEthe same way).
Summary by CodeRabbit
-
Bug Fixes
atmos describe affectednow honors theATMOS_PROCESS_TEMPLATESandATMOS_PROCESS_FUNCTIONSenvironment variables.- Command-line options take precedence over environment variable values.
- Invalid environment variable values are rejected with clear validation errors.
-
Tests
- Added coverage for defaults, environment variables, CLI precedence, validation, and end-to-end flag handling.
-
Documentation
- Documented environment variable support and precedence rules for
describe affected.
- Documented environment variable support and precedence rules for
🤖 Automatic Updates
chore(deps): update mcr.microsoft.com/vscode/devcontainers/base:debian docker digest to 1f85100 @[renovate[bot]](https://github.com/apps/renovate) (#3117)
This PR contains the following updates:| Package | Type | Update | Change |
|---|---|---|---|
| mcr.microsoft.com/vscode/devcontainers/base | final | digest | b8c3669 → 1f85100
|
Configuration
📅 Schedule: (UTC)
- Branch creation
- At any time (no schedule defined)
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.