<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ai-Usagebar | AkitaOnRails.com</title><link>https://akitaonrails.github.io/tags/ai-usagebar/</link><description>Blog do Fabio Akita do Canal do YouTube 'Akitando' falando sobre tecnologia, carreira e coisas geek.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 23:20:48 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/tags/ai-usagebar/index.xml" rel="self" type="application/rss+xml"/><item><title>Novidades no meu AI-MEMORY: cada vez melhor pra usar com suas IAs</title><link>https://akitaonrails.github.io/2026/07/20/novidades-no-meu-ai-memory-cada-vez-melhor-pra-usar-com-suas-ias/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/07/20/novidades-no-meu-ai-memory-cada-vez-melhor-pra-usar-com-suas-ias/</guid><pubDate>Mon, 20 Jul 2026 21:00:00 -0300</pubDate><description>&lt;p&gt;Faz pouco mais de um mês que publiquei &lt;a href="https://akitaonrails.github.io/2026/06/16/ai-memory-memoria-longo-prazo-karpathy-wiki-auto-aprendizado-hermes-projetos/"&gt;ai-memory: memória de longo prazo (Karpathy Wiki) e auto-aprendizado (Hermes) pros seus projetos&lt;/a&gt;. Foi dia 16 de junho. Naquele texto eu expliquei como sessões viravam páginas Markdown, como o auto-improve promovia aprendizados e por que memória ruim pode ser pior que amnésia.&lt;/p&gt;
&lt;p&gt;No mesmo dia saiu a versão 1.1.0. Hoje, 20 de julho, estamos na &lt;strong&gt;1.17.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Versão sozinha não quer dizer grande coisa, então fui contar o que aconteceu de verdade desde o horário daquele post. Foram &lt;strong&gt;31 releases, 55 pull requests mergeados e 46 issues fechadas&lt;/strong&gt;. Eu contei &lt;strong&gt;24 grupos de funcionalidades novas voltadas ao usuário&lt;/strong&gt; no &lt;a href="https://github.com/akitaonrails/ai-memory/blob/main/CHANGELOG.md"target="_blank" rel="noopener"&gt;CHANGELOG&lt;/a&gt;, ignorando correções, documentação e detalhes internos da mesma entrega. Se eu quebrasse a nova família &lt;code&gt;ai-memory run&lt;/code&gt; em auto-seleção, adoção de sessão, suporte a Crush, &lt;code&gt;--yolo&lt;/code&gt;, busca e recuperação, passava disso fácil.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Faz pouco mais de um mês que publiquei <a href="/2026/06/16/ai-memory-memoria-longo-prazo-karpathy-wiki-auto-aprendizado-hermes-projetos/">ai-memory: memória de longo prazo (Karpathy Wiki) e auto-aprendizado (Hermes) pros seus projetos</a>. Foi dia 16 de junho. Naquele texto eu expliquei como sessões viravam páginas Markdown, como o auto-improve promovia aprendizados e por que memória ruim pode ser pior que amnésia.</p>
<p>No mesmo dia saiu a versão 1.1.0. Hoje, 20 de julho, estamos na <strong>1.17.1</strong>.</p>
<p>Versão sozinha não quer dizer grande coisa, então fui contar o que aconteceu de verdade desde o horário daquele post. Foram <strong>31 releases, 55 pull requests mergeados e 46 issues fechadas</strong>. Eu contei <strong>24 grupos de funcionalidades novas voltadas ao usuário</strong> no <a href="https://github.com/akitaonrails/ai-memory/blob/main/CHANGELOG.md"target="_blank" rel="noopener">CHANGELOG</a>, ignorando correções, documentação e detalhes internos da mesma entrega. Se eu quebrasse a nova família <code>ai-memory run</code> em auto-seleção, adoção de sessão, suporte a Crush, <code>--yolo</code>, busca e recuperação, passava disso fácil.</p>
<p>Quinze pessoas tiveram PRs mergeados nesse período, quatorze além de mim. Preciso agradecer em especial ao <a href="https://github.com/djalmajr"target="_blank" rel="noopener">Djalma Júnior</a>, que sozinho teve 24 PRs mergeados, <a href="https://github.com/matheus-rodrigues00"target="_blank" rel="noopener">Matheus Rodrigues</a>, com cinco, <a href="https://github.com/lhzapata"target="_blank" rel="noopener">lhzapata</a>, com quatro, <a href="https://github.com/rthiago"target="_blank" rel="noopener">Thiago Silva</a> e <a href="https://github.com/cristianodewes"target="_blank" rel="noopener">Cristiano Dewes</a>, com dois cada. Mais nove contribuidores tiveram PR mergeado. Faz tempo que isso deixou de ser &ldquo;um programinha que eu fiz num fim de semana&rdquo;.</p>
<p>Não vou despejar 55 PRs aqui. Quero falar da mudança que mais afeta meu uso diário: o novo <strong><code>ai-memory run</code></strong>.</p>
<h2>A sessão também faz parte do projeto<span class="hx:absolute hx:-mt-20" id="a-sessão-também-faz-parte-do-projeto"></span>
    <a href="#a-sess%c3%a3o-tamb%c3%a9m-faz-parte-do-projeto" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Código é o resultado que sobreviveu. Ele não guarda a investigação inteira.</p>
<p>O Git mostra que você trocou Redis por SQLite. Talvez o commit explique uma parte. Mas onde ficou o experimento com Redis? Onde está o bug intermitente que só aparecia com dois workers? Quem lembrou que a primeira solução quebrava no Windows? Por que o time mudou de ideia depois de três horas? Qual workaround era temporário e qual virou decisão?</p>
<p>Boa parte disso só existe na sessão do agente.</p>
<p>Quando programo com Claude Code ou Codex, a sessão acumula o raciocínio operacional do projeto: perguntas, correções, tentativas descartadas, resultados de testes, surpresas, decisões e mudanças de direção. O código final mostra o que ficou. A sessão explica por que chegamos ali.</p>
<p>E sessão de LLM, no fim das contas, é texto. Claude Code grava JSONL. Codex também. OpenCode usa SQLite. Pi, OMP e Crush têm seus próprios formatos e diretórios. Cada harness empacota a conversa de um jeito, mas o conteúdo visível continua sendo mensagens e resultados de ferramentas.</p>
<p>Por que eu deveria deixar a parte mais cara do trabalho presa ao harness?</p>
<p>Anthropic pode mudar limite, preço, modelo ou formato amanhã. OpenAI também. Um agente pode estar excelente esta semana e insuportável na próxima. Eu quero trocar o motor sem jogar fora a viagem inteira.</p>
<p>Essa é a tese do ai-memory desde o começo: <strong>o programador tem que continuar independente das vontades dos providers</strong>. Modelo e harness são substituíveis. A memória do projeto é minha.</p>
<h2>O handoff resolvia só metade<span class="hx:absolute hx:-mt-20" id="o-handoff-resolvia-só-metade"></span>
    <a href="#o-handoff-resolvia-s%c3%b3-metade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O ai-memory já fazia passagem de bastão. Eu encerrava Claude Code, os hooks consolidavam a sessão e o Codex seguinte recebia um resumo curto com o que foi feito, perguntas abertas e próximos passos.</p>
<p>Isso continua existindo e continua útil. Quem abre <code>claude</code>, <code>codex</code> ou <code>opencode</code> diretamente mantém o comportamento anterior. O launcher novo é opt-in.</p>
<p>Mas handoff é uma compressão deliberadamente lossy. Ele preserva o que parece mais importante naquele momento. Não pretende transportar a sessão inteira, nem retomar a sessão nativa de cada harness. Se o resumo omitiu uma tentativa antiga que voltou a ser relevante duas horas depois, você precisa procurar na wiki ou nos registros.</p>
<p>O <code>ai-memory run</code> acrescenta outra camada: uma <strong>workstream gerenciada</strong>, uma linha de trabalho que atravessa os harnesses.</p>
<h2>Claude hoje, Codex daqui a pouco<span class="hx:absolute hx:-mt-20" id="claude-hoje-codex-daqui-a-pouco"></span>
    <a href="#claude-hoje-codex-daqui-a-pouco" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O uso básico é esse:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/Projects/meu-projeto
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ai-memory run claude
</span></span><span class="line"><span class="cl"><span class="c1"># trabalha, encerra o Claude Code normalmente</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ai-memory run codex --yolo
</span></span><span class="line"><span class="cl"><span class="c1"># Codex continua a mesma linha de trabalho</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ai-memory run claude --model opus
</span></span><span class="line"><span class="cl"><span class="c1"># volta pra sessão nativa anterior do Claude</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ai-memory run
</span></span><span class="line"><span class="cl"><span class="c1"># ou deixa o ai-memory escolher o harness certo pra continuar</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Não precisa de <code>--</code> pra separar os argumentos. Tudo depois do nome do harness segue pra ele, com uma exceção proposital: o <code>--yolo</code> pertence ao wrapper e é traduzido pra opção perigosa nativa de Claude Code, Codex, OpenCode, Pi ou Crush.</p>
<p>Por baixo, o ai-memory não tenta converter um arquivo do Codex num arquivo do Claude. Isso seria frágil e provavelmente quebraria na próxima atualização. Cada harness mantém sua própria sessão nativa. A workstream liga essas sessões a um ledger portátil com a parte visível da conversa.</p>
<p>Pensa assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">sessão nativa do Claude ─┐
</span></span><span class="line"><span class="cl">sessão nativa do Codex  ─┼─ workstream ─ contexto portátil
</span></span><span class="line"><span class="cl">sessão do OpenCode      ─┤                 + busca completa
</span></span><span class="line"><span class="cl">sessão nativa do Pi     ─┘</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Na primeira vez que Claude entra naquela workstream, ele ganha uma sessão nativa. Quando você troca pra Codex, o Codex ganha a sessão nativa dele e recebe o delta portátil que ainda não viu. Ao voltar pro Claude, o launcher usa o <code>--resume</code> do próprio Claude Code e entrega apenas o que aconteceu nos outros harnesses desde a última vez.</p>
<p>Isso é bem diferente de começar um chat novo com um resumo colado no prompt. O Claude volta pra sessão real dele. O Codex volta pra sessão real dele. O ai-memory cuida da continuidade entre os dois.</p>
<p>Hoje o modo gerenciado suporta <strong>Claude Code, Codex, OpenCode, Pi, Crush e OMP</strong>. O suporte geral do ai-memory é maior, com MCP e hooks pra outros clientes, mas isso não quer dizer que todo cliente já tenha adapter de sessão nativa pro <code>run</code>. São contratos diferentes e eu prefiro deixar isso explícito.</p>
<h2>O que entra na workstream<span class="hx:absolute hx:-mt-20" id="o-que-entra-na-workstream"></span>
    <a href="#o-que-entra-na-workstream" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando o harness encerra, o ai-memory lê o final da sessão nativa sem modificar o store original. Entram mensagens visíveis de usuário e assistente, tool calls concluídas com seus resultados, resumos de compaction e um checkpoint não mutante do Git. Cada evento mantém a origem: veio do Claude, Codex, OpenCode, Pi, Crush ou OMP.</p>
