neogen/command-scheduler
Schedule and manage Laravel Artisan commands dynamically without touching your console kernel. Define commands, intervals, and arguments in config or the database, then let the scheduler run and track them automatically.
Package identity mismatch — the primary finding. Despite being framed as a Laravel package, neogen/command-scheduler is a Symfony bundle. That is not a packaging nuance; it changes the integration cost by an order of magnitude. A Symfony bundle ships a Bundle class, a DI Extension, and service/config YAML or XML that is compiled by Symfony's FrameworkBundle container. Laravel uses a subset of Symfony components (console, process, finder, http-foundation) but does not run the full FrameworkBundle, so the bundle's registration and container-compilation path has no host to execute in. Adopting it would mean either (a) reimplementing its internals as a Laravel service provider, or (b) bootstrapping Symfony's DI machinery inside a Laravel app — both of which defeat the purpose of pulling a dependency.
Architecture fit: poor, and largely redundant. Laravel already ships a first-class scheduler (Illuminate\Console\Scheduling\Schedule, schedule:run, schedule:work, schedule:list), including overlap prevention, output redirection, background execution, and hooks (before/after/onSuccess/onFailure). The stated value of this bundle — "monitor and execute commands" — is the exact surface Laravel owns natively. The only differentiated capability would be the monitoring half (persisted run records, status history), which is small, well-understood functionality that a maintained package or ~200 lines of first-party code covers.
Integration feasibility: low. A 2018 bundle will carry Composer constraints pinned to Symfony 3.4/4.x and PHP 7.1–7.2. Current Laravel (10/11) requires Symfony 6/7 components and PHP 8.1+. composer require will almost certainly fail dependency resolution; forcing it with --ignore-platform-reqs and constraint overrides leaves you with code that has never executed against the framework versions you run. There is no Laravel service provider, no facade, no config-publishing convention, and no artisan surface.
Technical risk: high.
E_STRICT removal, stricter string/int coercion, create_function removal, dynamic property deprecation). Code written in 2018 is a coin flip on PHP 8.2+ even if it loads.Key questions for the requester:
Illuminate\Console\Scheduling\Schedule plus schedule:list does not already solve?Verdict: do not adopt. The framework mismatch alone is disqualifying for a Laravel context; the abandonment profile disqualifies it for any context.
Stack fit: none for Laravel. There is no service provider, no config/ publish path, no facade, and no scheduler hook integration. Any integration is a rewrite, not an integration. Recommend rejecting on stack-fit grounds before spending engineering time on a spike.
Recommended target architecture (what to sequence instead):
routes/console.php (Laravel 11) or app/Console/Kernel.php. No new dependency.scheduled_task_runs table (task key, started_at, finished_at, exit_code, output excerpt, duration), written from a Schedule before/after/onFailure wrapper or a middleware-style decorator. Roughly a day of work, fully owned, no version risk.onFailure into your existing observability stack (Sentry, Opsgenie, Slack). Alternatively evaluate a maintained package such as spatie/laravel-schedule-monitor — check its release cadence, Laravel version matrix, and issue responsiveness against the same criteria applied here.Migration path (if a prototype already exists): inventory every command currently registered through this bundle and its schedule expression; re-express each as a Schedule::command() entry with explicit withoutOverlapping(), onOneServer(), and timeout; run both schedulers in parallel for one to two weeks with outputs diffed; cut over by disabling the old cron entry. The migration is bounded — the surface is a command list — which is precisely why the dependency is not worth carrying.
Compatibility: treat the package as incompatible until proven otherwise on PHP 8.1+/Laravel 10+. If a spike is mandated, timebox it to half a day, composer require in a throwaway branch, and record the exact constraint conflict output as the decision artifact. Expect that artifact to be a resolution failure, and let it settle the question cheaply.
Sequencing: resolve the "what is the actual requirement" question first (scheduling vs. monitoring). Only the monitoring half has real scope, and it should be built or bought as a monitoring component — never as a Symfony bundle grafted into a Laravel app.
Maintenance: you would be the sole maintainer of an orphaned fork from day one. Zero stars and zero dependents means no upstream community to absorb bug fixes, no issue triage, no PR review. Every future PHP or Laravel major upgrade becomes your team's problem to patch in vendored third-party code. That cost is permanent and recurs on a roughly annual cadence across the framework lifecycle.
Support: none. No maintainer, no commercial backing, no security disclosure channel, no changelog after 2018. In an incident, the escalation path is "a current team member reads unfamiliar code under time pressure." For a component that executes shell commands, that is an unacceptable support posture regardless of criticality tier.
Scaling: the 2018 design almost certainly assumes a single host invoking cron against a local store. Multi-node deployments need distributed locking to avoid duplicate execution; modern Laravel provides onOneServer() backed by your cache driver. Retrofitting that into an abandoned bundle's execution path is not a configuration change — it is a fork. Command output and run-history storage will also grow unbounded without a retention policy you'd have to add yourself.
Failure modes to expect:
Ramp-up: low effort, low ceiling. A competent Laravel engineer reads the command list and reimplements it in the native scheduler in under a day. There is no deep domain knowledge to acquire, no integration expertise to build — which is itself the argument: the package's total value is smaller than the cost of carrying it. The ramp-up cost that does exist is unquantifiable — understanding 2018-era third-party internals with no documentation, no maintainer, and no tests.
Recommendation to stakeholders: reject. Close the evaluation with the framework-mismatch finding and the release-date finding as the two documented reasons. Redirect the underlying need — scheduled command visibility — to the native Laravel scheduler plus a small first-party run-history table, or to a maintained alternative vetted on release cadence and Laravel version support. If a Symfony service genuinely exists in the estate, re-run this assessment against a maintained Symfony scheduler in that context; nothing here transfers.
How can I help you explore Laravel packages today?