Skip to content

v3.0.0

Latest

Choose a tag to compare

@StevenTCramer StevenTCramer released this 14 Oct 17:17
· 339 commits to master since this release
c1982f9

TimeWarp.Nuru 3.0: CLIs your agents can call

Every Nuru app now describes itself to an agent and accepts its arguments as JSON. You don't need an
MCP server or a second schema. It's one package.

myapp --capabilities                                        # endpoints[] + invocation{}
myapp deploy --json-args '{"env":"staging","tag":"3.0.0"}'  # route literal on argv, values as JSON
myapp apply_patch --json-args @./patch.json                 # or - for stdin

📝 Blog: https://thefreezeteam.com/posts/steven-t-cramer/2026/10/2026-10-15-nuru-3.0-release · 📖 Migrating to 3.0

Agent contract

  • --capabilities emits a flat endpoints list. Each endpoint carries pattern, groupPath,
    aliases, kind (query, command, idempotentCommand, or unspecified), parameters, and
    options. examples is included only when the route declares them. A top-level invocation
    object names the transport: jsonArgs, stdin: "-", filePrefix: "@", merge: "argvOverridesJson",
    and unknownKeys: "error".
  • --json-args binds parameter and option values from inline JSON, @path, or - (stdin) on
    the same code path as argv. Argv values override JSON. An unknown key is an error with exit code 1.
  • --group-filter <g> filters that JSON document. --capabilities --search <q> does not.
    It runs nuru search and prints that tool's listing.
  • TimeWarp.Nuru.Search (dotnet tool install -g TimeWarp.Nuru.Search) adds nuru index and
    nuru search, which run full-text search over the capabilities of every CLI you index.
  • tw-nuru skill (skills/tw-nuru/SKILL.md) gives an agent the route syntax, the builder API,
    and the testing patterns in context. It replaces the MCP server.

Also new in 3.0

  • REPL key-binding profiles: Default, Emacs, Vi, and VSCode. A global JSON profile can be
    set with NURU_KEYBINDINGS, and the key-bindings command lists the bindings.
  • Shell completion for bash, zsh, fish, and PowerShell: --generate-completion and
    --install-completion. Completion can hand File and Directory candidates to the shell.
  • Route examples appear in --help and in --capabilities.
  • Endpoint classes use TimeWarp.Mediator contracts. The generated IMediator, ISender, and
    IPublisher are available with or without Microsoft DI. Nuru 3.0.0 depends on stable
    TimeWarp.Mediator 14.0.0, so you don't need --prerelease or a prerelease opt-in for Mediator.
  • Nuru 3.0.0 depends on stable TimeWarp.Amuru 2.0.0 (new since 2.x). You don't need
    --prerelease or a prerelease opt-in for Amuru.
  • Pre-release review: Grok and Claude agents filed 28 findings. 22 were fixed before the tag.
    20 of those, plus a changelog backfill, landed in 15 PRs (#283–#297, stacked in #298). The other
    two were fixed on the review task (#282). Six are scheduled after 3.0. The record is in
    kanban/done/482-complete-code-review-of-timewarpnuru-before-the-official-30-release/review/.

⚠️ Breaking changes

  • Contracts moved to TimeWarp.Mediator: IMessage, IQuery<T>, ICommand<T>,
    IIdempotentCommand<T>, IIdempotent, the three handler interfaces, and Unit. To migrate:
    • Add using TimeWarp.Mediator;.
    • Handlers return Task<T> instead of ValueTask<T>. Use Unit.Task and Task.FromResult.
    • Remove using static ...Unit;.
  • [NuruRoute] endpoint classes must be public
    (timewarp-mediator#64).
  • Endpoint kind precedence: Query, then IdempotentCommand, then Command.
  • --capabilities output is a flat endpoints list with groupPath. It used to be grouped.
  • Removed:
    • MapDefault. Use Map("").
    • AddReplSupport(). Use AddRepl().
    • The TimeWarp.Nuru.Mcp package, which is no longer published. Use the skill.
  • Obsolete, still present in 3.0: NuruAppBuilder.Services (it throws) and AddReplOptions.
  • Targets net10.0 only. The minimum SDK is 10.0.3xx.

See Migrating to 3.0
for before and after code, and changelog.md
for every beta.

Full Changelog: v3.0.0-beta.80...v3.0.0