Skip to content

About

A Swiss Army knife for setting up development environments on new machines—exclusively for macOS and Linux.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

kanivet-cli

Prepara Linux e macOS para o terminal: um comando, todas as suas ferramentas CLI.

Release Licença MIT macOS e Linux

Tela de boas-vindas da TUI do kanivet-cli

Instala e gerencia um ambiente de desenvolvimento focado em terminal: shell, ferramentas CLI modernas, git, o editor Helix configurado como IDE (com os servidores de linguagem de cada perfil), Neovim (LazyVim e outras distribuições, opcionais), linguagens, ambiente PHP local (lerd ou Flock), Python/dados, containers e o terminal kitty + herdr. Tudo vem de um catálogo declarativo (catalog/) e de perfis embutidos, com uma TUI para escolher o que instalar e uma CLI completa para scripts.

Funciona no macOS e no Linux (Debian/Ubuntu, Fedora, Arch e openSUSE; x86_64 e arm64). É um binário único em Go, sem dependências em tempo de execução.

Instalação

macOS e Linux: o script baixa a release mais recente, confere o SHA-256 e instala em ~/.local/bin, sem sudo:

curl -fsSL https://raw.githubusercontent.com/eusener/kanivet-cli/master/install.sh | sh

Para fixar uma versão ou trocar o destino:

curl -fsSL https://raw.githubusercontent.com/eusener/kanivet-cli/master/install.sh | KANIVET_VERSION=0.1.0 KANIVET_INSTALL_DIR=/opt/bin sh

Ubuntu/Debian, com o pacote .deb da página de releases (troque amd64 por arm64 se for o caso):

curl -fsSLO https://github.com/eusener/kanivet-cli/releases/download/v0.1.0/kanivet-cli_0.1.0_amd64.deb
sudo apt install ./kanivet-cli_0.1.0_amd64.deb

Fedora, com o pacote .rpm (troque x86_64 por aarch64 se for o caso):

sudo dnf install https://github.com/eusener/kanivet-cli/releases/download/v0.1.0/kanivet-cli-0.1.0-1.x86_64.rpm

Os pacotes não são assinados. Se o dnf recusar por falta de assinatura, use --nogpgcheck. Os pacotes instalam em /usr/bin e, quando removidos, não apagam o estado em ~/.local/state/kanivet-cli. Cada release traz um checksums.txt para conferir com sha256sum -c --ignore-missing checksums.txt.

macOS pelo navegador: o binário não é assinado pela Apple, então um .tar.gz baixado pelo navegador é bloqueado pelo Gatekeeper. Libere com xattr -d com.apple.quarantine ./kanivet-cli. O script acima não passa por esse bloqueio.

kanivet-cli --version mostra a versão instalada.

Compilar do código

go build -o kanivet-cli ./cmd/kanivet-cli   # precisa do Go 1.24+

Início rápido

kanivet-cli                                 # abre a TUI

Na primeira vez abre o wizard: boas-vindas, perfil, categorias, revisão, execução e resumo. Nada é instalado antes da tela de revisão.

Escolha do perfil no wizard Itens de uma categoria, com o detalhe do item à direita
Perfil: cada perfil mostra quantos itens traz Itens: marque item a item, com método de instalação e configs

Revisão do plano com cada comando que será executado
Revisão: o plano lista cada comando e cada arquivo antes de qualquer mudança

Perfis

Perfil O que traz
blank Só a base: shell, ferramentas CLI modernas, git, Helix e o terminal
web Node, pnpm e Bun, ferramentas de HTTP e tarefas, Helix para TypeScript
laravel PHP via lerd (Linux) ou Flock (macOS), Composer, Node e Helix para PHP
ml Python, uv, Ruff, JupyterLab e CUDA quando há GPU NVIDIA
backend Rust, Go, .NET, Java, Podman e ferramentas de Kubernetes

Todos incluem a base do blank. Depois de escolher o perfil, cada categoria pode ser ajustada item a item. Em categorias exclusivas (distribuição do Neovim, lerd ou Flock, Docker ou Podman) só um item fica marcado. Nenhuma distribuição do Neovim vem marcada: o editor padrão é o Helix, e o LazyVim (com os extras de linguagem do perfil) continua disponível na categoria "Distribuição Neovim".

CLI

kanivet-cli profiles                       # perfis embutidos
kanivet-cli list                           # itens do catálogo
kanivet-cli status                         # estado de cada item nesta máquina
kanivet-cli plan --profile laravel         # o que seria feito, sem alterar nada
kanivet-cli install --profile laravel      # mostra o plano, pede confirmação e instala
kanivet-cli install lazygit --yes          # itens avulsos, sem perguntar
kanivet-cli install --profile web --add rust --remove bun --version node=24
kanivet-cli install --resume               # retoma uma execução interrompida
kanivet-cli update                         # atualiza o que o kanivet-cli instalou
kanivet-cli uninstall bat                  # desinstala e desfaz as configs do item
kanivet-cli restore                        # lista execuções com backup
kanivet-cli doctor                         # diagnóstico
kanivet-cli catalog lint                   # valida o catálogo

Regras principais

  • Nada muda sem revisão. O plano mostra cada comando e cada arquivo. Um arquivo que já existe aparece marcado com (backup) e é copiado para ~/.local/state/kanivet-cli/backups/<execução>/ antes de ser alterado; kanivet-cli restore <execução> desfaz.
  • Configs opinativas são opcionais. Cada config (kitty, herdr, Helix...) pode ser desmarcada na revisão ou no dashboard.
  • Sem sudo à toa. No macOS as ferramentas vêm do Homebrew; no Linux, do mise (binários no ~). Só os itens da seção "Precisa de sudo" pedem a senha, uma vez.
  • Linguagens pelo mise, com as exceções oficiais: Rust pelo rustup e PHP pelo lerd/Flock (ou Homebrew no macOS e static-php-cli no Linux, se nenhum dos dois for escolhido).
  • Seleção aditiva. install nunca remove nada; --remove só tira o item da seleção. Remover é sempre uninstall.
  • herdr primeiro. Se o herdr já está na máquina, toda execução começa com herdr update; os outros passos esperam por ele. Se o update falhar (sem rede, por exemplo), a execução segue com o herdr atual.
  • Retomável. Uma falha não derruba os outros itens. Se a execução for interrompida, rodar kanivet-cli ou install de novo oferece retomar de onde parou.
  • Shell. zsh e bash. Aliases e hooks vão para ~/.config/kanivet-cli/shell/init.{zsh,bash}, carregados por um único bloco # >>> kanivet-cli >>> no fim do rc. install --zsh também troca o shell padrão para o zsh.
  • Idioma. Inglês por padrão; pt-BR quando LANG/LC_ALL começa com pt.

Interface

kanivet-cli sem subcomando, num terminal (stdin e stdout TTY), abre a TUI: o wizard na primeira vez e o dashboard depois que já há itens ou perfil no estado. Se houver uma execução inacabada, a TUI abre direto na revisão dos passos pendentes: enter retoma e esc descarta. Sem TTY, imprime a ajuda.

Dashboard com abas de categoria, status de cada item e atualizações disponíveis
Dashboard: status de cada item, versões, atualizações disponíveis e o que veio de fora do kanivet-cli

Tecla Ação
setas ou hjkl mover
space marcar/desmarcar
enter confirmar ou avançar
esc voltar
/ buscar
? ajuda
q sair (confirma se houver mudanças pendentes)
ctrl+c sair ou, durante a execução, interromper
d (revisão) diff do arquivo
a, u/U, p (dashboard) aplicar, atualizar, trocar de perfil
f (execução) voltar a seguir o log
l, r (resumo) l abre o log do passo sob o cursor; r tenta de novo só os itens que falharam
tab/shift+tab (dashboard) trocar de aba de categoria (←/→ trocam a versão do item)
c (itens) painel de configs

O rodapé sempre mostra os atalhos da tela. Mínimo de 80×24. Em terminal com cor, a TUI pinta um fundo creme sobre a tela inteira; com NO_COLOR ou em terminais de 16 cores ela não pinta fundo e usa o do terminal. Os ícones usam Nerd Font (instalada pelo item nerd-font-jetbrains), com fallback ASCII.

Ferramentas do shell

Com os itens instalados, o init do shell ativa:

Comando / atalho O que faz
ls, ll, lt eza com ícones; ll com status do git, lt em árvore
cat bat sem paginação
z <pasta> / zi pula para pastas frequentes (zoxide)
ctrl+r histórico com o atuin (a seta para cima continua normal)
ctrl+t / alt+c fzf: arquivos (preview com bat) / entrar numa pasta
y abre o yazi e, ao sair, fica na pasta onde você parou
lg / lzd lazygit / lazydocker

