PTENES
macOS · Linux · WSL · Claude Code & Codex

Puxe a marcha, o modelo muda

Painel de Modelo e Esforço

Model & Effort Panel Panel de Modelo y Esfuerzo

StickShift é um painel de menu-bar em macOS com um H-pattern de câmbio de verdade: puxe o manche pra trocar o modelo do Claude Code ou Codex na pane de terminal que você está olhando, arraste o acelerador pra trocar o effort. Tudo é provado antes de agir — ou recusa com um motivo, nunca digita às cegas.

Painel do StickShift: gate H-pattern, console LCD e alavanca de effort
O que é

Um câmbio de verdade pro seu agente de código

Nada de editar config na mão ou decorar comando: StickShift lê a pane pela Accessibility API do macOS, prova que é um agente local idle e digita exatamente o que você digitaria — /model, /effort, ou as teclas do picker do Codex.

🔒 Fail-closed de verdade

Nunca edita arquivo de config, nunca chama API de provider, nunca usa automação de terminal. Só digita depois de provar pane idle, processo local certo e binário assinado e qualificado — qualquer prova que falhar vira recusa com código de motivo.

🎛️ Um painel pra cada provider

Face Claude (throttle até ULTRACODE) e face Codex (throttle até ULTRA), com os labels exatos de cada provider e atalhos globais (Cmd+Shift+1..5, Cmd+Shift+R) que disparam a marcha sem nem abrir o painel.

🖥️ App + CLI

bin/shift faz dry-run por padrão (não digita nada); --commit executa de fato. shift doctor diagnostica permissão, config e atribuição da pane focada num comando só.

Como funciona

Anatomia de uma troca

Entre puxar a marcha e o toast CHANGED, o motor passa por uma cadeia de provas — qualquer elo que falhar interrompe a troca e devolve um código de motivo em vez de um keystroke.

1. Read→ 2. Classify→ 3. Attribute→ 4. Qualify→ 5. Plan→ 6. Precheck→ 7. Inject→ 8. Watch/Verify→ 9. Report

Ler + classificar

A pane focada é lida via Accessibility API; um classificador puro extrai agente, modelo, effort, cwd, e se está idle/busy/com diálogo aberto, com composer provadamente vazio.

Atribuir + qualificar

A pane é ligada a um processo local (tty → foreground group → cwd), e o binário atribuído tem assinatura, team e versão checados contra o manifesto.

Injetar + verificar

Digita com keycodes resolvidos pelo layout atual, prova a entrega por delta de ocorrência antes de qualquer Enter, e só reporta sucesso com verdicto ancorado no fim da pane.

Pré-requisitos

Antes de instalar

O caminho automático (setup.sh) cobre quase tudo; isso aqui é o que precisa existir na máquina antes.

macOS + Xcode CLT

Precisa do clang pra compilar.

# instala as command line tools se faltar
xcode-select --install

Terminal suportado

Warp é o default verificado ponta a ponta. Terminal.app já passou nos dois testes mais difíceis; outros terminais se qualificam em 4 passos.

# qualifica um terminal novo
./scripts/qualify-terminal.sh "iTerm"

Accessibility

StickShift pede a permissão sozinho no primeiro lançamento — é só conceder em System Settings quando o diálogo aparecer.

# confirma o que está concedido
./bin/shift doctor
Guia de uso · passo a passo

Instalar e trocar sua primeira marcha

O script é idempotente: roda de novo sem medo se algo falhar no meio.

1

Clone e rode o setup

Verifica pré-requisitos, cria a identidade de assinatura estável, builda, roda a suíte de testes inteira, instala em ~/Applications/StickShift.app e já abre o app.

git clone https://github.com/inematds/stickshift && cd stickshift  # baixa o repo
./scripts/setup.sh  # idempotente, instala tudo
2

Conceda Accessibility e reabra o app uma vez

Habilite o StickShift em System Settings → Privacy & Security → Accessibility. Depois saia e abra o app de novo (clique direito no gear do menu-bar → Quit → reabra) — a permissão só gruda no processo depois do relaunch, esse é o erro de suporte nº 1.

3

