Changelog

Cada versão do Catenary, da mais nova para a mais antiga. Achou um bug? Mande seu feedback ou escreva para support@thecatenary.app.

1.1.0

6 de outubro de 2026
O Catenary 1.1.0 é a IDE para orquestrar terminais e agentes de IA. A mesma sessão de trabalho agora tem duas vistas, que você alterna a qualquer momento com Ctrl/Cmd+Alt+S sem reiniciar um único processo: o TerminalMap, uma grade focada de terminais e splits no estilo do cmux/Ghostty, e o Canvas espacial, a mesa infinita onde os painéis flutuam e os fios ligam os agentes.

TerminalMap e Cockpit de sessões

  • Layout TerminalMap. Uma grade encaixada de terminais, splits e abas que convive com o Canvas: trocar de vista nunca mexe na geometria dos nós, e PTYs, browsers e editores continuam vivos na troca.
  • Cockpit de sessões na barra lateral. Uma barra de atividades compacta Sessions | Files, um cartão por sessão de trabalho com três níveis visuais sobre sete estados de agente, "Hide from Cockpit", arquivamento e um sino de atenção global com Jump to Unread entre workspaces.
  • Cartões de sessão que dizem o que está acontecendo. O cartão mostra o seu último prompt e a ferramenta que o agente está rodando agora. O sino só acende quando um agente está bloqueado (uma aprovação, uma falha ou um pedido explícito); uma resposta terminada deixa o cartão verde sem tocar.
  • Splits e Split Zoom. Divida o terminal em foco para a direita ou para baixo (⌘D / ⇧⌘D no macOS, Alt+Shift+D / Alt+Shift+H no Windows e no Linux, onde o Ctrl+D é do shell) e maximize um painel com o Split Zoom (Ctrl/Cmd+Shift+Enter) sem mexer no layout.
  • Terminais fecham na hora, no estilo cmux/Ghostty. Clicar no ✕ de um terminal, de um split ou de um grupo inteiro fecha sem modal de confirmação, para qualquer processo ou agente.
  • Tela de boas-vindas com dois cartões. A primeira abertura oferece TerminalMap ou Canvas lado a lado, seguidos de um tour curto que dá para pular. Um terminal avulso começa na sua pasta pessoal, sem seletor de pasta.
  • Pastas de trabalho previsíveis. Splits novos, terminais de worktree e terminais da Home resolvem a pasta a partir da origem, acompanhada por OSC 7, com um fallback seguro quando a pasta sumiu.

Editor e motor de LSP local

  • Motor de LSP local compartilhado para TypeScript e Python. typescript-language-server e pyright rodam sob um supervisor com reinício automático, em pool por workspace e worktree, alimentando no Monaco o completion com auto-import, hover, ir para definição, referências, renomear, diagnósticos e semantic tokens.
  • Sincronia de buffers entre editor, disco e agentes. Um DocumentService compartilhado versiona cada buffer aberto; quando um agente escreve num arquivo em que você tem alterações não salvas, o editor oferece Compare / Replace / Keep Buffer em vez de sobrescrever em silêncio.
  • Follow Link no Monaco. Ctrl+Click em links http://, https:// e mailto: abre no seu navegador padrão.
  • Pré-visualizações ricas. Markdown com tabelas GFM, listas de tarefas, diagramas Mermaid e KaTeX, e notebooks Jupyter nativos (.ipynb) com saídas de Matplotlib/Plotly e Pandas.
  • Links de arquivo clicáveis no terminal. path:line:col pula direto para essa posição no editor.
  • Cores de sintaxe mais ricas. Variáveis desestruturadas e nomes importados em TypeScript/JavaScript, e as expressões dentro de f-strings do Python, agora ganham as cores semânticas.

Extensions Hub e observabilidade de MCP

  • Extensions Hub. Abas Installed, Install e MCP num só hub da barra lateral, com controles por workspace.
  • Observabilidade de MCP. A aba MCP lista os servidores declarados em .mcp.json e .pi/mcp.json (nome, transporte e executável — nunca args, env ou segredos) ao lado das conexões MCP do Catenary ao vivo e das portas observadas.
  • Servidor catenary mcp nativo, registrado automaticamente. Os agentes instalados (Claude Code, Codex, Antigravity e outros) ganham as ferramentas catenary_* sem configurar nada: abrir arquivos, criar tarefas e worktrees, dividir terminais, pedir atenção, delegar trabalho e consultar o motor de LSP compartilhado (definição, referências, hover, símbolos, diagnósticos).

