Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Artisan Menu Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  • Escape now cancels. Previously Escape during required input presumably did nothing or passed through. Any command or wrapper script that relied on Escape-as-noop, or that asserts on exit codes, changes behavior. Cancellation semantics (exit code, partial side effects, cleanup) are unspecified in the notes.
  • PHP floor moved 7.0 → 7.1. This is a corrective change — the notes state runtime dependencies already required 7.1 — so PHP 7.0 environments were already broken and are now honestly excluded. Low real-world impact, but it does mean Composer will refuse install on 7.0 where it previously "succeeded" and failed at runtime.

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:

  • Non-interactive contexts. Adding prompts for optional arguments expands the interactive surface. Every prompt must degrade to a default or error when 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.
  • Machine-readable output. If any prompt writes to stdout, commands that emit JSON for downstream consumption are now corrupted. Needs confirmation that prompts route to stderr or are suppressed.
  • Persisted state. "Handle stale recent commands safely" confirms the package writes some form of recent-command history. An undocumented, package-owned state file means: location, TTL, permissions, and behavior on ephemeral container filesystems are all open questions.

Key questions for the maintainer (or for our own source read).

  1. What is the actual BC break that justified the 4.0.0 major bump? The changelog enumerates features and fixes but no break.
  2. Exact exit-code contract when Escape cancels mid-command. Does the command abort before or after partial side effects?
  3. Are prompts automatically bypassed when STDIN is not interactive? Is there an env var / --no-interaction flag honored consistently across all new prompt types?
  4. Where is recent-command state stored, what is its schema, and does it fail open or closed on a read-only or missing filesystem?
  5. What does the full CI matrix look like — endpoints only, or sampled interior combinations (e.g. PHP 7.4/Laravel 6, PHP 8.1/Laravel 9)?
  6. Is str_contains the only PHP-8-only construct that was present? Was the codebase swept, or was this a single-symptom fix?
  7. Does the package declare a support/EOL policy consistent with a 5.1–13 span, and how quickly do security fixes reach the 5.1 end?

Integration Approach

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:

  • Diff the public API surface between the prior major and v4 — specifically prompt class constructors, method signatures, and return types for the new optional-argument and repeatable-option paths. "Add prompts for optional arguments" could mean new opt-in methods (additive, safe) or changed handling of existing argument definitions (breaking, silent).
  • Pin the current working version in composer.lock so a composer update cannot pull v4 unattended. This is the single highest-value action available today.
  • Treat Escape-cancellation as a behavioral change requiring review of any script that invokes our Artisan commands and asserts on exit status or output.

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.

  1. Now — contain. Pin to the current major in composer.json / lockfile; forbid unattended minor-or-major bumps in CI.
  2. Week 1 — static verification. Source-read for TTY detection, stdout-vs-stderr prompt routing, and state-file location. Resolve the BC-break question from the diff, not from the changelog.
  3. Week 1 — CI image audit. Confirm every build image's PHP version is ≥7.1 and that no job runs Artisan commands with an attached TTY that would now block on a new prompt.
  4. Week 2 — pilot. Upgrade one internal, non-critical command with an optional argument. Exercise it in three modes: interactive terminal, piped stdin, and --no-interaction.
  5. Week 3 — team rollout. Only after the pilot confirms non-interactive parity. Batch the remaining commands rather than upgrading package-wide and discovering behavior drift command by command.
  6. Ongoing — matrix watch. If the maintainer publishes a fuller CI matrix, downgrade the interior-combination risk. If not, carry it as a standing assumption.

Operational Impact

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.

  1. Indefinite hang in CI or a deploy pipeline — a prompt awaiting input that will never arrive. Highest cost, because it burns runner minutes and blocks releases. Detectable only by timeout.
  2. Silent partial execution after Escape-cancel — the command reports cancellation but has already written some state. Needs the exit-code contract and a side-effect audit on any command we wrap.
  3. Corrupted machine-readable output — prompts leaking into stdout breaks JSON consumers downstream. Cheap to test, expensive to debug in production.
  4. Stale or divergent recent-command state — the package's own history file, on ephemeral container storage, or shared across parallel jobs. Low severity (cosmetic prompt ordering) but the note implies it previously crashed, which is a different category.
  5. PHP-version-dependent fatal — the 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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin