github carthage-software/mago 1.29.0
Mago 1.29.0

5 hours ago

Mago 1.29.0

A maintenance release with two themes: tightening generic template inference (the #1859 false-positive cluster) and giving closures + anonymous classes stable, human-readable names. New: three WordPress security rules, regex-based ignore patterns, symlinked-vendor support, and a no-fully-qualified-global-function follow-up that migrates use function imports in one pass. Plus the usual analyzer, formatter, and language-server fixes.

✨ Features

Codex

  • Readable closure & anon-class names: {closure:src/foo.php:12:5} replaces opaque hash identifiers in messages and baselines. (#1872, 8c7751d)

Reporting

  • Regex-pattern ignores: [analyzer] ignore entries accept pattern = "..." matched against issue text. (#1866, d769368)

Linter

  • WordPress security rules: nonce-verification, prepared-sql, validated-sanitized-input under the wordpress integration. (#1572, 64ec53e)
  • use function migration: under namespaced = true, bare imported calls rewrite to namespace-prefixed form and the orphan import is dropped. (#1843, e23fdfc)

Docs

  • Copy linter rule names without expanding details: rule heading anchors are click-to-copy. (#1890, 720f3c7)

🐛 Bug Fixes

Analyzer

  • Top-level template pinning: Column<T> matched against IntColumn pins T; nested-container literals still union freely. (#1859, 491374f)
  • redundant-logical-operation on &&-assign: silent on short-circuit assignment idioms like $x === 't' && $y = 1. (#1869, 6f957d6)
  • String-casing preserved in assertion intersection: lowercase-string etc. keep their narrowing. (#1879, 61764f1)

Codex

  • Property docblock inheritance: typed properties pick up @var from parent class declarations. (#1885, 1e36833)

Formatter

  • Promoted-property docblocks stay on their own line: when the parameter list breaks. (#1874, 04a0c37)
  • Constructor parens on chained new: preserved for (new Foo())->bar() shapes. (#1875, 4e86fc2)

Semantics

  • Invalid bare-class new member access: new Foo->bar() etc. surface a proper diagnostic. (#1875, 4e86fc2)

Linter

  • $this pre-declared in variable-usage analysis: stops no-redundant-variable flagging $this reassignment. (#1868, 191902b)
  • prefer-fake-helper inside interpolated strings: report-only, no auto-fix that would produce invalid syntax. (#1870, ce50ef1)

Docblock

  • Non-ASCII bytes in @var names: accepted in identifier positions. (#1888, fafff67)

Database

  • Follow symlinks under paths/includes: composer path-type packages and other symlinked sources are scanned. (#1861, 9d65ff3)

Language Server - Experimental

  • Bootstrap events no longer lost: fixes the race during the initial workspace scan. (#1891, 370c724)
  • Analyzer issues filtered by config: LSP diagnostics now respect [analyzer].ignore. (#1877, b26ef25)

Config

  • mago.dist discovery restored: distributed config file is picked up again. (#1889, 7b8e8fe)

🏗️ Internal

CI / Tooling

  • Clippy fixes: applies the latest Clippy lint cleanups across the workspace. (e578c1d)
  • Nightly toolchain pins: routine bumps to nightly-2026-05-19 / 2026-05-22. (#1867, #1876, cbc2f68, 3b43f33)

🙏 Thank You

Contributors

A huge thank you to everyone who contributed code to this release:

Issue Reporters

Thank you to everyone who reported issues that shaped this release:

Full Changelog: 1.28.0...1.29.0

Don't miss a new mago release

NewReleases is sending notifications on new releases.