feat: Atmos bugfixes and enhancements from vhs-demo-videos branch @osterman (#1954)
## what- Add
atmos list aliasessubcommand for viewing CLI command aliases - Add query normalization and simplified syntax for
atmos list components - Support installing multiple tools in a single
atmos toolchain installcommand - Add markdown rendering extensions (admonitions, badges, highlights, linkify, muted)
- Fix inline code spacing in markdown rendering
- Add terraform output format improvements
- Update roadmap component with demo links support
- Various documentation updates across CLI commands
why
- These improvements enhance the CLI user experience with better list filtering and multi-tool installation
- The markdown extensions enable richer terminal output formatting
- Documentation updates ensure consistency across command reference pages
- These changes were developed alongside the vhs-demo-videos feature but are independent core improvements
references
- Extracted from
osterman/vhs-demo-videosbranch (excluding demo infrastructure: tools/director/, pkg/ffmpeg/, pkg/vhs/, demos/)
Summary by CodeRabbit
-
New Features
- Added
atmos list aliasesto show built-in + configured aliases. atmos toolchain installaccepts multiple tools in one command.- List commands can page output when enabled; Terraform output gains a table format.
- Rich Markdown rendering: admonitions, badges, highlights, muted text.
- Demo video embeds added across CLI docs.
- Added
-
Improvements
- List/vendor tables show Tags; stacks expose extracted vars for templates.
- Better terminal color/profile and optional force-color handling.
✏️ Tip: You can customize this high-level summary in your review settings.
Auto-scroll sidebar to active item on navigation @osterman (#2009)
## what- Added SidebarScrollHandler component to automatically scroll the sidebar to show the active menu item
- Component triggers on route changes and waits for sidebar DOM updates before scrolling
- Uses smooth animation to center the active link in the sidebar viewport
why
When navigating to design patterns or other sections that share sidebars with references, Docusaurus's autoCollapseCategories feature expands/collapses categories. Previously, the active item would end up off-screen. This fix ensures the active menu item is always visible and centered in the sidebar.
references
Fixes the sidebar navigation issue where design pattern pages weren't scrolled into focus when the sidebar changed.
Summary by CodeRabbit
- New Features
- The sidebar now automatically scrolls to highlight the active navigation link when navigating between pages, improving visibility of your current location in the documentation.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Add interactive file generation for terraform, helmfile, and packer @osterman (#1971)
## SummaryAdds comprehensive support for atmos terraform generate files with auto-generation enabled during component execution for all provisioners (terraform, helmfile, packer).
What Changed
Core Features
- Auto-generate files BEFORE path validation when
auto_generate_filesis enabled, allowing components to be JIT (Just-In-Time) created from stack configuration - Interactive prompting for component and stack selection (like
terraform backendcommand) - Idempotent file generation - compares existing content before writing to avoid unnecessary updates
- Deterministic output - uses sorted map keys to ensure reproducible file generation across runs
- Enhanced UI - shows individual files changed plus a summary line with counts
Files Modified
pkg/terraform/generate/file_generator.go- Core idempotent generation logic with sorted keys and summary outputpkg/terraform/generate/generate.go- Directory creation before file generationcmd/terraform/generate/files.go- Interactive prompting for component/stack selectioninternal/exec/terraform.go- Auto-generation during terraform executioninternal/exec/helmfile.go- Auto-generation during helmfile executioninternal/exec/packer.go- Auto-generation during packer executionpkg/schema/schema.go- Config support for helmfile and packer auto-generationexamples/generate-files/- Complete working example with terraform configurations
Test Plan
-
Test interactive prompting without arguments:
atmos -C examples/generate-files terraform generate files # Should prompt for component, then stack -
Test with component argument only:
atmos -C examples/generate-files terraform generate files demo # Should prompt for stack only -
Test with all arguments (no prompting):
atmos -C examples/generate-files terraform generate files demo -s dev # Should generate without prompting -
Test idempotency (run twice):
atmos -C examples/generate-files terraform generate files demo -s dev atmos -C examples/generate-files terraform generate files demo -s dev # Second run should show "unchanged" files -
Test auto-generation during terraform plan:
cd examples/generate-files atmos terraform plan demo -s dev # Should auto-generate files before validation
-
Test helmfile and packer:
atmos -C examples/generate-files helmfile diff demo -s dev atmos -C examples/generate-files packer build demo -s dev # Both should auto-generate files if needed -
Run test suite:
make testacc
🤖 Generated with Claude Code
Summary by CodeRabbit
-
New Features
- Interactive prompts (with shell completion) to select component and stack when generating files; JIT auto-generation for Terraform, Helmfile, and Packer before validation; deterministic HCL/.tfvars output and per-file create/update/skip summaries.
-
Documentation
- New blog post, CLI docs, working example, and embedded demos for file-generation workflows.
-
Tests
- Broadly expanded tests covering generation, .tfvars, labeled blocks, formatting, templates, and edge cases.
-
Chores
- Added example project, README, and ignore/config files for the generate-files demo.
✏️ Tip: You can customize this high-level summary in your review settings.
docs: Remove non-existent CLI flags from profiles blog post @osterman (#2004)
## whatRemoved non-existent CLI flags (--sentry-enabled, --terminal-width, --markdown-style) from the blog post examples. Fixed incorrect config keys (width → max_width). Now accurately shows the real problem: scattered environment variables across CI/CD systems.
why
The examples were showing CLI flags that don't exist in Atmos, which could mislead users. These settings are configuration-only via atmos.yaml or profiles, not CLI flags. The corrected examples now focus on the actual pain point that Profiles solve.
references
Follows investigation of hallucinated flags in documentation examples.
Summary by CodeRabbit
- Documentation
- Updated blog post to reflect environment variable-based configuration approach instead of CLI flags.
- Expanded content on profile benefits including version control and composability.
- Updated configuration examples and terminology throughout.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Enhance source list commands with optional filters @osterman (#1996)
## what- Made
--stackflag optional foratmos terraform source listandatmos list sourcescommands - Added optional
[component]positional argument to filter by component name or folder - Added dynamic
Foldercolumn that appears only when component folder differs from instance name - Added
Typecolumn toatmos list sourcesfor multi-type visibility
why
- Improves UX by allowing users to list sources across all stacks without specifying
--stack - Follows Atmos naming conventions with optional positional arguments for filtering
- Better visibility when dealing with derived components using
metadata.component
references
Implements enhancements outlined in the source provisioner PRD for comprehensive source listing capabilities.
Summary by CodeRabbit
-
New Features
- Added unified
atmos list sourcesto list component sources across Terraform, Helmfile, and Packer with optional component/stack filtering and multiple output formats.
- Added unified
-
Documentation
- Expanded docs and examples for the new command and per-type variants; added blog post and roadmap entry.
-
Improvements
- Dynamic output columns and improved user-facing messages; enhanced error context extraction and inline markdown formatting.
-
Tests
- Comprehensive tests added for listing, extraction, filtering, sorting, rendering, and error scenarios.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Add --format=github for terraform output and unified pkg/env package @osterman (#1985)
## what- Created unified
pkg/env/package for environment variable formatting (env, dotenv, bash, github formats) - Created
pkg/github/actions/env/package with GitHub Actions environment file helpers - Added
--format=githubsupport foratmos terraform outputthat writes to$GITHUB_OUTPUT - Eliminated code duplication between
cmd/envandpkg/terraform/outputby refactoring to usepkg/env - All output formats now consistently sort keys alphabetically for deterministic output
why
- Reduces code maintenance burden by consolidating format logic into a single package
- Enables GitHub Actions workflows to directly consume terraform outputs
- Supports multiline values via heredoc syntax for GitHub Actions compatibility
- Provides flexible options pattern for key transformation (uppercase, flatten with separator)
references
Part of environment variable formatting consolidation effort.
Summary by CodeRabbit
-
New Features
- Added --format=github to export Terraform outputs to GitHub Actions ($GITHUB_OUTPUT or custom file)
- Unified environment-variable formatting across formats (env, dotenv, bash, github) with options for uppercase keys, flattening, and export-prefix control
-
Documentation
- Added docs and examples for GitHub Actions integration and sharing outputs between workflow steps
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Add multi-package support and fix toolchain add help text @osterman (#1979)
## what- Support multiple tools in a single
atmos toolchain addcommand - Default version to
latestwhen omitted (e.g.,atmos toolchain add terraform) - Fixed help examples to use
@syntax (tool@version) instead of incorrect space-separated syntax - Updated CLI documentation and removed phantom
--fileflag references - Added comprehensive tests for multi-package and latest-version-default behavior
why
The help text was showing incorrect space-separated syntax (<tool-name> <version>) which didn't match the actual command behavior that uses @ syntax (tool@version). Users also couldn't add multiple tools efficiently. This fix aligns the UX with other similar CLIs and improves productivity for users managing toolchains.
references
Related to improving the toolchain command usability and fixing the discrepancy between documented and actual command syntax.
Summary by CodeRabbit
-
New Features
- Add accepts multiple tool[@Version] args (version defaults to latest); new --tool-versions flag. Env supports a new github format and --output/-o (auto-uses GITHUB_PATH); path acts as an env alias for PATH emission.
-
Bug Fixes
- Clearer, actionable errors and hints for missing tools and unknown commands.
- More resilient release fetching with retries and backoff.
- Improved ANSI-aware formatting/whitespace handling for CLI output.
-
Documentation
- CLI docs and blog updated with GitHub Actions PATH examples and usage.
-
Tests
- Expanded unit tests across toolchain commands, env/path emitters, formatting, and ANSI trimming.
✏️ Tip: You can customize this high-level summary in your review settings.
Allow locals to access `settings`, `vars`, and `env` from the same file. Add `locals` design patterns. Add Atmos YAML functions support in `locals` @aknysh (#1994)
## what- Enable locals to access
.settings,.vars, and.envsections from the same YAML file during template resolution - Add template context (settings, vars, env) to the locals resolver so locals can reference these sections
- Only add context to template processing when locals are present (preserving existing behavior for files without locals)
- Merge section-specific settings/vars/env with global values (not replace) so global keys are preserved
- Add YAML functions support in locals (
!env,!exec,!store,!terraform.state,!terraform.output) - Update documentation with error handling, common pitfalls, workarounds for optional values, and YAML functions
- Add
examples/localsexample demonstrating the feature - Add Locals Design Patterns documentation
- Add blog posts announcing the enhancements
why
- The PRD for file-scoped locals explicitly shows examples of locals accessing
.varsfrom the same file - YAML functions in locals enable powerful patterns like fetching values from terraform state or environment variables
- This enables useful patterns like:
settings: substage: dev locals: domain: '{{ .settings.substage }}.example.com'
- Cross-file access (from imported files) remains unsupported by design - locals are file-scoped
- Clear error messages help users understand when template references fail
YAML Functions in Locals
Locals support all Atmos YAML functions for dynamic value resolution:
| Function | Description | Example |
|---|---|---|
!env
| Environment variables | !env API_ENDPOINT
|
!exec
| Command execution | !exec git rev-parse --short HEAD
|
!store
| Store lookups | !store secrets/db .password
|
!terraform.state
| Terraform state queries | !terraform.state vpc .vpc_id
|
!terraform.output
| Terraform outputs | !terraform.output vpc .vpc_id
|
Example:
locals:
# Fetch from environment variable
api_endpoint: !env API_ENDPOINT
# Combine with Go templates
api_url: "https://{{ .locals.api_endpoint }}/api/v1"
components:
terraform:
myapp:
vars:
api_url: "{{ .locals.api_url }}"Blog Posts
-
Locals Context Access (
2026-01-19-locals-context-access-and-design-patterns.mdx)- Enhancement allowing locals to access settings/vars/env from same file
- File-scoped context explanation
-
YAML Functions in Locals (
2026-01-20-locals-yaml-functions.mdx)- Support for
!env,!exec,!store,!terraform.state,!terraform.outputin locals - Examples and use cases
- Support for
Error Handling Behavior
When a template reference cannot be resolved, Atmos produces a hard error with a clear message rather than silently returning an empty string or passing through the literal template syntax:
| Scenario | Result |
|---|---|
{{ .settings.foo }} when settings doesn't exist
| Error: map has no entry for key 'settings'
|
{{ .settings.foo }} when settings exists but no foo
| Error: map has no entry for key 'foo'
|
{{ .settings.foo }} when both exist
| ✅ Resolves to the value |
Workarounds for optional values:
locals:
# Using 'with' for conditional access
safe_region: '{{ with .settings }}{{ .region }}{{ else }}us-west-2{{ end }}'
# Using index with default
domain: '{{ index .settings "region" | default "us-west-2" }}.example.com'Example
A new examples/locals example demonstrates the feature:
cd examples/locals
# See how locals are resolved
atmos describe component myapp -s dev
# View all resolved locals
atmos describe locals myapp -s devOutput:
vars:
environment: development
full_name: acme-development-dev
name: acme
tags:
Environment: development
ManagedBy: Atmos
Namespace: acme
Team: platformSummary of Changes
Code Changes:
pkg/locals/resolver.go:- Added
templateContextfield andWithTemplateContextmethod to pass settings/vars/env during resolution - Added
YamlFunctionProcessorcallback type andWithYamlFunctionProcessormethod for YAML function support - Updated
resolveStringto detect and process YAML functions (strings starting with!)
- Added
internal/exec/stack_processor_locals.go:- Build and pass template context with settings/vars/env from the stack config
- Added
localsResolveOptionsstruct andcreateYamlFunctionProcessorfor YAML function processing - Fixed
buildSectionTemplateContextto merge section values with global values (not replace) - Added
mergeStringAnyMapshelper for shallow merging
internal/exec/stack_processor_utils.go:- Extract settings/vars/env from raw YAML and add to context only when locals are present
- Updated to use Atmos YAML unmarshaling for proper custom tag handling
errors/errors.go: AddedErrLocalsYamlFunctionFailedsentinel error
Test Changes:
- Added new integration tests:
TestLocalsSettingsAccessSameFile,TestLocalsSettingsAccessDescribeStacks,TestLocalsSettingsAccessNotCrossFile - Added test fixture
tests/fixtures/scenarios/locals-settings-access/demonstrating same-file access - Added test fixture
tests/fixtures/scenarios/locals-settings-cross-file/demonstrating cross-file access error - Added advanced tests:
TestLocalsNestedSettingsAccess,TestLocalsEnvironmentVariableAccess,TestLocalsHelmfileSectionLocals - Added test fixture
tests/fixtures/scenarios/locals-advanced/for nested values and helmfile section locals - Converted context-access unit tests to table-driven format (
TestExtractLocalsFromRawYAML_ContextAccess) - Added unit tests for merge behavior (
TestMergeStringAnyMaps,TestBuildSectionTemplateContext_MergesBehavior) - Added
TestLocalsWithYamlFunctionsEnvfor YAML functions in locals - Added test fixture
tests/fixtures/scenarios/locals-yaml-functions/for YAML function testing
Documentation Changes:
- Added "Accessing Other Sections" section explaining what template context is available
- Added "Processing Order" section explaining why cross-file access doesn't work
- Added "Component-Level Locals" section with inheritance from base components
- Added "Scope Merging for Settings and Vars" section explaining merge behavior
- Added "Debugging Locals" section with troubleshooting guidance
- Added "YAML Functions in Locals" section with examples for
!env,!exec,!store,!terraform.state,!terraform.output - Added "Error Handling" section with:
- Unresolved template reference behavior (produces error, not empty string)
- Common error scenarios table
- Handling optional values with Go template conditionals
- Cross-file access error explanation and solutions
- Updated "Locals vs Vars" comparison table with "Cross-File Access" row
- Added best practice for using vars for cross-file sharing
Blog Posts Added:
website/blog/2026-01-19-locals-context-access-and-design-patterns.mdxwebsite/blog/2026-01-20-locals-yaml-functions.mdx
Example Added:
examples/locals/- Minimal example demonstrating locals feature:- Basic locals and dependency resolution
- Accessing settings/vars from same file
- Building computed values (name_prefix, full_name, tags)
- File-scoped isolation between dev and prod stacks
Dependency Updates:
- Updated
google.golang.org/apifrom retracted v0.258.0 to v0.260.0
Summary by CodeRabbit
-
New Features
- Locals now access .settings, .vars, and .env from the same file during resolution
- YAML function support in locals (e.g., !env, !exec, !store, !terraform.state, !terraform.output)
-
Documentation
- Major docs and blog updates with processing diagrams, examples, guidance, and warnings
-
Tests
- Extensive new tests and fixtures covering locals scope, YAML functions, env access, cross-file cases, and edge conditions
-
Examples
- New examples demonstrating locals usage and try-it workflows
-
Chores
- Multiple dependency patch bumps and NOTICE license URL updates
✏️ Tip: You can customize this high-level summary in your review settings.
🚀 Enhancements
fix: Imperative stack names now bypass template and pattern validation @osterman (#1970)
## what- Stacks with explicit
namefield now correctly bypassname_templateandname_patternvalidation - Previously, stacks with explicit names that lacked template/pattern-required vars were silently skipped
- Added regression test to prevent future regressions
- Added example demonstrating imperative stack naming
why
The processStackContextPrefix function was processing name_template or name_pattern before checking if the stack had an explicit name field. According to the stack name identity spec, explicit names take absolute precedence and should skip template/pattern processing entirely.
how
Updated processStackContextPrefix to accept stackManifestName parameter and skip validation when an explicit name is present. This ensures the correct precedence order is enforced during component discovery in ProcessStacks.
references
- Relates to stack name identity specification (
docs/prd/stack-name-identity.md) - Test fixture:
tests/fixtures/scenarios/stack-name-pattern-missing-vars/ - Example:
examples/stack-names/
Summary by CodeRabbit
-
New Features
- Added a stack-names example workspace demonstrating explicit stack naming with precedence over filename-based names
- Included example Terraform mock component and .gitignore for the example
-
Bug Fixes
- Pattern validation failures now gracefully fall back to filename-based stack names instead of aborting
- Improved CLI error hints when an invalid stack name is provided
-
Documentation
- Added docs and an embedded "Stack Names" example describing naming rules and usage
-
Tests
- Added tests and snapshots covering explicit naming, pattern-fallback behavior, and CLI outputs (including telemetry notice)
✏️ Tip: You can customize this high-level summary in your review settings.
fix: Describe Affected Detects Component File Changes. fix: Vendored components with `source` @aknysh (#2003)
## what- Fixed
atmos describe affectedto correctly detect component file changes (Terraform, Helmfile, Packer) - Added
gitRepoRootparameter to path resolution logic to properly resolve relative paths from git diff - Fixed detection of components using
sourcefor vendoring (components without explicitcomponentfield) - A regression in previous Atmos releases caused changes to component files to not be detected in certain scenarios
why
Issue 1: Git repo root path resolution
- Git diff returns file paths relative to the git repository root
- The previous implementation used
filepath.Abs()which resolves paths against the current working directory - When Atmos was run from a subdirectory (e.g.,
atmos -C examples/demo-stacks), paths would not match, causing component changes to go undetected
Issue 2: Vendored components with source
- Components using
sourcefor just-in-time vendoring were not being detected - The affected detection required an explicit
componentfield to determine which folder to monitor - Now defaults to using the component name (YAML key) when no explicit
componentfield is specified
changes
Path resolution fix
newChangedFilesIndex()now acceptsgitRepoRootparameter- Relative paths from git diff are resolved against the git repo root, not the current working directory
Source component detection fix
- Added
GetComponentFolder()helper instack_utils.goto consolidate component folder resolution logic - Modified
BuildComponentPath()to accept optional fallback parameter processTerraformComponentsIndexed(),processHelmfileComponentsIndexed(),processPackerComponentsIndexed()now useGetComponentFolder()which defaults to component name whencomponentfield is missing- This ensures components with
sourcevendoring are properly tracked
test coverage
All three scenarios are covered by unit tests:
| Scenario | Test Coverage |
|---|---|
metadata.component specified
| TestFindAffectedComponentFolderChanges/explicit_component_field ✓TestFindAffectedComponentFolderChanges/inherited_base_component ✓TestGetComponentFolder/returns_explicit_component_field_when_set ✓
|
source specified (JIT vendoring)
| TestFindAffectedComponentFolderChanges/JIT_vendored_component_with_source_-_simple_config ✓TestFindAffectedComponentFolderChanges/JIT_vendored_component_with_source_-_full_config ✓TestFindAffectedHelmfileAndPackerComponents/Helmfile_JIT_vendored_with_source ✓TestFindAffectedHelmfileAndPackerComponents/Packer_JIT_vendored_with_source ✓
|
source + workdir specified
| TestFindAffectedHelmfileAndPackerComponents/Terraform_with_source_and_workdir ✓TestFindAffectedHelmfileAndPackerComponents/Helmfile_with_source_and_workdir ✓TestFindAffectedHelmfileAndPackerComponents/Packer_with_source_and_workdir ✓
|
Resolution flow
metadata.component: mock→ Stack processing setscomponentSection["component"] = "mock"→GetComponentFolderuses that valuesourceonly → Nocomponentfield →GetComponentFolderfalls back to componentName (YAML key)source+workdir→ Same as 2 (see note below)
Why provision.workdir doesn't affect folder resolution
For describe affected, the workdir configuration doesn't change how component folders are resolved because:
-
Workdir is runtime-only: The
.workdir/directory is created at runtime when you runatmos terraform plan/apply. It's a temporary copy of the component files. -
Workdir is not tracked in git: The
.workdir/directory is in.gitignore. Changes to files in.workdir/don't appear ingit diff. -
describe affectedcompares git branches: It looks at what files changed between commits/branches. Since workdir files aren't tracked, the detection happens on the source files:- For local components:
components/terraform/<component>/ - For vendored components with
source:components/terraform/<component-name>/(where files are vendored)
- For local components:
Source of truth (tracked in git) → Workdir (runtime, not tracked)
components/terraform/vpc-remote/ → .workdir/terraform/dev-vpc-remote/
↑ ↑
describe affected terraform runs here
detects changes HERE
When you modify vendored component files in components/terraform/vpc-remote-workdir/, describe affected detects that change. The fact that at runtime those files get copied to .workdir/ doesn't matter for change detection.
references
Summary by CodeRabbit
- Bug Fixes
- Corrected affected-component detection when running from a repo root or subdirectory (e.g., using -C), improving path resolution.
- Properly detect vendored (source-based) components and component folder/file changes across Terraform, Helmfile, and Packer.
- Documentation
- Added blog posts explaining the improved detection, vendoring behavior, and cross-platform path-handling guidance.
✏️ Tip: You can customize this high-level summary in your review settings.
fix: resolve --all flag prompting for component (issue #1945) @osterman (#1976)
## what- Fixed critical bug where terraform commands with
--all,--affected,--query, or--componentsflags would incorrectly prompt for component selection, then error - Root cause was
applyOptionsToInfobeing called afterresolveAndPromptForArgs, preventing prompting logic from detecting multi-component flags - Added regression tests to prevent similar bugs in future
why
The --all flag must be applied to the info struct BEFORE checking whether to show interactive prompts. Otherwise, the prompting logic cannot determine that multi-component flags are set and incorrectly prompts for a component, which then conflicts with the multi-component flag validation.
references
closes #1945
Summary by CodeRabbit
-
New Features
- Interactive prompts now respect CLI multi-component options earlier, preventing prompts when those flags are present.
-
Bug Fixes
- Clear success messages when no components are affected or no query matches.
- Dry-run now reports results and cleanly skips execution while indicating success.
-
Tests
- Expanded coverage for multi-component flags, prompt-skipping, dry-run behavior, no-match cases, and related edge conditions.
✏️ Tip: You can customize this high-level summary in your review settings.
🤖 Automatic Updates
chore(deps): bump github.com/redis/go-redis/v9 from 9.12.1 to 9.17.2 @[dependabot[bot]](https://github.com/apps/dependabot) (#1989)
Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.12.1 to 9.17.2.Release notes
Sourced from github.com/redis/go-redis/v9's releases.
9.17.2
🐛 Bug Fixes
- Connection Pool: Fixed critical race condition in turn management that could cause connection leaks when dial goroutines complete after request timeout (#3626) by
@cyningsun- Context Timeout: Improved context timeout calculation to use minimum of remaining time and DialTimeout, preventing goroutines from waiting longer than necessary (#3626) by
@cyningsun🧰 Maintenance
- chore(deps): bump rojopolis/spellcheck-github-actions from 0.54.0 to 0.55.0 (#3627)
Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsunand@ndyakov9.17.1
🐛 Bug Fixes
- add wait to keyless commands list (#3615) by
@marcoferrer- fix(time): remove cached time optimization (#3611) by
@ndyakov🧰 Maintenance
- chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
- chore(deps): bump actions/checkout from 5 to 6 (#3610)
- chore(script): fix help call in tag.sh (#3606) by
@ndyakovContributors
We'd like to thank all the contributors who worked on this release!
9.17.0
🚀 Highlights
Redis 8.4 Support
Added support for Redis 8.4, including new commands and features (#3572)
Typed Errors
Introduced typed errors for better error handling using
errors.Asinstead of string checks. Errors can now be wrapped and set to commands in hooks without breaking library functionality (#3602)New Commands
- CAS/CAD Commands: Added support for Compare-And-Set/Compare-And-Delete operations with conditional matching (
IFEQ,IFNE,IFDEQ,IFDNE) (#3583, #3595)- MSETEX: Atomically set multiple key-value pairs with expiration options and conditional modes (#3580)
- XReadGroup CLAIM: Consume both incoming and idle pending entries from streams in a single call (#3578)
- ACL Commands: Added
ACLGenPass,ACLUsers, andACLWhoAmI(#3576)- SLOWLOG Commands: Added
SLOWLOG LENandSLOWLOG RESET(#3585)- LATENCY Commands: Added
LATENCY LATESTandLATENCY RESET(#3584)
... (truncated)
Changelog
Sourced from github.com/redis/go-redis/v9's changelog.
9.17.2 (2025-12-01)
🐛 Bug Fixes
- Connection Pool: Fixed critical race condition in turn management that could cause connection leaks when dial goroutines complete after request timeout (#3626) by
@cyningsun- Context Timeout: Improved context timeout calculation to use minimum of remaining time and DialTimeout, preventing goroutines from waiting longer than necessary (#3626) by
@cyningsun🧰 Maintenance
- chore(deps): bump rojopolis/spellcheck-github-actions from 0.54.0 to 0.55.0 (#3627)
Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsunand@ndyakov
Full Changelog: redis/go-redis@v9.17.1...v9.17.2
9.17.1 (2025-11-25)
🐛 Bug Fixes
- add wait to keyless commands list (#3615) by
@marcoferrer- fix(time): remove cached time optimization (#3611) by
@ndyakov🧰 Maintenance
- chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
- chore(deps): bump actions/checkout from 5 to 6 (#3610)
- chore(script): fix help call in tag.sh (#3606) by
@ndyakovContributors
We'd like to thank all the contributors who worked on this release!
Full Changelog: redis/go-redis@v9.17.0...v9.17.1
9.17.0 (2025-11-19)
🚀 Highlights
Redis 8.4 Support
Added support for Redis 8.4, including new commands and features (#3572)
Typed Errors
... (truncated)
Commits
d3e7d4cchore(release): v9.17.2 (#3629)665d0bffix(pool): correct turn management in putIdleConn to prevent connection leaks...68d8c59chore(release): v9.17.1 (#3617)932caa5chore(deps): bump actions/stale from 9 to 10 (#3505)b362eb7fix(txpipeline) add wait to keyless commands list (#3615)fd437cechore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)8549116chore(deps): bump actions/checkout from 5 to 6 (#3610)6390822fix(time): remove cached time optimization (#3611)1bb9e0dchore(scripts: fix help call in tag.sh (#3606)5b0b228chore(release): v9.17.0 (#3604)- Additional commits viewable in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)