orkestra-cms/setup-bundle
orkestra-cms/setup-bundle is a Laravel package that provides setup and installation tooling for Orkestra CMS, helping you scaffold configuration, bootstrap required components, and get a CMS-powered application running quickly.
composer.json in the repo and look for illuminate/support, illuminate/console, and illuminate/database ranges — they will almost certainly be ~5.4 or ~5.5. On anything from Laravel 6 onward, composer require orkestra-cms/setup-bundle will fail with a dependency resolution error, and --ignore-platform-reqs will not help because the code itself calls APIs that were removed.composer.json (constraints and auto-discovery block) → the service provider in src/ (which commands it registers) → the Console/ commands themselves (that’s where the actual setup logic lives) → config/ → README. For a “setup bundle”, the service provider is thin and the commands are the product.src/ code actually targets before wiring anything. If the classes extend Symfony\Component\Console\Command rather than Illuminate\Console\Command, nothing here will run under Laravel as-is.src/Console/* side by side with the output.app/Console/Commands/AppInstallCommand.php, not the package. You get the orchestration order and safety rails without the 2017 constraint lock-in.$this->call('vendor:publish', ['--tag' => 'orkestra-config', '--force' => $this->option('force')]), then vendor:publish for assets, then migrate, then db:seed --class=OrkestraSeeder. Recreate that as php artisan app:install in your own code.$this->confirm(...) unless --force is passed. Guard the seeding with firstOrCreate keys so re-running on a half-installed environment doesn’t duplicate rows. This is the single biggest robustness gap in 2017-era installers.php artisan app:check-env that asserts: required PHP extensions, APP_KEY present, storage/ and bootstrap/cache/ writable, DB connection reachable (DB::connection()->getPdo() inside a try/catch), and any Orkestra-specific config keys non-null. Wire it as the first step of app:install, exit non-zero on failure, and reuse it in your deploy pipeline.OrkestraSetup interface (bound to an adapter) via the constructor. When the upstream API changes or you fork the package later, you touch one binding in a service provider instead of every call site.app(OrkestraSetup::class), constructor injection, or $this->app->make(...) — never new. This is what lets you swap to a fake in tests and lets config changes take effect without rebuilding the class."extra": {"laravel": {"providers": [...], "aliases": [...]}} to the vendor manifest or copy it into your config/app.php if the package predates auto-discovery. Do not mix both — double-registration produces duplicate command listings.config/orkestra.php and reference via config('orkestra.*'). Keep per-environment setup (DB name, asset CDN, seeding mode) out of the installer code and out of the published config’s hardcoded defaults.setUp(), $this->app->instance(OrkestraSetup::class, Mockery::mock(...)) and assert on the sequence of methods your installer calls (publish → migrate → seed). Asserting on the package’s internal state couples your tests to abandoned code.illuminate/* ranges in composer.json. Anything from Laravel 6 up is incompatible by constraint and by API. Don’t burn time fighting Composer; if you need the behavior, vendor the installer pattern into your own command.Command base class is used. If src/Console/* extends Symfony\Component\Console\Command, the entire thing is a Symfony bundle, and every Laravel-flavored assumption in the description (artisan, vendor:publish, facades) will be wrong.php artisan vendor:publish --tag=<wrong-tag> prints nothing and does nothing. Grep src/ for publishes( to get the exact tags the package registers before you script anything.config/ whenever you touch the version constraint, and diff your own copied installer against src/Console/ when you fork it.config:cache staleness. After editing published config, run php artisan config:clear locally and php artisan config:cache in deploy. A stale cache is the number-one “the package ignores my settings” cause, and it applies doubly here because 2017 installers typically read config at boot.down(). Before running migrate, grep the package’s migrations for table names that might collide with your app (users, settings, media). Then verify each migration’s down() actually drops what up() created — 2017-era migrations frequently shipped an empty down(), which makes local rollbacks painful."^1.0" from composer.json and read the CHANGELOG before any composer update. Deploy with composer install --no-dev --optimize-autoloader; only update deliberately on a branch.php artisan about to confirm the provider is loaded (Laravel 9+; on 5.5 use php artisan route:list or a tinker $app->getLoadedProviders()), php artisan tinker to poke the resolved command, and Log::channel('single') for the installer’s own output. If a facade throws “class not found”, run composer dump-autoload.config/app.php, delete config/orkestra.php, delete any published migrations and assets, and run php artisan config:clear. Orphaned published config from a dead installer is a classic source of “why is this value wrong” six months later.How can I help you explore Laravel packages today?