Técnica

Um clique e o Claude Code abre na pasta certa

claude-codesetupworkflowtodoistmacosmemoria

Problema

Começar uma sessão do Claude Code custa mais do que parece. Abrir o terminal, lembrar em qual pasta o projeto vive, dar cd num caminho comprido, rodar claude, e aí lembrar onde eu tinha parado. São uns 40 segundos, e 40 segundos é o suficiente pra eu abrir outra aba e não voltar.

Eu percebi isso olhando a minha lista de tarefas. Tinha um monte de item do tipo “continuar a revisão do orçamento” que eu adiava não por falta de tempo, mas porque cada um pedia esse ritual de entrada antes de qualquer trabalho de verdade. O contexto estava todo lá, nos arquivos e no MEMORY.md do projeto. O que faltava era um jeito de cair dentro dele sem passar pela porta da frente.

A solução veio em duas partes, e as duas nasceram no meu Mac do trabalho antes de eu replicar no pessoal. A primeira é um par de apps com ícone que abrem o Claude Code num clique. A segunda é mais interessante: um link na descrição de cada tarefa que abre o terminal na pasta certa, com o prompt de retomada já digitado.

Técnica

Parte 1: um ícone no Dock que abre o Claude Code na sua pasta

O Claude Code é um programa de terminal, então ele não tem ícone. Dá pra criar um. A ideia é um app do macOS que só faz uma coisa: abre o Terminal já rodando claude dentro da pasta do seu segundo cérebro.

Eu tenho dois. Claude OS abre direto na raiz da minha pasta. Claude OS Pasta abre um seletor de pasta e roda o claude na que eu escolher, que é o que uso quando quero trabalhar dentro de um projeto específico.

A arquitetura tem duas camadas. Um script .command em ~/.claude/launchers/, que é quem faz o trabalho:

#!/bin/zsh
cd "/caminho/da/sua/pasta" || exit 1
export PATH="$HOME/.local/bin:$PATH"
exec claude

E um applet de AppleScript por cima, criado com uma linha no terminal, que só manda o macOS abrir aquele script:

osacompile -o ~/Applications/"Claude OS.app" \
  -e 'do shell script "open " & quoted form of "/Users/você/.claude/launchers/Claude OS.command"'

Separar assim tem uma vantagem prática: mudar o comportamento (outra pasta, uma flag nova) é editar o script, sem recriar o app.

O ícone é a parte que dá trabalho, e por um motivo que não está em lugar nenhum da documentação. Você converte a imagem pra .icns (sips pra gerar os tamanhos, iconutil pra empacotar) e troca o Contents/Resources/applet.icns do app. Faz isso, reinicia o Finder, reinicia o Mac, e o ícone continua o padrão do Script Editor.

A causa é que o applet vem com um arquivo Assets.car e uma chave CFBundleIconName no Info.plist, e enquanto os dois existirem o macOS ignora o .icns. A receita que destrava:

cd ~/Applications/"Claude OS.app"
rm Contents/Resources/Assets.car
plutil -remove CFBundleIconName Contents/Info.plist
codesign --force -s - .
touch .
killall Finder Dock iconservicesagent

O codesign é porque mexer no bundle quebra a assinatura, e uma assinatura ad-hoc basta pra app que só roda na sua máquina. Se o Dock ainda mostrar o ícone antigo depois disso, tira o app do Dock e arrasta de volta: o tile do Dock tem cache próprio.

Eu perdi um bom tempo nisso no Mac do trabalho, reboot incluído. No pessoal levou 5 minutos, porque a receita já existia.

Essa é a parte que mudou a rotina de verdade. O Claude Code registra no sistema um esquema de URL próprio, claude-cli://, do mesmo jeito que mailto: abre o seu email. Um link nesse formato abre uma janela de terminal com o Claude Code rodando na pasta que o link indica, e com o prompt que o link carrega já preenchido, esperando você apertar Enter.

O formato é este:

claude-cli://open?cwd=<pasta absoluta, URL-encoded>&q=<prompt, URL-encoded>

Não tem nada pra instalar. O handler se registra sozinho na primeira sessão interativa em que você envia um prompt (abrir e fechar o claude não conta). No Mac ele vira o ~/Applications/Claude Code URL Handler.app. A documentação oficial descreve os parâmetros; o q aceita até 5.000 caracteres, com %0A pra quebra de linha.

O que eu faço com isso: toda tarefa que entra no meu Todoist começa a descrição com um link assim. A descrição do Todoist renderiza markdown, então a primeira linha é:

[▶️ Abrir no Claude Code](claude-cli://open?cwd=...&q=...)

Um exemplo real, com o caminho encurtado pra caber:

[▶️ Abrir no Claude Code](claude-cli://open?cwd=/Users/gui/Claude%20OS/1%20Projects/financas&q=Leia%20o%20MEMORY.md%20deste%20projeto%20e%20continue%20a%20revis%C3%A3o%20do%20or%C3%A7amento%20de%20setembro.%20Me%20diga%20onde%20paramos.)

Clicou, abriu o terminal na pasta de finanças, o prompt “Leia o MEMORY.md deste projeto e continue a revisão do orçamento de setembro. Me diga onde paramos.” está na caixa. Enter. A tarefa começou.

Montar o link na mão dá erro de encoding, então eu deixo o próprio Claude montar. Em Python é uma linha:

from urllib.parse import quote
link = f"claude-cli://open?cwd={quote(pasta, safe='/')}&q={quote(prompt)}"

E como isso vira regra e não boa intenção: eu escrevi no CLAUDE.md do meu segundo cérebro que toda tarefa criada por ali nasce com o link. Quem cria as tarefas na maior parte do tempo é o Claude, então o link aparece sozinho.

Três regras que separam um link útil de um link decorativo:

Como aplicar

O caminho mais curto, na ordem:

  1. Rode claude num terminal, mande qualquer prompt e saia. Isso registra o handler. Faça no terminal que você usa de verdade, porque o link vai abrir no último terminal em que o claude rodou.
  2. Teste com um link qualquer no navegador ou no shell: open "claude-cli://open?cwd=/Users/você/sua-pasta&q=oi". Deve abrir uma janela com “oi” na caixa e um aviso de “Prompt from an external link” embaixo. O aviso é segurança, não erro: nada roda até você apertar Enter.
  3. Crie uma tarefa no seu gerenciador com o link na descrição e clique nela. Se funcionou, escreva a regra no seu CLAUDE.md pra toda tarefa nova sair assim.
  4. Os apps com ícone são opcionais. Se quiser, o prompt pra montar os dois cabe em 10 linhas: os scripts, o osacompile, a conversão de ícone e a remoção do Assets.car.

Alguns limites que vale saber antes:

O que mudou pra mim foi o tamanho da barreira de entrada. Antes, a tarefa dizia o que fazer e eu tinha que reconstruir o contexto pra começar. Agora a tarefa carrega a porta de entrada. Talvez seja o exemplo mais claro que eu tenho de que o custo de uma tarefa raramente está no trabalho em si, e quase sempre está em voltar pra onde você estava.