# rtb-cli
> Part of the [phpboyscout Rust toolkit](https://rust.phpboyscout.uk) —
> small, framework-free crates extracted from
> [rust-tool-base](https://gitlab.com/phpboyscout/rust-tool-base).
The CLI runtime family: a four-crate workspace sharing one version
line. `rtb-cli` builds the application; the other three each register
a built-in command into the same link-time registry:
- **`rtb-cli`** — the entry-point crate every downstream tool's
`main()` touches: `Application::builder` typestate, clap
integration of `BUILTIN_COMMANDS`, tracing + miette wiring, signal
binding, and the built-in command suite (`version`, `doctor`,
`init`, `config`, `credentials`, `telemetry`).
- **`rtb-docs`** — interactive docs browser (`ratatui` two-pane TUI),
loopback `docs serve` HTML server, `tantivy` full-text search, and
a streaming AI Q&A seam (`ai` feature → `rtb-chat`).
- **`rtb-update`** — signature-verified self-update: select,
download, verify (Ed25519 + SHA-256), atomically swap, roll back.
Composes on `rtb-forge`.
- **`rtb-mcp`** — Model Context Protocol server (via the official
`rmcp` SDK) exposing `mcp_exposed` commands as MCP tools.
```rust
use rtb_cli::prelude::*;
#[tokio::main]
async fn main() -> miette::Result<()> {
Application::builder()
.metadata(ToolMetadata::builder().name("mytool").summary("a tool").build())
.version(VersionInfo::from_env())
.build()?
.run()
.await
}
```
- **Docs:** <https://cli.rust.phpboyscout.uk>
- **API reference:** <https://docs.rs/rtb-cli> ·
<https://docs.rs/rtb-docs> · <https://docs.rs/rtb-update> ·
<https://docs.rs/rtb-mcp>
- **Crates:** <https://crates.io/crates/rtb-cli> ·
<https://crates.io/crates/rtb-docs> ·
<https://crates.io/crates/rtb-update> ·
<https://crates.io/crates/rtb-mcp>
## Development
`just ci` runs the full local gate (fmt, clippy, nextest, doc, deny),
including `--all-features` clippy + test passes that exercise
rtb-docs' `ai` feature. Tests include a cucumber BDD suite
(`crates/rtb-cli/tests/bdd.rs`) and trybuild compile-fail fixtures
(run isolated — see `.config/nextest.toml`; nextest is required).
Releases are cut by release-plz from Conventional Commits — do not
tag manually.
## License
MIT