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 acceptpattern = "..."matched against issue text. (#1866, d769368)
Linter
- WordPress security rules:
nonce-verification,prepared-sql,validated-sanitized-inputunder thewordpressintegration. (#1572, 64ec53e) use functionmigration: undernamespaced = 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 againstIntColumnpins T; nested-container literals still union freely. (#1859, 491374f) redundant-logical-operationon&&-assign: silent on short-circuit assignment idioms like$x === 't' && $y = 1. (#1869, 6f957d6)- String-casing preserved in assertion intersection:
lowercase-stringetc. keep their narrowing. (#1879, 61764f1)
Codex
- Property docblock inheritance: typed properties pick up
@varfrom 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
newmember access:new Foo->bar()etc. surface a proper diagnostic. (#1875, 4e86fc2)
Linter
$thispre-declared in variable-usage analysis: stopsno-redundant-variableflagging$thisreassignment. (#1868, 191902b)prefer-fake-helperinside interpolated strings: report-only, no auto-fix that would produce invalid syntax. (#1870, ce50ef1)
Docblock
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
🏗️ 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:
- @kitrio: #1859
- @eran-digipharma: #1866
- @bendavies: #1843
- @mathroc: #1872
- @Tastaturberuf: #1861
- @galiazzi: #1869
- @adam-ja: #1885
- @norberttech: #1868
- @BafS: #1879
- @LocalHeroPro: #1875, #1870
- @oruborus: #1888
- @edsrzf: #1874
Full Changelog: 1.28.0...1.29.0