Skip to content

⚗️ Elric

Choose a tag to compare

@mychidarko mychidarko released this 12 Aug 21:03
· 3 commits to v5.x since this release

v5.0 - 12 Aug 2026

Added

  • Added verb commands: alchemy test, lint, fmt, refactor, analyse, ci and all (alchemy setup still works as an alias)
  • Added alchemy init with framework detection (Leaf, Laravel, Symfony, Slim, plain PHP) which writes the full pipeline and asks port-or-keep for existing tool configs
  • Added first-class Laravel support: Pint as a lint provider (auto-selected with the laravel preset) and Larastan wired in automatically on analyse
  • Added lint.provider so the linter is swappable between php-cs-fixer and Pint, with lossless pint.json porting
  • Added Rector support via the refactor section (prepared sets, PHP upgrade/downgrade sets, import names and more)
  • Added PHPStan support via the analyse section, with baseline handling, verbatim key passthrough and Pest's phpstan plugin wired in automatically
  • Added CI generation for GitLab CI and CircleCI alongside GitHub Actions, plus alchemy switch to move between providers or test engines
  • Added near-1:1 phpunit.xml mapping: named suites, env/ini/const/server values, coverage excludes, extensions and any root attribute via tests.config
  • Added --flags forwarding to the underlying engine, e.g. composer run fmt -- --flags=dirty
  • Added lint.autofix so CI can commit style fixes instead of failing (GitHub only)
  • Added support for Pest 5
  • Rewrote eject to export real config files (including pint.json when Pint is your provider) and rewire your composer scripts, so there's no lock-in

Fixed

  • Commands return real exit codes, so failing tests and style violations actually fail CI
  • lint now checks and fmt fixes, instead of one command doing both silently
  • The events config key is read correctly, so custom CI triggers actually apply
  • tests.parallel with PHPUnit runs through paratest instead of passing a flag PHPUnit doesn't have
  • A hand-written phpunit.xml is never overwritten or deleted
  • Fixed coverage options in generated GitHub workflows
  • Fixed --flags values being swallowed by option parsing

Changed

  • Alchemy now requires PHP 8.2+
  • Generated config lives in .alchemy/ (gitignored for you) and is discarded after each run, so your project root is never written
  • Engines install unpinned (pestphp/pest:*), so the newest version your PHP supports always resolves
  • Composer scripts are written as @php vendor/bin/alchemy ..., so they run on Windows too