grep, find, sed, du, df e ps não ganham alias, porque as ferramentas novas usam flags diferentes e quebrariam scripts. Use rg, fd, sd, dust, duf e procs direto.

Helix

O Helix é o editor padrão de todos os perfis e define EDITOR e VISUAL como hx. As configs (opcionais e com backup) deixam ele com cara de IDE: abas no topo, statusline completa, diagnósticos e dicas de tipo inline, guias de indentação, auto-save e formatação ao salvar. O tema é o monokai_soda_ide (monokai_soda com a aba ativa e a linha do cursor destacadas).

Atalhos incluídos na config (os nativos do Helix continuam valendo):

Atalho Ação
ctrl+s salvar (também no modo insert)
ctrl+p / ctrl+shift+p abrir arquivo / paleta de comandos
ctrl+shift+f buscar no projeto
ctrl+e / ctrl+y explorador de arquivos nativo / yazi
ctrl+b lista de buffers
ctrl+g lazygit em tela cheia (recarrega os buffers ao sair)
ctrl+t terminal (o seu shell) em tela cheia; exit ou ctrl+d volta ao Helix e recarrega os buffers
H / L aba anterior / próxima
ctrl+q ou space x fechar a aba (space X fecha as outras)
F12 / shift+F12 ir para a definição / referências
F2 renomear símbolo
ctrl+. code actions
ctrl+space hover (no modo insert, autocomplete)
F8 / shift+F8 próximo / anterior diagnóstico
alt+↑ / alt+↓ mover a linha
space t / space W liga/desliga dicas de tipo / quebra de linha
space p roda o Laravel Pint (vendor/bin/pint) no arquivo atual

Os servidores de linguagem ficam na categoria "Servidores de linguagem" e são instalados pelo mise (pacotes npm:, go:, pipx:, dotnet: e github:), exceto o rust-analyzer, que é um componente do rustup:

Perfil Servidores e formatadores
web typescript-language-server, ESLint/HTML/CSS/JSON (vscode-langservers), Tailwind, prettier
laravel intelephense, laravel-ls, blade-formatter e os mesmos do web
ml basedpyright (o Ruff já vem no perfil)
backend rust-analyzer, gopls, goimports, delve, csharp-ls

O csharp-ls fica fixo na 0.20.0, a última versão que instala com o SDK do .NET 9. O laravel-ls não tem release para Linux arm64 e é pulado nessa plataforma. hx --health <linguagem> mostra o que o Helix encontrou.

kitty + herdr

As configs opinativas do terminal (todas opcionais e com backup):

  • kitty: JetBrainsMono Nerd Font 13, abas compactas no topo (estilo fade, com botão + estreito para abrir abas), fundo translúcido (80% de opacidade) com desfoque, tema Afterglow fixo (claro e escuro), e abas/janelas novas no diretório atual (cmd+t, cmd+enter, cmd+n; no Linux ctrl+shift+t, ctrl+shift+enter, ctrl+shift+n).
  • herdr: tema gruvbox, notificações no próprio herdr, atalhos dos plugins e lazygit em popup. Plugins herdr-bar, herdr-auto-title, herdr-radar, herdr-reviewr e herdr-sidebar, cada um num commit fixo, mais as integrações dos agentes de IA encontrados no PATH.

O prefix do herdr é ctrl+b. Atalhos incluídos na config:

Ação Atalho
Workspace anterior / próximo prefix+shift+h / prefix+shift+l
Ir para o workspace N prefix+shift+1 … prefix+shift+9
Agente anterior / próximo prefix+shift+k / prefix+shift+j
Focar o agente N prefix+alt+1 … prefix+alt+9
Voltar ao último painel prefix+;
Mover a aba para trás / para frente prefix+shift+← / prefix+shift+→
Limpar o painel e o histórico prefix+ctrl+k
Redimensionar o painel prefix+setas ou ctrl+alt+h/j/k/l
Lazygit em popup prefix+alt+g
Busca rápida (herdr-bar) prefix+space
Painel de review do diff (reviewr) prefix+d
Sidebar estilo VS Code: arquivos, busca e git (herdr-sidebar) prefix+f
Radar: alternar ativos / recentes prefix+a
Radar: configurações prefix+,

Estrutura

