Registering commands without life before main
Rust has no init or pre-main phase, so self-registering commands need another mechanism. Using a distributed slice to get the same shape.

Rust has no init or pre-main phase, so self-registering commands need another mechanism. Using a distributed slice to get the same shape.

Porting a Go framework to Rust separates design from idiom. Which decisions survived the move, which were habits, and how to tell them apart.

You do not need LangChain in a command-line tool. A four-method chat interface can hide five providers, tool calling and structured output.

Timing, auth, recovery and logging are cross-cutting in a CLI too. Wrapping Cobra commands in web-style middleware rather than PreRun hooks.

One tool, three logging backends: colour for a terminal, JSON for a container, silence for tests. Depend on the interface, choose the backend once.

Go embed.FS is per-package, so a modular CLI ends up with islands. Merging them into one filesystem, and deep-merging YAML and JSON across them.

Passing dependencies to Go commands in a typed struct rather than stuffing them in context.Context, so the compiler checks them and tests stay simple.