Robustez do terminal

  • Fontes monoespaçadas seguras. Fontes proporcionais saem da lista, as fontes instaladas vêm do sistema e uma pilha de fallback monoespaçada está sempre garantida.
  • Backpressure no PTY. O PTY pausa com 256 KB de saída não processada e retoma em 64 KB, confirmado pelo callback de escrita do xterm, com um watchdog para que nenhum terminal congele por falta de confirmação.
  • Recuperação do WebGL. Um contexto WebGL perdido é tentado de novo com backoff antes de cair no renderizador DOM.
  • Sem piscada na troca de sessões. Um terminal que volta à vista é redesenhado antes do primeiro quadro, e a troca entre sessões fica instantânea e limpa.

Configurações e feedback

  • Importe suas preferências. Traga configurações e atalhos do VS Code, do Cursor ou do Ghostty (Paleta de Comandos → Import Preferences), com prévia, avisos de conflito e desfazer em um clique.
  • Send Feedback. Help → Send Feedback… abre um formulário curto em thecatenary.app. O app em si continua sem enviar nada.

Ergonomia multiagente

  • Delegação sem configuração. Agentes da mesma sessão se alcançam com catenary ask sem cartão de confirmação nem fio visível; catenary ask --no-wait passa o trabalho adiante sem bloquear.
  • Caixa de entrada estruturada. Mensagens delegadas são deduplicadas, expiram em 24 horas e são confirmadas explicitamente, mantendo "entregue" e "feito" como estados distintos.
  • Worktrees limpas em um clique. A instrução da tarefa é opcional, o botão alterna entre Launch Task e Create Worktree, as abas mostram um chip da branch, e a confiança do agente só vale para worktrees criadas dentro do projeto autorizado.

Versões anteriores

1.0.x29 de agosto de 2026

1.0.0

29 de agosto de 2026(em inglês)