cmd/kanivet-cli/     # main
catalog/             # catálogo embutido no binário
├── catalog.yaml
├── categories/      # uma categoria por arquivo (exclusive: true/false)
├── items/           # um item por arquivo: métodos de instalação, detecção, configs, shell
├── profiles/        # perfis embutidos
└── configs/         # templates das configs opinativas
internal/
├── platform/        # detecção de SO, distro, gerenciador de pacotes, shell
├── catalog/         # tipos, carga e lint do catálogo
├── backend/         # brew, mise, rustup, system, script, git, font, herdr-plugin
├── detect/          # estado de cada item e atualizações disponíveis
├── plan/            # seleção → passos ordenados (dependências, conflitos, sudo)
├── executor/        # execução paralela, journal, retomada
├── configs/         # aplicação das configs com backup e restauração
├── shellinit/       # geração do init do zsh/bash
├── state/           # estado, journal e backups em ~/.local/state/kanivet-cli
├── app/             # sessão compartilhada pela CLI e pela TUI
├── cli/             # comandos (cobra)
└── tui/             # interface (Bubble Tea)
test/integration/    # instalação real em containers
test/release/        # teste do install.sh contra um dist/ do GoReleaser
docs/superpowers/    # design e planos
docs/assets/         # logo, ícone e prints da TUI

Para adicionar uma ferramenta, crie catalog/items/<id>.yaml (use um item parecido como modelo) e rode kanivet-cli catalog lint.

Testes

go test -race ./...
test/integration/run.sh <ubuntu|debian|fedora|arch|opensuse> [perfil]   # precisa de Docker

Teste manual num terminal real (antes de um release):

  1. wizard completo no perfil blank;
  2. senha do sudo pedida e aceita no meio da execução;
  3. ctrl+c durante um brew install e depois kanivet-cli oferecendo a retomada;
  4. resize abaixo de 80×24;
  5. NO_COLOR=1 kanivet-cli.

Para validar a release sem publicar (o CI roda o mesmo no job release-check):

goreleaser check
goreleaser release --snapshot --clean   # gera dist/ sem publicar
test/release/install-test.sh dist       # testa o install.sh contra o dist/

Fazer uma release

  1. Com tudo em master e o CI verde, rode o teste manual acima.
  2. Crie e envie uma tag anotada: git tag -a v0.1.0 -m "v0.1.0" && git push origin v0.1.0.
  3. O workflow Release (.github/workflows/release.yml) roda os testes, cria a release como rascunho, instala o .deb no Ubuntu, o .rpm no Fedora e o install.sh no macOS e, se tudo passar, publica. Tags com sufixo (v0.2.0-rc.1) saem como pré-release.
  4. Se algo falhar, a release continua como rascunho. Corrija, apague a tag (git push --delete origin v0.1.0 && git tag -d v0.1.0) e o rascunho (gh release delete v0.1.0), e crie a tag de novo.

Rollback de uma release já publicada: gh release edit v0.1.0 --draft=true tira a release do ar. A correção sai numa versão nova (v0.1.1), nunca na mesma tag.

Problemas comuns

  • Ícones aparecem como quadrados: feche e abra o kitty. Se continuar, rode herdr plugin action invoke hhdebb.herdr-radar.install-font.
  • A barra de título do kitty não mudou de cor: o kitty precisa ser reiniciado; só recarregar a config não basta para essa opção.
  • Um item falhou: os outros continuam. O resumo mostra o log de cada passo; os logs ficam em ~/.local/state/kanivet-cli/runs/<execução>/. Corrija a causa e rode kanivet-cli install --resume.
  • Uma integração do herdr foi pulada: o agente não foi encontrado no PATH. Instale o agente e rode kanivet-cli install herdr-plugins de novo.
  • Algo estranho no ambiente: kanivet-cli doctor.

Logo e ícone

Ícone do kanivet-cli   Ícone do kanivet-cli para fundos escuros

Os arquivos ficam em docs/assets/, em SVG e PNG:

Arquivo Uso
kanivet-logo-light.svg / .png logo para fundos claros (tema claro do GitHub)
kanivet-logo-dark.svg / .png logo para fundos escuros (tema escuro do GitHub)
kanivet-icon.svg / .png ícone: avatar, favicon, ícone do repositório
kanivet-icon-dark.svg / .png ícone para fundos escuros

O topo deste README usa <picture> e troca o logo sozinho conforme o tema de quem lê (o trecho pronto está em docs/assets/README-header.md).

Licença

MIT.

About

A Swiss Army knife for setting up development environments on new machines—exclusively for macOS and Linux.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages