Callers
Every feature against every caller — a person, an agent, CI, a screen reader and another program — and the test that holds each cell.
Generated by npm run callers:page from examples/conformance/src/callers.ts.
Do not edit by hand.
Five callers arrive at a command, and each one is told apart by what it can observe — whether stdout is a terminal, the environment, the flags — never by guessing who is on the other end. Every feature has a cell per caller. A cell is held by a named test, does not apply (and says why, and that caller gets the plain static text), or is missing. A missing cell is a gap we publish, and the count of them may only fall.
43 held · 7 n/a · 5 missing, of 55 cells.
The callers
| Caller | Who | Told apart by | Mode |
|---|---|---|---|
| tty | a person at a terminal | stdout is a TTY, no agent variable, no CI | tty |
| agent | an AI agent | a pipe, --json, or an agent variable (CLAUDECODE, AI_AGENT, …) even on a TTY | json · pipe |
| ci | CI or a script | a pipe, or CI set | ci |
| accessible | a screen reader | a TTY with CLI_ACCESSIBLE set | accessible |
| program | another program | --schema, --mcp, a completion script, the Fig spec | json |
The matrix
| Feature | Package | tty | agent | ci | accessible | program |
|---|---|---|---|---|---|---|
| help | burgee | ✅ | ✅ | ✅ | ✅ | ✅ |
| errors | burgee | ✅ | ✅ | ✅ | ❌ missing | ✅ |
| prompts | caique | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| spinner | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| progress | flagstaff | ✅ | ✅ | ✅ | ✅ | ✅ |
| table | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| box | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| theme | roundel | ✅ | ✅ | ✅ | ✅ | n/a |
| plugins | burgee · flagstaff | ✅ | ✅ | ✅ | ✅ | ✅ |
| completions | burgee | ✅ | n/a | n/a | n/a | ✅ |
| mcp | burgee | n/a | ✅ | n/a | n/a | ✅ |
Each cell
| Feature | Caller | Held by |
|---|---|---|
| help | tty | ✅ packages/burgee/src/help.test.ts › “takes its width from the injected stdout when it has columns (H3)” |
| help | agent | ✅ packages/burgee/src/color.test.ts › “a detected agent reads plain help even on a terminal, as it reads non-interactive (N12)” |
| help | ci | ✅ packages/burgee/src/color.test.ts › “is styled on a terminal, and only there” |
| help | accessible | ✅ packages/burgee/src/color.test.ts › “is plain under CLI_ACCESSIBLE, as every accessible surface is” |
| help | program | ✅ packages/burgee/src/help-json.test.ts › “is the same shape as --schema, scoped to one command” |
| errors | tty | ✅ packages/burgee/src/json-failure.test.ts › “$name: at a terminal, stderr is the prose alone — no JSON (R6)” |
| errors | agent | ✅ packages/burgee/src/json-failure.test.ts › “$name: the envelope is on stdout, alone, and stderr is the one structured line (R6)” |
| errors | ci | ✅ packages/burgee/src/json-failure.test.ts › “$name: plain mode keeps its prose on stderr, nothing on stdout, and the structured line last when stderr is piped (R6)” |
| errors | accessible | ❌ missing — no test holds this cell yet |
| errors | program | ✅ packages/burgee/src/json-failure.test.ts › “$name: isError with the envelope as the text, then answers the next call” |
| prompts | tty | ✅ packages/caique/src/shape.test.ts › “on a terminal, the same call is a prompt” |
| prompts | agent | ✅ scripts/prompt-exit-codes.test.ts › “carries the code into the JSON envelope an agent reads” |
| prompts | ci | ✅ scripts/prompt-exit-codes.test.ts › “a question nobody can answer — no TTY — exits 2, naming the flag to pass instead” |
| prompts | accessible | ✅ packages/caique/src/ask.test.ts › “writes no escape sequence and no carriage return — it is the accessible mode” |
| prompts | program | ❌ missing — no test holds this cell yet |
| spinner | tty | ✅ packages/flagstaff/src/spinner.test.ts › “hoisted on a terminal with a manual clock, the frames are exact” |
| spinner | agent | ✅ packages/flagstaff/src/loop.test.ts › “json: one NDJSON event per transition on stderr, stdout untouched” |
| spinner | ci | ✅ packages/flagstaff/src/ora.test.ts › “under CI the same, even when the stream claims to be a terminal” |
| spinner | accessible | ✅ packages/flagstaff/src/loop.test.ts › “%s: the static projection once per state change, no repaint” |
| spinner | program | ❌ missing — no test holds this cell yet |
| progress | tty | ✅ packages/flagstaff/src/builtins.test.ts › “the drawn bar is exactly the width it was given” |
| progress | agent | ✅ packages/flagstaff/src/loop.test.ts › “json: one NDJSON event per transition on stderr, stdout untouched” |
| progress | ci | ✅ packages/flagstaff/src/builtins.test.ts › “%s writes no carriage return and no escape on a pipe” |
| progress | accessible | ✅ packages/flagstaff/src/loop.test.ts › “%s: the static projection once per state change, no repaint” |
| progress | program | ✅ packages/flagstaff/src/progress.test.ts › “sends done, total and the static line through ctx.progress, and draws nothing in either projection” |
| table | tty | ✅ packages/flagstaff/src/builtins.test.ts › “draws a grid whose every row is the same measured width” |
| table | agent | ✅ packages/flagstaff/src/builtins.test.ts › “the component emits header-and-value pairs off a terminal, not the grid” |
| table | ci | ✅ packages/flagstaff/src/builtins.test.ts › “%s writes no carriage return and no escape on a pipe” |
| table | accessible | ✅ packages/flagstaff/src/loop.test.ts › “%s: the static projection once per state change, no repaint” |
| table | program | ❌ missing — no test holds this cell yet |
| box | tty | ✅ packages/flagstaff/src/builtins.test.ts › “draws the border it was asked for, at the width it was given” |
| box | agent | ✅ packages/flagstaff/src/loop.test.ts › “json: one NDJSON event per transition on stderr, stdout untouched” |
| box | ci | ✅ packages/flagstaff/src/builtins.test.ts › “the component says the text off a terminal, and draws only on one” |
| box | accessible | ✅ packages/flagstaff/src/loop.test.ts › “%s: the static projection once per state change, no repaint” |
| box | program | ❌ missing — no test holds this cell yet |
| theme | tty | ✅ packages/roundel/src/theme.test.ts › “degrades to the nearest readable of 256 at level 2” |
| theme | agent | ✅ packages/roundel/src/theme.test.ts › “flies at level 0 when the run was asked for --json” |
| theme | ci | ✅ packages/roundel/src/policy.test.ts › “an empty CI with no vendor is the table’s floor, not the terminal’s level” |
| theme | accessible | ✅ packages/roundel/src/policy.test.ts › “defaults to 0 on the most colour-capable terminal there is” |
| theme | program | n/a — --schema and --mcp carry data, never styled text: the json row of the colour policy (level 0) is what they get |
| plugins | tty | ✅ packages/flagstaff/src/cli.test.ts › “prints the plugin in all five modes side by side and exits 0” |
| plugins | agent | ✅ packages/flagstaff/src/cli.test.ts › “prints the plugin in all five modes side by side and exits 0” |
| plugins | ci | ✅ packages/flagstaff/src/cli.test.ts › “prints the plugin in all five modes side by side and exits 0” |
| plugins | accessible | ✅ packages/flagstaff/src/cli.test.ts › “prints the plugin in all five modes side by side and exits 0” |
| plugins | program | ✅ packages/burgee/src/schema-fields.test.ts › “names the plugin that contributed it” |
| completions | tty | ✅ packages/burgee/src/mcp.test.ts › “the Fig spec and the shell completions still offer it, because a person is not an agent” |
| completions | agent | n/a — a completion script is what a shell sources; this caller runs commands, and reads --schema for what they take |
| completions | ci | n/a — a completion script is what a shell sources; this caller runs commands, and reads --schema for what they take |
| completions | accessible | n/a — the candidate list is drawn by the shell, not by the program; the script hands it plain words, one per line |
| completions | program | ✅ packages/burgee/src/completions.test.ts › “%s script is deterministic and mentions every visible command and option” |
| mcp | tty | n/a — --mcp speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | agent | ✅ packages/burgee/src/mcp.test.ts › “lists exactly the commands the author did not withhold, generated from the manifest (N1, N2, N6)” |
| mcp | ci | n/a — --mcp speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | accessible | n/a — --mcp speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | program | ✅ packages/burgee/src/mcp.test.ts › “completes the handshake and names the program (N1)” |