Added

  • The shipped code is V8 bytecode, not source (Fase 2.4). The main process is compiled to .jsc and the plain-JavaScript bundle is removed from the package. npx asar extract used to hand over 1.7 MB of readable TypeScript-derived source — including the Ed25519 licence verification and the trial expiry, which meant defeating either one was a text edit. Those now run from bytecode inside the main process.

    Stated plainly, because it is worth being honest about: this is not encryption. String literals survive in the V8 constant pool and bytecode can be disassembled by someone determined. What it removes is casual source copying and the one-line patch. The preload script is deliberately left as plain JavaScript — compiling it would require turning off the renderer's OS sandbox, and the preload holds nothing but a list of IPC channel names.

  • A one-click Windows installer. Double-click, a progress bar, the app opens — no wizard, no Next/Next/Finish, and no UAC prompt, because Catenary installs per-user rather than for the whole machine. It carries the official icon throughout (installer window, progress bar, uninstaller) and creates the Desktop and Start Menu shortcuts. Named Catenary-Setup-<version>.exe.
  • The EULA and the Privacy Policy ship with the app, under resources/legal/. The terms someone agreed to now live on their machine rather than only on a website that can change or go offline.
  • Free vs Pro licensing (Fase 2.2): Catenary now has a plan. A Pro key is verified offline with Ed25519 — no server call, no phone-home, and the app stays fully functional without a network.

    The 7-day Pro trial is claimed, not granted: a fresh install runs on Free from the first second, and the clock only starts when you ask for it — from the invitation that appears when you meet a free limit, or from Settings → License. No card, once per machine. Because it can only ever be started once and there is no way back, asking for it opens a confirmation that names the date the trial would end before you spend it, rather than starting the clock on a single click. That way the days are spent while you are actually pushing against something, instead of draining during a week you never opened the app.

    Day 8 is a screen rather than a silence. If the trial left more projects open than Free allows, Catenary reopens the one you were last in and closes the rest — closed, never deleted: they wait under Recent, the screen names them, and every file, canvas, branch and worktree is untouched. From there you work one project at a time, or get Pro to keep them side by side. The same reconciliation runs whenever the app starts over its limit, so a plan is never enforced in one direction only, and a Recent entry you cannot open right now says so with a lock instead of failing on the click.

    The free plan is the whole product, in small: canvas, terminals, editor, browser, git and wires between agents are unlimited on every plan. What Pro buys is scale — more projects open at once, more tasks running in parallel, bigger teams. On Free one agent commands at most two helpers, and that single rule is the same number everywhere it shows up: two Maestro recruits, and a three-node squad (a leader plus two). Four of the five built-in squads fit under it; the five-agent Enterprise squad carries a PRO badge, shown only to users who are actually on the free plan.

    Meeting a limit opens an invitation that names what just happened rather than a generic upsell, and never interrupts work in progress. It offers three doors in the order they cost: Get Pro is the button, I have a key sits beside it, and the trial is a quiet link off to the side — an offer, not the answer the wall volunteers first.

    Changing plan is a moment, not a relabelled row: activating a key or claiming the trial dims the room, and the mark arrives with a shockwave, the trial naming the date it ends and a purchase naming the person it was sold to.

    Which plan you are on is always visible: a small tag sits beside the version in the sidebar foot — FREE, PRO TRIAL · 3d, or PRO — so the trial countdown runs somewhere you actually walk past, instead of only inside Settings. Clicking it opens a plain comparison: what every plan gets unlimited (canvas, terminals, editor, browser, git, and the wires between agents) stated first and without columns, then the five places Free and Pro genuinely differ. Those five rows are generated from the same numbers the app enforces, so the table cannot drift from docs/legal/PLAN-LIMITS.md. A Pro user clicking their own tag gets their licence, not a sales table.

    License… sits in the app menu, the command palette and its own Settings section, where the plan is a card — what you have, what it comes with, and, on a trial, how much of it is left as a bar. A paid plan can also raise the Maestro ceiling (2–10) there. That ceiling exists on Pro too and is not a paywall: a maestro opens agents on its own initiative, each one spending your API credits, so it stands alongside the approval card and the action throttle as a cost brake.

    Plan limits are documented in docs/legal/PLAN-LIMITS.md, which EULA clause 4.1 now incorporates by reference.

  • 1-Click Agent Task (worktree automation): a ⚡ New Agent Task pill now leads the canvas toolbar (Cmd/Ctrl+Shift+N, also in the command palette). It opens a prompt-first modal: you describe what the AI should do, and the branch name writes itself from that description — "Criar modal de login" becomes feature/login-modal, "Faça a Issue #42" becomes fix/issue-42. The branch field is always visible and always editable, and it stops following the prompt the moment you touch it.

    Confirming creates an isolated git worktree, pans the canvas to a clear patch, draws the task's own territory there, and starts the chosen workforce inside it — a single agent (Claude Code, Codex, …), a plain terminal, or a whole Squad, picked through the real Squads dialog rather than a smaller copy of it. The prompt is delivered once the agent CLI is actually listening, so it reaches the agent instead of the shell it booted from — and the delivery is verified against the terminal's own screen rather than assumed, then re-sent until the text is really in the composer. A CLI that takes five seconds to attach its input reader (Antigravity on Windows) used to swallow the prompt silently and leave an empty > behind; now the Enter is only pressed once the words are there. A squad leader gets its role prompt in front of the goal, in the same single message.

    Setup rápido (on by default) makes the new checkout usable in about a second: node_modules is linked from the source checkout, the .env family is copied (copied, not linked — a task branch must not rewrite your main checkout's secrets), and the repo's own .catenary/setup.sh runs if the team committed one. All three are best-effort: none of them can fail the worktree.

  • Task island controls on the canvas: each task territory carries a control pill — the branch, a live status dot (working / waiting on you / done), Review Diffs, and Create PR ▾. Review Diffs opens a Monaco diff per changed file against the merge base with the base branch, so it shows everything the agent did (committed or not) and nothing the base branch did meanwhile. Create PR pushes and opens GitHub's own PR form, which renders the repo's pull_request_template.md; the dropdown holds local merge, push, copy branch name, and discard.
  • ACTIVE TASKS in the Explorer: a collapsible section above the file tree lists every running task worktree with its status badge and teleports the camera to that island in one click. It renders nothing at all when there are no task worktrees, so an ordinary single-branch project is unchanged.
  • Autonomous agent terminals: the New Agent Terminal picker gained an "Agente autônomo" checkbox, and the recruit approval card a matching one. A terminal created with it ticked launches its agent CLI with permission prompts bypassed, so the agent edits files and runs commands without someone accepting each one. The picker's command footer rewrites itself as you tick the box, so the flag is always read rather than promised.

    Autonomy is chosen at creation and nowhere else: a CLI fixes its permission mode when it starts, so a switch offered afterwards could only mark something invisible until a future restart. A node whose terminal is autonomous shows a badge beside the Maestro one — an indicator, not a control.

    The mark survives an app restart (and a session resume) via the machine-local session.json, deliberately not the committed workspace.json, so cloning a project never inherits someone else's bypass.

    Per-agent flags: --dangerously-skip-permissions for Claude Code and Antigravity (read from the installed CLIs), plus --dangerously-bypass-approvals-and-sandbox (Codex), --always-approve (Grok), --auto (OpenCode) and --force (Cursor) from each project's docs.

  • In-App Toast Notification System: Added a lightweight, accessible floating toast system (toastStore.ts + ToastContainer.tsx) with auto-dismiss timers, custom actions, and theme-adaptive styling across main and detached dock windows for non-fatal errors (file injection errors, file tree operations).
  • Maestro & Process Lifecycle Hygiene: Added automatic cleanup of pending approval cards (dismissApprovalsForMaestro) and immediate release of recruit slots (forgetRecruited) when a Maestro or recruited terminal exits, dies, or is closed. Recruited terminals cleanly decouple into independent user terminals if their maestro is closed.
  • Terminal Render Scale Stability: Resolved DPR / display density re-derivation timing during canvas zoom transitions and display changes in TerminalPanel.
  • CI Workflow Trigger: Updated .github/workflows/ci.yml to trigger automated builds and test suites on both main and catenary branches.

Changed

  • Every panel belongs to a branch, and master is always one of them. A terminal, editor or browser created on empty canvas belongs to the primary worktree — because that is the checkout it is running against — instead of belonging to nothing. A branch is selected from the moment a project opens, and clicking any panel moves the whole app into that panel's branch: what a new terminal inherits, which panels stand at full strength, and which files the Explorer shows. Panels on other branches step back a little (opacity only — never hidden, never disabled, still one click away); the focus lens keeps its own, much stronger dim for when you deliberately ask to study one island.

    The Explorer follows the branch: click into a task island and the tree shows that worktree's files. Source Control and Search deliberately stay on the workspace root — a project-wide search that silently narrowed to one checkout would be a search that lies about its scope.

  • The canvas is flat again. The topographic "territory" relief painted behind each branch's panels is gone, along with its WebGL2 shader, CPU fallback, pocket-mask flood fill and context-loss recovery. It answered "which panels belong together" with a picture of ground, and competed with the panels for the eye on a surface whose whole job is to show panels. That question is now answered by the branch pill above each island and by the opacity of the panels themselves. Settings → Canvas → Worktree territories is now Branch pills and keeps the same switch, so anyone who had turned it off stays off.
  • No more operating-system confirm boxes. Every window.confirm — delete a file or folder, discard a worktree, merge a branch, remove a workspace, delete a saved layout, clear imported passwords — is now an in-app modal in Catenary's own chrome, with Enter to confirm and Escape to cancel. The native dialog painted a white card with OS buttons on top of a dark canvas and blocked the renderer thread, which stopped every terminal from drawing until it was answered. Two of these (merge, discard) could not ask at all through a component, so they now go through confirmDialog() — a promise any store or hook can await.
  • ACTIVE TASKS moved to the base of the Explorer, under the file tree, with its own divider and a capped height that scrolls internally. A dozen branches no longer squeeze the tree into a sliver, and the section still disappears entirely on a project that has never launched a task.

Fixed

  • "Agent finished • N files changed" never fired inside a task branch. A worktree is checked out at <repo>/.cate/worktrees/<branch>/…, and the filter that hides Catenary's own machine-local state rejected anything with a .cate segment — which is every file an agent writes in a task island. Paths are now judged from inside their checkout, so an agent working in a worktree gets the same offer as one working in the root, while state files and build churn (even inside a worktree) stay filtered out.
  • Review Diffs compared against the wrong base. It always diffed against the primary branch, so a task cut from develop reported everything develop did as if the agent had written it. The ref a worktree was created from is now recorded and used, falling back to the primary branch for a branch cut from HEAD. The dropdown's "Local Merge to …" keeps naming the primary branch, which is where the merge actually goes.

Atualizações pontuais

1.0.5

12 de setembro de 2026

Corrigido

  • Canvas: abas da doca soltas no canvas sumiam ou teletransportavam (BUG-001). Ao arrastar uma aba da barra da doca para o canvas, a tradução de coordenadas e os handlers de drop podiam perder a posição de destino, e o painel sumia ou ia parar em coordenadas arbitrárias. O fluxo de drop e o cálculo de posição foram normalizados na passagem da doca para o canvas.
  • Windows: hooks do Codex CLI falhando em silêncio no PowerShell (BUG-002). No Windows, o PowerShell exige o operador de chamada (&) para executar wrappers de comando. As definições de hook do Codex em .codex/hooks.json agora prefixam & ao caminho do wrapper, e o envio de hooks em tempo real voltou a funcionar nos terminais do Windows.
  • Antigravity: vazamento do observador de transcript ao fechar o terminal. Fechar um terminal rodando o Antigravity deixava o observador de transcript consultando em segundo plano. O ciclo de fechamento do terminal agora descarta o observador e limpa as conversas ativas.
  • Codex: arquivos alterados no payload do hook PostToolUse. O Codex manda o conteúdo do patch na propriedade command de tool_input. O parser de hooks agora lê args.command e payloads em texto nos eventos apply_patch, e o aviso "Agent finished • N files changed" volta a oferecer os arquivos modificados no canvas.

Adicionado

  • Barra de navegação Breadcrumbs no editor. O EditorPanel ganhou breadcrumbs interativos do caminho, com a hierarquia de pastas, tooltip com o caminho completo e cópia do caminho em um clique.
  • Canvas: arquivos arrastados abrem como Monaco Editor completo. Soltar arquivos da árvore da barra lateral ou do gerenciador de arquivos do sistema no canvas agora cria painéis do Monaco Editor editáveis, em vez de blocos de cartão estáticos.

1.0.4

6 de setembro de 2026

Corrigido

  • macOS: isolamento da arquitetura Apple Silicon no empacotamento (cachedDataRejected). No electron-builder.yml, os alvos traziam arch: [x64, arm64] fixo, e o electron-builder ignorava as flags de arquitetura da linha de comando e compilava as duas em cada runner de CI. O runner Intel terminava por último e sobrescrevia o DMG ARM64 no GitHub Releases com um artefato de bytecode V8 (.jsc) compilado para x64, que o Apple Silicon recusava ao abrir com Error: Invalid or incompatible cached data (cachedDataRejected). A configuração deixou de fixar a lista de arquiteturas, e cada runner empacota só a sua.
  • macOS: o app era morto ao abrir no Apple Silicon (EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid))). Virar os fuses do Electron reescreve bytes dentro do Electron Framework e invalida a assinatura ad-hoc que vem com ele — e num build sem assinatura (sem certificado Developer ID) o electron-builder pulava a assinatura, então nada a consertava. No arm64 cada página __TEXT é conferida por hash, e o processo morria dentro de electron::fuses::IsRunAsNodeEnabled() antes de qualquer janela aparecer, com o Gatekeeper chamando o download de "danificado". O empacotamento agora reassina o bundle ad-hoc logo depois dos fuses (electronFuses.resetAdHocDarwinSignature), e o workflow de release confere a assinatura do .app antes de subir o dmg e o zip.
  • Descrição do limite de computadores na licença. A nota em Settings → License passou de "on any number of their own machines" para "on two of your own computers at a time", alinhada à EULA §4.4 e ao que o servidor aplica.
  • Convite do trial escondido para quem já é Pro. Em Settings → License, o convite para começar o trial de 7 dias só aparece para quem não pagou (!isPaid), e assinantes Pro deixam de ver a oferta.