Foque uma pane com Claude Code ou Codex e puxe uma marcha

Clique no pane do terminal rodando o agente, arraste o manche até um gate (ou dispare pela CLI a partir de outro pane — a CLI recusa a própria pane como SELF_TARGET).

./bin/shift 4          # dry run: mostra o plano, não digita nada
./bin/shift 4 --commit # executa de verdade
4

Confira o log

CHANGED quer dizer que deu certo; qualquer outro código é uma recusa explicada — cada tentativa fica registrada com motivo, nunca com o conteúdo da pane.

tail -5 ~/.stickshift/log
5

Ou pule a leitura: deixe o próprio agente instalar

Aponte Claude Code, Codex, ou qualquer agente de código pra este repo e diga "set up StickShift on this Mac". O AGENTS.md do repo é o playbook operacional completo: instalação, adaptação a terminal e versão de agente, e debug de recusa por código de motivo.

🧩 Qualquer modelo

Modelo novo sem recompilar

A versão publicada conhecia só Opus 4.8, Fable 5 e a família gpt-5.x. No branch catalogo-modelos, os modelos viram dados: um catálogo único diz quais modelos existem, como cada um aparece na tela e quais esforços aceita. As marchas padrão já vêm com o Opus 5.5 e a família GPT-6.

⚠️ Ainda não compilado nem testado num Mac

O código foi escrito num servidor Linux, sem o compilador da Apple. Os nomes dos modelos vieram dos programas instalados (Claude Code 2.1.282 e Codex 0.156.1) e foram conferidos na tela real via tmux no Linux, que é a mesma interface do macOS. Nessa conferência apareceram duas mudanças do Codex, já corrigidas no branch: o rodapé mostra "GPT-6-Astra" com maiúsculas, e Max/Ultra agora ficam num submenu "More reasoning…". Pontos para checar no Mac: a lista de textos-fantasma do campo do Codex ainda é da versão 0.144.1 (se recusar com DRAFT_PRESENT, basta reextrair) e o modelo do Claude é lido de uma linha de status 📂 pasta · Modelo, que parece vir de um statusline personalizado. Antes de usar, num Mac: git checkout catalogo-modelos, make test, make matrix, stickshift doctor e stickshift status num painel com cada agente. Só depois disso o branch entra no main.

MarchaClaude CodeCodex
1Haiku 4.5gpt-6-luna · medium
2Sonnet 5gpt-6-sol · medium
3Opus 5.5 · mediumgpt-6-astra · medium
4Opus 5.5 · highgpt-6-astra · high
5Opus 5.5 · xhighgpt-6-astra · xhigh
ROpus 5.5 · lowgpt-6-sol · low
ULTRAOpus 5.5 · ultracodegpt-6-astra · ultra

A escada segue a referência de esforço: medium como marcha de trabalho, high quando precisar de mais raciocínio e xhigh para o caso difícil. O max fica fora das marchas padrão, mas continua disponível pelo acelerador ou por remapeamento.

1 · Ensine o modelo novo

No ~/.stickshift/config.toml, uma linha por modelo:

claude_model.opus = "Opus 5.6"
codex_model.gpt-7-nova = "low medium high xhigh max"
gear.3.claude = "opus medium"

No Claude, a chave é o argumento do /model e o valor é o nome da linha de status. No Codex, a chave é o nome no seletor e o valor é a lista de esforços que o modelo aceita.

2 · Confira antes de trocar

stickshift status num painel com o modelo novo precisa mostrar o mesmo nome. Depois, stickshift 3 sem --commit imprime o plano sem digitar nada; só então use --commit.

A comparação de nomes aceita decoração ("Opus 5.5 (1M context)" conta como Opus 5.5), mas nunca confunde versões: "Opus 5" não é "Opus 5.5". No Codex, cada modelo só aceita os próprios esforços; pedir ultra no luna é recusado.

🐧 Linux e Windows (WSL)

StickShift v2: painel web + chat no Linux

