phn migrate rewrites a PHP file as Phaenon: the open tag goes, PHPStan's docblock generics become syntax, public function becomes fun, nested call chains become pipelines where the rewrite is exact. Every tag it leaves in place is reported with the reason. A project typed for PHPStan migrates with its types intact; the rest is typed as it goes.
phn runs where code is written and released: on the developer's machine, in CI, in the release step. Never on the consumer's. A library publishes the compiled PHP beside its .phn, the way a TypeScript package ships its JavaScript, so composer require brings plain PHP that needs no compiler, no plugin and no build step.
phaenon.json names each source root and its sibling output directory: src/ compiles into .src/, tests/ into .tests/. Composer's PSR-4, PHPUnit, PHPStan, php-cs-fixer and Xdebug point at the outputs; the repository and the IDE hold the sources. The output sits at the same depth, so __DIR__ resolves where the source's does. A target per project, PHP 8.5 or 8.6: what is newer than the target is lowered where that is exact and refused otherwise.