Adicionado

  • Confirmação antes de remover uma licença. Clicar em "Remove license" agora abre uma confirmação destrutiva (confirmDialog, camada MODAL_Z.confirm) explicando que a máquina volta ao plano Free, libera a vaga no servidor de licenças e guarda a chave para ativar de novo depois.
  • Pipeline de release para gerenciadores de pacote. Entraram scripts/write-checksums.mjs e scripts/render-packaging.mjs, que geram os arquivos SHA-256 e preenchem os manifestos (packaging/) do Homebrew, do AUR do Arch Linux e do Winget, disparados na publicação do release.

1.0.3

5 de setembro de 2026

Corrigido

  • Confiabilidade dos Squads multiagente e isolamento de estado em worktrees compartilhadas. Quando vários agentes (por exemplo, o Enterprise Full Squad) trabalham ao mesmo tempo na mesma pasta de worktree, o observador de transcript do Antigravity agora relaciona os transcripts por terminal com um registro de entradas (noteTerminalInput), e não só pela pasta (cwd). Isso acaba com eventos de turno espalhados, sequestro entre terminais e travamentos falsos em (busy) durante a comunicação entre agentes (catenary ask).
  • TTL de atividade de turno na detecção de agentes. O agentScreenDetector agora expira um hookTurnActive antigo para waitingForInput depois de 120 segundos sem saída no terminal e sem eventos de ciclo de vida, evitando que o status congele em silêncio quando um CLI em segundo plano perde um evento de turno.
  • Diagnóstico rápido para vizinhos que não respondem. O catenary ask agora mostra um diagnóstico peer-stale com o fim da tela do alvo depois de 45 segundos de silêncio, em vez de bloquear indefinidamente num laço de 20 minutos.
  • Resolução do build em modo dev. Corrigida a resolução de módulos externos do Rollup para bufferutil e utf-8-validate no empacotamento de desenvolvimento.

