Terminal.Gui.Cli

June 23, 2026 · View on GitHub

NuGet License: MIT

A .NET library that turns Terminal.Gui apps into scriptable CLI tools — with typed JSON output, POSIX exit codes, and built-in AI-agent discoverability.

Terminal.Gui.Cli in action

Why

Terminal.Gui gives you rich TUI applications. Terminal.Gui.Cli lets those same apps participate in scripts, pipelines, and agentic workflows — no separate CLI layer needed.

One NuGet package. One CliHost. All your views become commands.

Features

CapabilityHow
CLI parsingPositional command dispatch, typed options, --initial pre-fill
Structured output--json emits a versioned JsonEnvelope
Headless rendering--cat renders viewer content without a TUI
AI discoverability--opencli metadata + agent-guide embedded Markdown
Built-in help--help via pluggable IHelpProvider
Exit codesDeterministic POSIX codes from CommandResult

Quickstart

dotnet add package Terminal.Gui.Cli
using Terminal.Gui.Cli;

CliHost host = new (options =>
{
    options.ApplicationName = "my-app";
    options.Version = "1.0.0";
});

host.Registry.Register (new GreetCommand ());

return await host.RunAsync (args);

Then run it:

my-app greet --initial "World"          # interactive TUI
my-app greet --initial "World" --json   # → {"schemaVersion":1,"status":"ok","value":"Hello, World!"}
my-app info --cat                       # headless viewer output
my-app --opencli                        # machine-readable command metadata
my-app agent-guide                      # embedded agent guidance (Markdown)

Command model

KindInterfaceDescription
InputICliCommand<T>Launches a Terminal.Gui UI, returns a typed result
ViewerIViewerCommandDisplays content; supports --cat for headless rendering

Commands register explicitly (no reflection scanning) and resolve by case-insensitive alias.

Global options

Every command inherits these from the host:

OptionDescription
--help / -hShow help
--versionShow version
--opencliEmit OpenCLI metadata JSON
--jsonWrap output in JSON envelope
--initial <value>Pre-fill input value (non-interactive mode)
--timeout <duration>Cancel after duration (e.g., 30s, 5m)
--output <path> / -oWrite output to file
--catHeadless render (viewer commands only)

Repository layout

src/          Terminal.Gui.Cli library
tests/        Unit, integration, and smoke tests
examples/     Example console app (see hero GIF above)
specs/        Constitution and library specification
scripts/      Tooling and recording scripts
docs/         Images and documentation assets

Building from source

Requires .NET 10 SDK. Solution: Terminal.Gui.Cli.slnx.

dotnet restore Terminal.Gui.Cli.slnx
dotnet build   Terminal.Gui.Cli.slnx

# Run all test tiers
dotnet run --project tests/Terminal.Gui.Cli.Tests
dotnet run --project tests/Terminal.Gui.Cli.IntegrationTests
dotnet run --project tests/Terminal.Gui.Cli.SmokeTests

# Try the example app
dotnet run --project examples/greet -- greet --initial "World" --json

Status

Alpha0.1.0-develop pre-release. API surface is stabilizing; breaking changes possible.

Contributing

See specs/constitution.md for architectural rules and PR requirements.

License

MIT — see LICENSE.