Laravel Prompts v0.3.15 trouxe stream(), task(), autocomplete(), notify() e title(). E a CLI em PHP mudou de patamar.
O stream() renderiza texto incremental no terminal com efeito de fade-in. Foi feito pra exibir respostas de IA em tempo real, token por token, direto num comando Artisan. Combina com o AI SDK do Laravel 13. Você monta um agente, chama a LLM e o resultado aparece fluindo no terminal como se fosse um chat.
O task() mostra um spinner com log ao vivo enquanto um processo longo roda. Deploy, instalação de dependências, seed de banco. Dá pra atualizar o label dinamicamente conforme o progresso avança. Quando termina, fica um status persistente de sucesso, warning ou erro.
O autocomplete() entrega sugestões em tempo real enquanto o usuário digita. Caminhos de arquivo, chaves de config, nomes de pacote. O select ganhou um painel de info dinâmico que mostra detalhes da opção highlighted. O notify() dispara notificação nativa do sistema operacional quando um processo em background termina.
Isso tudo é PHP. Rodando no terminal.
Eu lembro de uma época em que CLI em PHP significava readline() com um echo colorido, se você tivesse sorte. O que o Laravel Prompts faz hoje se parece mais com uma TUI de Rust ou Go do que com qualquer coisa que a gente associava a PHP.
O ponto Para quem lidera equipes: ferramentas internas de CLI são subestimadas. Scripts de deploy, wizards de setup, ferramentas de diagnóstico. Quando a interface é boa, a adoção sobe. Quando é um script bash com 400 linhas e zero feedback visual, ninguém usa.
O Prompts baixou a barreira pra fazer CLI boa em PHP. Com o stream() e o AI SDK, dá pra construir ferramentas internas que conversam com LLMs, mostram progresso real e notificam quando terminam. Tudo com Artisan.
Adoção de comando interno depende de feedback visível
Ferramenta interna compete com o tempo de quem está no meio de um incidente ou de um onboarding. Se o comando fica mudo por dois minutos, a pessoa mata o processo, abre outro caminho ou chama alguém. O pacote agora oferece o mínimo que um produto de terminal precisa: entrada com sugestão, progresso com log, resultado que permanece na tela, título da janela enquanto o job roda.
Joe Tannenbaum descreveu a origem: vários primitivos saíram da Cloud CLI e foram para o Prompts. Isso importa porque a API deixou de ser um conjunto de inputs bonitos e passou a cobrir o ciclo de uma operação longa. task() recebe um logger para linhas, mensagens estáveis de sucesso, aviso ou erro, e um label que muda no meio do caminho. title() atualiza a aba. callout() empacota um resumo com lista e metadado. Quem opera de verdade lê isso; não lê um wall of text no final.
Meça adoção com números do próprio time, não com impressão. Quantas vezes o comando foi executado na semana. Quantas execuções terminam em erro. Quantas pessoas ainda colam o runbook no Slack. Se o gráfico não mexer depois de uma interface nova, o problema não era o spinner. Era permissão, ambiente ou um passo que o comando não cobre.
Não construa TUI para uma operação que deveria ser um job no CI. Wizard interativo serve a quem escolhe opção. Pipeline serve a quem precisa de repetição e auditoria. Os dois podem chamar a mesma função PHP. A casca muda.
Stream no TTY e log no CI pedem caminhos distintos
stream() existe para texto que chega aos poucos: token de modelo, log de API, saída de um processo filho. No TTY humano, wrap, ANSI e fade-in ajudam a leitura. No GitHub Actions, o mesmo fluxo precisa de linha estável, sem controle de cursor, e de um artefato que outro sistema consiga parsear.
A documentação do Prompts descreve fallbacks para ambientes sem suporte e a extensão PCNTL para animar spinner. Sem PCNTL, a tarefa aparece estática. Isso é aceitável no notebook. Em runner efêmero, assuma o fallback e teste os dois. Prompt interativo em CI é falha de desenho: a Cloud CLI já desliga prompt quando não há TTY. O comando interno deveria fazer o mesmo, com --no-interaction ou detecção explícita.
Streaming de agente também é superfície de dado. Token a token na tela pode incluir trecho de .env, PII de um dump ou uma chave que o modelo repetiu. Defina o que pode ir para o terminal e o que só entra em log redigido. stream() não faz essa distinção. O produto que você monta em volta precisa fazer.
autocomplete() com closure que consulta disco ou banco a cada tecla é ótimo no notebook e caro se a fonte for uma API lenta. Cacheie a lista. Limite o conjunto. O painel info do select deve mostrar o que a pessoa precisa para não escolher o ambiente errado: nome, região, se é produção. Preço de pacote é ilustração da docs; no comando interno, o metadado crítico é impacto.
Spinner bonito não prova que o processo é seguro
Deploy, migrate e seed continuam sendo operações com efeito. Uma barra viva reduz ansiedade. Não reduz a chance de rodar migrate em produção sem backup, nem a chance de um agente Artisan aplicar um diff sem revisão. O Prompts melhora a casca. A política de quem pode disparar o comando, em qual ambiente, com qual confirmação, continua no código e no acesso.
Use confirm() com default negativo em qualquer ação destrutiva. Use o painel info para repetir o alvo ("produção, eu-west, cluster X"). Grave um identificador da execução no log estruturado, o mesmo que o callout pode mostrar no rodapé. Se o time só tem o spinner, o pós-mortem vira captura de tela.
Testes do próprio pacote existem para prompts. Trate o comando como produto: cubra o caminho feliz, o cancelamento e o fallback sem TTY. Um comando de diagnóstico que só foi clicado no Mac de uma pessoa vai falhar no primeiro Windows sem WSL ou no primeiro job agendado.
Notificação do sistema não fecha o incidente
notify() no macOS pode levar subtítulo e som; no Linux, ícone. Serve para quem disparou um seed e foi olhar outra aba. Não substitui alerta no canal de operação, ticket, nem o estado persistente no terminal. A pessoa que não estava no notebook não ouve a notificação local.
Separe os públicos. Quem espera na mesa ganha notify e title. Quem precisa saber depois ganha linha no log, código de saída diferente de zero e, se o comando for de deploy, o mesmo sinal que o pipeline já usa. Misturar os dois gera a ilusão de que "o time foi avisado".
O Prompts baixou o custo de uma CLI que alguém queira usar. A decisão de liderança é quais operações merecem essa casca, quais devem permanecer mudas no CI, e qual evidência fica quando o spinner some. Sem essa triagem, o time ganha um chat de LLM no Artisan e continua com o bash de 400 linhas para o que realmente mexe em produção.