1.0.2

5 de setembro de 2026

Adicionado

  • Trial de 7 dias protegido pelo servidor, com verificação criptográfica offline. O trial de 7 dias agora é ancorado no relógio Postgres do servidor por um hash anônimo do hardware (machineId), o que impede reiniciá-lo mudando o relógio ou reinstalando. O servidor emite um token assinado com Ed25519 (CATE-TRIAL-1-...) que o app confere offline, e tudo continua funcionando offline depois do pedido inicial.
  • Carência para ativações de licença não confirmadas. Ativações feitas offline ganham 30 dias para confirmar a vaga com o servidor, protegendo o uso offline legítimo sem permitir compartilhar a licença offline para sempre.
  • Endurecimento com Electron Fuses. Os builds empacotados agora exigem a validação de integridade do ASAR embutido (enableEmbeddedAsarIntegrityValidation), carregam o app só de dentro do ASAR (onlyLoadAppFromAsar) e restringem a inspeção de debug do processo principal em produção.
  • macOS: grade de ícone squircle da Apple e instalador DMG escuro com a marca. O ícone do macOS agora tem a margem squircle padrão (~18% no canvas de 1024x1024), eliminando a moldura cinza arredondada que o Finder desenhava por cima. A janela do instalador DMG ganhou um fundo escuro próprio (build/background.png), ícones grandes de 128px e um fio de catenária brilhante ligando o app a /Applications.

1.0.1

4 de setembro de 2026

Corrigido

  • macOS: compilar e empacotar por arquitetura de CPU para corrigir a recusa do cache de bytecode V8 no Intel. O bundle do processo principal é compilado para bytecode V8 (.jsc), que depende da arquitetura. No 1.0.0, os DMGs arm64 e x64 saíam de um único build Apple Silicon, e Macs Intel e processos x64 no Rosetta quebravam ao abrir com Error: Invalid or incompatible cached data (cachedDataRejected). O pipeline de release agora compila e empacota em runners nativos de cada arquitetura (macos-latest para arm64 e macos-15-intel para x64), identifica os artefatos pela arquitetura (Catenary-<version>-arm64.dmg e Catenary-<version>-x64.dmg) e junta os metadados de atualização automática.