omp.sh: O Agente de Codificação Definitivo para o Terminal com Foco em Flutter e Dart
Se você é um desenvolvedor Flutter ou Dart que passa boa parte do dia no terminal, precisa conhecer o omp.sh (Oh My Pi). Mais do que um simples assistente de linha de comando, o omp é um agente de codificação completo que integra IDE, depurador, linguagem server e inteligência artificial em uma única ferramenta de terminal. Com suporte nativo a LSP, DAP, subagentes paralelos, MCP (Model Context Protocol), habilidades especializadas (Skills) e mais de 40 provedores de IA, o omp promete — e entrega — uma experiência de desenvolvimento que rivaliza com qualquer IDE moderna.
Neste artigo, vamos explorar todos os recursos do omp.sh, com ênfase especial no ecossistema Flutter/Dart, incluindo a configuração do MCP Server oficial da Dart e Flutter, skills especializadas, e dicas práticas para turbinar sua produtividade.
O que é o omp.sh?
omp é a abreviação de Oh My Pi, um fork do Pi de Mario Zechner, reescrito por Can Bölük como uma superfície de codificação completa para o terminal. Com aproximadamente 55 mil linhas de Rust em seu núcleo, o omp não apenas "empacota" ferramentas externas — ele as incorpora diretamente no processo: busca (ripgrep), shell (brush), realce de sintaxe, PTY, decodificação de imagem e contagem de tokens BPE são todos nativos, sem fork/exec no caminho crítico.
O resultado? Uma ferramenta que roda em macOS, Linux e Windows (sem WSL), com performance de IDE diretamente no seu terminal.
Instalação
A instalação é simples e funciona em virtualmente qualquer sistema:
macOS / Linux (via script)
curl -fsSL https://omp.sh/install | sh
Homebrew (macOS / Linux)
brew install can1357/tap/omp
Bun (recomendado)
bun install -g @oh-my-pi/pi-coding-agent
Windows (PowerShell)
irm https://omp.sh/install.ps1 | iex
Versões fixas (mise)
mise use -g github:can1357/oh-my-pi
Após instalar, ative as completions de shell para uma experiência ainda mais fluida:
# zsh — adicione ao ~/.zshrc eval "$(omp completions zsh)" # bash eval "$(omp completions bash)" # fish omp completions fish > ~/.config/fish/completions/omp.fish
Primeiros Passos
Com o omp instalado, inicie uma sessão interativa com:
omp
Por padrão, o omp usa o modo interativo (TUI). Você também pode usar o modo one-shot com -p:
omp -p "Liste os arquivos .dart neste projeto"
O omp herda automaticamente configurações existentes de outras ferramentas como .claude, .cursor, .windsurf, .gemini, .codex, .cline e .vscode. Não é preciso migrar nada — o que sua equipe já configurou continua funcionando.
Ferramentas Essenciais do omp.sh
O omp.sh vem com 32 ferramentas nativas. Vamos destacar as mais relevantes para o desenvolvimento Flutter/Dart:
Leitura e Escrita de Arquivos
| Ferramenta | Função |
|---|---|
read | Lê arquivos, diretórios, ZIPs, SQLite, PDFs, cadernos Jupyter, URLs — e URIs internos como pr://, agent:// |
write | Cria ou sobrescreve arquivos, entradas de arquivo ZIP ou linhas SQLite |
edit | Patches com âncoras hashline — edições perfeitas sem loops de falha |
search | Busca regex em arquivos, diretórios, globs e URLs internos |
find | Busca por nome de arquivo via glob, ordenado por modificação |
Um recurso particularmente útil: o read consegue ler PRs do GitHub (pr://1428), issues (issue://42), resultados de subagentes (agent://) e conflitos de merge (conflict://3). Tudo com a mesma interface.
Execução de Código
| Ferramenta | Função |
|---|---|
bash | Shell persistente com sessão, PTY e jobs em background |
eval | Células persistentes de Python e JavaScript com reentrada de ferramentas |
recipe | Executa targets do task runner do projeto (bun, just, make, cargo) |
Dica para Flutter: use recipe para executar flutter test, dart analyze, e flutter build sem sair da sessão.
Code Intelligence (LSP): Inteligência de Código para Dart
Uma das maiores vantagens do omp.sh é a integração profunda com LSP (Language Server Protocol). O comando lsp expõe as mesmas capacidades que seu IDE usa — renomear, navegar, diagnosticar e refatorar — através do language server, não por regex.
Para Dart/Flutter, o omp.sh detecta automaticamente o dart language server (via dart language-server) e o inicia sob demanda. Você não precisa configurar nada.
Ações do LSP essenciais para Flutter
| Ação | Descrição | Uso em Flutter/Dart |
|---|---|---|
definition | Onde o símbolo é definido | "De onde vem este widget?" |
references | Todos os pontos de uso do símbolo | Antes de renomear um método |
hover | Assinatura do tipo + docstring | Ver tipos inferidos, parâmetros genéricos |
rename | Renomeia atomicamente em todo o projeto | Renomear classe/widget/método |
diagnostics | Erros e warnings do arquivo ou workspace | Verificar análise estática |
code_actions | Correções e refatorações sugeridas pelo servidor | "Adicionar import", "Implementar trait" |
symbols | Busca de símbolos no workspace | Encontrar classe sem saber o arquivo |
rename_file | Move/renomeia arquivo e reescreve imports | Reorganizar estrutura de diretórios |
Exemplo prático: renomear um método em um projeto Flutter
# 1. Verificar referências antes da mudança lsp action=references file=lib/services/auth_service.dart line=42 symbol="loginUser" # 2. Aplicar rename atomicamente lsp action=rename file=lib/services/auth_service.dart line=42 symbol="loginUser" new_name="authenticateUser" # 3. Verificar se algo quebrou lsp action=diagnostics file="*"
O passo 2 é atômico: ou todos os arquivos são atualizados, ou nenhum. O rename_file também reescreve imports automaticamente ao mover um arquivo — essencial ao reorganizar a estrutura de diretórios de um projeto Flutter.
Debugging (DAP): Depuração Visual no Terminal
O omp.sh suporta o Debug Adapter Protocol (DAP), permitindo que você controle um processo vivo diretamente do terminal: breakpoints, stepping, inspeção de variáveis, avaliação de expressões.
Para Dart/Flutter, o adaptador DAP é fornecido pelo próprio SDK Dart. O omp.sh o detecta automaticamente quando você inicia uma sessão de depuração com dart debug.
Exemplo: depurar um teste Falho no Flutter
// test/widget_test.dart
void main() {
testWidgets('Contador deve incrementar', (tester) async {
await tester.pumpWidget(const MyApp());
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('1'), findsOneWidget); // falha?
});
}
No omp.sh:
# Iniciar sessão de debug para o teste debug start program="flutter test --no-publish" cwd="." # Configurar breakpoint debug setBreakpoint file=test/widget_test.dart line=10 # Avançar debug continue # Quando o breakpoint for atingido: debug stack debug evaluate expression="counter"
Não é mais preciso ficar adicionando print() por todo lado. O debugger está a um comando de distância.
Subagentes e Paralelismo
O omp.sh possui um sistema de subagentes que permite dividir tarefas complexas em trabalhos paralelos. Cada subagente roda em seu próprio contexto, com seu próprio conjunto de ferramentas e sessão de terminal.
Agentes inclusos
| Agente | Melhor para |
|---|---|
explore | Investigação rápida apenas leitura |
plan | Decisões arquiteturais multi-arquivo |
designer | Implementação de UI/UX, acessibilidade |
reviewer | Revisão de qualidade e segurança |
librarian | Pesquisa de bibliotecas/APIs externas |
oracle | Consultoria de engenheiro sênior |
task | Delegação multi-propósito geral |
quick_task | Tarefas mecânicas (modelo barato) |
Exemplo: Refatorar um app Flutter com subagentes
Imagine que você precisa refatorar um app Flutter. Em vez de fazer tudo manualmente, delegue:
task agent=plan context="Refatorar app Flutter em lib/" tasks=[
{ id: "WidgetAudit",
assignment: "Mapear todos os widgets em lib/widgets/. \
Listar os que precisam de extração." },
{ id: "ServiceRefactor",
assignment: "Extrair lógica de API de lib/main.dart \
para lib/services/api_service.dart. \
Responder quando WidgetAudit perguntar." },
]
Os subagentes podem se comunicar entre si via irc (mensagens curtas entre pares), permitindo coordenação em tempo real. Quando um termina, envia uma mensagem; o outro recebe e age.
MCP (Model Context Protocol) para Flutter e Dart
O Model Context Protocol (MCP) é um protocolo aberto que permite que agentes de IA se conectem a ferramentas especializadas. O omp.sh suporta MCP nativamente, e o time do Flutter/Dart mantém um MCP Server oficial que expõe ferramentas de desenvolvimento para qualquer cliente MCP compatível.
Dart and Flutter MCP Server
O Dart and Flutter MCP Server (experimental, requer Dart 3.9+) oferece um conjunto crescente de ferramentas que dão ao seu agente IA insights profundos sobre seu projeto:
- Analisar e corrigir erros de código no projeto
- Resolver símbolos para elementos — verificar existência, obter documentação e assinatura
- Inspecionar e interagir com o aplicativo em execução (screenshots, taps, texto)
- Pesquisar pacotes no pub.dev
- Gerenciar dependências no pubspec.yaml
- Executar testes e analisar resultados
- Formatar código com o mesmo formatador do
dart format
Configurando o MCP Server no omp.sh
Para configurar o Dart e Flutter MCP Server no omp, adicione ao arquivo mcp.json do omp (~/.omp/agent/mcp.json ou .omp/mcp.json no projeto):
{
"$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/src/config/mcp-schema.json",
"mcpServers": {
"dart-flutter": {
"type": "stdio",
"command": "dart",
"args": ["mcp-server"],
"env": {}
}
}
}
Ou use os comandos de barra do omp:
/mcp add dart-flutter -- dart mcp-server
Uma vez configurado, as ferramentas do servidor aparecem como mcp__dart-flutter_<tool> no repertório de ferramentas do agente.
Outros MCP Servers Úteis para Flutter/Dart
| MCP Server | Descrição |
|---|---|
| mcp_flutter (Arenukvern) | Toolkit para agentes IA: snapshots semânticos, tap em widgets, hot-reload, logs do app Flutter em execução |
| dart_docs_mcp | Busca metadata, READMEs, exemplos e APIs diretamente do pub.dev e GitHub |
| dart-mcp-server (its-dart) | Alternativa open-source ao servidor oficial, com foco em análise estática |
| pub.dev MCP | Consulta o repositório pub.dev para encontrar pacotes, versões e dependências |
Skills do omp.sh e Skills para Flutter/Dart
O omp.sh possui um sistema de Skills (habilidades) que permitem adicionar instruções passo-a-passo reutilizáveis ao agente. Além disso, o ecossistema Flutter/Dart oferece Skills oficiais mantidas pelo time do Google.
Skills do Flutter/Dart (Oficiais)
O time do Dart e Flutter mantém dois repositórios oficiais de Skills que funcionam perfeitamente com o omp.sh:
- dart-lang/skills — Skills para desenvolvimento Dart: gerar testes unitários, resolver dependências, corrigir erros de análise estática
- flutter/agent-plugins — Skills para Flutter: layouts responsivos, roteamento declarativo (GoRouter), serialização JSON
Para instalar as Skills oficiais no seu projeto (usando npx skills, que funciona com omp.sh pois ele herda o formato .agents/skills):
# Skills Flutter npx skills add flutter/agent-plugins --skill '*' --agent universal # Skills Dart npx skills add dart-lang/skills --skill '*' --agent universal
Isso cria o diretório .agents/skills/ no seu projeto, e o omp.sh descobre automaticamente as Skills de lá. Pergunte ao seu agente: "Quais skills estão disponíveis para me ajudar com [tarefa atual]?"
Skills Nativas do omp.sh
No omp, você também pode criar suas próprias Skills locais no formato .omp/skills/ ou ~/.omp/agent/skills/. Cada Skill é um arquivo markdown com metadados YAML que o agente carrega sob demanda (progressive disclosure — igual ao deferred loading do Flutter).
Exemplo de Skill para Flutter:
---
name: flutter-add-screen
description: Adiciona uma nova tela com roteamento GoRouter
---
# Adicionar Tela com GoRouter
## Passos
1. Criar o arquivo `lib/screens/nova_tela_screen.dart`
2. Criar o widget `NovaTelaScreen extends StatelessWidget`
3. Adicionar a rota em `lib/app_router.dart`:
```dart
GoRoute(
path: '/nova-tela',
name: 'novaTela',
builder: (context, state) => const NovaTelaScreen(),
)
```
4. Executar `dart format .` no diretório do projeto
Hashline: Edições Perfeitas sem Loops de Falha
Um dos recursos mais inovadores do omp.sh é o sistema de Hashline para edições. Em vez de pedir para o modelo reescrever linhas inteiras (o que frequentemente causa problemas de whitespace e quebras), o omp usa âncoras de hash de conteúdo.
O modelo aponta para âncoras em vez de redigitar as linhas que quer mudar. Se o arquivo foi modificado entre a leitura e a escrita, os âncoras divergem — e o patch é rejeitado antes de corromper qualquer coisa. Resultado: Grok 4 Fast gasta 61% menos tokens de saída no mesmo trabalho.
Hindsight: Memória que o Agente Mantém Entre Sessões
O omp.sh possui um sistema de memória persistente chamado Hindsight. O agente escreve fatos durante a execução com retain, recupera com recall, e comprime cada sessão em um modelo mental que carrega no primeiro turno da sessão seguinte.
Por padrão, a memória é escopada por projeto — o que o agente aprende sobre um repositório Flutter fica naquele repositório. Isso significa que, ao voltar para um projeto após semanas, o agente já conhece sua estrutura, seus padrões e suas peculiaridades. Não é preciso reexplicar nada.
40+ Provedores e Centenas de Modelos
O omp.sh suporta mais de 40 provedores de IA, incluindo Anthropic, OpenAI, Google Gemini, xAI Grok, Mistral, Groq, Cerebras, Fireworks, Together, OpenRouter, e muitos mais. Você pode rotear papéis diferentes para modelos diferentes:
| Papel | Uso |
|---|---|
default | Turns normais de codificação |
smol | Subagentes baratos (quick_task) |
slow | Raciocínio profundo (ultrathink) |
plan | Modo planejamento |
commit | Geração de mensagens de commit |
Troque o modelo ativo no meio da sessão com Ctrl+P ou o comando /model.
Para provedores locais (Ollama, LM Studio, llama.cpp, vLLM), o omp.sh também funciona perfeitamente — ideal para quem quer rodar modelos localmente sem depender de APIs externas.
Extensibilidade: Plugins e Custom Tools
O omp.sh foi projetado para ser extensível. Você pode:
- Criar plugins em TypeScript: mesmas APIs, mesmo registro de comandos, mesmas primitivas TUI que os recursos nativos usam
- Escrever custom tools: ferramentas bespoke sem depender de um MCP server (útil para lógica específica do seu projeto)
- Publicar em marketplaces: compartilhe seus plugins com a comunidade
- Usar hooks: scripts que disparam em eventos do ciclo de vida da sessão
- TTSR rules: regras de streaming com viagem no tempo — ficam dormentes até o modelo sair do script, então injetam um lembrete e pedem para tentar de novo
Modos de Execução
O omp.sh oferece quatro pontos de entrada para o mesmo motor:
| Modo | Comando | Para que usar |
|---|---|---|
| Interativo (TUI) | omp | Trabalho diário, quando o agente pode perguntar |
| One-shot | omp -p "prompt" | Comandos rápidos, scripts, automação |
| RPC | omp --mode rpc | Embarcar em outro programa via stdio |
| ACP | omp acp | Rodar dentro de editores (Zed, etc) |
Fluxo de Trabalho Completo com Flutter
Aqui está um exemplo de fluxo de trabalho real usando o omp.sh com um projeto Flutter:
# 1. Iniciar sessão no diretório do projeto Flutter cd ~/projetos/meu_app_flutter omp # 2. Analisar o projeto > Analise a estrutura do projeto, liste os arquivos Dart principais # 3. Executar análise estática > Rode dart analyze e me mostre os warnings # 4. Corrigir automaticamente > Corrija os warnings de análise estática usando as ferramentas LSP # 5. Renomear um widget (LSP) > Renomeie o widget "HomePage" para "DashboardPage" em todo o projeto # 6. Adicionar um pacote (via MCP) > Encontre o melhor pacote para gráficos no pub.dev e adicione ao projeto # 7. Debuggar um teste que falha > Inicie uma sessão de debug no teste de widget, pare no método increment() > e verifique o valor do contador # 8. Commit com mensagem gerada > omp commit -m "refactor: renomeia HomePage para DashboardPage e adiciona gráficos"
Dicas de Eficiência para Programação com omp.sh
- Use os modos especiais: as palavras-chave
ultrathink,orchestrateeworkflowzno prompt ativam comportamentos especializados — raciocínio profundo, paralelismo massivo e workflows determinísticos respectivamente. - Aproveite o /review: antes de fazer merge, peça uma revisão de código com
/review. O omp spawna subagentes revisores que varrem branches, commits ou trabalho não commitado em paralelo, classificando issues de P0 a P3. - Habilite o advisor model: configure um segundo modelo no papel 'advisor' para revisar cada turno do agente principal. Ele roda em contexto e modelo próprios, detectando o que o agente principal pode ter deixado passar.
- Use o /model para trocar de provedor: se um modelo está lento ou dando respostas ruins, troque na hora com
/model. Não precisa reiniciar a sessão. - Colabore com /collab: gere um link e compartilhe sua sessão ao vivo com um colega. Ele pode entrar de outro terminal ou do navegador para depurarem juntos.
- Domine as URIs internas:
pr://para PRs,agent://para resultados de subagentes,conflict://para conflitos de merge. Tudo lê com o mesmoread. - Use plan mode para mudanças grandes: antes de refatorar, ative o plan mode. O agente elabora um plano, você aprova, e ele executa em fases.
- Skills Flutter primeiro: instale as skills oficiais do Flutter/Dart antes de começar um projeto novo. Elas já contêm as melhores práticas para routing, serialização e testes.
- Não tenha medo de subagentes: tarefas como "auditar widgets", "extrair serviços" e "escrever testes" podem rodar em paralelo. O
taskcomisolated: truecria workspaces isolados que evitam conflitos. - Mantenha um
AGENTS.mdno projeto: o omp.sh lê arquivos de contexto comoAGENTS.md,CLAUDE.md,.cursorrules— use para documentar decisões arquiteturais que o agente deve seguir.
Conclusão
O omp.sh não é apenas mais um assistente de terminal — é uma plataforma completa de desenvolvimento com IA que rivaliza com qualquer IDE moderna. Com suporte nativo a LSP para Dart, DAP para depuração, MCP Server oficial do Flutter, Skills especializadas, paralelismo com subagentes, e mais de 40 provedores de modelo, ele oferece um ambiente de desenvolvimento coeso e extremamente produtivo.
Para desenvolvedores Flutter/Dart, a combinação é particularmente poderosa: o LSP nativo entende a estrutura do seu projeto Dart, o MCP Server oficial permite que o agente execute tarefas complexas como gerenciar dependências, buscar pacotes, analisar erros e até interagir com o app em execução, enquanto as Skills oficiais garantem que o agente siga as melhores práticas da comunidade.
E o melhor: tudo isso roda no seu terminal, sem depender de IDE pesada, sem configurações complexas, e com a liberdade de escolher qualquer modelo de IA — local ou na nuvem.
Links úteis: