Skip to main content
A coding agent runs to11 in a shell with nobody at the keyboard. In that shell a question would wait forever, so the CLI does not ask it: it prints what it needs as one JSON object, and the agent either finishes the work with a command from that object or hands one sentence to a person.

When the CLI does not prompt

A run is non-interactive when any of these holds: --interactive overrides the flag, the variable and agent detection — for a person working inside an agent’s shell. It never overrides a missing terminal. --interactive with --non-interactive is a usage error. The commands that can prompt are a bare to11, to11 link, to11 login, to11 skill import, and to11 skill sync, which asks one question: whether to remove a skill you picked that is no longer published. to11 ui is a full-screen program and exits 1 without a terminal instead.

Agent markers

An agent is detected from the variables a coding agent sets for the processes it runs. Any non-empty value counts, except where a value is given. Variables that a person’s own shell also carries are not markers, because they would make a person at a terminal non-interactive: CURSOR_TRACE_ID, set in every Cursor terminal; REPL_ID, set in every Replit shell; COPILOT_GITHUB_TOKEN, COPILOT_MODEL and COPILOT_ALLOW_ALL; and ANTIGRAVITY_AGENT. A flag always wins over detection. A marker changes whether the CLI asks, never what --project, --organization or any other flag means.

What changes

Nothing is asked. Each value to11 link takes is read from its flag, its variable, the location’s file and what can be derived, exactly as at a terminal. Then:
  • a value that is still missing is the action_required answer below, and nothing is written;
  • Change targets? is not asked, and the targets are what was detected or given;
  • Which skills? is not asked, and the file’s per-skill choices are left as they are — unless --skill names the skills to receive, which works the same with or without a terminal: to11 link --project acme/web --skill code-review --skill incident-triage, or --skill '*' for all. A name the project does not have fails the link, and nothing is written;
  • the plugin offer is skipped, unless --yes was given;
  • with nobody signed in, nothing is attempted — the answer is not_signed_in;
  • after the link is written, skill folders already in the targets that to11 did not deliver are not adopted, uploaded or asked about: the answer is unmanaged_skills, and the sync does not run.

The action_required object

The command prints one JSON object on stdout, exits 1, and writes nothing. Header lines such as to11 CLI <version> stay on stderr, so stdout parses as exactly one object.
Fields come in this order and are absent rather than null. The objects in choices, next and ask are flat: each field is a string. This is the one place the JSON contract nests, and it stays additive only. Exactly one of next and ask is present. next means the caller can finish on its own; ask means it has to stop and hand the sentence to a person.

The two hints

Both are fixed, so a script can match either string.

Reasons

A value you cannot read is the same question. When --organization, --project or their variables name something you cannot read, the reason is the matching missing_ one, message starts with a sentence naming the value — acme has no project acme/nope that you can read. — and choices holds only what you can read. Signing in is always an ask, never a next. Non-interactive to11 login is itself action_required, so a next naming it would point an agent at the command that printed the object it was trying to resolve:

unmanaged_skills

Its choices are skill folders, each with the location it is in, and its next steps are to11 skill import lines — with --global for your home’s folders, and a path in place of a slug waiting in both locations. A folder in a location that is not linked is a choice with a reason, and that location’s to11 link is a step. The link file is already written when a link stops here; nothing else is.
next has one step per folder per outcome it can have — adopt for an exact match; keep, upload and take for one that differs; upload for one the project does not have, when a copy of it has a description in its SKILL.md (otherwise the choice carries a reason) — and a last step, --skip, that leaves every folder as it is. Each step acts on the folder it names and leaves the others, so any one of them exits 0. A keep step promises the published skill is never delivered here only when no other target holds a copy of it that is, or can be adopted as, to11’s; otherwise its when says the other targets keep receiving it. Run to11 afterwards to sync: in a linked location it does not look at the folders again. A step carries --project when the location’s file names several projects, and --global when the location is your home and the command runs inside a repository.

The next commands

A next[] command finishes without prompting and exits 0. Each carries every value already settled — --organization when you belong to several, --project — and the inputs that shape the file: any --target, --prefix, --skill and --no-plugin you gave, --yes, and --global when the location is your home and the command runs inside a repository. A next[] command never carries a credential. The CLI takes no token flag, so none can reach a suggested command line. After a link, to11 with no flags syncs the location — the when field says so. A home linked from inside a repository is synced with to11 skill sync, because to11 there acts on the repository. After a to11 skill import step, so does to11, or to11 skill sync for that home.

--yes

--yes answers confirmations, never data questions. It accepts a single directory-name match, the detected targets and the plugin offer. It does not choose an organization or a project from several: with any of those open, the answer is still action_required.

Next steps

Commands

What to11 link decides, in which order, and where it writes.

Output formats

Plain versus JSON, and what the JSON contract promises.