From c3c04f416cb36c9cdf345c018149d57f31793eb6 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 13:37:16 -0400 Subject: [PATCH 1/6] Show success message in a callout box Matches the Laravel installer's final output, including an Open step with the site URL when the project is parked on Herd or Valet. Co-Authored-By: Claude Opus 5.5 --- src/Concerns/InteractsWithHerdOrValet.php | 42 +++++++++++++++++++++++ src/NewCommand.php | 24 +++++++++---- 2 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 src/Concerns/InteractsWithHerdOrValet.php diff --git a/src/Concerns/InteractsWithHerdOrValet.php b/src/Concerns/InteractsWithHerdOrValet.php new file mode 100644 index 0000000..1d5698f --- /dev/null +++ b/src/Concerns/InteractsWithHerdOrValet.php @@ -0,0 +1,42 @@ +runOnValetOrHerd('paths')); + + return is_array($paths) + && (in_array(dirname($directory), $paths) || in_array(dirname($directory).DIRECTORY_SEPARATOR, $paths)); + } + + protected function generateAppUrl(string $name): string + { + $hostname = mb_strtolower($name).'.'.($this->runOnValetOrHerd('tld') ?: 'test'); + + return gethostbyname($hostname.'.') !== $hostname.'.' ? 'http://'.$hostname : 'http://localhost'; + } + + protected function runOnValetOrHerd(string $command): string|false + { + foreach (['herd', 'valet'] as $tool) { + $process = new Process([$tool, $command, '-v']); + + try { + $process->run(); + + if ($process->isSuccessful()) { + return trim($process->getOutput()); + } + } catch (ProcessStartFailedException) { + } + } + + return false; + } +} diff --git a/src/NewCommand.php b/src/NewCommand.php index 2b5e9a0..6af5f21 100644 --- a/src/NewCommand.php +++ b/src/NewCommand.php @@ -4,6 +4,9 @@ use GuzzleHttp\Client; use Laravel\Prompts\ConfirmPrompt; +use Laravel\Prompts\Elements\Heading; +use Laravel\Prompts\Elements\Link; +use Laravel\Prompts\Elements\NumberedList; use Laravel\Prompts\Prompt; use Laravel\Prompts\SelectPrompt; use Laravel\Prompts\SuggestPrompt; @@ -22,6 +25,7 @@ use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Process\Process; +use function Laravel\Prompts\callout; use function Laravel\Prompts\confirm; use function Laravel\Prompts\intro; use function Laravel\Prompts\select; @@ -30,7 +34,7 @@ class NewCommand extends Command { - use Concerns\ConfiguresDatabase, Concerns\ConfiguresPrompts, Concerns\RunsCommands; + use Concerns\ConfiguresDatabase, Concerns\ConfiguresPrompts, Concerns\InteractsWithHerdOrValet, Concerns\RunsCommands; const BASE_REPO = 'statamic/statamic'; const OUTPOST_ENDPOINT = 'https://outpost.statamic.com/v3/starter-kits/'; @@ -1047,11 +1051,19 @@ protected function enableStatamicPro() */ protected function showSuccessMessage() { - $this->output->writeln(PHP_EOL.' [βœ”] Statamic was installed successfully!'.PHP_EOL); - $this->output->writeln(' You may now enter your project directory using cd '.$this->relativePath.','.PHP_EOL); - $this->output->writeln(' The documentation is always available at statamic.dev and you can '); - $this->output->writeLn(' join the community on Discord at statamic.com/discord anytime.'.PHP_EOL); - $this->output->writeLn(' Now go β€”Β it\'s time to create something wonderful! 🌟'.PHP_EOL); + $steps = ['cd '.$this->relativePath]; + + $steps[] = $this->isParkedOnHerdOrValet($this->absolutePath) + ? 'Open: '.new Link($this->generateAppUrl($this->name)) + : 'composer run dev'; + + callout('Statamic was installed successfully!', [ + 'You can start your local development using:', + new NumberedList($steps), + "\e[1mNew to Statamic?\e[22m Check out our ".new Link('https://statamic.dev', 'documentation').'.'.PHP_EOL. + "\e[1mNeed help?\e[22m Join the community on ".new Link('https://statamic.com/discord', 'Discord').'.', + new Heading('Now go β€” it\'s time to create something wonderful! 🌟'), + ]); return $this; } From 228bc27a5cd878ec093fd43ae8cc541faca6c91b Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 13:38:02 -0400 Subject: [PATCH 2/6] Fall back to plain success message on older prompts versions Co-Authored-By: Claude Opus 5.5 --- src/NewCommand.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NewCommand.php b/src/NewCommand.php index 6af5f21..5087f9e 100644 --- a/src/NewCommand.php +++ b/src/NewCommand.php @@ -1051,6 +1051,16 @@ protected function enableStatamicPro() */ protected function showSuccessMessage() { + if (! function_exists('Laravel\Prompts\callout')) { + $this->output->writeln(PHP_EOL.' [βœ”] Statamic was installed successfully!'.PHP_EOL); + $this->output->writeln(' You may now enter your project directory using cd '.$this->relativePath.','.PHP_EOL); + $this->output->writeln(' The documentation is always available at statamic.dev and you can '); + $this->output->writeln(' join the community on Discord at statamic.com/discord anytime.'.PHP_EOL); + $this->output->writeln(' Now go β€” it\'s time to create something wonderful! 🌟'.PHP_EOL); + + return $this; + } + $steps = ['cd '.$this->relativePath]; $steps[] = $this->isParkedOnHerdOrValet($this->absolutePath) From b9cbfebad5de6c40d9f62075e664c6780dfd14d3 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 15:32:48 -0400 Subject: [PATCH 3/6] Require laravel/prompts 0.3.21 for callout links Co-Authored-By: Claude Opus 5.5 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6ce6f96..b3edd91 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ "composer-runtime-api": "^2.2", "guzzlehttp/guzzle": "^6.5.5|^7.0.1", "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", - "laravel/prompts": "^0.3.19", + "laravel/prompts": "^0.3.21", "symfony/console": "^6.2|^7.0", "symfony/process": "^6.0|^7.0" }, From aeec3bfe0d2b121fb3151a6d856b7944d73e333a Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 15:32:48 -0400 Subject: [PATCH 4/6] Remove plain success message fallback Co-Authored-By: Claude Opus 5.5 --- src/NewCommand.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/NewCommand.php b/src/NewCommand.php index 5087f9e..6af5f21 100644 --- a/src/NewCommand.php +++ b/src/NewCommand.php @@ -1051,16 +1051,6 @@ protected function enableStatamicPro() */ protected function showSuccessMessage() { - if (! function_exists('Laravel\Prompts\callout')) { - $this->output->writeln(PHP_EOL.' [βœ”] Statamic was installed successfully!'.PHP_EOL); - $this->output->writeln(' You may now enter your project directory using cd '.$this->relativePath.','.PHP_EOL); - $this->output->writeln(' The documentation is always available at statamic.dev and you can '); - $this->output->writeln(' join the community on Discord at statamic.com/discord anytime.'.PHP_EOL); - $this->output->writeln(' Now go β€” it\'s time to create something wonderful! 🌟'.PHP_EOL); - - return $this; - } - $steps = ['cd '.$this->relativePath]; $steps[] = $this->isParkedOnHerdOrValet($this->absolutePath) From 21704d9d6a1da80a53136e339feb33b6c5ae0936 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 15:50:39 -0400 Subject: [PATCH 5/6] Use output formatter for bold callout text Co-Authored-By: Claude Opus 5.5 --- src/NewCommand.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NewCommand.php b/src/NewCommand.php index 6af5f21..de28802 100644 --- a/src/NewCommand.php +++ b/src/NewCommand.php @@ -1060,8 +1060,10 @@ protected function showSuccessMessage() callout('Statamic was installed successfully!', [ 'You can start your local development using:', new NumberedList($steps), - "\e[1mNew to Statamic?\e[22m Check out our ".new Link('https://statamic.dev', 'documentation').'.'.PHP_EOL. - "\e[1mNeed help?\e[22m Join the community on ".new Link('https://statamic.com/discord', 'Discord').'.', + $this->output->getFormatter()->format('New to Statamic?') + .' Check out our '.new Link('https://statamic.dev', 'documentation').'.'.PHP_EOL + .$this->output->getFormatter()->format('Need help?') + .' Join the community on '.new Link('https://statamic.com/discord', 'Discord').'.', new Heading('Now go β€” it\'s time to create something wonderful! 🌟'), ]); From b5493e6ac860145818ef71a42c74cf50547a9aec Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 9 Oct 2026 15:51:18 -0400 Subject: [PATCH 6/6] Require mbstring polyfill with mb_str_pad for PHP 8.2 Co-Authored-By: Claude Opus 5.5 --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index b3edd91..cab6270 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", "laravel/prompts": "^0.3.21", "symfony/console": "^6.2|^7.0", + "symfony/polyfill-mbstring": "^1.31", "symfony/process": "^6.0|^7.0" }, "require-dev": {