À la fin, Claude Code tourne dans un panneau de terminal, Codex dans un autre, et quelques chats et agents tournent à côté. Un seul tableau dans osFoundry les liste tous. Quand Claude Code s'arrête sur « Do you want to make this edit? », sa carte passe dans la colonne Needs you (a besoin de vous) en moins d'une seconde. Un clic ouvre le panneau sur ce prompt. Vous répondez, et la carte repasse en Running (en cours).
Qui fait quoi
| Claude Code | App de bureau osFoundry | |
|---|---|---|
| Connexion | Sa propre connexion Claude, dans son propre processus | N'en détient rien. Pour un agent qu'elle a lancé, elle retire une ANTHROPIC_API_KEY héritée pour qu'une exécution sous abonnement ne soit pas facturée comme de l'API |
| Où il tourne | Un vrai PTY dans l'écran Terminal, dans le dossier de votre projet | Possède le PTY et garde une copie émulée de l'écran |
| Qui approuve | Vous, dans le prompt d'autorisation de Claude Code lui-même | Ne répond jamais à votre place. Elle déplace seulement la carte et ouvre le panneau |
| Comment l'état est connu | Claude Code affiche son interface comme d'habitude | Lit l'écran toutes les 700 ms selon des règles publiées, et reçoit les rapports de hooks quand elle a lancé l'agent |
| Où restent les données | Vos fichiers, votre terminal | Le texte de l'écran reste dans la mémoire de l'app sur votre Mac. Terminer une session d'agent écrit un résumé dans vos fichiers de connaissances |
Mise en place
- Ouvrez l'écran Terminal (barre latérale Main → Terminal,
/terminal) et lancez les agents comme d'habitude. Chaque panneau est son propre PTY.
~/code/shop-api (fix/checkout-retry) $ claude ~/code/shop-web $ codex osFoundry reconnaît Claude Code au programme qui occupe le terminal, ou à son écran si vous l'avez lancé via un script wrapper. Il n'y a rien à configurer.
- Ouvrez Sessions (barre latérale Main → Sessions,
/sessions). Chaque chat, agent seul, équipe, boucle et session de terminal est une carte. Les colonnes sont Running, Needs you, Paused (en pause), Idle (inactive), Done (terminée) et Failed (en échec). Vous ne pouvez pas glisser une carte dans une colonne pour fixer son état ; la colonne vient de ce que le runtime rapporte.
- Cliquez sur Filter (le bouton affiche Filtered dès qu'un filtre est actif) et cochez Needs me only (seulement ce qui a besoin de moi). Les types (Chat, Agent, Team, Loop, Terminal) et la période restent tels quels.
Il reste deux cartes : un chat qui a posé une question, et le terminal Claude Code dans shop-api.
Un chat arrive ici quand son dernier message se termine par une question dont il attend encore la réponse. Un terminal arrive ici quand son état est blocked, ce que montre l'étape suivante.
- Cliquez sur la carte
shop-api. L'écran Terminal s'ouvre sur ce panneau, le prompt toujours affiché. Le rail de gauche marque Claude Code comme « Needs you · shop-api » et Codex comme « Working · shop-web ».
Avec plusieurs panneaux ouverts, Mod+. (⌘. sur Mac) saute au prochain agent qui a besoin de vous. La barre d'état l'indique : « ⌘. to jump to what needs you ».
- Répondez dans le panneau comme n'importe où ailleurs : Entrée sur
1. Yes. Claude Code continue, et au balayage suivant le rail et le tableau l'affichent de nouveau en Working / Running.
- Quand une session d'agent est finie et se trouve dans Idle, glissez sa carte vers Done. L'app demande d'abord confirmation.
Confirmer écrit le résumé, puis termine la session. Si le résumé échoue, la session reste où elle était. Une session en cours ne peut pas du tout être déposée sur Done : « This session is still running. Pause it first, then end it. » (il faut d'abord la mettre en pause, puis la terminer).
Une exécution réelle
Exemple. Le panneau des captures d'écran, et ce qu'osFoundry conclut de chaque écran. Les verdicts viennent du fichier de règles de Claude Code, claude.toml, que l'app embarque et qui est aussi servi sur osfoundry.io/agent-detection/claude.toml.
~/code/shop-api (fix/checkout-retry) $ claude ● Retry now reuses the first charge. Updating the payment code. Edit file src/payments/charge.ts 41 - const intent = await stripe.paymentIntents.create(params) 41 + const intent = await stripe.paymentIntents.create(params, { 42 + idempotencyKey: `charge-${order.id}`, 43 + }) Do you want to make this edit to charge.ts? ❯ 1. Yes 2. Yes, allow all edits during this session 3. No, and tell Claude what to do differently à l'écran state règle déclenchée carte spinner, "esc to interrupt" working esc to interrupt Running le prompt ci-dessus blocked Do you want to (proceed|continue|make this edit|create) Needs you ... vous appuyez sur Entrée sur "1. Yes" de nouveau le spinner working esc to interrupt Running ● Update(src/payments/charge.ts) ⎿ Updated src/payments/charge.ts with 3 additions and 1 removal ● Bash(npm test -- payments) ⎿ Tests: 42 passed, 42 total ● Fixed. A second press of Pay now reuses the first charge. La règle blocked est placée au-dessus de la règle working exprès. Tant qu'un prompt est affiché, le pied de page de Claude Code peut encore indiquer « esc to interrupt », et c'est la première règle qui correspond qui l'emporte.
Où passe la limite
osFoundry ne répond jamais à un prompt à votre place. D'autres agents peuvent taper dans un panneau via l'outil runtime_send de l'app, mais celui-ci refuse un panneau qui attend une décision. Répondre passe par un outil au nom distinct, runtime_answer, et vous confirmez chaque réponse. La vérification se fait sur une lecture fraîche de l'écran au moment de taper, pas sur le dernier balayage : un prompt apparu un instant plus tôt ne peut donc pas capter des frappes destinées à du texte ordinaire.
Un écran qu'osFoundry ne sait pas lire est signalé comme Idle, jamais comme Needs you. Le commentaire dans detect.rs en donne la raison : une seule fausse alerte, et plus personne ne fait confiance au badge, et ensuite les vraies alertes sont perdues elles aussi. Donc, quand une règle a un doute, l'app signale moins, pas plus.
Les règles sont des données, pas du code. Un fichier de règles téléchargé peut changer les motifs qui correspondent, et rien d'autre. Il ne peut pas changer le programme qui s'exécute. Votre propre surcharge se place dans ~/.osfoundry/agent-detection/claude.toml.
Le texte du terminal reste dans la mémoire de l'app de bureau. Seule une session que vous terminez laisse une trace hors du panneau : son résumé dans vos fichiers de connaissances, écrit avant que quoi que ce soit soit archivé.
Et ensuite
Lancez un second Claude Code dans un autre dossier, donnez aux deux une tâche qui demande une modification, et laissez le tableau Sessions filtré sur Needs me only pendant que vous faites autre chose. Si vous n'avez pas encore l'app de bureau, elle se trouve sur la page de téléchargement.







