Your AI agents can drive Union. Every terminal has a union command that lets the agent inside it see, open, arrange, read and — with your say-so — type into the other terminals in the window. Local only, on by default, one switch to turn off.
An agent running in a Union terminal (Claude Code, Codex, Cursor’s CLI, a shell script, anything) can already edit files. What it could not do was touch the running app: open a second terminal in ./api and run the tests there, bring a terminal to the front when it needs you, colour and group its work, read what another terminal printed, or wait for a build to finish. Conductor is that control plane. It lives inside Union and speaks over a per-user local pipe; nothing is hosted and no network port is opened.
Try it: in any terminal, run union ls. Or tell your agent: “Open a terminal named API in ./api, run the dev server there, and tell me when it’s ready.”
Every terminal Union opens has union on its PATH and a private credential in its environment. Agents find it with union help --agent, a one-page reference written for them. There is nothing to install, no port, no token to paste. Terminals opened before Conductor was turned on (or on an older version) do not have the command; open a new one.
Something running outside a Union terminal (another terminal app, an editor’s agent, an MCP host) gets no credential. The first time it calls union, Union asks you whether to let it in and what it may do, then issues it a boarding pass. Settings → Conductor lists these clients; revoke any of them with one click.
Abilities come in tiers. The first three never ask you anything; the last two ask unless the terminal is one the agent opened itself.
Typing is also gated by what the terminal is doing: Union refuses to type over live output (the agent can choose to wait), and refuses while a confirmation prompt is on screen. An agent can type at most twenty times in ten seconds and open five terminals a minute.
Your terminals are yours. When an agent wants to type into or close a terminal it did not open, Union shows a dialog naming the agent, the terminal, and the first line of what it wants to type. Allow it once, allow it for that terminal, allow it for that agent, or deny. A denied agent is told the human said no.
Protected terminals. Right-click a tab → Protect from Conductor. A protected terminal shows a lock; agents can still see it in the list and arrange it, but can never read it, type into it or close it — no dialog, no override.
Provenance. When an agent has typed into a terminal, a small ⍁ marker appears on that tab for a few seconds, and the tooltip says who typed and when.
The Conductor log. Settings → Conductor keeps the last 500 actions: who, what, which terminal, allowed or refused. It never records what was typed or what a terminal printed, and it never leaves your machine.
Save and apply. union save ws.json writes the open terminals (name, folder, shell, colour, group) to a small JSON file you can edit and share. union apply ws.json opens whatever the file lists that is not open yet (matched by name and folder), runs each new terminal’s command, and sets the layout. It never closes anything, so applying twice is safe — “set up my usual four terminals” becomes one command.
Schedule. union schedule API "npm run deploy" --at 14:30 (or --in 20m) queues the text into Union’s Scheduler, which types it when the time comes. The approval rules are the ones for typing, decided when the message is queued.
On and off from the command line. union conductor off asks you before turning Conductor off. union conductor on asks the running app to turn it back on — you see a dialog and decide — so an agent that finds Conductor off is not stuck.
Agents inside a Union terminal need nothing more. Agents that run elsewhere can get the same abilities as MCP tools: union mcp serves Conductor over stdio. Settings → Conductor → Connect an agent registers it with Claude Code (one entry in ~/.claude.json) or Codex (one block in ~/.codex/config.toml) with a single click. You see the exact file and entry before anything is written; Disconnect removes exactly that entry; a union server you configured yourself is never touched. Any other MCP host can use the copy-paste snippet on the same screen.
Turning on Claude Code Mode offers to connect Claude Code at the same time (one checkbox, on by default). The two are independent: turning Claude Code Mode off leaves the MCP entry in place.
Settings → Conductor → Let agents drive Union. Off stops the pipe immediately, tells connected agents that Conductor is off, and strips the union command and the credential from terminals opened afterwards. Turn it back on any time; no restart needed.
Conductor is local: a per-user named pipe on Windows, a socket only your user can open on macOS and Linux. Union opens no network ports for it and nothing about it is hosted. What agents type, what terminals print, file paths and folder names never leave the device and are never written to the Conductor log. Anonymous usage (when on) records only that Conductor is enabled and which kinds of command run — never their arguments. See the privacy policy.
Every command accepts --json. A terminal is named by its tab name, id, unique prefix, or me. Exit codes: 0 ok, 1 refused or failed, 2 usage, 3 Conductor is off.
See — union ls · union me · union wait <t> [--until idle|exited|prompt|output] [--timeout 2m]
Open & arrange — union open [--cwd DIR] [--shell NAME] [--name N] [--color C] [--group G] [--satellite] [-- CMD...] · union focus <t> [--attention] · union rename <t> <name> · union color <t> <violet|rose|amber|mint|sky|purple|pink|lime|none> · union group create|rename|color|add|remove|rm · union layout <single|columns|rows|grid|freeform> · union hide|unhide <t> · union satellite|recall <t> · union preview <path>
Read & type — union read <t> [-n 200] [--grep RE] [--raw] · union send <t> <text> [--mode input|paste|submit] [--wait] [--force] · union run <t> -- CMD... · union interrupt <t> · union close <t> · union schedule <t> <text> --at HH:MM | --in 10m
Workspaces — union save <file.json> [--force] · union apply <file.json>
Conductor itself — union conductor status|clients|revoke <id>|log|on|off · union mcp · union help --agent
Errors print as CODE — message with a hint for the human: PROTECTED, NOT_SETTLED, PROMPT_ON_SCREEN, CONFIRM_DENIED, TIER_REQUIRED, PAIRING_REQUIRED, CONDUCTOR_OFF.
CONDUCTOR_OFF or command not found.