v3.13.0 keeps the command tree in one Go structure
urfave/cli v3.13.0 lets a Go program describe its root command, children, flags, aliases, help text, and actions with Command values. An action receives a standard context.Context and the active command, so cancellation and deadlines fit ordinary Go code. The same definitions drive generated help, suggestions, compound short flags, and completion for bash, zsh, fish, and PowerShell.
That scope sits in a useful middle ground. Go's flag package handles simple options, while urfave/cli adds the behavior expected from a multi-command tool without asking you to generate a project skeleton. The README says the core depends only on Go's standard library. You still own the business logic and output, but command discovery and flag parsing stop becoming a second application inside the first.
What happened when we ran it
Our run at commit ae1fde9 installed 4 packages in 1 second inside a fresh Debian container. The build completed in 18 seconds. The Go test step then finished in 5 seconds with 2 passed and 0 failed out of 2. Those results cover repository setup and test execution; they do not measure parsing speed or the startup time of an application built with the library.
The checkout used 12.6 MB and contained 175 files with roughly 26,875 source lines. Our scan found 3 CI workflow files, no Dockerfile, and no standalone tests directory. This is a Go library, so the missing container file is unsurprising, and its test files live beside the packages. Our measurement setup used 3 CPUs, 8 GB of RAM, Go 1.24, no secrets, and an unprivileged container.
Moving from v2 to v3 changes application code
The v3 migration is larger than changing the import suffix. cli.App becomes cli.Command, RunContext becomes Run, and Subcommands becomes Commands. The old cli.Context type is removed; its flag and argument accessors now live on Command. Action, before, after, completion, and error handlers receive context.Context plus the current command. A compiler will identify many changes, but this is still scheduled migration work.
Go 1.22 is the minimum declared by the v3 module. The official guide gives side-by-side replacements for v2 imports, value sources, handler signatures, and completion hooks, which makes the work inspectable before you start. Maintainers who cannot move the project toolchain or touch every command handler should remain on their supported major line until those constraints change. The contribution guide keeps separate v1 and v2 maintenance branches for bug fixes.
YAML and man pages moved outside the v3 core
In v3, environment variables and plain text files remain built-in value sources. YAML, JSON, TOML, and HTTP-backed input live in the separate urfave/cli-altsrc module. Markdown and man-page generation moved to urfave/cli-docs. Pulling those jobs out keeps the central parser narrow, although applications with config-file flags now need to version and test more than one urfave module.
Shell completion covers 4 shells but needs deliberate setup. The root command must enable it, and users must generate and source the script for bash, zsh, fish, or PowerShell. That is better than maintaining four handwritten scripts, yet it is not invisible installation work. If completion is part of your product, package the generated instructions with the binary and test them in the shells you claim to support.
v3.13.0 still has a bare-dash argument trap
Open issue 2418 describes a sharp parsing case in v3: when a bare - is followed by more positional arguments, the parser keeps the dash and drops the remaining operands. The report is based on source analysis, and commit ae1fde9 contains the cited break in parseFlags. Tools that use - as a stdin placeholder can therefore receive a plausible but truncated argument list instead of an error.
Pull request 2419 proposes keeping the arguments after the bare dash and was still open when checked on September 21, 2026. Our 5-second test run passed, so the available suite did not catch this path as a failure in the measured commit. Do not broaden that into a claim that common parsing is unreliable. Add a regression case if your syntax uses this form, or wait until the fix lands in a release.
September 2026 activity supports choosing v3 for new work
Our September 21 fetch found 24,241 stars, 44 open issues, and 23 open pull requests. GitHub recorded the last push on September 20, 2026. Release v3.13.0 was published that same day from the commit we measured, with fixes for Unicode short flags, inverse Boolean counts, and map-flag spacing, plus deprecation metadata for flags and commands.
Those dates matter more than the queue size by itself. The project has active work on the main v3 line, a documented release process, and compatibility checks for public API changes. Its maintainers are unpaid volunteers and warn that replies may take days. For a new Go 1.22+ command tree, the 1-second install makes a trial cheap. For an existing v2 program, the migration guide and the bare-dash regression deserve a branch and targeted tests before release.

