Changelog
phil/dev-toolsAll notable changes to phil/dev-tools will be documented in this file.
Updates follow the Keep a CHANGELOG principles, and versions follow Semantic Versioning.
0.1.1-alpha - 2026-11-11
Changed
- The version matrix raises the Symfony floor at the next minor version's first patch release (x.y.1); a Symfony major version and PHP still become the floor at their x.y.3.
0.1.0-alpha - 2026-11-11
Added
phil-dev.php,Manifest,PackageandWorkspace: each package's paths and exceptions in a file of its own; the root, the members found by the root's globs, and the installed packages that ship a manifest;PHIL_DEV_PACKAGESto analyse some members only.PackageStatusand thestatusofphil-dev.php:activeby default, orplannedfor a package being written;--skip-plannedon every command andPHIL_DEV_SKIP_PLANNED=1leave the planned members out of every gate, the command telling how many it skipped;PhpUnitConfigwrites the root's PHPUnit configuration without them, fortestandinfection.- The shared configurations of PHP-CS-Fixer, Rector, Arkitect, PHPStan and PHPBench, read through
Tooling, with the forbidden calls of PHPStan, their identifiers and their witnesses. - PHPStan in bleeding edge, with
phpstan-deprecation-rules, the type coverage at 100 %, the cognitive complexity at 25 per method and 100 per class, and a selection of the rules ofsymplify/phpstan-rules, inconfig/phpstan-symplify.php. - The rules of
kocal/phpstan-symfony-uxon Live Components and Twig Components, inconfig/phpstan-symfony-ux.php, without effect on a project that has no Symfony UX, exceptClassNameMustNotEndWithComponentRule. PhpStan\Rules\ClassNameMustEndWithComponentRule, identifierphil.componentClassName: a class carrying#[AsTwigComponent]or#[AsLiveComponent]has a name ending withComponent, the attribute compared by its name so that a project without Symfony UX runs it; loaded byconfig/phpstan-symfony-ux.php, with its witness.DeptracConfig: the Deptrac layers of every package, generated from itscomposer.jsonandphil-dev.php, with a shared default of Symfony components, contracts, polyfills and PSR interfaces, the dependencies each package is allowed, libraries that never see a bundle, andForbiddenclosed by a negative lookahead.InfectionConfig: the Infection configuration generated from every package, at 100 % of mutants killed, with the named exceptions of each manifest.phil-dev init: the thin configuration files,captainhook.json,vendor-bin/for each tool, the Composer scripts and their descriptions, ParaTest and the slow-test detector, without replacing what differs unless forced, and neverphil-dev.php; aphpunit.dist.xmlthat requires the coverage metadata of every test.phil-dev test: the tests through ParaTest, or PHPUnit without it or withphpunit.parallel: false;test,infectionandservices test|recordwithTMPDIRunder the root'svar/tmp/, a cache per checkout for the test kernels.- The gates
audit(composer audit),unused(composer-unused),normalize(composer-normalize, with--fix),twig(Twig-CS-Fixer) andjs(Biome, downloaded throughkocal/biome-js-bundle), each turned off bygatesin the root's manifest, andtwigstan, with its generated configuration and the shared Twig loader. PsalmConfigandphil-dev taint: the taint analysis of Psalm on the production code, with the excludes and reviewed suppressions of each manifest.phil-dev fuzz: the fuzz targets of each manifest run bynikic/php-fuzzerfor a time budget, with their corpus;ProcessRunnerruns a command with a timeout.phil-dev sbom: the CycloneDX bill of materials of each package, a member resolved in a copy.phil-dev bc: the public API against the latest tag, with roave/backward-compatibility-check.phil-dev bench, with--baselineand--compareat the threshold ofbench.threshold, andbench:worker,WorkerBenchand the FrankenPHP service ofresources/compose.yamlfor a worker-mode benchmark.phil-dev split: the finished members split to their repositories or merged into another monorepo, with splitsh-lite or git subtree, a dry run without--push.CaptainHookConfig: the fast gates on the staged files before each commit, installed bycomposer hooks.DocsLintConfigandphil-dev lint-docs: cspell, in English or French, the French mirrors in French, markdownlint and Vale with the shared words and style ofresources/docs/;Executables, the programs of thePATH.ChurnConfigandphil-dev hotspots: the hotspots of the code, with churn-php.phil-dev new: the skeleton of a library or a bundle, with the wording of its vendor, the versions of the matrix, a normalizedcomposer.jsonandroave/security-advisories, and the French mirror of its README anddoc/, stamped with its English source;--plannedfor a package being written, with what it will do in its README, its status and a smoke test;--requires,--titleand--description-fr.phil-dev check-docs: the file set, the links, the tables, the bold — code spans of any run of backticks and escaped pipes left out —, the README index and sections, one "Added" section until the packages are public, the licence holder's wording and the forbidden terms;README.fr.md, when there is one, indexesdoc/fr/.phil-dev check-translationsandTranslationChecker:README.mdanddoc/againstREADME.fr.mdanddoc/fr/, a document or a mirror alone, the headings of each level and the code blocks failing, a translation behind its English reported, by the SHA-256 ofSourceStampon its first line;docs.translationsfor a blocking or advisory package;phil-dev stamp-translations; thecomposer docs:translationsscript and its pre-commit hook.doc/fr-glossary.md: the words and the tone of the French documentation.phil-dev check-packages: each package installed and tested on its own, on another Symfony version with--symfony; the siblings at the branch their branch alias names, from a worktree as from the main checkout;TMPDIRinside each copy.phil-dev infection, on the whole code or on the files changed since a base ref;phil-dev deptrac,phil-dev witnessesandphil-dev generate.phil-dev servicesandresources/compose.yaml: MySQL 8, PostgreSQL 17 and Gotenberg 9 for the integration tests, their variables, andServiceUrl.HttpRecordingandphil-dev services record: the HTTP exchanges of integration tests recorded and replayed offline through the recorder of Symfony 8.2, with their secrets masked.config/matrix.json,Matrix,phil-dev matrixandphil-dev php: the floor and the next versions of PHP and Symfony, the PHP range of PHPStan, and the commands run in the Docker image of a PHP version, with GD for WebP and AVIF, thesqlite3command, and the neighbouring directories of the path repositories mounted read-only.MemberAutoloader: the classes of a monorepo's members loaded from their owncomposer.json, their prefixes added to Composer'sClassLoader.- The documentation in
doc/, one file per topic, indexed by the README. CONTRIBUTING.md,SECURITY.mdandCODE_OF_CONDUCT.md.