Skip to content

Releases: Goldziher/polylint

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 04 Jul 08:13
v0.4.0
404be3e

Added

  • Colored poly hooks install / uninstall output — 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 poly from PATH rather than baking in an
    absolute path to the binary, so a hook always runs whatever poly is current
    (a recorded absolute path could pin a stale or moved build). When poly is not
    on PATH the shim now fails with a clear, actionable message and a non-zero exit
    instead of proceeding as though the hook had passed. Re-run poly 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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 06:55
v0.3.0
1621e61

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::CSharp variant so .cs files route to the
    tree-sitter generic formatter (deterministic, zero system dependency) instead of
    being skipped. Maps the c# / csharp catalog names and the .cs extension.
  • Elixir do…end reindent 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
    produces mix format's 2-space nesting; idempotent, with heredocs/strings
    preserved.

Changed

  • poly fmt honors // swift-format-ignore-file — a Swift file carrying the
    directive is left byte-for-byte untouched (the same whole-file skip marker
    swift-format respects), 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, and sqruff to their latest releases.

Fixed

  • poly hooks now enforces the commit-msg stage. Lowered hooks kept
    Stage::default() (pre-commit), so the runner dispatched the poly commit
    (Conventional Commits) builtin in file-input mode, matched no files, and silently
    skipped it — the git commit-msg hook never enforced anything. Every lowered hook
    is now stamped with the stage it was lowered for; latent for any non-pre-commit
    builtin, only poly-commit surfaced it.
  • Rust files named like dockerfile.rs are no longer misdetected as
    Dockerfiles.
    Language detection now lets a known file extension (.rs → Rust)
    win over the Dockerfile filename match, so engines/dockerfile.rs and similar no
    longer produce spurious Dockerfile parse errors.

V0 Floating Tag

Choose a tag to compare

@Goldziher Goldziher released this 30 Jun 06:24
404be3e

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 09:46
v0.2.0
7575df5

Release v0.2.0

v0.1.15

Choose a tag to compare

@Goldziher Goldziher released this 02 Jul 17:27
v0.1.15
ad013fc

Added

  • Hierarchical (monorepo-aware) config resolution (ADR 0018). Running poly
    from a monorepo root now discovers nested poly.toml files 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's poly.toml declares only its diff and inherits [defaults], the
    [lint.*]/[fmt.*] rule tables, and [per-file-ignores] from above.
    • New [workspace] root = true marker bounds the upward cascade; a .git
      directory is an implicit boundary, so single repos need no annotation.
    • [discovery] exclude globs 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.toml and no nested configs
      resolves every file to the root config, identical to before.

v0.1.14

Choose a tag to compare

@github-actions github-actions released this 02 Jul 15:44
v0.1.14
e408b0e

Release v0.1.14

v0.1.13

Choose a tag to compare

@github-actions github-actions released this 02 Jul 13:42
v0.1.13
225b385

Release v0.1.13

v0.1.12

Choose a tag to compare

@Goldziher Goldziher released this 02 Jul 10:08
v0.1.12
1bf3ff4

Fixed

  • ruff cache-key now folds the E501/line_length engine change from 0.1.11. Warm .polylint caches were serving stale 88-column E501 diagnostics because the engine version() suffix wasn't bumped. Fixed with a +e501 suffix bump. (CI is unaffected — fresh runners have no cache.)

v0.1.11

Choose a tag to compare

@Goldziher Goldziher released this 02 Jul 10:00
v0.1.11
26184ff

Fixed

  • ruff E501 now honors line_length. The line-too-long rule read ruff's pycodestyle.max_line_length, which poly never set — so it stayed pinned at ruff's hardcoded 88 regardless of the configured line_length (while the formatter correctly used 120). poly now mirrors the resolved line_length onto pycodestyle.max_line_length, so select = ["ALL"] projects with a 120 limit no longer see false-positive E501 on 89–120 char lines.

v0.1.10

Choose a tag to compare

@Goldziher Goldziher released this 02 Jul 09:35
v0.1.10
a59fd70

Added

  • ruff known_first_party / known_third_party in [lint.python.ruff] — poly now honors isort first-party module classification, fixing spurious I001 (import-block un-sorted) errors in monorepos where a first-party package (e.g. imported by a sibling tests/ tree) was misclassified as third-party.

Fixed

  • actionlint is now scoped to .github/workflows/** via a catalog path_globs field. 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-xml advisories RUSTSEC-2026-0194/0195 (via ruff_db's JUnit path, not reachable from poly's usage; fix needs a ruff-rev bump, tracked separately).