jord-jd/artisan-menu
jord-jd/artisan-menu is a Laravel package for building interactive Artisan console menus. Define options and actions with a simple API to create selectable CLI prompts for commands, setup scripts, and developer tools, turning complex terminal workflows into navigable menus.
What shipped. v4.0.0 is a major-version release of a console/Artisan interactive-prompting package. The functional delta is threefold: (1) new prompt coverage for optional command arguments, plus command-specific flags, values, and repeatable options; (2) a safety behavior — Escape now cancels a command during required input rather than being swallowed; (3) compatibility corrections — declared Laravel support widened to 5.1–13, PHP floor corrected 7.0 → 7.1, a stray str_contains (PHP 8-only) removed, and stale "recent commands" state handled defensively.
Architecture fit. Low coupling by design: this is a developer-experience layer over console input, not a runtime request-path dependency. It should sit in require-dev unless our shipped Artisan commands are themselves user-facing (e.g. installer wizards, make:* scaffolding exposed to customers). The package does not appear to impose container bindings, service providers with global middleware, or config publishing on the hot path — but that must be confirmed rather than assumed.
Breaking-change assessment. The notes list no removals or deprecations, yet the version is major. Two candidate BC breaks are buried in prose:
Technical risk — the most material signal. The str_contains entry is an admission that a prior release shipped a PHP 8-only function inside a package claiming PHP 7.1 support. That is a test-matrix gap, not a typo. The remediation — "PHP 7.1/Laravel 5.1 and PHP 8.5/Laravel 13 tests" — tests the two endpoints of a 13-version × many-PHP-minor matrix. Endpoint testing does not cover the interior, and endpoint testing is precisely the pattern that lets a mid-range incompatibility ship. Treat "supports 5.1 through 13" as a marketing claim until we see the matrix.
Secondary risks worth naming up front:
stdin is not a TTY. CI runners, cron, docker exec without -it, queue workers, and deploy scripts are all non-TTY. A blocking prompt in a pipeline is a hang, not an error — the worst failure class.Key questions for the maintainer (or for our own source read).
STDIN is not interactive? Is there an env var / --no-interaction flag honored consistently across all new prompt types?str_contains the only PHP-8-only construct that was present? Was the codebase swept, or was this a single-symptom fix?Stack fit. The 5.1–13 span means we almost certainly do not need to coordinate this upgrade with any Laravel framework upgrade — a rare and welcome property. Verify our PHP version against the new 7.1 floor and against the 8.5 upper test target; 8.5 support is forward-looking and worth noting if we plan to adopt it.
Migration path. There is no upgrade guide in the notes, which for a major version is itself a finding. Before scheduling work:
composer.lock so a composer update cannot pull v4 unattended. This is the single highest-value action available today.Compatibility. Because the package is almost certainly a dev dependency, blast radius is confined to developer machines and CI images — not production. That said, CI is where non-TTY hangs bite hardest, and developer machines are exactly where the PHP-version-dependent failures surface, so the two environments that matter most are the two most exposed.
Sequencing.
composer.json / lockfile; forbid unattended minor-or-major bumps in CI.--no-interaction.Maintenance. The dominant long-term consideration is the support envelope, not the feature set. Carrying PHP 7.1 and Laravel 5.1 in 2025-era code means the maintainer's CI and dependency constraints are anchored to a fourteen-year-old runtime. That is excellent for us if we run legacy Laravel — it is a cost if we do not, because it constrains which modern PHP language features and dependency versions the package can adopt, and it slows the maintainer's ability to use tooling we might otherwise benefit from. Neither outcome is bad; the point is that the breadth is a strategic trade the maintainer has made, and our assessment should record why we value it.
Support. Interactive terminal behavior is among the hardest software to support: it is timing-dependent, terminal-emulator-dependent, and rarely reproduced accurately in a bug report. Expect to own: "the prompt hung," "Escape left my database half-migrated," and "it asked me for a flag I already passed." Mitigation is documentation on our side, not theirs — a short internal page stating that all Artisan invocations from automation must pass --no-interaction, and what our wrappers do when a command cancels.
Scaling. Runtime scaling is a non-issue; the cost is confined to console invocations and is human-paced. The scaling concern is organizational: every additional command that adopts prompting adds one more place where a non-TTY invocation can hang. At ten commands this is a convention; at a hundred it needs a lint rule or a wrapper that injects --no-interaction by default.
Failure modes, ranked by expected cost.
str_contains class of bug. Low probability post-fix, high impact if we run an interior PHP version the endpoint tests do not cover.Ramp-up. For application developers: near zero — the new optional-argument and repeatable-option prompts are ergonomic wins that reduce memorized flag syntax, and they will be adopted without training. For the platform or build owners who must guarantee non-interactive behavior across CI and deployment: moderate, and concentrated in the first week, because they own the failure modes above and get no benefit from the feature work. Budget their review time explicitly rather than assuming the upgrade is free because it is "just a prompt library."
Net recommendation. Adopt, but not by drifting into it. Pin now, resolve the undocumented BC break, verify TTY handling before any shared command adopts prompting, and record the interior-matrix risk as a standing assumption to revisit if the maintainer publishes a fuller test grid.
How can I help you explore Laravel packages today?