You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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