# burgee > Everything a CLI needs that isn't your CLI. Written once, served to humans and agents alike. A CLI framework that replaces commander and yargs, is drop-in compatible with both, and projects help, --json, --schema, an MCP server and shell completions from one declaration. ## Packages - [burgee](https://burgee.interlace.tools/docs/packages/burgee) — replaces commander and yargs. An agent-native CLI framework, drop-in compatible with commander and yargs. One declaration; help, --json, --schema, --mcp and completions all projected from it. - [bellpull](https://bellpull.interlace.tools/docs) — replaces cross-spawn and which. The cord you pull to ring a bell in another room. Subprocesses with executable resolution and a structured result every caller can read — human, JSON envelope or agent event. Drop-in paths for cross-spawn and which; its own run() and resolver are the execa alternative, not a drop-in. Zero dependencies. - [Coming from execa](https://bellpull.interlace.tools/docs/coming-from/execa): An execa alternative with zero dependencies: bellpull's run() treats a non-zero exit as a value, not an exception, says which binary ran, and renders one result as text, --json or an agent event. Not an execa drop-in: execa's own suite grades it 0 / 1048, and that zero is the design. - [Coming from cross-spawn](https://bellpull.interlace.tools/docs/coming-from/cross-spawn): A cross-spawn alternative with a drop-in path: import spawn from bellpull/cross-spawn, graded 68 / 68 by cross-spawn's own test suite — then zero dependencies, and a run() whose result says which binary ran and treats a non-zero exit as a value. - [Coming from which](https://bellpull.interlace.tools/docs/coming-from/which): A which alternative with a drop-in path: import which from bellpull/node-which, graded 5 / 5 by node-which's own test suite — then zero dependencies, and a resolver that returns the PATH entry the binary came from. - [caique](https://caique.interlace.tools/docs) — replaces inquirer and clack. The parrot that always answers back, and the boat that goes between ship and shore. Prompts that are flags first, so agents answer before they are asked and non-TTY callers get an error naming the flag, never a hang. Drop-in path for inquirer and clack. - [Coming from inquirer](https://caique.interlace.tools/docs/coming-from/inquirer): An inquirer alternative for prompts that never hang: caique/inquirer carries @inquirer/core's surface, graded 41 / 41 by its own suite — and caique's prompts are flags first, so a non-TTY caller gets an error naming the flag instead of a hang. - [Coming from clack](https://caique.interlace.tools/docs/coming-from/clack): A clack (@clack/prompts) alternative with two ways across: caique/clack, clack's prompts under clack's names on caique's own engine, graded by clack's own suite; or caique's flag-first prompts, where a non-TTY caller gets an error naming the flag instead of a hang. - [closeout](https://closeout.interlace.tools/docs) — replaces signal-exit, exit-hook and restore-cursor. Close everything out. Exit handlers that run exactly once on every path, terminal restore, and a bounded deadline so shutdown cannot hang. Drop-in paths for signal-exit, exit-hook and restore-cursor. Zero dependencies. - [Coming from signal-exit](https://closeout.interlace.tools/docs/coming-from/signal-exit): A signal-exit alternative with a drop-in path: import { onExit } from closeout/signal-exit, graded 134 / 135 by signal-exit's own test suite, level with signal-exit itself — then an onExit that runs once on every exit path under a bounded deadline, and reports as --json or an agent event. - [Coming from exit-hook](https://closeout.interlace.tools/docs/coming-from/exit-hook): An exit-hook alternative with a drop-in path: import exitHook from closeout/exit-hook, graded 21 / 21 by exit-hook's own test suite — then phases that hand the terminal back last, and an onExit that reaches every exit path under one bounded deadline. - [Coming from restore-cursor](https://closeout.interlace.tools/docs/coming-from/restore-cursor): A restore-cursor alternative with a drop-in path: import restoreCursor from closeout/restore-cursor, graded 6 / 6 by restore-cursor's own test suite — then zero dependencies, and a restore phase that runs after every other exit handler. - [controlroom](https://burgee.interlace.tools/docs/packages/controlroom) — replaces ink. Reserved, and not usable yet: full-screen, keyboard-driven terminal screens with a static projection for pipes, CI and --json. The planned drop-in path for ink. Its only export today is status = 'reserved'. - [flagstaff](https://flagstaff.interlace.tools/docs) — replaces ora, log-update, boxen and cli-table3. The staff the flag flies from. A terminal frame loop with a static projection for agents and screen readers, and a plugin host for spinners, progress, boxes and tables. Drop-in paths for ora, log-update, boxen and cli-table3. No dependency outside the burgee family. - [Coming from ora](https://flagstaff.interlace.tools/docs/coming-from/ora): An ora alternative with a drop-in path: import ora from flagstaff/ora, graded 99 / 99 by ora's own test suite — then a frame loop whose static projection gives pipes one line per state and --json one event per transition. - [Coming from log-update](https://flagstaff.interlace.tools/docs/coming-from/log-update): A log-update alternative with a drop-in path: import logUpdate from flagstaff/log-update, graded 99 / 99 by log-update's own test suite — then a frame loop whose static projection gives pipes one line per state and --json one event per transition. - [Coming from boxen](https://flagstaff.interlace.tools/docs/coming-from/boxen): A boxen alternative with a drop-in path: import boxen from flagstaff/boxen, graded 84 / 84 by boxen's own test suite — then a box component whose static projection gives a pipe, an agent and a screen reader the text and title, not the border. - [Coming from cli-table3](https://flagstaff.interlace.tools/docs/coming-from/cli-table3): A cli-table3 alternative with a drop-in path: import Table from flagstaff/cli-table3, graded 29 / 29 by cli-table3's own test suite — then a table component whose static projection gives a pipe and an agent one line of header: value pairs per row. - [linegauge](https://linegauge.interlace.tools/docs) — replaces string-width, wrap-ansi, strip-ansi and slice-ansi. A printer's line gauge — the steel rule marked in picas and points. Measuring, wrapping, truncating and slicing styled terminal text without the edge fraying — grapheme-correct over Intl.Segmenter. Drop-in paths for string-width, wrap-ansi, strip-ansi and slice-ansi. Zero dependencies. - [Coming from string-width](https://linegauge.interlace.tools/docs/coming-from/string-width): A string-width alternative with zero dependencies: linegauge's default export is string-width, graded 229 / 229 by its own suite — plus wrap-ansi, strip-ansi and slice-ansi paths, grapheme-correct over Intl.Segmenter and pure, so a pipe and a terminal get the same columns. - [Coming from wrap-ansi](https://linegauge.interlace.tools/docs/coming-from/wrap-ansi): A wrap-ansi alternative with a drop-in path: import wrapAnsi from linegauge/wrap, graded 80 / 80 by wrap-ansi's own test suite — then zero dependencies, one style stack shared with slice, and the same grapheme-correct width string-width is graded on, so a wrapped row measures the way a terminal draws it. - [Coming from strip-ansi](https://linegauge.interlace.tools/docs/coming-from/strip-ansi): A strip-ansi alternative with a drop-in path: import stripAnsi from linegauge/strip, graded 8 / 8 by strip-ansi's own test suite — then no ansi-regex underneath, and one escape scanner shared with width, wrap and slice, so what strip removes is exactly what they count as zero columns. - [Coming from slice-ansi](https://linegauge.interlace.tools/docs/coming-from/slice-ansi): A slice-ansi alternative with a drop-in path: import sliceAnsi from linegauge/slice, graded 104 / 104 by slice-ansi 9's own test suite — then zero dependencies, grapheme clusters never halved, and one style stack shared with wrap. - [paratext](https://paratext.interlace.tools/docs) — replaces ansi-escapes, terminal-link and term-img. Everything around your terminal output that is not the output: hyperlinks, images, window title, clipboard, notifications and the bell — each with a static fallback for terminals that cannot do it. Drop-in paths for ansi-escapes, terminal-link and term-img; term-img's takes image bytes, not file paths. Zero dependencies. - [Coming from ansi-escapes](https://paratext.interlace.tools/docs/coming-from/ansi-escapes): An ansi-escapes alternative with a drop-in path: import ansiEscapes from paratext, graded 4 / 4 by ansi-escapes' own test suite — then hyperlinks, images and the working directory that project to plain text for pipes and agents instead of raw escape bytes. - [Coming from terminal-link](https://paratext.interlace.tools/docs/coming-from/terminal-link): A terminal-link alternative with a drop-in path: import terminalLink from paratext/terminal-link, graded 8 / 8 by terminal-link's own test suite, with two cases excluded by name — then zero dependencies, and hyperlinks that project to plain text for pipes and agents. - [Coming from term-img](https://paratext.interlace.tools/docs/coming-from/term-img): A term-img alternative with a drop-in path for image bytes: import terminalImage from paratext/term-img, graded 12 / 18 by term-img's own test suite — all six misses pass a file path, which paratext declines to read — then zero dependencies and no node:fs. - [roundel](https://roundel.interlace.tools/docs) — replaces chalk. The colours a CLI carries. One output policy, semantic tokens, a theme, and a chalk migration path lighter than chalk. Zero dependencies. - [Coming from chalk](https://roundel.interlace.tools/docs/coming-from/chalk): A chalk alternative with a drop-in path: import chalk from roundel/chalk, graded 58 / 58 by chalk's own test suite — then semantic tokens that go plain on a pipe, under NO_COLOR and under --json. - [seniority](https://seniority.interlace.tools/docs) — replaces cosmiconfig, dotenv and rc. Which source outranks the others. One resolution for flags, environment, project and home config files and defaults — with provenance, so every value can say where it came from. Drop-in paths for cosmiconfig, dotenv and rc. Zero dependencies. - [Coming from cosmiconfig](https://seniority.interlace.tools/docs/coming-from/cosmiconfig): A cosmiconfig alternative with zero dependencies: import { cosmiconfig } from seniority, graded 186 / 243 by cosmiconfig's own suite (YAML is the gap) — with provenance, so every resolved value can say where it came from, as text, --json data or an agent event. - [Coming from dotenv](https://seniority.interlace.tools/docs/coming-from/dotenv): A dotenv alternative with a drop-in path: import dotenv from seniority/dotenv, graded 106 / 141 by dotenv's own test suite (the declined .env.vault is most of the gap) — then the same package resolves every value across flags, env, config files and defaults, with provenance as text, --json data or an agent event. - [Coming from rc](https://seniority.interlace.tools/docs/coming-from/rc): An rc alternative with a drop-in path: import rc from seniority/rc, graded 1 / 1 by rc's own test — one exit-code bit, not a case count — then rc's file stack and merge with none of its four dependencies, and a resolver that says where every value came from. ## Documentation - [Your CLI is an agent tool](https://burgee.interlace.tools/docs/agent-surfaces): Every burgee program answers --schema and --mcp from its one declaration — no tool definitions, no second interface. - [Benchmarks](https://burgee.interlace.tools/docs/benchmarks): Every number this project claims in public, measured — and the ones that are not measured, saying so. - [burgee vs the alternatives](https://burgee.interlace.tools/docs/comparison): Measured against commander, yargs, oclif, cac and citty — every capability row marked built is in the package today, with its tests. - [Compatibility](https://burgee.interlace.tools/docs/compatibility): Each host's own test suite, run against burgee in CI. A published pass rate that only goes up — never the word "compatible". - [Contrast](https://burgee.interlace.tools/docs/contrast): Why your CLI's colours are checked, what AA and AAA actually require, and how to find out which one you meet. - [Gallery](https://burgee.interlace.tools/docs/gallery): Every component and every registered plugin, rendered by running them — the static projection beside the animation, in all five modes. - [Getting started](https://burgee.interlace.tools/docs/getting-started): One file, one command, and your agent connected to it while you write it. - [Overview](https://burgee.interlace.tools/docs): burgee is a CLI framework that replaces commander and yargs, is drop-in compatible with both, and projects help, --json, --schema, an MCP server and completions from one declaration. - [Migrate](https://burgee.interlace.tools/docs/migrate): One command moves a project from commander, yargs, chalk, ora and a dozen more incumbents to the family's drop-ins — every import the compatibility oracle grades level, and nothing it does not. - [burgee](https://burgee.interlace.tools/docs/packages/burgee): An agent-native CLI framework, drop-in compatible with commander and yargs. One declaration; help, --json, --schema, --mcp and completions all projected from it. - [controlroom](https://burgee.interlace.tools/docs/packages/controlroom): Reserved, and not usable yet: full-screen, keyboard-driven terminal screens with a static projection for pipes, CI and --json. The planned drop-in path for ink. Its only export today is status = 'reserved'. - [Packages](https://burgee.interlace.tools/docs/packages): burgee and the 9 packages it is built from: what each replaces, and the site its docs live on. - [Plugins](https://burgee.interlace.tools/docs/plugins): Every layer takes plugins the same way — a plain object, validated against one published schema, checked by the package's own command before it ships. One object can extend all nine. - [Research](https://burgee.interlace.tools/docs/research): What 329 open issues across yargs, commander, oclif, citty and clack say about the layer nobody owns. - [The floor](https://burgee.interlace.tools/docs/the-floor): The requirements every CLI on burgee meets, and who holds each — runtime, lint, or both. 74 of the floor's 114 are tabled here. - [burgee vs cac](https://burgee.interlace.tools/docs/vs/cac): A cac alternative, measured against it rather than dropped in: there is no burgee/cac, so moving means rewriting each command. cac is far smaller and starts faster; this is when that matters and when --json, --schema and --mcp matter more. - [burgee vs citty](https://burgee.interlace.tools/docs/vs/citty): A citty alternative, measured against it rather than dropped in: there is no burgee/citty, but both declare a command as one object, so the rewrite is short. When citty is the better choice, when burgee is, and what moving looks like. - [burgee vs commander](https://burgee.interlace.tools/docs/vs/commander): A commander alternative that is drop-in compatible: change one import, keep your code and tests, and gain --json, --schema, --mcp and shell completions. Graded by commander's own test suite. - [burgee vs oclif](https://burgee.interlace.tools/docs/vs/oclif): An oclif alternative, measured against it rather than dropped in: there is no burgee/oclif, so moving means rewriting each command class. When oclif is the better choice, when burgee is, and what the rewrite looks like. - [burgee vs yargs](https://burgee.interlace.tools/docs/vs/yargs): A yargs alternative that is drop-in compatible: change one import, keep your code and tests, and gain --json, --schema, --mcp and shell completions — with no dependency outside the burgee family where yargs has six. - [Weight, per subpath](https://burgee.interlace.tools/docs/weight): What every published entry point costs a consumer's bundle, at both ends of the tree-shaking range. - [Fly your own burgee](https://burgee.interlace.tools/docs/your-own-burgee): Every CLI built on burgee can have a flag of its own — generated from two colours, with your glyph on it, from the same code that draws ours.