Al terminar tendrás Claude Code corriendo en un panel de terminal, Codex en otro y un par de chats y agentes funcionando al lado. Un solo tablero en osFoundry los muestra todos. Cuando Claude Code se detiene en "Do you want to make this edit?", su tarjeta pasa a la columna Needs you (te necesita) en menos de un segundo. Un clic abre el panel justo en ese prompt. Respondes y la tarjeta vuelve a Running (en ejecución).
Quién hace qué
| Claude Code | App de escritorio de osFoundry | |
|---|---|---|
| Inicio de sesión | Su propio login de Claude, en su propio proceso | No guarda nada de eso. En un agente que ella misma lanzó, elimina la ANTHROPIC_API_KEY heredada para que una ejecución con suscripción no se facture como API |
| Dónde se ejecuta | Un PTY real en la pantalla Terminal, en la carpeta de tu proyecto | Es dueña del PTY y mantiene una copia emulada de la pantalla |
| Quién aprueba | Tú, en el propio prompt de permisos de Claude Code | Nunca responde por ti. Solo mueve la tarjeta y abre el panel |
| Cómo se conoce el estado | Claude Code dibuja su interfaz como siempre | Lee la pantalla cada 700 ms contra reglas publicadas y recibe informes de hooks cuando lanzó ella el agente |
| Dónde quedan los datos | Tus archivos, tu terminal | El texto de la pantalla se queda en la memoria de la app en tu Mac. Al terminar una sesión de agente se escribe un resumen en tus archivos de conocimiento |
Configuración
- Abre la pantalla Terminal (barra lateral Main → Terminal,
/terminal) e inicia los agentes como lo harías normalmente. Cada panel es su propio PTY.
~/code/shop-api (fix/checkout-retry) $ claude
~/code/shop-web $ codex
osFoundry reconoce Claude Code por el programa que ocupa la terminal, o por su pantalla si lo iniciaste con un script envoltorio. No hay nada que configurar.
- Abre Sessions (barra lateral Main → Sessions,
/sessions). Cada chat, agente individual, equipo, bucle y sesión de terminal es una tarjeta. Las columnas son Running, Needs you, Paused (en pausa), Idle (inactiva), Done (terminada) y Failed (fallida). No puedes arrastrar una tarjeta a una columna para fijar su estado; la columna depende de lo que informa el runtime.
- Haz clic en Filter (pasa a decir Filtered cuando hay un filtro activo) y marca Needs me only (solo lo que me necesita). Los tipos (Chat, Agent, Team, Loop, Terminal) y el rango de tiempo se quedan como estaban.
Quedan dos tarjetas: un chat que hizo una pregunta y la terminal de Claude Code en shop-api.
Un chat llega aquí cuando su mensaje más reciente termina en una pregunta que sigue esperando respuesta. Una terminal llega aquí cuando su estado es blocked, que es lo que muestra el siguiente paso.
- Haz clic en la tarjeta
shop-api. La pantalla Terminal se abre en ese panel con el prompt todavía visible. El riel de la izquierda marca Claude Code como "Needs you · shop-api" y Codex como "Working · shop-web".
Con varios paneles abiertos, Mod+. (⌘. en un Mac) salta al siguiente agente que te necesita. La barra de estado lo indica: "⌘. to jump to what needs you".
- Responde en el panel como lo harías en cualquier otro sitio: Enter en
1. Yes. Claude Code sigue trabajando y, en la siguiente pasada, el riel y el tablero lo vuelven a mostrar como Working / Running.
- Cuando una sesión de agente ha terminado y está en Idle, arrastra su tarjeta a Done. La app pregunta antes.
Al confirmar, se escribe el resumen y después se termina la sesión. Si el resumen falla, la sesión se queda donde estaba. Una sesión en ejecución no se puede soltar en Done de ninguna manera: "This session is still running. Pause it first, then end it." (primero hay que pausarla y luego terminarla).
Una ejecución real
Ejemplo. El panel de las capturas y lo que concluye osFoundry de cada pantalla. Los veredictos salen del archivo de reglas de Claude Code, claude.toml, que la app incluye y que también se publica en 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
en pantalla state regla que coincidió tarjeta
spinner, "esc to interrupt" working esc to interrupt Running
el prompt de arriba blocked Do you want to (proceed|continue|make this edit|create) Needs you
... pulsas Enter en "1. Yes"
spinner otra vez 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 regla blocked está por encima de la regla working a propósito. Mientras hay un prompt abierto, el pie de Claude Code puede seguir diciendo "esc to interrupt", y gana la primera regla que coincide.
Dónde está el límite
osFoundry nunca responde un prompt por ti. Otros agentes pueden escribir en un panel con la herramienta runtime_send de la app, pero esta rechaza un panel que está esperando una decisión. Responder pasa por una herramienta con otro nombre, runtime_answer, y tú confirmas cada respuesta. La comprobación se hace con una lectura nueva de la pantalla en el momento de escribir, no con la última pasada, así que un prompt que apareció hace un instante no puede tragarse pulsaciones pensadas como texto normal.
Una pantalla que osFoundry no puede leer se informa como Idle, nunca como Needs you. El comentario en detect.rs da el motivo: una sola falsa alarma y la gente deja de fiarse del indicador, y a partir de ahí las alarmas verdaderas también se pierden. Por eso, cuando una regla no está segura, la app informa de menos, no de más.
Las reglas son datos, no código. Un archivo de reglas descargado puede cambiar qué patrones coinciden y nada más. No puede cambiar qué programa se ejecuta. Tu propia versión va en ~/.osfoundry/agent-detection/claude.toml.
El texto de la terminal se queda en la memoria de la app de escritorio. Solo una sesión que terminas deja rastro fuera del panel: su resumen en tus archivos de conocimiento, escrito antes de que nada se archive.
Siguiente paso
Inicia un segundo Claude Code en otra carpeta, dale a los dos una tarea que requiera una edición y deja el tablero Sessions filtrado por Needs me only mientras haces otra cosa. Si todavía no tienes la app de escritorio, está en la página de descarga.






Top comments (0)