<p>Credenciais do provider, registros criptografados, system/developer prompts e hidden reasoning ficam de fora. Formatos privados que o adapter não entende também ficam de fora e geram uma anotação de perda, em vez de o sistema fingir que importou tudo.</p>
<p>Os registros passam pelo sanitizer antes de entrar no ledger pesquisável e nos segmentos JSONL imutáveis do ai-memory. Os stores nativos são abertos read-only pelo adapter; quem continua escrevendo neles é o próprio harness.</p>
<p>Também não enfio a sessão inteira no próximo prompt. Isso recriaria o problema que o projeto tenta resolver: contexto bruto demais, caro demais e cheio de ruído. O próximo agente recebe um delta recente com tamanho limitado. Se uma decisão velha voltar a importar, o ledger completo continua pesquisável:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-memory workstream-search <span class="s2">&#34;por que desistimos do Redis&#34;</span>
</span></span><span class="line"><span class="cl">ai-memory workstream-search --limit <span class="m">50</span> --json <span class="s2">&#34;migration que falhou&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Dentro de um <code>ai-memory run</code>, o ID da workstream já entra no ambiente. O agente não precisa descobrir UUID nenhum.</p>
<p>E o ledger não substitui a wiki. Ele resolve continuidade operacional. Decisões, regras, procedimentos e gotchas que precisam sobreviver por meses continuam merecendo páginas Markdown consolidadas. Sessão bruta é evidência. Wiki é conhecimento organizado.</p>
<h2>Posso manter mais de uma linha de trabalho?<span class="hx:absolute hx:-mt-20" id="posso-manter-mais-de-uma-linha-de-trabalho"></span>
    <a href="#posso-manter-mais-de-uma-linha-de-trabalho" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Sim. A workstream padrão se chama <code>default</code>, selecionada por repositório e worktree. Se eu quiser abrir uma linha independente pra uma investigação sem contaminar o trabalho principal:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-memory run --new investigar-race claude
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># depois continuo aquela linha com outro harness</span>
</span></span><span class="line"><span class="cl">ai-memory run --workstream investigar-race codex</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Uma lease impede duas janelas de escreverem ao mesmo tempo na mesma workstream. Em encerramento normal, o launcher importa o final da sessão e libera imediatamente. Se alguém matar o processo sem cleanup, a lease expira em até 90 segundos e a próxima execução retoma do último cursor confirmado, sem duplicar os eventos já importados.</p>
<p>Uma irritação besta que eu tinha o tempo todo: voltava pra um projeto depois de alguns dias e não lembrava se a sessão mais recente estava no Claude ou no Codex. Eu chutava um, abria, percebia que o contexto estava no outro, fechava e tentava de novo.</p>
<p>Agora só rodo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-memory run
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ou com a mesma seleção automática em YOLO mode</span>
</span></span><span class="line"><span class="cl">ai-memory run --yolo</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Numa workstream vazia, o ai-memory procura sessões locais daquele checkout em Claude Code, Codex, OpenCode, Pi e Crush, descobre qual é a mais recente e abre o harness certo pra mim. Numa workstream já estabelecida, a memória do servidor vence o timestamp de arquivo: ele volta ao último harness ligado àquele trabalho, em vez de adotar por engano uma sessão velha que só recebeu uma gravação mais recente. OMP continua disponível quando escolhido explicitamente, mas ainda não participa da seleção automática.</p>
<p>Na primeira execução explícita, o launcher também pode oferecer sessões existentes do mesmo checkout pra adoção. Dá pra começar a usar sem abandonar o chat que já estava aberto antes de atualizar o ai-memory.</p>
<h2>Outras novidades que eu realmente uso<span class="hx:absolute hx:-mt-20" id="outras-novidades-que-eu-realmente-uso"></span>
    <a href="#outras-novidades-que-eu-realmente-uso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu prometi não ler o changelog inteiro em voz alta, mas algumas mudanças desse mês merecem menção porque reduzem trabalho do programador.</p>
<h3>Briefing antes da primeira pergunta<span class="hx:absolute hx:-mt-20" id="briefing-antes-da-primeira-pergunta"></span>
    <a href="#briefing-antes-da-primeira-pergunta" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Um projeto pode pedir um briefing automático no início de cada sessão:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">briefing</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">inject_on_session_start</span> <span class="p">=</span> <span class="s2">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">max_chars</span> <span class="p">=</span> <span class="mi">4000</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O ai-memory recompõe um pacote com páginas pinned, <code>_rules/</code>, <code>_slots/</code> e títulos recentes. O agente começa sabendo as regras e o estado básico do projeto, em vez de gastar a primeira conversa redescobrindo a arquitetura. É opt-in porque consome contexto em todo SessionStart, inclusive depois de um <code>/clear</code> do Claude.</p>
<h3>Preferências globais e busca entre projetos<span class="hx:absolute hx:-mt-20" id="preferências-globais-e-busca-entre-projetos"></span>
    <a href="#prefer%c3%aancias-globais-e-busca-entre-projetos" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Preferências que valem pra todo meu trabalho agora podem viver no escopo reservado <code>_global</code>: estilo de código, ferramentas que prefiro, regras pessoais e convenções que não pertencem a um repositório específico. Consultas normais já fazem union desse escopo com o projeto atual.</p>
<p>Pra meta-repos que precisam consultar vários projetos irmãos o tempo todo, existe outro opt-in:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">recall</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">default_global</span> <span class="p">=</span> <span class="s2">&#34;true&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Assim <code>memory_query</code> e <code>memory_recent</code> sem escopo explícito procuram em todos os projetos. Não ligo isso em qualquer repo porque busca global à toa só traz ruído.</p>
<h3>Menos instrução fixa, mais Agent Skills<span class="hx:absolute hx:-mt-20" id="menos-instrução-fixa-mais-agent-skills"></span>
    <a href="#menos-instru%c3%a7%c3%a3o-fixa-mais-agent-skills" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O bloco de routing em <code>CLAUDE.md</code> ou <code>AGENTS.md</code> ficou pequeno. As instruções detalhadas de quando buscar memória, consolidar, guardar decisão ou criar handoff foram movidas pra Agent Skills gerenciadas. Um comando instala ou atualiza os dois sem atropelar o resto do arquivo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-memory install-instructions</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso também reduz drift. Quando o protocolo muda, atualizo o pacote gerenciado em vez de caçar um prompt velho copiado em quarenta repositórios.</p>
