Composer Integration

FastForward DevTools is exposed through both a Composer plugin and a dedicated console application.

Startup Chain

  1. bin/dev-tools loads bin/dev-tools.php .
  2. bin/dev-tools.php prefers the consumer project's vendor/autoload.php and falls back to the package autoloader.
  3. bin/dev-tools.php starts FastForward\DevTools\Console\DevTools and appends --no-plugins .
  4. FastForward\DevTools\Container\ContainerFactory::get(FastForward\DevTools\Console\DevTools::class) resolves the shared application container from FastForward\DevTools\ServiceProvider\DevToolsServiceProvider .
  5. FastForward\DevTools\Console\CommandLoader\DevToolsCommandLoader lazily discovers #[AsCommand] classes from the command namespace.
  6. FastForward\DevTools\Composer\Capability\DevToolsCommandProvider later exposes that same command set to Composer.

Composer Plugin Classes

Class Purpose
FastForward\DevTools\Composer\Plugin Registers the command provider and runs dev-tools:sync after Composer install and update.
FastForward\DevTools\Composer\Capability\DevToolsCommandProvider Exposes Symfony command instances to Composer through proxy commands while filtering names and aliases already registered by Composer or the root project's scripts.
FastForward\DevTools\Composer\Command\ProxyCommand Adapts one Symfony command to Composer's command provider contract.
FastForward\DevTools\Console\DevTools Console application used by the local binary.

Why --no-plugins Is Appended

The local binary already knows which commands it needs. Appending --no-plugins keeps the standalone application predictable and avoids pulling unrelated Composer plugins into the command runtime.