À propos du projet

## Ce qu'est postbag postbag est un petit pont qui permet à deux sessions d'agents de codage IA exécutées sur la même machine d'écrire des lettres l'une à l'autre. Les sessions peuvent provenir du même fournisseur ou de fournisseurs différents — une session Claude Code et une session Codex, ou deux sessions Claude Code, ou deux sessions Codex. Chaque lettre est délivrée via le mécanisme de réveil propre au fournisseur destinataire (la « porte »), est ajoutée à un ledger unique et est décomptée d'un budget de lettres qu'un humain définit. Les usages typiques suggérés par le README incluent : demander à un agent de relire le diff de l'autre, diviser une tâche entre deux agents et convenir de l'interface par lettre, ou obtenir un deuxième avis sans coller le contexte manuellement. Le README présente la division du travail comme « le texte voyage par postbag, le code voyage par git ». ## Comment ça marche - `join` enregistre la porte d'une session dans le ledger sous un nom. Pour Claude Code, il s'agit de son socket de messagerie par session et de son jeton ; pour Codex, il s'agit de l'identifiant de thread. - `send` frappe à la porte enregistrée (le socket ou `codex queue`), puis append la lettre sous verrou de fichier, afin que les lettres simultanées obtiennent des numéros distincts et partagent un seul budget. - `open` démarre le prochain échange depuis un terminal normal, en dehors de toute session. Les lettres sont numérotées au sein d'un échange, et le budget est partagé par tous les membres du sac. Sans `--limit`, un échange contient 12 lettres. - `read` affiche les noms actuellement dans le sac, l'échange ouvert et les enregistrements. - Le ledger à `~/.postbag/ledger.jsonl` est le seul état. Il n'y a pas de daemon, de polling, d'hooks, de serveur ni de fichier de configuration. Définir le même `POSTBAG_LEDGER` dans les deux sessions et le terminal crée un sac séparé. Le destinataire se réveille avec une lettre numérotée, le nombre restant, le corps et la commande unique pour y répondre (un `send` avec la réponse sur l'entrée standard). La dernière lettre d'un échange indique de ne pas répondre, et l'envoi suivant refuse et demande à l'agent de s'arrêter et de solliciter l'humain. ## Prérequis Python 3.10 ou supérieur, standard library uniquement ; installable via `pipx install postbag`. Une session Claude Code nécessite que son socket de messagerie par session soit exporté via `CLAUDE_CODE_MESSAGING_SOCKET` et `CLAUDE_CODE_MESSAGING_TOKEN`. Une session Codex a besoin de la commande `queue` introduite dans Codex 0.149, de `CODEX_SESSION_ID` exporté, et d'un `codex queue --help` fonctionnel ; `POSTBAG_CODEX` peut pointer vers un binaire non standard. Deux sessions Claude n'ont besoin d'aucun binaire Codex, et deux sessions Codex n'ont besoin d'aucun socket Claude. ## Vérification et support plateforme Le README rapporte une vérification live sur macOS: version 1.0.2 avec Claude Code 2.1.263 et Codex 0.153.4 depuis l'application de bureau ChatGPT, et version 1.1.0 avec deux véritables sessions Claude Code 2.1.263, incluant un échange bidirectionnel et le refus de budget épuisé. Linux passe le CI mais la livraison live y est décrite comme non vérifiée, et Windows n'est pas supporté. ## Limites et notes de sécurité - Le ledger contient tous les jetons de session Claude ainsi que les lettres. Les écritures maintiennent le fichier à `0600` et les nouveaux répertoires d'état à `0700` ; un répertoire personnalisé existant est laissé tel quel. `read` masque les champs de porte, `cat` ne le fait pas, le fichier brut doit donc être tenu hors de git, des logs et des captures d'écran. - Une lettre devient un tour utilisateur dans la session destinataire, donc les deux sessions doivent être approuvées pour la tâche. postbag lui-même n'envoie rien hors de la machine, mais les sessions fournisseur transmettent la lettre à leurs services modèle comme n'importe quel prompt. - Un nom est une adresse, pas une authentification. `open` refuse de s'exécuter à l'intérieur d'une session. Ces vérifications lisent les variables de session des fournisseurs — un garde-fou contre les rôles mélangés, pas une protection contre un autre processus s'exécutant en tant que même utilisateur. - La livraison non surveillée à Claude a été observée avec des permissions de contournement sur les versions testées ; d'autres modes peuvent retenir la lettre pour approbation. Codex a besoin de permissions pour écrire le ledger et se connecter au socket Claude. - « Délivrée » signifie soumis via la porte, pas lu. Un timeout ou un crash entre la soumission et l'enregistrement laisse une lettre dans le doute, et il n'y a pas d'acquittements ni de retentatives. ## Portée et compatibilité Deux sessions sont la configuration supportée. Trois ou plus est décrit comme expérimental ; `read` l'indique et chaque lettre liste alors les noms enregistrés. Les ledgers écrits par la 1.0 se lisent sans réécriture, avec les pairs fournisseurs hérités lus comme `@claude` et `@codex`. Mélanger une session 1.0 avec une session 1.1 n'est pas supporté, car un `send` 1.0 n'accepte que `claude` ou `codex` nu et ne peut donc pas exécuter la commande de réponse portée par une lettre 1.1 ; les deux sessions doivent être mises à jour et redemander `join`. Après un redémarrage, une session doit `join` à nouveau sous le nom qu'elle occupait, et une commande de réponse atteint celui qui détient le nom au moment de son exécution. Le dépôt est sous licence MIT et inclut un document conceptuel sous forme de `CONCEPT.md`, un journal des changements, des directives de contribution et un document de recherche listant d'autres outils dans le domaine.