Releases: open-policy-agent/regal
v0.39.0
We're happy to announce Regal v0.39.0, featuring 3 new linter rules, many language server improvements, and much faster linting!
New Rule: use-array-flatten
Category: idiomatic
The use-array-flatten rule recommends using array.flatten instead of nested array.concatenation (#1873).
Avoid
package policy
flat1 := array.concat(arr1, array.concat(arr2, arr3))
flat2 := array.concat(arr1, array.concat(arr2, array.concat(arr3, arr4)))Prefer
package policy
flat1 := array.flatten([arr1, arr2, arr3])
flat2 := array.flatten([arr1, arr2, arr3, arr4])New Rule: use-object-union-n
Category: idiomatic
The use-object-union-n rule recommends using object.union_n over nested calls to object.union (#1873).
Avoid
package policy
obj := object.union(obj1, object.union(obj2, obj3))Prefer
package policy
obj := object.union_n([obj1, obj2, obj3])New Rule: equals-over-count
Category: performance
The new optional equals-over-count rule suggests using direct equality comparisons rather than count when checking collection membership or emptiness (#1878). This is a micro-optimization and not a general recommendation. Must be manually enabled.
Performance
This release brings an approximate 25% reduction in linting time through aggregate remodeling and Rego prepare stage optimizations (#1838). Additional performance work includes Rego refactoring (#1857, #1884), AST transform improvements (#1892), and various micro-optimizations (#1866, #1879).
Language Server Improvements
The language server now includes a semantic token framework for improved syntax highlighting (#1845, #1865, #1870),
code actions for the constant-condition and redundant-existence-check fixers (#1830).
and an opaTestProvider feature for test discovery (#1888, #1889, #1898),
Completion performance is improved with a completionItem/resolve handler (#1831),
and server capabilities are now properly exposed and consistent with the clients (#1867, #1880).
Note: Semantic token support is feature flagged and will be available in the next release.
Compiler Explorer
Regal now supports the VSCode-based OPA Explorer extension, providing a rich GUI to compare compiler stages directly in VS Code (#1862) - thanks @srenatus! A new "Format stages" option has also been added to the compiler explorer (#1854) - thanks @johanfylling!
Experimental: rq Engine Support
Initial support for the rq engine has been added (#1872) - thanks @charlesdaniels!
Various Improvements
- Improved
redundant-existence-checkrule (#1897, fixes #1805) - Disabled
zero-arity-functionrule asopa-fmtnow covers that (#1885)
Bug Fixes
- Fix nil dereference on compiler errors in explorer (#1837)
- Fix broken links to fixer page (#1852)
- Fix false positive in
use-some-for-output-vars(#1886) - Fix broken
input.jsoncompletion provider (#1891)
Dependency Updates
Regal has been upgraded to use OPA v1.14.0 and Go 1.26.
Documentation
- Added mise as an alternative installation method (#1849) - thanks @jylenhof!
- Updated installation documentation (#1861)
- Updated note about eval and debug roots (#1894)
- Show release badge when using pre-release versions (#1899)
New Contributors
- @jylenhof made their first contribution in #1849
- @charlesdaniels made their first contribution in #1872
v0.38.1
This patch release fixes several bugs including some found in the recent v0.38.0 release, as well some other improvements.
Bug Fixes
- Fix for
prefer-equals-comparisonfixer failing to parse policies with multiple "=" in expressions (#1824, fixes #1818 reported by @gusega) - Fix for incorrect fixable violation count display in lint output (#1825, fixes #1813 reported by @gusega)
- Fix for false positive in
prefer-equals-comparisonrule with comprehension term vars (#1828, fixes #1826 reported by @SeanLedford) - bundle: Surface configured rule notices as messages in lint output (#1827, fixes #1795 reported by @ghmer)
Improvements
- Code action for
prefer-equals-comparisonfixer now available in the language server (#1810) - New option for
prefer-value-in-headrule to count interpolated strings as scalars (#1817) - Minor performance improvement for
any_set_item, used for selecting items from sets (#1815)
Changelog
- f1c5f74: bundle: Improve performance of any_set_item (#1815) (@charlieegan3)
- 9300420: Implemented Code action for prefer-equals-comparison fixer (#1810) (@SeanLedford)
- 28121f0: build(deps): bump github/codeql-action in the dependencies group (#1823) (@dependabot[bot])
- 54cdcb6: Add
prefer-value-in-headoption to count interpolated string as scalar (#1817) (@anderseknert) - e68184d: Fix false positivie in prefer-equals-comparison (#1828) (@anderseknert)
- 593e221: fix: Prefer-Equals-Comparison Edge Case With Multiple "=" (#1824) (@SeanLedford)
- 3dc28bb: bundle: Surface configured rule notices (#1827) (@charlieegan3)
- aac9618: Updated lint reporter to track fixable violation count separate from fixable violation Set (#1825) (@SeanLedford)
- fd6dd4d: Updated example for prefer-equals-comparison edge case to not include false positive (#1829) (@SeanLedford)
v0.38.0
Happy New Year from the Regal maintainers!
Feature: String Interpolation Support
v0.38.0 of your favorite Rego linter, debugger and language server brings full support for OPA's new string interpolation feature. This means not only that Regal lints code found inside interpolated strings, but that you'll have access to all your favorite language server features within them too — like code completions, tooltips on hover, or document highlighting. You can even use the debugger to step through interpolated expressions! If you haven't yet tried it out, grab OPA v1.12.2, Regal v0.38.0 and enjoy an absolutely awesome addition to the Rego language!
In addition to this, we have a number of fun new features and performance improvements.
New Rule: disallow-rego-v1
Category: custom
This optional new rule flags the use of import rego.v1 in Rego policies (#1778). Since OPA v1.0 (December 2024), this import is a no-op and no longer needed. The rule helps users maintain clean code by preventing this outdated import from appearing in new policies. Teams standardizing on OPA 1.0+ can enable this rule to enforce modern Rego standards.
package example
import rego.v1 # <-- Happy 2026! Time to stop doing this!Authored by @SeanLedford.
New Fixers
@SeanLedford has also done some great work to help expand Regal's auto-fixing capabilities by having regal fixers added for three more rules.
See (#1790) and (#1794) for more details.
Performance
The fixer saw a 12% performance improvement by reusing the linter, reducing allocations from 2.3M to 2.0M operations (#1783). Additional optimizations include:
- faster file filtering by avoiding recompiled ignore patterns (#1758),
- better built-in function handling by registering Regal's functions globally only once (#1788),
- and more efficient AST location serialization (#1758)
To track ongoing performance work, a new post-merge benchmark-recording workflow was added (#1793).
LSP: New Ignore Code Action
The language server now supports a code action to quickly add regal ignore configuration for specific rules directly from the editor (#1777).
Changelog
- ac35695: Various performance improvements (#1758) (@anderseknert)
- 48cd03d: docs: Add custom head for regal index page (#1761) (@charlieegan3)
- 728ae28: build(deps): bump golangci/golangci-lint-action (#1762) (@dependabot[bot])
- 92cf6ca: explorer: allow hiding stages without an effect (+misc) (#1760) (@srenatus)
- c000994: docs: Correct sidebar labels (#1763) (@charlieegan3)
- bf0b621: build(deps): bump github.com/containerd/containerd/v2 in /e2e/testbuild (#1753) (@dependabot[bot])
- 18e7a89: build(deps): bump github.com/containerd/containerd/v2 (#1754) (@dependabot[bot])
- ccab7bd: Rename: encoding/util -> encoding/write (#1764) (@anderseknert)
- 54f7625: build: run windows in matrix with other jobs (#1770) (@charlieegan3)
- 5c9e6f0: update: Update version checking logic (#1772) (@charlieegan3)
- 5034776: build: Add badge update to readme script (#1773) (@charlieegan3)
- 95e8220: Added OPA installation as a Regal prerequisite, and fixed golangci-lint link. (#1774) (@SeanLedford)
- 149f71d: build(deps): bump js-yaml from 4.1.0 to 4.1.1 in /build (#1775) (@dependabot[bot])
- b8f8b7f: Enable more golangci-lint linters (@anderseknert)
- e092627: build: Update mac runner (@charlieegan3)
- 877884c: lsp: Add code action and command to ignore rule (#1777) (@charlieegan3)
- ece9ca2: build(deps): bump the dependencies group with 5 updates (@dependabot[bot])
- bd37bbd: build(deps): bump golang.org/x/crypto in /build/lsp (@dependabot[bot])
- 17cc429: build(deps): bump golang.org/x/crypto in /e2e/testbuild (@dependabot[bot])
- 415b05f: build(deps): bump golang.org/x/crypto from 0.43.0 to 0.45.0 (@dependabot[bot])
- e1bb975: Improve fixer performance (@anderseknert)
- 1b083ff: Added Rule: Disallow import rego.v1 (#1778) (@SeanLedford)
- 9e43c50: Optimize and improve code for built-in functions (@anderseknert)
- 64ce2aa: build(deps): bump glob and markdownlint-cli in /build (#1779) (@dependabot[bot])
- 48fddeb: build(deps): bump github/codeql-action in the dependencies group (#1787) (@dependabot[bot])
- bc41f63: pkg/linter: use errgroup, set limits + context on it (@srenatus)
- f22c2aa: Add fixer for prefer-equals-comparison rule (#1790) (@SeanLedford)
- cf88eb9: Fixers for redundant-existence-check and constant-condition rules (#1794) (@SeanLedford)
- 36401a2: build(deps): bump the dependencies group across 1 directory with 7 updates (#1796) (@dependabot[bot])
- ecb23d3: version: Add OPA version to version output (#1798) (@charlieegan3)
- 94ce038: build(deps): bump golang.org/x/crypto from 0.43.0 to 0.45.0 in /build/ws (#1791) (@dependabot[bot])
- 9ce1ddd: workflows: add post-merge benchmark-recording workflow (@srenatus)
- e111443: workflows/benchmark: fix golang setup (@srenatus)
- 4bb2d5a: docs: Update messy rule docs (@charlieegan3)
- dec83ea: docs: Updates from opa website link scanner (@charlieegan3)
- 8f544a6: fix typo in fix.go help message (#1807) (@gusega)
- 941b02e: build(deps): bump the dependencies group with 3 updates (#1804) (@dependabot[bot])
- 9f09e6e: build(deps): bump the dependencies group with 4 updates (#1808) (@dependabot[bot])
- 476ef89: OPA v1.12.2 and full string interpolation support (#1811) (@anderseknert)
- a9843ab: Move
chained-rule-bodytocustomcategory (#1812) (@anderseknert)
v0.37.0
Regal v0.37.0
This release features a new linter rule, several new language server features, and many improvements and fixes. The two major OPA versions bumped since the last release additionally contains several performance improvements that were contributed as part of developing Regal!
New Rule: prefer-equals-comparison
The prefer-equals-comparison linter rule recommends using the == operator for equality comparison over the unification operator =. The rule helps improve code clarity by using operators for their intended purposes: := for assignment, == for equality comparison, and = for unification. The linter identifies when = is used for comparison by checking if both sides of the operator are "unassignable".
Avoid
input.request.method = "GET"Prefer
input.request.method == "GET"There are some certainly valid use cases for the unification operator! But simple equality comparison is not one. For more information, see the documentation for the rule. As an amusing aside, this fixes one of the first issues created in the project!
Language server: Document highlighting to help show where function args are referenced
Document highlighting is one of the more subtle features of the LSP specification, but a really helpful one when implemented well. The experimental first implementation that shipped with Regal v0.36.0 is no longer experimental, and has also been extended to highlight usage of function argument variables inside of a function head or body.
Language server: Selection ranges
Selection ranges provide smart selection of code that can expand and shrink based on knowledge of the code rather than simple text properties, like hyphens or whitespace. This makes moving code around extremely fast, and without leaving the keyboard. Consult the language server docs for how to enable this in your editor
Improvements
- The pointless-reassignment rule would previously only flag reassignment at the top level of a rule body. Now it flags pointless reassignments also in nested bodies, like comprehensions,
everystatements, and so on.
- All completion providers are now implemented purely in Rego
- Remove the go-semver dependency in favor of a custom, much faster implementation
- Build: Reduce permissions granted in update-caps top-level workflow, by @timothyklee
- Docs: Update language server page to demonstrate recently added features
- Docs: Add kakoune LSP configuration example
Windows compatibility improvements
In this release we have fixed various Windows bugs (Language Server Init, Goto Definition, Error Popups) in #1740, #1737, #1736, following #1633, and #1642 last release. Reported and verified by geirs73.
These fixes have also made it possible to run our test suites on Windows runners to catch issues sooner in future. A huge thanks to @charlieegan3 for his tireless work on this!
Bugs fixed
- Fix false positive in use-some-for-output-vars triggered by nested variables in rule ref heads, like
rule[input[i]].allow if .... - Fix false positive in redundant-existence-check when a
notcheck made an existence check necessary, reported by @gusega - Fix false positive in narrow-argument rule, which would incorrectly flag some arrays passed as arguments
- Ensure that the language server
InitOptionsis never nil and don't cause issues with clients that don't provide those
Dependency Updates:
Go modules:
github.com/open-policy-agent/opa:v1.8.0→v1.10.1github.com/arl/statsviz:v0.7.1→v0.7.2github.com/go-git/go-git/v5:v5.16.2→v5.16.3github.com/olekukonko/tablewriter:v0.0.5→v1.1.0github.com/spf13/cobra:v1.9.1→v1.10.1github.com/spf13/pflag:v1.0.7→v1.0.10- Removed:
github.com/coreos/go-semver:v0.3.1
GitHub Actions:
open-policy-agent/setup-opa:v2.2.0→v2.3.0actions/cache:v4.2.4→v4.3.0actions/upload-artifact:v4.6.2→v5.0.0golangci/golangci-lint-action:v2.4.0→v2.5.0actions/setup-go:v5.5.0→v6.0.0
Support
If you encounter any issues with this release, please either file an issue, or let us know in the #opa-regal channel in the OPA Slack!
Changelog
- 244459c: docs: Remove some old references (#1689) (@anderseknert)
- 4212b5c: build(deps): bump the dependencies group with 2 updates (#1690) (@dependabot[bot])
- e149c6d: build: reduce update-caps top-level workflow permission to read (#1691) (@timothyklee)
- 819bbec: lsp: Fix missing initial root (#1692) (@charlieegan3)
- be8b020: docs: Update style guide links to new repo (#1693) (@charlieegan3)
- ceb890b: Builtin function completion in Rego (#1694) (@anderseknert)
- d36555e: Package ref import suggestions in Rego (#1698) (@anderseknert)
- 4e44131: build(deps): bump the dependencies group with 2 updates (#1703) (@dependabot[bot])
- 14166e9: Avoid multi-line highlighting of issues (#1702) (@anderseknert)
- 1685bb8: Move completion handler into Rego router (#1699) (@anderseknert)
- 0da5eaa: build(deps): bump the dependencies group with 2 updates (#1708) (@dependabot[bot])
- e792757: Bump OPA -> v1.9.0, golangci-lint 2.5.0 (#1709) (@anderseknert)
- 3092d1d: docs: Address some broken links from OPA report (#1704) (@charlieegan3)
- bebfd06: util: use Partial2 for IsAnyError (@srenatus)
- f22a570: Fix false positive in
redundant-existence-check(#1716) (@anderseknert) - 2703715: Various fixes (#1715) (@anderseknert)
- 87981f2: build(deps): bump the dependencies group with 2 updates (#1713) (@dependabot[bot])
- a6487b6: lsp: document highlighting supporting function args (#1718) (@anderseknert)
- fe8cbd3: Rule: prefer-equals-comparison (#1726) (@anderseknert)
- f3722ea: Fix false positive in narrow-argument (#1724) (@anderseknert)
- 73b8c65: Improve pointless-reassignment to cover nested cases (#1727) (@anderseknert)
- 9cf180c: lsp: Implement selection ranges and linked editing range (#1722) (@anderseknert)
- bf632d0: build(deps): bump the dependencies group with 2 updates (#1725) (@dependabot[bot])
- a373ae3: lsp: Use filename path for current buffer for defns (#1732) (@charlieegan3)
- d758eaf: lsp: Refactor range utilities (#1729) (@anderseknert)
- 13de8a9: Fix incorrect behavior in pointless-import (#1733) (@anderseknert)
- fb560c1: Fix false positive in use-some-for-output-vars (#1731) (@anderseknert)
- 70449b7: Various small fixes (#1736) (@anderseknert)
- 2594719: windows: Better use of slash paths (#1737) (@charlieegan3)
- 499125f: Get FindClosestMatchingRoot working on windows (#1740) (@charlieegan3)
- 3715085: OPA v1.10.0 (#1742) (@anderseknert)
- 781f809: deps: stick to github.com/vektah/gqlparser/v2@v2.5.30 (#1744) (@srenatus)
- bbb03db: Use generic client identifier in tests (#1741) (@charlieegan3)
- c42ce08: build(deps): bump github/codeql-action in the dependencies group ...
v0.36.1
This is Regal v0.36! The first Regal release since becoming a part of the OPA project last month. This release mostly delivers a number of new language server features as well as wider improvements under the hood and to the developer experience.
A note for users getting Regal via Homebrew
Since Regal was made an official formula, our recommendation has been to use that as your source for Regal. This is the first release distributed only via that formula, so if you still rely on the old styrainc/regal one, make sure to have that removed and brew install regal instead.
A note about Regal's documentation
Our documentation is now displayed as part of the main OPA website!
https://www.openpolicyagent.org/projects/regal
From this release, links generated from Regal in output to rules will point to this location. You might find links to the old location as we get things updated. Please feel free to open any issues for link problems you find just so we don't miss anything.
Get contextual documentation when calling built-in functions
Following PR #1654, the Regal language server will now offer signatureHelp to compatible clients. This shows the current argument type and description in the help text for built-in functions. This is in addition to the other general function documentation displayed here.
Quickly see related fields in when editing METADATA
PR #1657 implements support for the documentHighlight request from clients. This is currently only used to show signal other related METADATA keys when working with Rego metadata.
In future, this same functionality could be used to highlight other related items currently in the viewport.
Jump directly from ignore directives to documentation
documentLink is another request from clients which allow the server to respond with link ranges. We have used this to make regal ignore directives clickable, helping users quickly learn what they mean when encountered in policies PR #1657.
Get live diagnostics from custom rules as you type
PR #1631 ensures that users of custom linter rules are also able to access these for live diagnostics in language server clients. Previously these were not evaluated in the server, only in the Regal CLI.
Notable Refactors & Development Changes
- Rego Language Server Routing: PR #1675 makes some notable changes to how Rego is used within the Regal’s language server. The Language Server Protocol (LSP), which Regal implements to support LSP clients, is based on JSON message passing. This lends itself to Rego evaluation which is JSON in, JSON out. This PR updates the handling of different LSP messages sent from clients to route them in Rego, handling Rego backed rules first, and falling back to Golang implementations that still remain otherwise. This sets the direction for more Rego LSP functionality in the language server in future.
- Development bundle loading from disk: PR #1646 gives those working on Regal in development the option of using the current source for the Regal bundle without rebuilding the binary. This improves the experience when working on Rego based language server functionality by reducing the time of a feedback loop. Set
REGAL_BUNDLE_PATHto use this feature.
Changelog
- 1f1044f: build: Remove tap key (#1687) (@charlieegan3)
- build(deps): bump github/codeql-action from 3.29.0 to 3.29.1 in the dependencies group by @dependabot[bot] in #1616
- Add Regal bundle compilation benchmark by @anderseknert in #1618
- Remove quotes from keywords in refs by @anderseknert in #1619
- lsp: Skip loading files on disk when in cache by @charlieegan3 in #1620
- build(deps): bump the dependencies group with 2 updates by @dependabot[bot] in #1621
- automated: update capabilities by @github-actions[bot] in #1622
- add experimental lsp package for websocket communication by @srenatus in #1623
- internal/io: add FindInputPath when the content isn't needed by @srenatus in #1624
- build(deps): bump github/codeql-action from 3.29.2 to 3.29.3 in the dependencies group by @dependabot[bot] in #1626
- lsp/completions: Handle hyphenated package names by @charlieegan3 in #1625
- lsp: fix didOpen templating race by @charlieegan3 in #1627
- build/lsp: add web client demo by @srenatus in #1629
- lsp: Fix stale diagnostics after deletion by @charlieegan3 in #1628
- Some doc updates by @anderseknert in #1632
- lsp: Add support for custom rules by @charlieegan3 in #1631
- Vendor roast dependency by @anderseknert in #1634
- lsp: Address windows goto definition URI issue by @charlieegan3 in #1633
- Fix
regal new ruleissues + refactor io code by @anderseknert in #1636 - lsp: Use full text replacement for Intellij fmt by @charlieegan3 in #1637
- test: refactor e2e test, add new regal command runner by @anderseknert in #1640
- build(deps): bump github/codeql-action from 3.29.3 to 3.29.5 in the dependencies group by @dependabot[bot] in #1641
- Fix missing source.explore code action by @anderseknert in #1643
- lsp: Present filename relative to root in errors by @charlieegan3 in #1638
- refactor: Improve code quality throughout the codebase by @anderseknert in #1642
- lsp/uri: Refactor URI handling by @charlieegan3 in #1644
- Tidying up more code by @anderseknert in #1645
- Provide development option to load bundle from disk by @anderseknert in #1646
- lsp/eval: Ensure filenames use URI in print output by @charlieegan3 in #1647
- Rewrite more completion providers in Rego. Resolve schemas at runtime. by @anderseknert in #1652
- lsp: Add signature help by @charlieegan3 in #1654
- lsp: Fix server signature race in test by @charlieegan3 in #1655
- build(deps): bump the dependencies group with 5 updates by @dependabot[bot] in #1639
- build(deps): bump the dependencies group with 3 updates by @dependabot[bot] in #1653
- docs: update README badges for OPA 1.7.1 release by @charlieegan3 in #1656
- New LSP features and internal improvements by @anderseknert in #1657
- lsp/documenthighlight: Add tests by @charlieegan3 in #1659
- Add tests for textDocument/documentLink handler by @anderseknert in #1658
- Styra URLs -> OPA URLs by @anderseknert in #1662
- docs: Update README re: move to open-policy-agent by @charlieegan3 in #1664
- internal/io: explicitly disable lazy loading of regal bundle by @srenatus in #1666
- build(deps): bump the dependencies group across 1 directory with 4 updates by @dependabot[bot] in #1663
- Enable pprof endpoint only with env var set by @anderseknert in #1667
- docs: Remove update workflow & minor adjustments by @charlieegan3 in https://gi...
v0.35.1
We're happy to release v0.35.1, the mid-summer release of Regal for the 🏖️ ! This release updates to OPA v1.6.0 bringing a number of performance improvements as well as other improvements and bug fixes.
Improved Schema Loading
This PR replaces Regal's custom schema loader with one that matches OPA's behavior, enabling the same schemas to work across opa check, opa eval, and other OPA commands. PR #1605
Performance Improvements
- Thanks to a PR in OPA, Regal's memory use is now much reduced due to a change conditionally supplying built-in contexts only when needed.
- This PR optimizes Rego evaluation by directly mapping source data to ast.Value objects instead of going through intermediate map[string]any or JSON representations, eliminating ~2.9 million allocations in benchmarks. PR #1606
- Regal contributors will be happy with open-policy-agent/opa#7442 which makes running Regal's tests around 2.5x as fast!
Code Actions Rewrite
Code actions are LSP features that provide automated fixes or refactoring suggestions (like "quick fix" options), and this PR implements them for Regal with server-side filtering to reduce data transfer and ensure consistent editor behavior. This is also now implemented in Rego! PR #1604
Docs
- PR #1584 refactors a number of Regal's pages including breaking down the previously large README into separate files. Browse the new structure on the Regal Website.
- The Code Lens documentation has been updated to better explain supported configurations. Thanks @Shinzu for the report here. #1596
Changelog
- 92d1ba9: deps: Update OPA to v1.6.0 (#1617) (@charlieegan3)
- 2bbe76e: [create-pull-request] automated change (#1582) (@github-actions[bot])
- 6e5e6bb: e2e: add frankenstein test build (@srenatus)
- 5bf607d: build(deps): bump github/codeql-action in the dependencies group (#1585) (@dependabot[bot])
- 6f45a9f: build(deps): bump brace-expansion from 2.0.1 to 2.0.2 in /build (#1587) (@dependabot[bot])
- e85b878: docs: Update config cli docs (#1584) (@charlieegan3)
- 30c73fe: build(deps): bump github/codeql-action in the dependencies group (#1595) (@dependabot[bot])
- b8f3e8f: fix: improve snippets suggestion condition (#1597) (@anderseknert)
- eb48984: Fix issue with handling big numbers (#1599) (@anderseknert)
- 1ee1cf4: fix: Correct end location in unresolved-reference (#1600) (@anderseknert)
- e50c9af: Bump Roast -> v0.12.0 (#1601) (@anderseknert)
- 981d8d2: docs: Update Evaluation Code Lens docs (#1602) (@charlieegan3)
- 3577efe: lsp/completion/input: don't suggest 'input' following dot (#1603) (@srenatus)
- 02d1546: lsp: Code Action feature rewritten in Rego (#1604) (@anderseknert)
- 25b1072: More robust loading of schemas (#1605) (@anderseknert)
- 112dc87: perf: avoid JSON/map roundtrips in ast.Value transforms (#1606) (@anderseknert)
- d87fd2f: docs: Tone down "obsolete" description for use-rego-v1 (#1610) (@anderseknert)
- a939219: lsp: Roll over load file failures (#1611) (@charlieegan3)
- 1d771ca: interning: bump opa+roast, replace call to ast.InternedBoolTerm() (#1613) (@srenatus)
- ed0ead4: build(deps): bump github.com/go-viper/mapstructure/v2 in /e2e/testbuild (#1615) (@dependabot[bot])
- 0d65ef0: build(deps): bump github.com/go-viper/mapstructure/v2 (#1614) (@dependabot[bot])
v0.34.1
This patch release fixes a bug found since v0.34.0 as well as it bumps the OPA dependency to the v1.5.1 patch also released today. While Regal's own policies were not affected by the regression in walk, custom linter rules could very well be.
- OPA v1.5.0 -> v1.5.1
- Go 1.23 -> 1.24
- Fix false positive in sprintf-arguments-mismatch when the
%-*spattern was used for padding.
Changelog
- b5ce411: Go 1.23 -> 1.24 (#1573) (@anderseknert)
- aed72f0: Fix deprecated notices in .goreleaser.yaml (#1570) (@anderseknert)
- be86c30: build(deps): bump ossf/scorecard-action in the dependencies group (#1576) (@dependabot[bot])
- 0c605cc: fix: consider padding pattern in sprintf-arguments-mismatch (#1575) (@anderseknert)
- 72f0510: [create-pull-request] automated change (#1577) (@github-actions[bot])
- 72fb730: docs: Update to allow better regal docs generation (#1578) (@charlieegan3)
- af14e8d: deps: Revert 47c70f0 tablewriter changes (#1579) (@charlieegan3)
- 31284f0: docs: Update typo in link (#1581) (@charlieegan3)
- f4e4bc3: OPA v1.5.1 and some perf tweaks (#1580) (@anderseknert)
v0.34.0
After a month of development, we're happy to announce Regal v0.34. This version of the OPA community's favorite linter and language server brings you new 3 linter rules, performance improvements and much more.
With the v0.34.0 release, Regal now ships with more than 100 linter rules! 🎉
Which is pretty close to one new rule per week since the project started.
New rules
unresolved-reference
Category: imports
This one is particularly exciting! The new unresolved-reference rule reports any references (like data.users.permissions) that cannot be resolved (i.e. found) anywhere in the project. Some projects will have valid references that can't be resolved at the time Regal lints the project, and the rule provides configuration options to mark certain references, or entire paths (like data.users.*) as resolved. See the docs for the rule for more details.
This rule was contributed by @HookFirebolt and @bdumpp at Bankdata. Great work, and thank you both!
pointless-import
Category: imports
The new pointless-import rule will flags imports of the same package, and other import forms where the import has no real effect.
single-item-in
Category: idiomatic
The single-item-in rule reports cases of in being used on a single item collection, and suggests using an equality check instead.
Performance
- Use OPA v1.5.0, which brings performance improvements to
walkreducing linting time by about 10%. - Faster linting by avoiding
walkin a few locations where possible. - Improve performance of aggregate rules.
- Several performance optimizations to Regal's linter rules.
API
- The
linterAPI now has a newPreparemethod that can be used to prepare the linter before reusing it across several runs.
Various
- Some rules that would previously only scan the topmost level of a rule body will now recursively scan the whole rule.
- The input completions provider has been rewritten in Rego (previously Go).
- The automatic version check has been rewritten in Rego (previously Go).
Bugs
- Fix false positive in custom one-liner-rule.
Docs
- Updated roadmap. Go check it out!
- Move rules table from README and into a more interactive form on the Styra docs. Take a look!
- Add link to Renovating Rego blog.
- README: add link to KubeCon London talk, which prominently featured Regal.
- Update links to adapt to OPA's new documentation.
- Update outdated information in README.
Changelog
- 45bff44: Add link to KubeCon London talk (#1498) (@anderseknert)
- ee041e5: lsp: Handle and log case of no Href for diagnostic (#1502) (@charlieegan3)
- fef38cf: refactor: continued work to improve config handling and tests (#1500) (@anderseknert)
- b24a7a9: perf: walk less, save allocations (#1503) (@anderseknert)
- d2b4b94: Add Prepare method for reusing state across linter runs (#1506) (@anderseknert)
- 3a2f3ec: Port input completion provider to Rego (#1505) (@anderseknert)
- 4edddb2: Scan nested expressions (#1504) (@anderseknert)
- 0a127fc: Add Renovating Rego blog (#1509) (@anderseknert)
- 58b8152: build(deps): bump github/codeql-action in the dependencies group (#1507) (@dependabot[bot])
- d31b341: lsp: log handleTextDocumentCodeAction params (#1511) (@charlieegan3)
- bebff27: Move more of version check to Rego (#1513) (@anderseknert)
- 5d69c12: Rule: unresolved-reference (@HookFirebolt)
- 2eab703: Have redundant-existence-check flag subset terms (#1514) (@anderseknert)
- 0896ce8: build(deps): bump the dependencies group with 2 updates (#1521) (@dependabot[bot])
- abe5fff: docs: Fix annotations link (#1522) (@charlieegan3)
- e6c87d3: perf: improve performance of new unresolved-reference rule (#1530) (@anderseknert)
- b156f5d: perf: improve aggregate rules (#1531) (@anderseknert)
- 23303ae: [create-pull-request] automated change (#1528) (@github-actions[bot])
- acf16dd: Fix false positive in one-liner-rule (#1534) (@anderseknert)
- 0e92eb3: Enable prefer-values-in-head (#1535) (@anderseknert)
- 0d02763: OPA v1.4.2, Roast v0.9.0 (#1538) (@anderseknert)
- 152e87d: Rule: pointless-import (#1539) (@anderseknert)
- a75398c: Bump golangci-lint (#1541) (@anderseknert)
- 214c573: refactor: simplify test format (#1540) (@anderseknert)
- 90f4b64: Apply modernize fixes (#1543) (@anderseknert)
- 8d26d35: build(deps): bump the dependencies group with 2 updates (#1544) (@dependabot[bot])
- 129ea57: Various small fixes (#1545) (@anderseknert)
- cb21bd4: perf: various optimizations (#1547) (@anderseknert)
- 9746dc3: Rule: single-item-in (#1546) (@anderseknert)
- 7b64a08: docs: update some sections with outdated content (#1548) (@anderseknert)
- 80956fb: perf: some Rego micro-optimizations (#1549) (@anderseknert)
- bf2c719: perf: Rego optimizations to avoid alloactions (#1550) (@anderseknert)
- 838fea0: build(deps): bump the dependencies group with 2 updates (#1551) (@dependabot[bot])
- 2cfc3c5: perf: improve unresolved_reference rule (#1533) (@HookFirebolt)
- b23df09: docs: Update links to opa docs (#1552) (@charlieegan3)
- ba2e2a1: docs: Update roadmap for Regal 1.0 (#1561) (@charlieegan3)
- ad0834f: Various small fixes (#1562) (@anderseknert)
- 4136f01: Small perf fixes (#1563) (@anderseknert)
- 9cbd022: docs: Remove rules table from README and build (#1565) (@charlieegan3)
- eee47fb: Small fixes before next release (#1566) (@anderseknert)
- 47c70f0: OPA v1.5.0, improved report formatting (#1569) (@anderseknert)
v0.33.1
This release adds 4 new linter rules to Regal, alongside significant performance improvements and several bug fixes.
New Rule: in-wildcard-key
Using a wildcard variable (_) for the key in the key-value form of iteration (some _, value in collection) is never needed, and can be replaced by the simple some value in … form . This rule flags cases where the key iteration is redundant. (Read more)
package policy
allow if {
# Avoid: key iteration ('_') is redundant if only 'user' is used
some _, user in input.users
# do something with each user
}
allow if {
# Prefer: clearer intent when only iterating values
some user in input.users
# do something with each user
}PR #1466
New Rule: confusing-alias
While import aliases can improve readability, aliasing an import reference that is also imported without an alias is confusing, as both names point to the same resource. This rule catches such cases. (Read more)
package policy
# Avoid: both 'users' and 'employees' point to data.resources.users
import data.resources.users
import data.resources.users as employees
# Prefer: a single import for any given resource
# import data.resources.usersPR #1470
New Rule: mixed-iteration
Rego supports different styles of collection iteration. While "reference style" iteration (collection[_]) can be concise for deeply nested structures, mixing it with the some .. in style within a single iteration expression makes for code that’s more difficult to follow. This rule encourages consistency within a single iteration statement. (Read more)
package policy
allow if {
# mixing 'some .. in' and reference iteration
some resource in input.assets[_]
# do something with resource
}
allow if {
# using 'some .. in' iteration consistently
some asset in input.assets
some resource in asset
# do something with resource
}PR #1475
New Rule: narrow-argument
This new rule analyzes function arguments to suggest narrowing them down to the minimal value the function depends on. This can improve clarity and reusability. The rule considers incrementally defined functions across all their definitions. This is a powerful but opinionated rule and is thus in the custom category and is not on by default. See the documentation for how to enable it if you’re curious to try it out! (Read more)
package policy
# Avoid: the function only uses the 'email' property of the 'user' object
valid_user(user) if endswith(user.email, "acmecorp.com")
valid_user(user) if endswith(user.email, "acmecorp.org")
# Prefer: narrowing the argument to only what the function needs
valid_email(email) if endswith(email, "acmecorp.com")
valid_email(email) if endswith(email, "acmecorp.org")PR #1488
Performance Improvements
Several improvements have been made to reduce memory allocations and improve overall linting performance. Numbers below refer to Regal’s benchmark for linting its own policies.
- Optimized config loading and parsing, saving around 2.7 million allocations (#1491).
- Reduced allocations by approximately 2 million (#1494).
- Improved the performance of the
use-strings-countrule, saving almost 1 million allocations (#1465). - Optimized reference comparisons and small iteration patterns, saving around 300k allocations (#1472).
- Included performance enhancements alongside an update to the
external-referencerule to make it more configurable (#1496).
OPA v1.3.0
Regal has been upgraded to use OPA v1.3.0. This brings several upstream improvements, including support for the new one-liner grouping in formatting (see OPA#6760). (#1459)
Bug Fixes
- Fixed a bug in the handling of Rego input from stdin. Thanks @tokyowizard for the report! (#1474)
- Fixed a panic that could occur in
FindConfigRootswhen supplied with unexpected arguments. (#1487)
Other Rule Updates
- The
external-referencerule can now be configured with a maximum number of allowed external references, instead of solely flagging all external uses within a function. If you previously had this rule disabled, you might want to try enabling it now, and possibly tweak its configuration to your liking. (#1496) - The
rule-lengthrule now has a separate setting (max-test-rule-length) with a higher default value (60 vs 30) for test rules, acknowledging that tests often include substantial data. (#1476) - Updated documentation for the
rule-named-ifrule based on community feedback received via the page feedback form (please let us know if you see issues! & thanks for the report!) (#1463)
Dependencies
This release also updates Regals dependencies as follows.
Go Mod:
- github.com/open-policy-agent/opa v1.2.0 -> v1.3.0
- github.com/prometheus/client_golang v1.21.0 -> v1.21.1
- go.opentelemetry.io/otel v1.34.0 -> v1.35.0
- go.opentelemetry.io/otel/metric v1.34.0 -> v1.35.0
- go.opentelemetry.io/otel/sdk v1.34.0 -> v1.35.0
- go.opentelemetry.io/otel/trace v1.34.0 -> v1.35.0
- golang.org/x/crypto v0.35.0 -> v0.36.0
- golang.org/x/net v0.36.0 -> v0.38.0
- golang.org/x/sync v0.11.0 -> v0.12.0
- golang.org/x/sys v0.30.0 -> v0.31.0
- golang.org/x/text v0.22.0 -> v0.23.0
- google.golang.org/protobuf v1.36.4 -> v1.36.5
GitHub Actions:
- codecov/codecov-action v5.4.0 -> v5.4.2
- github/codeql-action/analyze v3.28.12 -> v3.28.15
- github/codeql-action/autobuild v3.28.12 -> v3.28.15
- github/codeql-action/init v3.28.12 -> v3.28.15
- github/codeql-action/upload-sarif v3.28.12 -> v3.28.15
- goreleaser/goreleaser-action v6.2.1 -> v6.3.0
Changelog
- automated: update capabilities by @github-actions in #1458
- OPA 1.3.0 by @anderseknert in #1459
- Parameterize some tests by @anderseknert in #1460
- automated: update capabilities by @github-actions in #1461
- build(deps): bump the dependencies group with 2 updates by @dependabot in #1462
- docs: rule-named-if by @charlieegan3 in #1463
- Some perf fixes by @anderseknert in #1465
- Rule: in-wildcard-key by @anderseknert in #1466
- Increase coverage by @anderseknert in #1467
- build(deps): bump github/codeql-action from 3.28.13 to 3.28.14 in the dependencies group by @dependabot in #1468
- perf: various improvements by @anderseknert in #1472
- Rule: confusing-alias by @anderseknert in #1470
- Add benchmark for testing all rules individually by @anderseknert in #1469
- Rule: mixed-iteration by @anderseknert in #1475
- Add max-test-rule-length setting to rule-length rule by @anderseknert in #1476
- fix: ensure policy from stdin is enumerated correctly by @anderseknert in #1474
- automated: update capabilities by @github-actions in #1477
- builtins.RegalIsFormatted: recover from formatter panics by @srenatus in #1481
- automated: update capabilities by @github-actions in #1482
- build(deps): bump github/codeql-action from 3.28.14 to 3.28.15 in the dependencies group by @dependabot in #1484
- Fix unnecessary-some rule not working after OPA 1.0+ by @anderseknert in #1485
- FindConfigRoots: return error, not panic by @srenatus in #1487
- perf: Improve how config is parsed, and when by @anderseknert in #1491
- Rule: narrow-argument by @anderseknert in #1488
- build(deps): bump golang.org/x/net from 0.37.0 to 0.38.0 by @dependabot in #1490
- build(deps): bump codecov/codecov-action from 5.4.0 to 5.4.2 in the dependencies group by @dependabot in #1495
- Make external-reference rule less annoying by @anderseknert in https://gi...





