liberusoftware/composer-installer
A Composer installer plugin for Liberu Software packages that provides custom install paths and package-type routing, helping Liberu modules, themes, and extensions land in the expected Laravel directories and integrate smoothly via Composer.
modules/ and themes/ instead of vendor/ is an architectural commitment: it lets the product ship first-party capability as separately versioned packages without abandoning a single deployable application. This release makes that commitment safe to rely on.rm -rf of the old target before reinstall. That is a documented, intentional upgrade step — a product decision to trade convenience for protection against silently orphaning a directory. Support docs, upgrade guides, and internal onboarding need to reflect it.extra.plugin-modifies-install-path flag removes a class of "unexplained churn in tracked package directories" that would otherwise consume engineering time in every pipeline that vendors or commits modules/ and themes/. That is a recurring cost removed, not a one-off fix.Consider it when:
modules/ or themes/, and you want Composer to manage them like any other dependency.vendor/-relative path assumptions break — the plugin-modifies-install-path flag exists precisely because Composer's defaults mislead here.composer.json names a different package fails the install) genuinely load-bearing.Look elsewhere when:
vendor/ and you have no need for modules//themes/ placement — the plugin adds a behavioural layer you will not use.Plugin no longer implements Composer\Plugin\Capable; any consumer that relied on that interface, even with an empty getCapabilities(), must be updated.LiberuInstaller being constructible only with no arguments in a way that assumes a fixed root. The constructor now takes an optional root directory defaulting to the working directory; behaviour is unchanged, but any subclass or reflection-based wiring should be checked.For executives: This release converts a known-fragile internal dependency into a verified one. Four previously logged defects are fixed, the package gains its first automated test suite — 32 tests — and continuous integration. The practical effect is fewer mysterious changes in tracked module and theme directories, and installs that refuse to overwrite a different package's directory rather than doing so silently. There is one deliberate behaviour change: renaming a package now requires deleting its old directory first, which is a short, documented step. Net position: same scope, materially lower operational risk.
For engineering: The installer now declares extra.plugin-modifies-install-path so Composer activates it before it computes install paths, which ends the vendor/-assumption churn. Collision detection inspects the working tree rather than only the current process, and correctly treats an absent, unreadable, or nameless composer.json as no evidence of ownership. LiberuInstaller takes an optional root directory, defaulting to the working directory — behaviour is identical, but path logic is now injectable and tested. Plugin drops the unused Composer\Plugin\Capable implementation and its empty getCapabilities(). Coverage spans path computation, supported package types, name validation, traversal and absolute-path rejection, and both collision paths, enforced by Pint and Pest in CI.
For support and platform teams: The one user-visible change is the rename path — remove the old target, then install. That failure is intentional and is the mechanism that catches an unremoved directory. Update upgrade guides and onboarding checklists accordingly; no other migration work is required.
How can I help you explore Laravel packages today?