Releases: Goldziher/polylint
Releases · Goldziher/polylint
Release list
v0.4.0
Added
- Colored
poly hooks install/uninstalloutput — a green ✓ header with
the hook count and the (relative) hooks directory, then one line per hook name,
replacing the flat list of absolute paths.
Changed
- Installed git-hook shims resolve
polyfromPATHrather than baking in an
absolute path to the binary, so a hook always runs whateverpolyis current
(a recorded absolute path could pin a stale or moved build). Whenpolyis not
onPATHthe shim now fails with a clear, actionable message and a non-zero exit
instead of proceeding as though the hook had passed. Re-runpoly hooks install
to migrate existing shims.
Fixed
- Native-toolchain formatter output is normalized to LF line endings; some
first-party CLIs emit CRLF on Windows, which made output platform-dependent.
v0.3.0
Added
- Native-toolchain formatter backends — opt-in backends that invoke a
language's canonical first-party CLI when it is present on the host: Java,
Kotlin, R, Swift, Dart, and Gleam. Off by default (enabled per-tool in config);
when the tool is absent the language falls through to the tier-2 tree-sitter
formatter, so the zero-dependency guarantee is intact for anyone who has not
opted in. - C# tier-2 support — a
Language::CSharpvariant so.csfiles route to the
tree-sitter generic formatter (deterministic, zero system dependency) instead of
being skipped. Maps thec#/csharpcatalog names and the.csextension. - Elixir
do…endreindent in the tier-2 formatter. Elixir's blocks are
keyword-delimited (do…end), so they matched neither the brace-counting path nor
a language-pack indents query (tree-sitter-elixir ships none) and were left at
column 0. A new built-in-indents-query dispatch slot plus a minimal Elixir query
producesmix format's 2-space nesting; idempotent, with heredocs/strings
preserved.
Changed
poly fmthonors// swift-format-ignore-file— a Swift file carrying the
directive is left byte-for-byte untouched (the same whole-file skip marker
swift-formatrespects), mirroring the generated-lock-file skip. Protects files a
project opted out of formatting and machine-generated swift-bridge glue.- Bumped
fs-err,serde-saphyr, andsqruffto their latest releases.
Fixed
poly hooksnow enforces thecommit-msgstage. Lowered hooks kept
Stage::default()(pre-commit), so the runner dispatched thepoly commit
(Conventional Commits) builtin in file-input mode, matched no files, and silently
skipped it — the gitcommit-msghook never enforced anything. Every lowered hook
is now stamped with the stage it was lowered for; latent for any non-pre-commit
builtin, onlypoly-commitsurfaced it.- Rust files named like
dockerfile.rsare no longer misdetected as
Dockerfiles. Language detection now lets a known file extension (.rs→ Rust)
win over the Dockerfile filename match, soengines/dockerfile.rsand similar no
longer produce spurious Dockerfile parse errors.
V0 Floating Tag
Full Changelog: https://github.com/Goldziher/polylint/commits/v0
v0.2.0
v0.1.15
Added
- Hierarchical (monorepo-aware) config resolution (ADR 0018). Running
poly
from a monorepo root now discovers nestedpoly.tomlfiles and cascades them
the way ruff/eslint resolve config: a file is governed by the deep-merge of its
ancestor config chain (workspace root as base, nearest config wins), so a
sub-project'spoly.tomldeclares only its diff and inherits[defaults], the
[lint.*]/[fmt.*]rule tables, and[per-file-ignores]from above.- New
[workspace] root = truemarker bounds the upward cascade; a.git
directory is an implicit boundary, so single repos need no annotation. [discovery] excludeglobs are unioned tree-wide, each rooted at its own
config directory (a nested config prunes only its subtree);[per-file-ignores]
globs resolve relative to their owning config's directory.--config <path>pins a single config and bypasses nested resolution.- Fully back-compatible: a repo with one root
poly.tomland no nested configs
resolves every file to the root config, identical to before.
- New
v0.1.14
v0.1.13
v0.1.12
Fixed
- ruff cache-key now folds the E501/
line_lengthengine change from 0.1.11. Warm.polylintcaches were serving stale 88-column E501 diagnostics because the engineversion()suffix wasn't bumped. Fixed with a+e501suffix bump. (CI is unaffected — fresh runners have no cache.)
v0.1.11
Fixed
- ruff E501 now honors
line_length. The line-too-long rule read ruff'spycodestyle.max_line_length, which poly never set — so it stayed pinned at ruff's hardcoded 88 regardless of the configuredline_length(while the formatter correctly used 120). poly now mirrors the resolvedline_lengthontopycodestyle.max_line_length, soselect = ["ALL"]projects with a 120 limit no longer see false-positive E501 on 89–120 char lines.
v0.1.10
Added
- ruff
known_first_party/known_third_partyin[lint.python.ruff]— poly now honors isort first-party module classification, fixing spuriousI001(import-block un-sorted) errors in monorepos where a first-party package (e.g. imported by a siblingtests/tree) was misclassified as third-party.
Fixed
- actionlint is now scoped to
.github/workflows/**via a catalogpath_globsfield. Previously poly ran actionlint on every YAML file (Taskfile.yml,pnpm-lock.yaml, etc.), emitting bogus "jobs section is missing in workflow" warnings. Real workflow files are still linted. - deny: acknowledge transitive
quick-xmladvisories RUSTSEC-2026-0194/0195 (viaruff_db's JUnit path, not reachable from poly's usage; fix needs a ruff-rev bump, tracked separately).