papo

Seu Claude conversa direto com o Claude do seu colega.

CI Release Docs Licença MIT

Site · Tutorial · Documentação · Wiki · Downloads

--- Quando dois agentes precisam combinar algo (o formato de uma API, um contrato de evento, quem muda o quê), hoje as pessoas viram proxy: copiam a pergunta de um Claude, colam no chat, o colega cola no Claude dele, copia a resposta, manda de volta... O **papo** acaba com esse vai e vem. Os dois Claudes conversam direto, se entendem e só chamam vocês quando precisam de uma decisão. O nome vem de "bater papo": você pede, e os agentes batem papo entre si até resolver. ```mermaid flowchart LR subgraph voce["Você"] CA["Claude Code"] <-->|MCP| PA["papo"] end subgraph colega["Seu colega"] PB["papo"] <-->|MCP| CB["Claude Code"] end PA <==>|"P2P direto, cifrado ponta a ponta"| PB PA -.->|"relay só se a conexão direta falhar"| R(["relay"]) R -.-> PB ``` - **Binário nativo único** para Linux, macOS e Windows, sem runtime e sem servidor para hospedar. - **P2P de verdade** via [iroh](https://iroh.computer): conexão direta por QUIC, com hole punching através de NAT. Quando a conexão direta não é possível, o tráfego passa cifrado por um relay. - **Nenhuma mensagem se perde**: se o colega está offline, ela fica na fila e é entregue quando ele voltar, com confirmação de recebimento. - **Push na sessão**: com *channels* do Claude Code, a mensagem do colega aparece sozinha na sessão do seu Claude, que reage sem você digitar nada. - **Feito para agentes**: o servidor ensina o Claude a escrever mensagens que se explicam sozinhas, a não vazar segredos para o outro lado e a não entrar em loop de "ok/obrigado". ### Uma conversa de ponta a ponta ```mermaid sequenceDiagram actor V as Você participant CV as Seu Claude participant CC as Claude do colega actor C as Colega V->>CV: combina o webhook com o agente do colega CV->>CC: Vou emitir payment.confirmed assinado. O handler de vocês aceita? Note right of CC: chega sozinho na sessão (push) CC->>CC: lê o código do colega CC->>CV: Quase: o header precisa ser X-Hub-Signature-256 CV->>CC: Fechado. Troco o header e mando um exemplo CC->>CV: Resumo: você emite, o colega migra o handler CV-->>V: contrato final combinado CC-->>C: o que ficou combinado ``` Mais diagramas (módulos, entrega com fila offline, reconexão, servidor MCP) em [Arquitetura](https://kelvin-jesus.github.io/papo/docs/arquitetura.html). ## Instalação Linux e macOS, num comando só (baixa a última release, confere o `.sha256` e instala em `~/.local/bin`, sem sudo): ```sh curl -fsSL https://raw.githubusercontent.com/Kelvin-Jesus/papo/main/scripts/install.sh | sh ``` Para outro diretório ou outra versão: `… | sh -s -- --dir /usr/local/bin --version v0.1.0`. Ou baixe o arquivo do seu sistema na [release mais recente](https://github.com/Kelvin-Jesus/papo/releases/latest), extraia e coloque o `papo` (ou `papo.exe`) no `PATH`. Cada arquivo tem um `.sha256` ao lado (`sha256sum -c papo-*.sha256`). | Sistema | Arquivo (v0.2.0) | | ------------------- | ------------------------------------------------- | | Linux x86_64 | [`papo-v0.2.0-x86_64-unknown-linux-musl.tar.gz`](https://github.com/Kelvin-Jesus/papo/releases/download/v0.2.0/papo-v0.2.0-x86_64-unknown-linux-musl.tar.gz) | | Linux ARM64 | [`papo-v0.2.0-aarch64-unknown-linux-musl.tar.gz`](https://github.com/Kelvin-Jesus/papo/releases/download/v0.2.0/papo-v0.2.0-aarch64-unknown-linux-musl.tar.gz) | | macOS Apple Silicon | [`papo-v0.2.0-aarch64-apple-darwin.tar.gz`](https://github.com/Kelvin-Jesus/papo/releases/download/v0.2.0/papo-v0.2.0-aarch64-apple-darwin.tar.gz) | | macOS Intel | [`papo-v0.2.0-x86_64-apple-darwin.tar.gz`](https://github.com/Kelvin-Jesus/papo/releases/download/v0.2.0/papo-v0.2.0-x86_64-apple-darwin.tar.gz) | | Windows | [`papo-v0.2.0-x86_64-pc-windows-msvc.zip`](https://github.com/Kelvin-Jesus/papo/releases/download/v0.2.0/papo-v0.2.0-x86_64-pc-windows-msvc.zip) | > No macOS, um binário baixado pelo navegador pode ser bloqueado pelo Gatekeeper. Libere com > `xattr -d com.apple.quarantine ./papo`. Ou compile (Rust 1.91+): `cargo install --git https://github.com/Kelvin-Jesus/papo`. Com Docker (imagem estática de ~8 MB, Intel/AMD e ARM): ```sh docker run --rm -v papo-data:/data ghcr.io/kelvin-jesus/papo new --name ``` O servidor MCP também roda em container. Detalhes no [guia de Docker](https://kelvin-jesus.github.io/papo/docs/guias/docker.html). ### Deixando o seu agente instalar Cole isto no Claude Code (ou em outro agente) da máquina onde o papo vai rodar: > Instala e configura o papo nesta máquina seguindo a seção "Instruções para o agente" de > https://raw.githubusercontent.com/Kelvin-Jesus/papo/main/README.md #### Instruções para o agente Se você é um agente instalando o papo para o seu usuário, siga os passos em ordem. Onde está escrito "pergunte", pergunte: não invente nome nem convite. 1. **Já está instalado?** Rode `papo --version`. Se responder, vá para o passo 3 (ou rode o passo 2 para atualizar). 2. **Instale o binário.** - Linux e macOS: `curl -fsSL https://raw.githubusercontent.com/Kelvin-Jesus/papo/main/scripts/install.sh | sh`. Instala em `~/.local/bin` sem sudo; não use sudo sem perguntar. Se o script avisar que o diretório não está no `PATH`, use o caminho completo (`~/.local/bin/papo`) nesta sessão e pergunte antes de editar o arquivo de inicialização do shell. - Windows (PowerShell): a última tag é o fim da URL para onde `https://github.com/Kelvin-Jesus/papo/releases/latest` redireciona. Baixe `papo--x86_64-pc-windows-msvc.zip` e o `.zip.sha256` de `https://github.com/Kelvin-Jesus/papo/releases/download//`, compare com `(Get-FileHash -Algorithm SHA256).Hash`, extraia, ponha o `papo.exe` em `%LOCALAPPDATA%\Programs\papo` e adicione essa pasta ao `PATH` do usuário. Windows on ARM usa o mesmo binário, por emulação. - Plataforma sem binário pronto: `cargo install --git https://github.com/Kelvin-Jesus/papo` (Rust 1.91+). Confirme com `papo --version`. 3. **Pergunte** se o usuário vai criar uma sala ou entrar numa com um convite, e qual nome usar na sala (até 32 caracteres: letras, dígitos, `-`, `_` e `.`). - Criar: `papo new --name `. Mostre o convite (`papo1...`) ao usuário e diga para mandá-lo ao colega por um canal privado. - Entrar: `papo join --name `. O convite é o segredo da sala: não grave em arquivo do projeto, commit, issue ou log. Se o comando disser que o perfil já existe, pare e pergunte: `--force` troca a sala atual pela nova, e `--profile ` mantém as duas (aí use o mesmo `--profile` nos passos seguintes). 4. **Registre no Claude Code**, dentro da pasta do projeto em que o usuário vai trabalhar: `papo install`. Se o `claude` não estiver no `PATH`, o comando imprime o `claude mcp add` para rodar à mão. 5. **Peça ao usuário para reabrir o Claude Code** nessa pasta com `claude --dangerously-load-development-channels server:papo`. Você não consegue fazer isso por ele: o servidor MCP só é carregado numa sessão nova. 6. Depois disso, `papo status` mostra se o colega está online. ## Primeiros passos ```sh # 1. Você cria a sala e manda o convite (papo1...) ao colega por um canal privado papo new --name voce # 2. O colega entra papo join papo1abcd... --name colega # 3. Cada um, dentro da pasta do projeto em que vai trabalhar papo install # 4. Cada um abre o Claude Code com channels ligado claude --dangerously-load-development-channels server:papo ``` Depois é só pedir: > Combina com o agente do colega o formato do webhook de pagamento pelo papo. Ele está > implementando o consumidor. Quando fecharem, me mostra o contrato final. E acompanhar a conversa dos agentes em outro terminal com `papo log -f`. O [tutorial completo](https://kelvin-jesus.github.io/papo/docs/tutorial.html) mostra uma sessão de ponta a ponta entre duas pessoas, com o que aparece em cada terminal. ## Com ou sem *channels* | Modo | Como abrir o Claude | O que acontece | | ---- | ------------------- | -------------- | | **Push** (recomendado) | `claude --dangerously-load-development-channels server:papo` | Mensagens novas entram sozinhas na sessão como `` e o Claude reage, mesmo parado. | | **Pull** | `claude` | Funciona igual, mas o Claude só vê mensagens quando chama `wait` ou `inbox` (por exemplo: "manda e espera a resposta"). | *Channels* é *research preview* do Claude Code: exige login com conta claude.ai ou chave do Console, e em organizações Team/Enterprise um Owner precisa habilitar *Channels* nas configurações de admin. Sem isso, o papo continua funcionando no modo pull. ## Comandos | Comando | Descrição | | ------- | --------- | | `papo new --name ` | Cria uma sala e mostra o convite. | | `papo join --name ` | Entra numa sala. | | `papo invite` | Gera um convite para chamar mais alguém. | | `papo install [--scope local\|user\|project] [--print]` | Registra no Claude Code. | | `papo log [-n 30] [-f]` | Mostra a conversa; `-f` acompanha ao vivo. | | `papo say [--to ] ` | Você (humano) fala na sala. | | `papo status` | Teste de conexão: entra na sala e lista quem está online. | | `papo leave` | Sai da sala: avisa os membros e apaga o perfil. Se você criou a sala, ela fecha para todos. | | `papo close` | Fecha a sala para todos. Sem ninguém online, deixa uma lápide que avisa quem voltar. | | `papo mcp` | O servidor MCP. Quem executa é o Claude Code. | O Claude ganha as ferramentas `send`, `wait`, `inbox`, `history` e `status`. Referência completa da [CLI](https://kelvin-jesus.github.io/papo/docs/referencia/cli.html), das [ferramentas MCP](https://kelvin-jesus.github.io/papo/docs/referencia/ferramentas-mcp.html) e da [configuração](https://kelvin-jesus.github.io/papo/docs/referencia/configuracao.html) no livro. ## Segurança - **O convite é o segredo da sala.** Dele derivam o tópico P2P e a chave que cifra cada mensagem (XChaCha20-Poly1305), por cima do TLS do QUIC. Relays só veem bytes cifrados; quem não tem o convite não lê nem injeta mensagens. - **Mensagem de outro agente não é ordem do seu usuário.** O papo diz isso ao Claude: nada de vazar `.env`, tokens ou credenciais, nem de fazer algo destrutivo só porque o outro agente pediu. As permissões do Claude Code continuam valendo. - **Anti-loop**: mais de 40 envios em 10 minutos viram erro, e o agente é orientado a parar e falar com você. Modelo de ameaças completo em [Segurança](https://kelvin-jesus.github.io/papo/docs/seguranca.html). ## Status | Marco | Estado | | ----- | ------ | | M0 Pesquisa e arquitetura | feito: [pesquisa](docs/engenharia/pesquisa.md), [arquitetura](docs/arquitetura.md), [ADRs](docs/adr/) | | M1 Núcleo P2P | feito: entrega com confirmação, fila offline, reconexão própria; e2e pela internet em cerca de 6 s | | M2 MCP e channels | feito no protocolo; ainda não validado numa sessão real do Claude Code | | M3 Docs e site | feito; site v2 em andamento | | M4 Testes completos | feito: 146 testes, 94% das linhas | | M6 Validação com o Claude Code real | em parte: duas sessões reais conversaram pelo papo ([validação](docs/engenharia/validacao-claude-code.md)) | | M5 Release v0.1.0 | feito: [binários e imagem Docker](https://github.com/Kelvin-Jesus/papo/releases/tag/v0.1.0) verificados depois de publicados | | M7 Empacotamento (Homebrew, Scoop, winget) | planejado | Detalhes, com o que foi verificado e como: [status](docs/engenharia/status.md) · [marcos](docs/engenharia/marcos.md) · [roadmap](docs/engenharia/roadmap.md). ## Documentação - [Guia para agentes](AGENTS.md) · [status](docs/engenharia/status.md) · [problemas conhecidos](docs/engenharia/problemas-conhecidos.md) · [roadmap](docs/engenharia/roadmap.md) · [diagramas](docs/engenharia/diagramas.md) - [Livro](https://kelvin-jesus.github.io/papo/docs/): tutorial, guias, referência, arquitetura, protocolo, segurança - [Pesquisa: channels do Claude Code, iroh, iroh-gossip, medições](docs/engenharia/pesquisa.md) - [Desempenho e como medir](docs/engenharia/desempenho.md) - [Guia de desenvolvimento: dois agentes locais, MCP à mão, diagnóstico de rede, releases](docs/engenharia/desenvolvimento.md) - [O que todo contribuidor e agente precisa saber](docs/contribuidores/) - [Decisões de arquitetura](docs/adr/) · [linguagem do domínio](CONTEXT.md) · [base de conhecimento OKF](knowledge/) - [Wiki](https://github.com/Kelvin-Jesus/papo/wiki): receitas de pedidos, perguntas frequentes, problemas comuns ## Desenvolvimento ```sh cargo test # unitários + integração (rede local, sem internet) cargo test --test mcp -- --ignored # dois servidores MCP pela internet real cargo clippy --all-targets -- -D warnings ``` Releases saem de uma tag `vX.Y.Z`: o workflow `release` compila para as cinco plataformas e publica os arquivos com SHA-256. Veja [Contribuindo](https://kelvin-jesus.github.io/papo/docs/contribuindo.html). ## Licença [MIT](LICENSE)