<h3>Privacidade antes da rede<span class="hx:absolute hx:-mt-20" id="privacidade-antes-da-rede"></span>
    <a href="#privacidade-antes-da-rede" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Agora cada repo pode excluir caminhos da captura:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">capture</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">ignore_paths</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;private/**&#34;</span><span class="p">,</span> <span class="s2">&#34;~/personal-notes/**&#34;</span><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Quando uma integração reconhece uma file tool e o caminho bate, o evento é descartado localmente antes de spool, fila, rede ou servidor. Isso tem limites claros: não é DLP mágico, não interpreta qualquer shell command e não rastreia conteúdo citado em texto livre. Mas resolve o caso verificável sem vender uma garantia falsa.</p>
<p>Também entraram integrações com Kimi Code, Grok Build CLI, Devin e Zero, um provider OpenCode Zen/Go, <code>finalize-session</code> pro Codex e melhorias na administração de workspaces. Reforço: ter MCP e hook não significa automaticamente ter <code>ai-memory run</code>. O <a href="https://github.com/akitaonrails/ai-memory#support-matrix"target="_blank" rel="noopener">README</a> separa esses níveis.</p>
<h2>Bônus: ai-jail por fora, YOLO por dentro<span class="hx:absolute hx:-mt-20" id="bônus-ai-jail-por-fora-yolo-por-dentro"></span>
    <a href="#b%c3%b4nus-ai-jail-por-fora-yolo-por-dentro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Há pouco mais de uma semana escrevi <a href="/2026/07/11/como-me-precaver-pros-meus-agentes-nao-apagarem-minhas-coisas/">como me protejo pra agentes não apagarem minhas coisas</a>. Minha recomendação continua a mesma: YOLO mode dá a melhor experiência, desde que o sistema limite o estrago possível.</p>
<p>O <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a> chegou à versão 1.15.0 e agora entende o launcher do ai-memory. O jeito que mais estou gostando de trabalhar virou:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-jail ai-memory run codex --yolo</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Ou, se quero que o ai-memory escolha qual harness deve continuar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-jail ai-memory run --yolo</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>A ordem importa. <code>ai-jail</code> fica por fora para manter tanto o launcher quanto o processo filho na mesma sandbox. <code>ai-memory run</code> sozinho gerencia a sessão, mas não cria sandbox.</p>
<p>O <code>--yolo</code> desliga a cerimônia de aprovação do harness. O ai-jail faz a contenção: projeto atual read-write, home substituído por tmpfs, partes necessárias do estado dos agentes montadas seletivamente e diretórios sensíveis como <code>.ssh</code>, <code>.gnupg</code> e <code>.aws</code> fora da jaula. O suporte novo também deixa o estado local do ai-memory gravável pros hooks manterem spool e cursores entre execuções.</p>
<p>ai-jail reconhece tanto a camada <code>ai-memory</code> quanto o harness selecionado. Se você tem configuração global específica pra Codex, por exemplo, ela continua sendo aplicada quando o comando real é <code>ai-memory run codex</code>. Até o ajuste de redraw da status bar entende que o filho é Codex.</p>
<p>Essa combinação resolve as duas irritações ao mesmo tempo: o agente para de pedir confirmação a cada comando e a sessão para de pertencer ao agente. Fluidez sem dar o home inteiro de presente.</p>
<h2>One more thing: ai-usagebar também cresceu<span class="hx:absolute hx:-mt-20" id="one-more-thing-ai-usagebar-também-cresceu"></span>
    <a href="#one-more-thing-ai-usagebar-tamb%c3%a9m-cresceu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando publiquei o <a href="/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/">ai-usagebar original</a>, ele monitorava Claude, Codex, Z.AI e OpenRouter num widget da Waybar ou numa TUI. A versão 0.14.0 já cobre <strong>onze integrações de uso, gasto ou saldo</strong>.</p>
<p>Kimi ganhou as duas informações que realmente importam pra coding: quota semanal da assinatura e janela móvel de cinco horas. Kilo, Novita, Moonshot e Grok mostram saldo restante. Uma integração separada da Anthropic Console mostra gasto de API no mês, sem confundir isso com a assinatura do Claude Code. Ela deixa explícito que o Cost API não inclui Priority Tier.</p>
<p>Também dá pra cadastrar várias contas da Anthropic, ver limites semanais específicos de modelos como Fable e enxergar um marcador de ritmo. A barra não fica vermelha só porque chegou em 40%; ela compara o percentual gasto com quanto da janela já passou. Se usei 40% em 20% da semana, estou rápido demais. Essa é a informação útil.</p>
<p>O projeto deixou de ser só Waybar. Tem app nativo de menu bar no macOS, extensão do GNOME e a TUI standalone. E a novidade mais recente é um monitor local de contexto do Claude Code: aperto <code>c</code>, escolho uma das sessões recentes e vejo quanto da janela já foi consumido. Ele lê caudas limitadas dos JSONL locais e não inventa porcentagem quando não consegue determinar o tamanho da janela.</p>
<p>No meu fluxo, o trio acaba se encontrando naturalmente. <code>ai-usagebar</code> mostra qual assinatura ainda tem espaço. <code>ai-memory run</code> troca de harness sem jogar fora o trabalho. <code>ai-jail</code> deixa o escolhido trabalhar em YOLO sem acesso irrestrito à máquina.</p>
<h2>Atualizando<span class="hx:absolute hx:-mt-20" id="atualizando"></span>
    <a href="#atualizando" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>As páginas de instalação dos três projetos têm todos os métodos, incluindo AUR, Homebrew e binários de release:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a></li>
<li><a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a></li>
<li><a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a></li>
</ul>
<p>Depois de atualizar o ai-memory, reinstale os hooks dos harnesses que pretende usar no modo gerenciado. Os três principais no meu caso:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-memory install-hooks --agent claude-code --apply
</span></span><span class="line"><span class="cl">ai-memory install-hooks --agent codex --apply
</span></span><span class="line"><span class="cl">ai-memory install-hooks --agent opencode --apply</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Crush não precisa de hook no modo gerenciado; ele recebe o contexto por um arquivo temporário configurado só pro processo lançado. A <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/managed-workstreams.md"target="_blank" rel="noopener">documentação de managed workstreams</a> tem os detalhes de instalação, privacidade, recuperação e os argumentos nativos de cada adapter.</p>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Um mês atrás, o ai-memory já conseguia transformar sessão em wiki e entregar um handoff pro próximo agente. Agora ele consegue gerenciar a própria linha de trabalho: adota uma sessão existente, mantém uma sessão nativa por harness, transporta o histórico visível, retoma cada cliente no formato dele e deixa o ledger inteiro pesquisável.</p>
<p>Pra mim, é aí que está o valor. O código contém a implementação que venceu. A sessão contém as decisões, experimentos que falharam, gotchas, bugs inesperados e mudanças de ideia que produziram aquela implementação. Jogar isso fora toda vez que muda de provider é desperdício.</p>
<p>Raw transcript também não resolve sozinho. É grande, repetitivo e caro pra enfiar em qualquer contexto. O ai-memory mantém a evidência, entrega só o delta recente e usa consolidação pra transformar o que merece sobreviver em páginas Markdown curtas.</p>
<p>Ainda há formatos novos pra suportar, arestas de plataforma e muito teste pela frente. A diferença é que agora existe uma base real, com acceptance test chamando harness de verdade, 14 contribuidores externos com PR mergeado em pouco mais de um mês e uso diário empurrando o desenho.</p>
<p>LLM e assinatura eu alugo de quem estiver entregando melhor hoje. A sessão do meu projeto fica comigo.</p>
]]></content:encoded><category>ai-memory</category><category>agentes-de-codigo</category><category>ai-jail</category><category>ai-usagebar</category></item><item><title>Brincando de TUI com LLMs - Ratatui+Bubbletea</title><link>https://akitaonrails.github.io/2026/06/08/brincando-tui-llms-ratatui-bubbletea/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/06/08/brincando-tui-llms-ratatui-bubbletea/</guid><pubDate>Mon, 08 Jun 2026 16:00:00 -0300</pubDate><description>&lt;p&gt;Antes de falar do brinquedo novo, um lembrete rápido: &lt;a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener"&gt;ai-jail&lt;/a&gt; e &lt;a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener"&gt;ai-memory&lt;/a&gt; continuam recebendo bastante atenção. Issues, pull requests, pequenas correções, melhorias de empacotamento, bugs de ambiente, ajustes de documentação. Aquelas coisas que ninguém vê num post de lançamento, mas que transformam experimento em ferramenta que dá pra usar todo dia.&lt;/p&gt;
&lt;p&gt;Eu gosto dessa fase. O projeto deixa de ser &amp;ldquo;o que eu imaginei no meu setup&amp;rdquo; e vira &amp;ldquo;o que quebra na máquina de outra pessoa&amp;rdquo;. Aí aparece Windows, macOS, Arch, AUR, path esquisito, token salvo em lugar diferente, shell diferente, terminal diferente. Chato? Sim. Necessário? Também.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Antes de falar do brinquedo novo, um lembrete rápido: <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a> e <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a> continuam recebendo bastante atenção. Issues, pull requests, pequenas correções, melhorias de empacotamento, bugs de ambiente, ajustes de documentação. Aquelas coisas que ninguém vê num post de lançamento, mas que transformam experimento em ferramenta que dá pra usar todo dia.</p>
<p>Eu gosto dessa fase. O projeto deixa de ser &ldquo;o que eu imaginei no meu setup&rdquo; e vira &ldquo;o que quebra na máquina de outra pessoa&rdquo;. Aí aparece Windows, macOS, Arch, AUR, path esquisito, token salvo em lugar diferente, shell diferente, terminal diferente. Chato? Sim. Necessário? Também.</p>
<p>Mas o prato principal de hoje não é ai-jail nem ai-memory. É TUI. Mais especificamente, é minha mania recente de escrever pequenas ferramentas de terminal em Rust com <a href="https://ratatui.rs/"target="_blank" rel="noopener">Ratatui</a>, mas querendo que elas fiquem com cara de <a href="https://github.com/charmbracelet/bubbletea"target="_blank" rel="noopener">Bubble Tea</a>.</p>
<h2>O app que não vou abrir<span class="hx:absolute hx:-mt-20" id="o-app-que-não-vou-abrir"></span>
    <a href="#o-app-que-n%c3%a3o-vou-abrir" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Nas últimas semanas também mexi num projeto privado que não pretendo abrir. É uma TUI pra acompanhar minha conta nos EUA, investimentos, assets, posições, covered calls, open calls, essas coisas chatas de adulto. Não vou publicar o código porque é o tipo de ferramenta que nasceu colada no meu fluxo financeiro, nas minhas planilhas, nos meus extratos e nas minhas gambiarras internas. Abrir isso seria transformar uma ferramenta minha em suporte gratuito pra bug de banco dos outros. Tô fora.</p>
<p>Mas dá pra mostrar a cara geral. Censurei o que precisava censurar:</p>
<p><strong>Observação óbvia, mas vou deixar explícito: todos os valores, tickers, posições e datas mostrados no screenshot são dados falsos de demonstração. Não é dado real da minha conta, nem portfolio real, nem recomendação de investimento.</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-portfolio-censored.png" alt="TUI privada de portfolio em terminal, com abas de dashboard e tabela de holdings. O nome do banco foi censurado."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-allocation-censored.png" alt="TUI privada mostrando uma visão de alocação por classe de asset, com nomes sensíveis censurados."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-open-calls-censored.png" alt="TUI privada mostrando uma aba de open calls com dados falsos de demonstração e nomes sensíveis censurados."  loading="lazy" /></p>
<p>Toda vez que faço uma TUI pequena, a mesma dúvida aparece: que stack usar?</p>
<p>Se eu fosse escrever tudo na unha, provavelmente escolheria Python ou Go. São linguagens mais confortáveis pra esse tipo de utilitário pequeno. Python porque é direto, cheio de biblioteca, ótimo pra script que conversa com API e parseia JSON. Go porque gera binário simples, cruza plataforma bem, e tem ergonomia boa pra CLI.</p>
<p>Só que hoje eu raramente escrevo esse código todo na unha. Eu orquestro Claude, Codex, OpenCode, mando revisar, mando refatorar, mando testar. Nesse cenário, a falta de ergonomia do Rust pesa menos, porque quem briga com borrow checker, trait bound e lifetime chato é o LLM. Eu fico mais no papel de revisor e usuário final. E aí Rust começa a ficar muito atraente.</p>
<p>Ferramental bom. <code>cargo</code> é ótimo. Testes são fáceis de rodar. Cross compile é administrável. O binário final é limpo. Erro de memória idiota praticamente some. Não estou dizendo que Rust é magicamente melhor que Go ou Python pra toda TUI. Não é. Mas com LLM escrevendo a maior parte, o custo que normalmente me faria evitar Rust cai bastante. E os modelos atuais estão surpreendentemente competentes em Rust, desde que você mande rodar teste, consertar warning e não aceite a primeira versão como se fosse revelação divina.</p>
<h2>Ratatui é bom, mas eu queria a cara do Charm<span class="hx:absolute hx:-mt-20" id="ratatui-é-bom-mas-eu-queria-a-cara-do-charm"></span>
    <a href="#ratatui-%c3%a9-bom-mas-eu-queria-a-cara-do-charm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://ratatui.rs/"target="_blank" rel="noopener">Ratatui</a> é uma biblioteca Rust pra construir interfaces ricas no terminal: dashboards, apps interativos, tabelas, listas, gauges, layouts, tudo aquilo que antigamente a gente chamava de &ldquo;ncurses moderno&rdquo;. Ele é o sucessor espiritual do <code>tui-rs</code>, e hoje é provavelmente o caminho mais óbvio se você quer fazer TUI séria em Rust.</p>
<p>Ratatui funciona bem. O problema é gosto pessoal: por padrão, não acho bonito. Não é feio no sentido &ldquo;isso parece programa de DOS de 1993&rdquo;. Dá pra fazer coisa boa. Mas muita TUI em Ratatui cai naquela estética quadrada, cinza, funcional, meio admin panel de datacenter.</p>
<p>Eu gosto mais da pegada da <a href="https://charm.sh/"target="_blank" rel="noopener">Charmbracelet</a>. O <code>gum</code>, por exemplo, é uma coleção de comandos pra deixar shell script interativo sem virar festival de <code>read -p</code> e <code>case</code>. Prompt, select, filter, spinner, tabela, pager, estilo. Você monta um script bash com cara de app decente em minutos.</p>
<p>E tem o <a href="https://github.com/charmbracelet/bubbletea"target="_blank" rel="noopener">Bubble Tea</a>, em Go, inspirado na arquitetura Elm. Você tem um model, recebe mensagens, atualiza estado, renderiza uma view. É uma ideia simples e muito boa pra terminal: estado entra, evento entra, view sai. A Charm também tem um gosto visual que eu curto: cores boas, espaçamento decente, componentes leves, nada com cara de formulário WinForms jogado no terminal.</p>
<p>Então eu queria o seguinte: continuar em Rust com Ratatui, mas roubar a sensação de Bubble Tea. Não o runtime inteiro. Não um clone perfeito. Só a direção visual e alguns componentes.</p>
<p>Daí nasceu o <a href="https://github.com/akitaonrails/ratatui-bubbletea"target="_blank" rel="noopener">ratatui-bubbletea</a>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/ratatui-bubbletea-example.png" alt="Showcase do ratatui-bubbletea rodando em terminal, com SelectList, Spinner, Theme, ThemedTable, TextInput, Progress e Viewport no estilo Charm."  loading="lazy" /></p>
<p>O projeto não substitui o Ratatui. Ele fica por cima. A ideia é oferecer uma camada de tema e componentes com inspiração em Bubble Tea/Bubbles, mas ainda renderizando com Ratatui.</p>
<p>Hoje ele é dividido em crates:</p>
<ul>
<li><code>ratatui-bubbletea-theme</code>, com paleta, helpers e estilos compartilhados.</li>
<li><code>ratatui-bubbletea-components</code>, com componentes prontos como select list, spinner, progress, table, text input, viewport e help.</li>
<li><code>ratatui-tea</code>, opcional, pra quem quer uma ergonomia mais perto de <code>Model</code>, <code>Msg</code> e <code>Cmd</code>, sem fingir que Rust virou Go.</li>
</ul>
<p>O README tem os exemplos completos e a documentação do que já existe. Por enquanto, eu trato como toolkit pequeno. Serve pra meus apps, e se servir pra mais alguém, ótimo. Se não servir, também não tem drama. O objetivo era parar de reimplementar o mesmo tema e os mesmos widgets toda vez que eu começava uma TUI nova.</p>
<h2>ai-usagebar como exemplo público<span class="hx:absolute hx:-mt-20" id="ai-usagebar-como-exemplo-público"></span>
    <a href="#ai-usagebar-como-exemplo-p%c3%bablico" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Como não vou abrir o app financeiro, precisava de um exemplo público usando essa estética. Então atualizei meu <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>.</p>
<p>Pra quem não lembra, expliquei o projeto no post <a href="/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/">&ldquo;Criei um Widget de Waybar pra Omarchy pra Monitorar Uso de Planos de LLM: ai-usagebar&rdquo;</a>. Ele nasceu como widget de Waybar pra mostrar uso de planos de LLM: Claude, OpenAI Codex/ChatGPT, Z.AI, OpenRouter. Bateu o olho na barra, sabe se está perto do limite e qual vendor usar agora.</p>
<p>Depois virou também TUI standalone. E graças a contribuições, hoje suporta Windows também. Isso é engraçado porque a origem dele é totalmente Linux/Omarchy/Waybar. Mas é open source: alguém usa em outro ambiente, encontra atrito, manda PR, e pronto, o projeto fica menos provinciano.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/ai-usagebar.png" alt="ai-usagebar em modo TUI mostrando dashboard de uso de OpenAI, abas de vendors, gauges de limite e atalhos no rodapé."  loading="lazy" /></p>
<p>No ai-usagebar a diferença visual não muda a vida de ninguém. É uma tela simples. Abas, gauges, texto, atalhos. Mas é um bom exemplo porque é pequeno, real, testado, empacotado, e não depende do meu app privado. Dá pra olhar o código e ver como apliquei a camada de tema.</p>
<h2>Os apps de coceira própria<span class="hx:absolute hx:-mt-20" id="os-apps-de-coceira-própria"></span>
    <a href="#os-apps-de-coceira-pr%c3%b3pria" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esses projetos todos seguem a mesma lógica: eu tenho uma coceira, faço uma ferramenta pequena, uso, ajusto, empacoto. Nada de roadmap de startup. Nada de manifesto. Só ferramenta que resolve um incômodo meu.</p>
<p>Um exemplo recente é o <a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">clock-tui</a>. Ele não nasceu comigo. Era um projeto Rust antigo, <code>tclock</code>, que parecia abandonado. Eu queria um relógio grande no meu segundo monitor vertical. Aquele monitor fica do lado, e eu gosto de ter um &ldquo;desk clock&rdquo; enorme ocupando parte da tela. Usei o clock-tui original por um tempo.</p>
<p>Só que uma tela vertical inteira só pra mostrar hora é desperdício. Eu já tinha o <a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>, que lista issues e PRs abertos em todos os meus projetos. Ele é meu &ldquo;tem alguém esperando resposta?&rdquo; em formato de CLI. Também queria ver minha agenda.</p>
<p>Então fiz outro app pequeno: <a href="https://github.com/akitaonrails/google-calendar-tui"target="_blank" rel="noopener">google-calendar-tui</a>. Ele usa as contas Gmail já registradas no GNOME Online Accounts e resume meus próximos compromissos no terminal. Read-only. Sem ritual de OAuth novo. Sem mais um config secreto espalhado em lugar esquisito.</p>
<p>Com essas duas peças, modernizei o clock-tui e adicionei layout de widgets auto-refresh. Agora o relógio ocupa a tela como eu queria, mas em volta dele aparecem pendências do GitHub e agenda do Google Calendar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/tclock.png" alt="tclock em monitor vertical, com relógio grande, widget de pendências do GitHub à esquerda e agenda do Google Calendar à direita."  loading="lazy" /></p>
<p>Isso é exatamente o tipo de coisa que eu nunca faria se custasse um fim de semana inteiro. Mas com LLM, vira uma sequência de tarefas pequenas: lê o projeto antigo, moderniza dependências, roda teste, adiciona módulo de widget, chama ghpending, chama google-calendar-tui, organiza layout, corrige bug, empacota. Ainda dá trabalho. Mas é trabalho de supervisão e refinamento, não de ficar brigando com boilerplate.</p>
<h2>Ajustando Geary sem fork<span class="hx:absolute hx:-mt-20" id="ajustando-geary-sem-fork"></span>
    <a href="#ajustando-geary-sem-fork" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Outra coceira veio do GNOME.</p>
<p>Como eu queria centralizar minhas contas no GNOME Online Accounts, comecei a usar <a href="https://wiki.gnome.org/Apps/Geary"target="_blank" rel="noopener">Geary</a> e o calendário do GNOME no segundo monitor também. Gosto da ideia: contas configuradas uma vez, apps do desktop reaproveitando a mesma infraestrutura, nada de cada programinha inventar seu próprio login.</p>
<p>O problema é que o Geary tem um layout fixo de três colunas. Numa tela normal, tudo bem. Num monitor vertical, fica apertado. A coluna de pastas, a lista de mensagens e o corpo do e-mail brigam por espaço. Eu não queria manter um fork do Geary só pra esconder uma sidebar. Fork de app GTK grande é dívida. Você pisca e passa o resto da vida resolvendo conflito de merge.</p>
<p>Então fiz um módulo GTK: <a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">geary-hide-sidebar-module</a>. Ele injeta um comportamento no Geary em runtime e permite recolher/expandir a sidebar, com atalho e auto-collapse em janela estreita. Sem recompilar Geary. Sem manter fork. Só um módulo pequeno com uma responsabilidade bem específica.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/geary-sidebar-hidden.png" alt="Geary com sidebar recolhida, mostrando lista de e-mails e corpo da mensagem em layout mais confortável para tela vertical."  loading="lazy" /></p>
<p>Essa é uma lição boa: às vezes você não precisa forkar a aplicação inteira. Dá pra ajustar por fora. GTK_MODULES existe. Wrapper existe. Config existe. CSS existe. Script existe. Nem toda personalização precisa virar uma manutenção eterna de código dos outros.</p>
<h2>Código pequeno ficou barato<span class="hx:absolute hx:-mt-20" id="código-pequeno-ficou-barato"></span>
    <a href="#c%c3%b3digo-pequeno-ficou-barato" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>É por isso que estou insistindo tanto nessa ideia de apps pequenos. Com LLMs atuais, ficou muito fácil implementar uma ideia específica pra deixar seu ambiente do jeito que você quer. Sem esperar alguém ter exatamente a mesma dor. Sem ficar procurando no GitHub por três horas uma ferramenta que faz 80% do que você quer e 40% do que você não quer.</p>
<p>Você descreve a coceira, cria um repo, pede um protótipo, testa, manda refatorar, manda escrever teste, manda empacotar. Se ficar ruim, joga fora. Se ficar bom, instala e usa.</p>
<p>Eu não deixo isso virar gambiarra jogada no <code>~/bin</code> sem dono. Meus apps têm testes. Têm builds automatizados. Muitos têm release no GitHub, pacote no AUR, instalação normal com <code>yay</code> no Arch. Usam paths XDG, então config vai pra <code>~/.config</code>, cache vai pra <code>~/.cache</code>, dados vão pra <code>~/.local/share</code>. Fica organizado. Dá pra atualizar. Dá pra remover. Dá pra outra pessoa clonar e contribuir.</p>
<p>Pra fechar, os links todos num lugar só:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ratatui-bubbletea"target="_blank" rel="noopener">ratatui-bubbletea</a></li>
<li><a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a></li>
<li><a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">clock-tui</a></li>
<li><a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a></li>
<li><a href="https://github.com/akitaonrails/google-calendar-tui"target="_blank" rel="noopener">google-calendar-tui</a></li>
<li><a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">geary-hide-sidebar-module</a></li>
<li><a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a></li>
<li><a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a></li>
</ul>
<p>Se você usar algum deles e quebrar no seu setup, abre issue. Se souber corrigir, manda PR. Eu uso essas ferramentas de verdade, então bug report útil tende a virar correção rápido.</p>
<p>Minha regra prática é essa: personalize seu ambiente sem transformar tudo em gambiarra. Faça ferramenta pequena. Teste. Empacote. Documente. Deixe o LLM carregar o peso chato e use seu cérebro pra decidir o que presta.</p>
<p>Essa é a parte divertida de programar que tinha sumido um pouco. Agora voltou.</p>
]]></content:encoded><category>ai-usagebar</category><category>ferramentas-de-desenvolvimento</category><category>rust</category><category>open-source</category></item><item><title>Dicas e Toolkit de IA do Akita: ai-jail, ai-memory, ai-usagebar</title><link>https://akitaonrails.github.io/2026/05/24/dicas-e-toolkit-de-ia-do-akita-ai-jail-ai-memory-ai-usagebar/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/05/24/dicas-e-toolkit-de-ia-do-akita-ai-jail-ai-memory-ai-usagebar/</guid><pubDate>Sun, 24 May 2026 10:30:00 -0300</pubDate><description>&lt;p&gt;No post da semana passada, &lt;a href="https://akitaonrails.github.io/2026/05/14/terminando-maratona-ia-sucesso-ou-fracasso/"&gt;&amp;ldquo;Terminando a Maratona de IA: Sucesso ou Fracasso?&amp;rdquo;&lt;/a&gt;, eu encerrei a primeira fase da minha maratona. Mais de 600 horas de uso intenso de agentes de código, dezenas de projetos, centenas de milhares de linhas de código e documentação, e uma pilha de conclusões práticas. Não de marketing. Práticas.&lt;/p&gt;
&lt;p&gt;Vou repetir uma coisa importante antes que alguém saia clonando todos os meus repositórios achando que virou produto 1.0: a maior parte dos projetos &lt;code&gt;frank-*&lt;/code&gt; no meu GitHub são provas de conceito. São experimentos. Alguns funcionam bem pra mim, no meu ambiente, no meu fluxo. Isso não quer dizer que estão prontos pra virar dependência crítica da sua empresa amanhã de manhã. Quer brincar, contribuir, estudar, ótimo. Só não confunda &amp;ldquo;publiquei no GitHub&amp;rdquo; com &amp;ldquo;está production ready&amp;rdquo;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>No post da semana passada, <a href="/2026/05/14/terminando-maratona-ia-sucesso-ou-fracasso/">&ldquo;Terminando a Maratona de IA: Sucesso ou Fracasso?&rdquo;</a>, eu encerrei a primeira fase da minha maratona. Mais de 600 horas de uso intenso de agentes de código, dezenas de projetos, centenas de milhares de linhas de código e documentação, e uma pilha de conclusões práticas. Não de marketing. Práticas.</p>
<p>Vou repetir uma coisa importante antes que alguém saia clonando todos os meus repositórios achando que virou produto 1.0: a maior parte dos projetos <code>frank-*</code> no meu GitHub são provas de conceito. São experimentos. Alguns funcionam bem pra mim, no meu ambiente, no meu fluxo. Isso não quer dizer que estão prontos pra virar dependência crítica da sua empresa amanhã de manhã. Quer brincar, contribuir, estudar, ótimo. Só não confunda &ldquo;publiquei no GitHub&rdquo; com &ldquo;está production ready&rdquo;.</p>
<p>Existem exceções. O <a href="https://github.com/akitaonrails/frankmd"target="_blank" rel="noopener">FrankMD</a>, por exemplo, recebeu uma quantidade decente de contribuições, testes, lapidação, correções de bugs reais, uso real. Hoje ele já é bem mais estável do que era no primeiro post. Ainda assim, o ponto continua: esses projetos nasceram como laboratório de vibe coding, não como plano de produto de 3 anos com roadmap, suporte enterprise e SLA.</p>
<p>Este post é um apanhado do que aprendi nesse laboratório. Algumas ferramentas minhas, alguns hábitos, algumas recomendações. Nada místico. Nenhuma &ldquo;nova forma revolucionária de programar&rdquo;. É engenharia velha com ferramenta nova.</p>
<h2>Primeiro: pare de colecionar agente<span class="hx:absolute hx:-mt-20" id="primeiro-pare-de-colecionar-agente"></span>
    <a href="#primeiro-pare-de-colecionar-agente" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se você é desenvolvedor normal, você não precisa de 12 agentes, 40 wrappers, 7 orquestradores e um diagrama de Kubernetes pra escolher quem vai escrever um <code>if</code>.</p>
<p>Na prática, foque em <strong>Claude Code</strong>, <strong>Codex</strong> ou <strong>opencode</strong>. Só isso.</p>
<p>Sim, existe Gemini CLI. Sim, existe Cursor. Sim, existe Windsurf, Crush, OpenClaw, Pi, Aider, e amanhã vai aparecer mais meia dúzia. Eu testei um monte. Leia meus posts de benchmark de LLMs, especialmente o <a href="/2026/04/24/llm-benchmarks-parte-3-deepseek-kimi-mimo/">&ldquo;LLM Benchmarks Parte 3: DeepSeek, Kimi, MiMo&rdquo;</a>. A conclusão é chata e óbvia: hoje, as melhores opções de custo-benefício pra programação pesada são <strong>Opus 4.7</strong> e <strong>GPT 5.5</strong> nos planos Pro/Plus/Max subsidiados. Nada chega perto quando o assunto é trabalhar várias horas por dia com agente de código de verdade.</p>
<p>Pagar token direto é caro. Pagar plano mensal subsidiado sai muito mais barato. É por isso que eu vivo alternando entre Claude Code e Codex: não porque eu quero &ldquo;multi-agent architecture&rdquo;, mas porque os planos têm limites e eu trabalho muitas horas seguidas.</p>
<p>DeepSeek v4 e Kimi 2.6 são mais baratos? Sim. São usáveis? Sim. Eu gosto deles pra vários casos. Mas pra <strong>Agile Vibe Coding</strong> do jeito que venho defendendo desde o post <a href="/2026/02/20/do-zero-a-pos-producao-em-1-semana-como-usar-ia-em-projetos-de-verdade-bastidores-do-the-m-akita-chronicles/">&ldquo;Do Zero à Pós-Produção em 1 Semana&rdquo;</a>, ainda falta. Eles tropeçam mais em continuidade, em refatoração longa, em testes, em entender o projeto inteiro. Dá pra usar? Dá. Mas se o objetivo é produtividade consistente, Opus e GPT ainda são a régua.</p>
<p>Rodar modelo open source local é legal. Eu mesmo brinquei bastante com isso no review do <a href="/2026/03/31/review-minisforum-ms-s1-max-amd-ai-max-395/">Minisforum MS-S1 Max com AMD AI Max+ 395</a>. Pra one-shot, pra estudar, pra brincar com inferência local, é divertido. Pra Agile Vibe Coding o dia inteiro, todo dia, ainda não é prático. Latência, contexto, qualidade, manutenção do setup, VRAM, tudo cobra imposto.</p>
<p>Também não é prático ficar rodando múltiplos LLMs em paralelo, tipo &ldquo;planner + executor + reviewer + juiz&rdquo;. Eu testei isso no post <a href="/2026/04/25/llm-benchmarks-vale-a-pena-misturar-2-modelos/">&ldquo;LLM Benchmarks: Vale a Pena Misturar 2 Modelos?&rdquo;</a>. A ideia é bonita no papel. Na prática, aumenta custo, aumenta latência, aumenta superfície de erro, e o ganho não paga a complexidade.</p>
<p>O segredo não é ter um monte de agentes. Esquece OpenClaw ou Pi pra programação do dia a dia. O segredo é processo de engenharia. XP. Testes. <a href="/2026/04/20/clean-code-para-agentes-de-ia/">Clean Code pra agentes de IA</a>. CI. Pair programming. Refatoração constante. Código pequeno. Deploy automatizado. Feedback rápido.</p>
<p>Ferramenta ajuda. Engenharia ganha.</p>
<h2>ai-jail: autonomia com cerca<span class="hx:absolute hx:-mt-20" id="ai-jail-autonomia-com-cerca"></span>
    <a href="#ai-jail-autonomia-com-cerca" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O primeiro projeto que quero destacar é o <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a>. Ele é um wrapper de sandbox pra rodar agentes de IA com acesso restrito ao sistema. No Linux usa <code>bubblewrap</code> (<code>bwrap</code>) e Landlock. No macOS usa <code>sandbox-exec</code>. A ideia é simples: o agente enxerga o ambiente que precisa pra trabalhar, mas não sai fuçando seu sistema inteiro.</p>
<p>Uso todo dia? Sim. Uso sempre? Não.</p>
<p>Quando sei que não vou fazer nada arriscado, abro <code>claude</code> ou <code>codex</code> direto. Se vou mexer num projeto simples, só rodar testes, editar markdown, refatorar coisa local, muitas vezes nem me preocupo. Em mais de 600 horas de Agile Vibe Coding intenso, mais de meio milhão de linhas de código e documentação, nunca tive um caso desses folclóricos de LLM destruindo meu sistema host de um jeito irrecuperável.</p>
<p>E olha que eu usei agentes explicitamente pra configurar meu Omarchy. ZSH, Hyprland, Waybar, configs de terminal, scripts de login, tudo. Nunca fizeram nada que eu não pedi.</p>
<p>Essas histórias de &ldquo;o agente deletou meu home inteiro sozinho&rdquo; eu leio com um pé atrás. Na minha experiência, quando você pede pra deletar algo perigoso, Claude e Codex perguntam confirmação. Você precisa dizer sim. Se você disse sim sem ler, a culpa não é mágica negra do LLM. É usuário no modo zumbi.</p>
<p>Dito isso: nada é garantido. Daí o ai-jail.</p>
<p>Meu uso preferido é combinar <code>ai-jail</code> com o modo sem freio do harness:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-jail claude --dangerously-allow-permissions
</span></span><span class="line"><span class="cl">ai-jail codex --dangerously-bypass-approvals-and-sandbox</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Parece contraditório, mas faz sentido. Eu tiro a fricção de confirmação dentro do agente, mas coloco uma cerca no nível do sistema operacional. O agente pode trabalhar rápido dentro do projeto, mas o filesystem do host fica essencialmente read-only. O diretório atual fica read-write. O que eu mapear explicitamente com <code>--rw-map</code> também fica read-write. O resto não é pra tocar.</p>
<p>O README do ai-jail resume bem: é um sandbox wrapper pra agentes como Claude Code, GPT Codex, OpenCode e Crush. No primeiro run ele cria um <code>.ai-jail</code> no projeto, que pode ser commitado. Suporta <code>--dry-run</code> pra ver os mounts antes de executar, <code>--lockdown</code> pra modo mais restritivo, <code>--private-home</code> pra esconder dotfiles reais, <code>--mask .env</code> pra esconder arquivos sensíveis dentro do próprio projeto, e perfis de navegador isolado pra Chromium/Firefox.</p>
<p>O ponto importante: não venda isso como segurança absoluta. Processo sandbox não é VM. Kernel bug existe. Side channel existe. macOS tem limitações. O próprio README é claro: se você precisa isolar workload hostil de verdade, use uma VM descartável. Eu não uso ai-jail como &ldquo;blindagem militar&rdquo;. Uso como mais uma camada, boa o suficiente pro fluxo de desenvolvimento.</p>
<p>E mesmo dentro do projeto, tudo é Git. Eu faço push frequente pro GitHub ou pro meu Gitea privado. Então o pior caso realista é o agente destruir o diretório do projeto. Chato? Sim. Catastrófico? Não. Clono de novo. Volto do remote. Refaço o que estava local. Se o <code>.git</code> corromper, apago tudo e clono de novo.</p>
<p>Secrets também têm cópia fora. <code>.env</code>, tokens, keys, tudo que importa fica no Bitwarden. <a href="/2025/09/10/omarchy-2-0-bitwarden-self-hosted-vaultwarden/">Self-hosted em Vaultwarden</a>, claro. Então se eu perder o diretório local, não perdi a chave do reino.</p>
<p>O risco mais comum não é o agente deletar tudo. É você vazar segredo no Git. Isso aconteceu comigo mais de uma vez. Você dá <code>git add .</code>, esquece um <code>.env</code>, empurra pro remote, parabéns. Acontece. Por isso tem que olhar <code>git status</code>, <code>git diff --cached</code>, e pensar antes de dar push.</p>
<p>Mesmo quando acontece, os LLMs são muito competentes pra ajudar a reescrever histórico. Peço pra limpar o segredo do Git, forçar push, revisar se sumiu, e depois eu rotaciono a key. Não é bonito, mas é administrável.</p>
<p>Então sim, recomendo usar Claude/Codex com permissões perigosas <strong>dentro</strong> do ai-jail. Existe a chance de 0,001% de acidente irrecuperável? Existe. Mas se você é bom engenheiro, isso não deveria te matar. Eu tenho camadas: snapshots automáticos em Btrfs, restic pro NAS, NAS arquivando offsite em AWS Glacier, Git remoto, Bitwarden. Ferramenta nenhuma substitui backup.</p>
<h2>ai-memory: contexto que sobrevive ao harness<span class="hx:absolute hx:-mt-20" id="ai-memory-contexto-que-sobrevive-ao-harness"></span>
    <a href="#ai-memory-contexto-que-sobrevive-ao-harness" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O segundo é o <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, que expliquei em detalhes no post <a href="/2026/05/23/criei-sistema-memoria-agentes-codigo-ai-memory/">&ldquo;Criei um Sistema de Memória pra Agentes de Código: ai-memory&rdquo;</a>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/23/ai-memory/ai-memory-logo.png" alt="Logo do projeto ai-memory: pictograma circular com um chip estilizado abrindo “asas” tipo bibliotecas/páginas pra cada lado, ao lado do texto ai-memory em itálico."  loading="lazy" /></p>
<p>A motivação é simples: harnesses perdem contexto. Claude Code compacta. Codex compacta. opencode compacta. Sessão acaba. Você abre outro agente e ele não sabe o que aconteceu nas últimas 4 horas. Se você usa só um harness, talvez isso não incomode tanto. Se você alterna entre Claude e Codex como eu, incomoda rápido.</p>
<p>Eu queria um consolidador de memória de longo prazo que funcionasse atravessando harnesses diferentes. Algo que permitisse handoff entre Claude, Codex e opencode sem eu ficar escrevendo <code>HANDOFF.md</code> manual toda vez. Algo que capturasse prompts, tool calls e eventos de sessão via hooks, consolidasse em páginas markdown, indexasse com SQLite/FTS5, e expusesse tudo via MCP quando o agente precisasse consultar.</p>
<p>Outro motivador foi o que expliquei no post <a href="/2026/04/06/rag-esta-morto-contexto-longo/">&ldquo;RAG Está Morto? Contexto Longo, Grep e o Fim do Vector DB Obrigatório&rdquo;</a>. Pra projeto de código, quase sempre texto simples resolve mais do que arquitetura afetada de vector DB. Markdown, <code>grep</code>, SQLite FTS5, contexto longo e bons arquivos em <code>docs/</code> já levam você longe. O ai-memory segue essa linha: compila memória em texto, deixa no disco, indexa simples, e só chama LLM quando vale consolidar.</p>
<p>O ai-memory não foi feito pra ser uma knowledge base navegável por usuário final. Ele tem uma UI web read-only, sim, mas isso é pra auditoria e inspeção. A memória é otimizada pra LLM consumir. É um wiki interno que o harness pode consultar quando acha que precisa. É um lugar onde posso pedir explicitamente &ldquo;salva isso pra próxima sessão&rdquo; e esperar que sobreviva mais do que a compactação padrão do Claude ou do Codex.</p>
<p><img src="https://raw.githubusercontent.com/akitaonrails/ai-memory/main/docs/web-projects-home.png" alt="Homepage da UI web do ai-memory mostrando projetos detectados, contagem de páginas, última atividade e o aviso de que a memória é otimizada pra consumo por LLM, não documentação curada por humanos."  loading="lazy" /></p>
<p>O README resume bem: agentes de código perdem todo contexto quando a sessão termina; o ai-memory dá a eles um wiki persistente compartilhado. Cada prompt, tool call e decisão pode ser capturado automaticamente. No fim da sessão, páginas relevantes são reescritas como narrativa coerente. Na próxima sessão, outro agente pode receber um handoff já prepended no contexto.</p>
<p>Isso é útil quando você fecha Claude às 18h, abre Codex no dia seguinte no mesmo diretório, e quer que ele saiba que você estava testando session cookies porque rotação de JWT tinha dado problema. Ou quando você volta a um projeto seis semanas depois e não lembra por que descartou Redis.</p>
<p>Mas não confunda com documentação canônica. Se você fez uma pesquisa importante que não quer perder, peça pro agente escrever um markdown em <code>docs/</code> dentro do projeto. Decisão arquitetural, benchmark, análise de biblioteca, runbook de deploy, tudo que precisa sobreviver com garantia deve virar arquivo explícito no repo. Isso é mais simples, auditável e versionado.</p>
<p>O ai-memory cobre a faixa intermediária: informação transitória que talvez importe depois. Um bug estranho que apareceu. Um raciocínio que levou a uma decisão. Um gotcha de ambiente. Um resumo de sessão. Coisas que você não quer transformar em doc oficial ainda, mas também não quer jogar fora.</p>
<p>Ele ainda é beta. Eu uso em produção pessoal, mas precisa de muito mais gente batendo nele. Tem integração com Claude Code, Codex e opencode mais polida. Gemini CLI, OpenClaw e clientes MCP exóticos ainda precisam de mais teste. PRs são bem-vindos. Bug report também. &ldquo;Instalei e quebrou no meu setup&rdquo; é exatamente o tipo de feedback que revela suposição errada.</p>
<h2>ai-usagebar: saber quando trocar de cavalo<span class="hx:absolute hx:-mt-20" id="ai-usagebar-saber-quando-trocar-de-cavalo"></span>
    <a href="#ai-usagebar-saber-quando-trocar-de-cavalo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Como falei acima, eu prefiro usar os planos subsidiados da Anthropic e da OpenAI. O problema é que, se você faz Agile Vibe Coding de verdade, você bate limite. Limite diário. Limite semanal. Limite de sessão. Limite que muda. Limite que não aparece direito em lugar nenhum.</p>
<p>Eu usava o <a href="https://github.com/mryll/claudebar"target="_blank" rel="noopener">claudebar</a>, que é bom, mas só cobre Claude. Eu queria ver os principais vendors num lugar só. Daí nasceu o <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>, que apresentei no post <a href="/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/">&ldquo;Criei um Widget de Waybar pra Omarchy pra Monitorar Uso de Planos de LLM: ai-usagebar&rdquo;</a>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-waybar.png" alt="Widget na Waybar mostrando “cld 29% · 1h 12m” no canto superior direito, com tooltip aberto exibindo o plano Claude Max 20x: Session 29%, Weekly 47%, Sonnet only 0%, Extra usage $0.00 sobre limite de $1100, e horário da última atualização."  loading="lazy" /></p>
<p>É um widget de Waybar e uma TUI em Rust pra monitorar uso de Anthropic Claude, OpenAI Codex/ChatGPT, Z.AI GLM e OpenRouter. Pra Claude e OpenAI, ele lê as credenciais OAuth que os CLIs oficiais já gravaram. Pra Z.AI e OpenRouter, usa API key. Mostra porcentagem da sessão, reset, limites, saldo, e permite trocar o vendor principal.</p>
<p>O valor disso é banal e por isso mesmo útil: bato o olho na barra e sei se devo continuar no Claude, fazer handoff pro Codex, ou recarregar crédito no OpenRouter. Não quero descobrir que cheguei no limite semanal no meio de uma refatoração grande.</p>
<p>Também tem a TUI standalone:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-tui-openai.png" alt="ai-usagebar-tui na aba OpenAI rodando num terminal: gauges de Codex 5h e semanal, bloco de Credits com faixas de contagem de mensagens, abas Claude / OpenAI / GLM (Z.AI) / OpenRouter no topo, atalhos de tecla no rodapé."  loading="lazy" /></p>
<p>Se você não usa Omarchy, Hyprland ou Waybar, ainda dá pra rodar <code>ai-usagebar-tui</code> em qualquer terminal. SSH, tmux, terminal normal, tanto faz. A barra é conveniência. A TUI é a forma universal.</p>
<h2>ghpending: pendência de GitHub sem ritual<span class="hx:absolute hx:-mt-20" id="ghpending-pendência-de-github-sem-ritual"></span>
    <a href="#ghpending-pend%c3%aancia-de-github-sem-ritual" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Depois da maratona, fiquei com dezenas de <code>ai-*</code> e <code>frank-*</code> no GitHub. Isso cria um problema chato: issues e pull requests começam a aparecer. Contribuidor abre PR. Alguém reporta bug. Outro manda sugestão. Se eu tiver que abrir o navegador, entrar repo por repo, filtrar aba por aba, eu vou adiar. E se eu adiar, fico semanas sem responder.</p>
<p>Sim, eu poderia usar <code>gh</code>, a CLI oficial do GitHub. Aliás, uso. Mas eu queria uma coisa mais burra e mais rápida: um comando curto pra imprimir um digest de tudo que está pendente nos repos que eu escolhi monitorar. Nasceu o <a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>, que descrevi no post <a href="/2026/05/23/criei-cli-pra-checar-pendencias-github-ghpending/">&ldquo;Criei um CLI pra Checar Pendências no Meu GitHub: ghpending&rdquo;</a>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/23/ghpending/ghpending-screenshot.png" alt="Saída do ghpending no terminal: tabela compacta listando cada repo monitorado com contagem de issues e pull requests abertos, autor da última atividade e há quanto tempo."  loading="lazy" /></p>
<p>É só isso: <code>ghpending add</code> pra escolher repos, <code>ghpending</code> pra ver o digest, <code>ghpending list</code>, <code>ghpending rm</code>. Sem autenticação funciona com limite de 60 req/h do GitHub. Com <code>GITHUB_TOKEN=$(gh auth token) ghpending</code>, sobe pra 5.000 req/h.</p>
<p>O ponto não é substituir o GitHub. É reduzir atrito. Se eu consigo rodar um comando no terminal e ver &ldquo;tem 3 PRs e 2 issues pra olhar&rdquo;, eu olho. Se depende de ritual de navegador, notificações e abas, fica pra depois.</p>
<p>E Claude/Codex são muito bons nesse tipo de trabalho. Dá pra pedir:</p>
<blockquote>
  <p>&ldquo;Checa os pull requests abertos, revisa o código, vê se compila, roda os testes, adiciona teste se faltar, faz rebase de master se precisar, mergeia e fecha.&rdquo;</p>

</blockquote>
<p>Ou:</p>
<blockquote>
  <p>&ldquo;Checa as issues abertas, avalia se tem bug real, reproduz se der, propõe correção, responde o usuário.&rdquo;</p>

</blockquote>
<p>Eles leem o PR, entendem o diff, rodam teste, fazem rebase, resolvem conflito simples, escrevem resposta pro contribuidor. Não é pra desligar o cérebro. É pra terceirizar o trabalho mecânico que você já sabe fazer.</p>
<h2>Refatoração: peça explicitamente, várias vezes<span class="hx:absolute hx:-mt-20" id="refatoração-peça-explicitamente-várias-vezes"></span>
    <a href="#refatora%c3%a7%c3%a3o-pe%c3%a7a-explicitamente-v%c3%a1rias-vezes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Claude e Codex são muito bons em refatorar, mas não presuma que vão fazer isso automaticamente do jeito que você faria. Eu costumo começar projetos ou features com instruções explícitas:</p>
<blockquote>
  <p>&ldquo;Use as melhores práticas de Rust. Evite duplicação desnecessária. Modularize só onde fizer sentido. Adicione unit tests pra toda feature nova. Siga princípios de <a href="/2026/04/20/clean-code-para-agentes-de-ia/">Clean Code</a>. Não crie abstração antes de precisar.&rdquo;</p>

</blockquote>
<p>Depois de uma feature grande, uma correção grande, ou algumas horas de desenvolvimento, paro e peço:</p>
<blockquote>
  <p>&ldquo;Agora que mexemos bastante no código, reavalie com calma. Delete código morto. Refatore duplicações óbvias. Adicione testes faltantes. Remova magic numbers. Veja se tem módulos grandes demais. Não mude comportamento sem teste.&rdquo;</p>

</blockquote>
<p>Antes de release:</p>
<blockquote>
  <p>&ldquo;Antes de publicar essa versão, faça uma auditoria de sanidade. Procure vazamento de secrets, permissões perigosas, comandos destrutivos, path traversal, unwraps desnecessários, falta de validação, e qualquer coisa que pareça vulnerabilidade óbvia.&rdquo;</p>

</blockquote>
<p>Isso garante segurança? Claro que não. Nem perto. Mas remove muito erro besta. É mais uma camada. Eu gosto de rodar essa auditoria com Claude e depois com Codex, porque cada um acha coisas diferentes. Mesmo assim, bug passa. Segurança é processo, não ritual mágico.</p>
<h2>Experimentos descartáveis: código ficou barato<span class="hx:absolute hx:-mt-20" id="experimentos-descartáveis-código-ficou-barato"></span>
    <a href="#experimentos-descart%c3%a1veis-c%c3%b3digo-ficou-barato" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes de escolher biblioteca, framework, arquitetura, modelo ou serviço, eu gosto de criar <code>experiments/</code>.</p>
<p>Exemplo:</p>
<blockquote>
  <p>&ldquo;Antes de escolher entre Qwen e DeepSeek, cria um protótipo descartável em <code>experiments/</code> pra A/B test. Documenta a análise em <code>docs/</code> com resultado, custo, latência, qualidade e recomendação.&rdquo;</p>

</blockquote>
<p>Isso mudou meu jeito de decidir. Antes, muita decisão de engenharia virava opinião, feeling, fé em benchmark dos outros. Agora código é barato. Peço pro agente fazer duas ou três versões, rodar teste, medir, documentar, jogar fora o que não presta.</p>
<p>Prototipar ficou rápido de verdade. O <a href="/2026/04/05/transformando-youtube-num-app-de-karaoke-frank-karaoke/">Frank Karaoke</a> é um bom exemplo: transformar YouTube num app de karaokê era o tipo de ideia que antes eu talvez deixasse numa lista mental por meses, esperando &ldquo;um fim de semana livre&rdquo; que nunca chega. Agora dá pra abrir um <code>experiments/</code>, pedir um protótipo tosco, testar o caminho técnico, e decidir se vale virar projeto. Olha meus outros posts de 2026 sobre os projetos <code>frank-*</code> e <code>ai-*</code>: quase todos começaram assim, como código descartável que provou alguma coisa antes de merecer nome.</p>
<p>Mas protótipo barato não significa one-shot. Já escrevi em <a href="/2026/04/15/como-falar-com-o-claude-code-efetivamente/">&ldquo;Por que as LLMs não te dão o resultado esperado&rdquo;</a>: prompt bom é conversa iterativa. Você dá contexto, mostra referência, aponta restrição, lê o resultado, corrige direção, manda refazer. Se você joga uma frase vaga e espera produto pronto, o erro é seu.</p>
<p>Também aprendi isso apanhando. No post do <a href="/2026/03/05/meu-primeiro-fracasso-com-vibe-code-e-como-consertei-frank-yomik/">Frank Yomik</a> contei meu primeiro fracasso real com vibe coding: quando a direção está errada, insistir no mesmo prompt só cava o buraco. Tem hora que precisa reduzir escopo, isolar o problema, criar teste, trocar estratégia. LLM não transforma plano ruim em engenharia boa.</p>
<p>E tem domínio onde você precisa estudar junto. No post de <a href="/2026/04/23/driveclub-shadps4-e-ia-como-aprender/">Driveclub e shadPS4</a>, a IA quase me levou pra todo lado errado porque o problema exigia entender renderização, gamma, shaders, buffers. A ferramenta ajuda a explorar, mas quem decide se a explicação faz sentido ainda é você. Se você não entende o suficiente pra verificar, está só aceitando chute bonito.</p>
<p>Por isso também repito a ideia de <a href="/2026/03/01/software-nunca-esta-pronto-4-projetos-a-vida-pos-deploy-e-por-que-one-shot-prompt-e-mito/">&ldquo;Software Nunca Está Pronto&rdquo;</a>: deploy não é linha de chegada. O protótipo vira produto quando aguenta bug report, manutenção, refatoração, docs, release, rollback, usuário reclamando. LLM ajuda muito nesse ciclo chato. Mas o ciclo continua existindo.</p>
<p>Se é testável, teste. Se dá pra medir, meça. Se não dá pra medir, pelo menos escreva as premissas. O importante é não escolher só porque &ldquo;parece melhor&rdquo;.</p>
<p>Código barato também significa desapego. Faça código pra jogar fora. Faça protótipo feio. Faça benchmark descartável. Peça pro agente documentar o que aprendeu em <code>docs/decision-qwen-vs-deepseek.md</code>, depois apague <code>experiments/</code> se quiser. O documento fica. O aprendizado fica.</p>
<p>LLMs também são muito bons em documentação. Use isso. Peça pra documentar tudo. Por que escolhemos PostgreSQL em vez de SQLite nesse caso. Por que o deploy usa Docker image multi-stage. Por que o serviço roda atrás de Cloudflare Tunnel. Por que aquele sysctl existe. Mesmo que depois você delete metade, o custo de escrever caiu perto de zero.</p>
<h2>Deploy automatizado ou você vai parar de manter<span class="hx:absolute hx:-mt-20" id="deploy-automatizado-ou-você-vai-parar-de-manter"></span>
    <a href="#deploy-automatizado-ou-voc%c3%aa-vai-parar-de-manter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Todo projeto meu que importa tem build automatizado. Muitos rodam no meu homelab, como descrevi em <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">&ldquo;Migrando meu Home Server com Claude Code&rdquo;</a>. Quase todo projeto tem um <code>bin/deploy</code> que builda imagem Docker, faz push, rotaciona no servidor, aplica migração se precisar, e valida healthcheck.</p>
<p>Claude e Codex são excelentes em deploy. Eles leem o <code>bin/deploy</code>, entendem Dockerfile, editam GitHub Actions, ajustam release workflow, corrigem assinatura de binário, atualizam Homebrew tap, geram checksum. E sim, eu peço pra Claude/Codex dar SSH no meu homelab e redeployar container Docker. Eles são muito bons nisso. O ai-jail, por exemplo, tem GitHub Actions pra buildar binários assinados pra Linux e macOS.</p>
<p>Se você tem dezenas de projetos, quanto mais automatizado melhor. Eu raramente digito comando administrativo no terminal sozinho. Peço pro LLM fazer, observo, aprovo o que for perigoso, e depois peço:</p>
<blockquote>
  <p>&ldquo;Documente o que foi feito e por que foi feito.&rdquo;</p>

</blockquote>
<p>Isso vale pro homelab e pra minha workstation. Meu Omarchy é customizado via Claude: ZSH, Hyprland, Waybar, scripts, atalhos, temas, integrações. Até meus setups de gaming/emulação entram nessa, como mostrei no post dos <a href="/2026/04/19/retrogames-de-corrida-favoritos-no-distrobox/">retrogames de corrida rodando no Distrobox</a>. Esse é um caso onde normalmente não uso ai-jail, porque justamente quero mexer no host. Então olho comandos, leio diffs, aprovo devagar. Mesmo assim, nunca tive o agente quebrando meu sistema de um jeito irrecuperável. Pelo contrário. Meu PC nunca esteve tão estável e documentado.</p>
<p>Dias depois, quando esqueço por que configurei alguma coisa daquele jeito, o contexto está em markdown, Git, ai-memory, ou no próprio histórico do projeto. Eu posso perguntar e o agente tem de onde puxar.</p>
<h2>Até este post foi escrito assim<span class="hx:absolute hx:-mt-20" id="até-este-post-foi-escrito-assim"></span>
    <a href="#at%c3%a9-este-post-foi-escrito-assim" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Inclusive, é assim que escrevo estes posts agora. Eu jogo um bloco enorme e bagunçado do meu cérebro no Claude. Peço pra ler posts recentes pra calibrar estilo. Peço pra checar os projetos diretamente e elaborar as partes técnicas. Peço pra usar as screenshots mais recentes, subir pro S3 quando precisa, linkar os posts anteriores, revisar o tom.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-toolkit/writing-this-post.png" alt="Screenshot do terminal com o prompt bruto usado pra escrever este post: um bloco enorme de instruções, links, opiniões e detalhes técnicos jogado no agente antes da edição final."  loading="lazy" /></p>
<p>Depois eu leio e edito. Corto o que ficou genérico. Troco frase que parece release note. Coloco minhas broncas de volta. O resultado ainda é meu texto, só que agora eu gasto energia no que importa: decidir o que dizer, corrigir nuance, cortar besteira.</p>
<h2>&ldquo;Mas você testou o Pi?&rdquo;<span class="hx:absolute hx:-mt-20" id="mas-você-testou-o-pi"></span>
    <a href="#mas-voc%c3%aa-testou-o-pi" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Toda vez que falo de LLM ou ferramenta de LLM, aparece alguém nos comentários com a mesma pergunta: &ldquo;mas você testou Pi?&rdquo;, &ldquo;mas você testou DeepSeek?&rdquo;, &ldquo;mas e o Qwen?&rdquo;, &ldquo;mas e o modelo novo que saiu ontem?&rdquo;. Toda. Santa. Vez.</p>
<p>É irritante pra cacete. E quase sempre vem de três tipos de pessoa: quem não testou nada e quer terceirizar o trabalho, quem já escolheu uma ferramenta e quer que eu valide a escolha dela, ou fanboy que trata vendor de LLM como time de futebol. Todos soam iguais. NPC repetindo diálogo de tutorial.</p>
<p>Engenheiro de software não deveria decidir baseado em opinião dos outros. Nem na minha. Se você escolhe ferramenta porque &ldquo;o Akita falou&rdquo;, você entendeu errado. Eu defendo Claude Code e Codex porque usei centenas de horas, em projetos reais, publicando código e post-mortem do que funcionou e do que falhou. E mesmo assim eu não parei em opinião.</p>
<p>Eu criei meu próprio benchmark automatizado: <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>. Atualizo quando vendor popular solta versão nova. Rodo cenários comparáveis. Publico resultado. Depois ajusto minha opinião baseado nos dados. É por isso que eu tenho segurança pra dizer que, no meu fluxo, Opus e GPT continuam vencendo. Não porque acordei com vontade de defender logo de empresa bilionária.</p>
<p>Se sua primeira reação foi &ldquo;mas você testou Qwen?&rdquo;, ótimo. Testa você. Roda o benchmark. Cria cenário melhor. Manda PR. Mostra número. Mostra custo. Mostra latência. Mostra onde falhou. Mostra onde ganhou. Traga dado novo.</p>
<p>Opinião solta é irrelevante. &ldquo;Pra mim funciona&rdquo; não escala. &ldquo;Eu gosto mais&rdquo; não interessa. &ldquo;No meu prompt one-shot ele foi melhor&rdquo; é anedota. Engenharia começa quando dá pra reproduzir, comparar e agir em cima.</p>
<p>Então fica simples: traga dado acionável ou fique quieto. Eu não preciso de torcida organizada de vendor nos comentários. Preciso de gente testando, medindo e contribuindo resultado novo.</p>
<h2>Checklist final<span class="hx:absolute hx:-mt-20" id="checklist-final"></span>
    <a href="#checklist-final" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Resumo curto, porque este post já ficou grande:</p>
<ul>
<li>Foque em Claude Code, Codex ou opencode. Pare de colecionar agente.</li>
<li>Use Opus 4.7 e GPT 5.5 via planos Pro/Plus/Max quando produtividade diária importa.</li>
<li>DeepSeek, Kimi e modelos locais são úteis, mas ainda não substituem o fluxo principal.</li>
<li>Agile Vibe Coding é XP com LLM: testes, <a href="/2026/04/20/clean-code-para-agentes-de-ia/">Clean Code</a>, CI, pair programming e deploy.</li>
<li>Use <code>ai-jail</code> quando quiser autonomia do agente com cerca no filesystem.</li>
<li>Combine <code>ai-jail</code> com permissões perigosas do Claude/Codex quando o projeto estiver protegido por Git.</li>
<li>Tenha backup de verdade: Btrfs snapshots, restic, NAS, offsite, Git, Bitwarden.</li>
<li>Revise <code>git add</code>, <code>git diff --cached</code> e pushes pra não vazar secrets.</li>
<li>Use <code>ai-memory</code> pra contexto transitório e handoff entre agentes.</li>
<li>Escreva documentação canônica em <code>docs/</code> quando a informação precisa sobreviver com garantia.</li>
<li>Use <code>ai-usagebar</code> pra saber quando trocar de Claude pra Codex, ou quando recarregar OpenRouter.</li>
<li>Use <code>ghpending</code> pra não abandonar issues e PRs.</li>
<li>Peça refatoração explicitamente depois de features grandes.</li>
<li>Rode auditoria de segurança antes de release, de preferência com mais de um modelo.</li>
<li>Crie protótipos descartáveis em <code>experiments/</code> antes de decidir por fé.</li>
<li>Se discordar de benchmark, rode o <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a> e traga dado novo.</li>
<li>Documente decisões em markdown. Código ficou barato. Documentação também.</li>
<li>Automatize deploy. Se depender de ritual manual, você vai parar de fazer.</li>
</ul>
<p>No fim, é o mesmo conselho de sempre: ferramenta muda, engenharia não. LLM aumenta a alavanca. Se você já tinha bons hábitos, vai produzir mais. Se não tinha, vai só produzir bagunça mais rápido.</p>
<p>E sim, isso muda a interface do trabalho. Já escrevi sobre isso em <a href="/2026/04/11/vs-code-e-o-novo-cartao-perfurado/">&ldquo;VS Code é o novo Cartão Perfurado&rdquo;</a>: ficar polindo pixel em editor virou nostalgia de programador velho. A parte difícil agora é escrever intenção direito, revisar execução sem preguiça, medir resultado, jogar fora código barato, e não confundir opinião com dado.</p>
]]></content:encoded><category>ai-jail</category><category>ai-memory</category><category>ai-usagebar</category><category>ghpending</category></item><item><title>Criei um Widget de Waybar pra Omarchy pra Monitorar Uso de Planos de LLM: ai-usagebar</title><link>https://akitaonrails.github.io/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/</guid><pubDate>Sun, 24 May 2026 00:01:00 -0300</pubDate><description>&lt;p&gt;Quem acompanha o blog já sabe que eu uso um monte de vendor de LLM diferente. Os principais são Claude e GPT, via Claude Code e Codex. Eu uso o harness de cada um porque estou preso aos planos de assinatura deles (Pro, Plus, Max), que saem muito mais baratos do que pagar crédito por token tipo OpenRouter. Mesmo assim, também uso OpenRouter pra acessar outros modelos pra teste, e tenho até uma assinatura Z.AI GLM pra coisas pequenas.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Quem acompanha o blog já sabe que eu uso um monte de vendor de LLM diferente. Os principais são Claude e GPT, via Claude Code e Codex. Eu uso o harness de cada um porque estou preso aos planos de assinatura deles (Pro, Plus, Max), que saem muito mais baratos do que pagar crédito por token tipo OpenRouter. Mesmo assim, também uso OpenRouter pra acessar outros modelos pra teste, e tenho até uma assinatura Z.AI GLM pra coisas pequenas.</p>
<p>O problema de ter vários planos é acompanhar quanto já gastei de cada um. Eu vinha usando o <a href="https://github.com/mryll/claudebar"target="_blank" rel="noopener">claudebar</a>, um widget de Waybar que mostra o uso do plano da Anthropic. Gosto dele, mas queria ver todos os meus vendors num lugar só, pra bater o olho e saber onde estou. E não queria encher minha Waybar de widget separado pra cada vendor. Então resolvi fazer o meu: o <strong><a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a></strong>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-waybar.png" alt="Widget na Waybar mostrando “cld 29% · 1h 12m” no canto superior direito, com tooltip aberto exibindo o plano Claude Max 20x: Session 29%, Weekly 47%, Sonnet only 0%, Extra usage $0.00 sobre limite de $1100, e horário da última atualização."  loading="lazy" /></p>
<p>É um port em Rust do claudebar, drop-in compatível, estendido pra quatro vendors: Anthropic Claude, OpenAI Codex/ChatGPT, Z.AI (GLM) e OpenRouter. Mantém os mesmos parâmetros (<code>--icon</code>, <code>--format</code>, <code>--tooltip-format</code>, etc.), o mesmo tooltip minimalista com borda Pango, e a mesma auto-detecção do tema do Omarchy. A diferença é que agora os quatro vendors aparecem no mesmo lugar, em vez de 865 linhas de bash cuidando de um só.</p>
<h2>Como ele autentica em cada vendor<span class="hx:absolute hx:-mt-20" id="como-ele-autentica-em-cada-vendor"></span>
    <a href="#como-ele-autentica-em-cada-vendor" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Essa é a parte que vale explicar, porque cada vendor faz diferente. Claude e Codex usam OAuth: os CLIs oficiais (<code>claude</code> e <code>codex</code>) já escreveram as credenciais no disco quando você logou, e o ai-usagebar lê esses mesmos arquivos. Não precisa de variável de ambiente nenhuma, o token até se renova sozinho.</p>
<p>Z.AI e OpenRouter usam API key, então pra esses você precisa setar uma chave (via env var ou inline no config).</p>
<table>
  <thead>
      <tr>
          <th>Vendor</th>
          <th>Método</th>
          <th>O que você precisa fazer</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Anthropic</td>
          <td>OAuth, lê de <code>~/.claude/.credentials.json</code></td>
          <td>Roda <code>claude</code> uma vez pra logar. Token renova sozinho.</td>
      </tr>
      <tr>
          <td>OpenAI</td>
          <td>OAuth, lê de <code>~/.codex/auth.json</code></td>
          <td>Roda <code>codex login</code> uma vez. Token renova sozinho.</td>
      </tr>
      <tr>
          <td>Z.AI</td>
          <td>API key (<code>ZAI_API_KEY</code> ou <code>[zai] api_key</code> no config)</td>
          <td>Seta uma das duas.</td>
      </tr>
      <tr>
          <td>OpenRouter</td>
          <td>API key (<code>OPENROUTER_API_KEY</code> ou <code>[openrouter] api_key</code>)</td>
          <td>Seta uma das duas.</td>
      </tr>
  </tbody>
</table>
<h2>A interface além da Waybar<span class="hx:absolute hx:-mt-20" id="a-interface-além-da-waybar"></span>
    <a href="#a-interface-al%c3%a9m-da-waybar" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Além do widget na barra, tem uma TUI com abas (<code>ai-usagebar-tui</code>) pra ver tudo de uma vez. Navega com Tab / h / l entre os vendors, atualiza a cada 60s. Dá pra abrir clicando no widget da Waybar, ou rodar direto no terminal (mais sobre isso na próxima seção).</p>
<p>A aba do OpenRouter mostra saldo de crédito, gasto de hoje / semana / mês e o tier:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-tui-openrouter.png" alt="ai-usagebar-tui na aba OpenRouter: gauge de saldo de crédito em 98% em vermelho ($13.67 restante de $900), bloco de uso por período (hoje/semana/mês), tier pago."  loading="lazy" /></p>
<p>E tem um overlay de settings pra escolher o vendor primário e colar as API keys sem editar o config na mão:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-tui-settings.png" alt="Overlay de settings flutuando sobre a TUI: radio de vendor primário (Anthropic selecionado), API key da Z.AI mascarada (•••), API key do OpenRouter mascarada (•••), botão Save, atalhos no rodapé."  loading="lazy" /></p>
<h2>Não usa Omarchy nem Hyprland? Roda como TUI standalone<span class="hx:absolute hx:-mt-20" id="não-usa-omarchy-nem-hyprland-roda-como-tui-standalone"></span>
    <a href="#n%c3%a3o-usa-omarchy-nem-hyprland-roda-como-tui-standalone" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O widget de Waybar é opcional. Os dois binários são independentes, então se você não usa Omarchy, nem Hyprland, nem Waybar (ou simplesmente prefere checar o uso de vez em quando em vez de ter na barra o tempo todo), o <code>ai-usagebar-tui</code> funciona como app de terminal totalmente standalone:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ai-usagebar-tui    <span class="c1"># abre no seu terminal atual</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Roda em qualquer emulador de terminal (Kitty, Alacritty, Foot, Ghostty, etc.), funciona até numa sessão SSH pura, e não depende de compositor nem de feature de window manager. Todos os controles e o overlay de settings funcionam igual. Os mesmos quatro vendors, as mesmas abas:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/05/24/ai-usagebar/ai-usagebar-tui-openai.png" alt="ai-usagebar-tui na aba OpenAI rodando num terminal: gauges de Codex 5h e semanal, bloco de Credits com faixas de contagem de mensagens, abas Claude / OpenAI / GLM (Z.AI) / OpenRouter no topo, atalhos de tecla no rodapé."  loading="lazy" /></p>
<p>Uso típico fora do Omarchy: uma checada rápida antes de começar uma sessão longa (&ldquo;será que tô perto do limite semanal do Claude?&rdquo;), um monitor num painel de tmux enquanto você programa, ou uma ferramenta só de shell em máquina remota (instala o binário e pronto, sem dependência de Waybar ou Hyprland). A TUI é a forma canônica de ver os quatro vendors de uma vez, independente de você configurar o widget ou não.</p>
<h2>Instalação<span class="hx:absolute hx:-mt-20" id="instalação"></span>
    <a href="#instala%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No Arch tem pacote no AUR, dois sabores:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yay -S ai-usagebar-bin    <span class="c1"># binário pré-compilado do GitHub Releases (~5s)</span>
</span></span><span class="line"><span class="cl">yay -S ai-usagebar        <span class="c1"># compila do fonte (~30-60s)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Ou do fonte direto:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cargo build --release
</span></span><span class="line"><span class="cl">sudo make install                  <span class="c1"># → /usr/local/bin</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ou</span>
</span></span><span class="line"><span class="cl">make install <span class="nv">PREFIX</span><span class="o">=</span><span class="nv">$HOME</span>/.local   <span class="c1"># → ~/.local/bin</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>A config de Waybar recomendada é um único módulo com scroll pra ciclar entre os vendors, e clique pra abrir a TUI:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsonc" data-lang="jsonc"><span class="line"><span class="cl"><span class="s2">&#34;custom/aibar&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;exec&#34;</span><span class="p">:</span> <span class="s2">&#34;ai-usagebar --format &#39;{vendor_short} {session_pct}% · {session_reset}&#39;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;return-type&#34;</span><span class="p">:</span> <span class="s2">&#34;json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;interval&#34;</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;signal&#34;</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;tooltip&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;on-click&#34;</span><span class="p">:</span> <span class="s2">&#34;ai-usagebar-tui&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;on-scroll-up&#34;</span><span class="p">:</span>   <span class="s2">&#34;ai-usagebar --cycle-next&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;on-scroll-down&#34;</span><span class="p">:</span> <span class="s2">&#34;ai-usagebar --cycle-prev&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Se preferir ver os quatro vendors ao mesmo tempo, dá pra usar um módulo por vendor. O <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">README</a> tem o detalhe completo de config, placeholders de formato, e as variações.</p>
<h2>Por que fiz<span class="hx:absolute hx:-mt-20" id="por-que-fiz"></span>
    <a href="#por-que-fiz" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esse parecia um projetinho de sábado à noite, então resolvi só fazer. E foi: portar o claudebar pra Rust e adicionar os vendors extras que eu queria foi tranquilo. Saí de uma noite com um widget que faz exatamente o que eu precisava e ainda é mais confiável (testado, modular) do que o shell script original.</p>
<p>Se você usa outros vendors que eu não cobri, ou achar bug, manda issue ou pull request: <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">github.com/akitaonrails/ai-usagebar</a>. É MIT.</p>
]]></content:encoded><category>ai-usagebar</category><category>omarchy</category><category>ferramentas-de-desenvolvimento</category><category>llms</category></item></channel></rss>