No Linux, e no Windows via WSL, o StickShift v2 pede ao próprio terminal (tmux) para ler a tela e digitar, sem Acessibilidade do macOS nem app nativo. Ele troca modelo e esforço do Claude Code e do Codex pela linha de comando ou por um painel web com o mesmo câmbio, e tem um chat nível 1 que manda prompts para o agente do painel escolhido. Usa só Python 3, sem instalar nada. Validado ao vivo em 24/09/2026 com Claude Code 2.1.282 e Codex 0.156.1.

Painel web do StickShift v2: terminais com agente à esquerda, câmbio no centro e chat à direita

1 · Instale e liste

Clone o repositório e ponha o lançador no PATH. O list mostra os painéis tmux com Claude Code ou Codex e o estado de cada um.

ln -s "$PWD/v2/bin/stickshift2" \
  ~/.local/bin/stickshift2
stickshift2 list

2 · Troque pela linha de comando

Sem --commit, é só simulação e mostra o plano. Com --commit, digita e confirma pela mensagem do próprio agente.

stickshift2 shift 4 --pane %3
stickshift2 shift 4 --pane %3 --commit
stickshift2 keys   # atalhos do tmux

3 · Abra o painel web

Abre em 127.0.0.1 com um token. À esquerda, os terminais; no centro, o câmbio; à direita, o chat com o agente.

stickshift2 web
# abra o endereço com ?t=… impresso

🔒 Garantias

O agente é identificado pelo processo que roda no painel, não pelo texto. Só digita com o agente ocioso e o campo vazio; a sugestão cinza do Claude não conta como rascunho. A troca é confirmada pela mensagem do agente ("Set model to …", "Model changed to …"). O painel web exige token em toda chamada, checa Host e Origin e registra tudo em ~/.stickshift/v2.log.

💬 Chat nível 1

Só prompts: mensagens começando com /, ! ou # são recusadas, assim como quebras de linha. Tarefas no sistema passam pelo agente e pelas permissões dele. Se o agente pedir permissão, o chat avisa e a decisão fica no terminal; aprovar pelo chat é a v3.

⚠️ Bom saber

Cada troca também vira o padrão do agente para sessões novas, como digitar /model à mão. opus e opus[1m] são modelos diferentes (200K e 1M de contexto); as marchas usam opus[1m]. O Windows nativo (backend WezTerm) é a fase 5 do plano e ainda não existe. Por enquanto, no Windows, use o WSL com tmux. Código e README da v2 → · plano →

Exemplos

Os diagramas que o próprio projeto usa

Direto de docs/: a anatomia de uma troca e o mapa de código-fonte, do jeito que acompanham o README.

Diagrama do pipeline: Read → Classify → Attribute → Qualify → Plan → Precheck → Inject → Watch/Verify → Report
Anatomia de uma troca — as 9 etapas entre puxar a marcha e o toast CHANGED.
Diagrama de arquitetura do código-fonte do StickShift
Mapa de arquitetura — engine em src/core, app shell em src/app, CLI em src/cli.
Roadmap

Onde está e pra onde vai

Do jeito que o próprio README documenta hoje.

Hoje
Warp verificado ponta a pontaTerminal.app com leitura + injeção verificadas; iTerm2 ainda não qualificado. Só Warp habilitado por padrão.
Próximo
Mais terminais + identidade de pane mais forteQualificar iTerm2 e outros via scripts/qualify-terminal.sh; reduzir a ambiguidade que hoje depende de título de janela + geometria + cwd.
Distribuição
Developer ID + notarizaçãoA identidade auto-assinada resolve o treadmill do TCC localmente; distribuir além da própria máquina pede um Developer ID pago.
Modelos
Catálogo de modelos (branch catalogo-modelos)Opus 5.5 e GPT-6 nas marchas padrão, modelo novo pelo config.toml; falta compilar e testar num Mac antes do merge.
v2 ✓
Linux e WSL com painel web + chat nível 1 (feito)Núcleo em Python, tmux, painel web com token e chat, validados ao vivo em 24/09/2026. Falta a fase 5: WezTerm para o Windows nativo.
v3
Chat com permissõesAprovar ou negar pelo chat os pedidos de permissão do agente. Desligado por padrão, só em diálogos reconhecidos, com log de quem aprovou o quê.