My urfave/cli version is
v3.6.1
Checklist
Dependency Management
- My project is using go modules.
Describe the bug
When you use DefaultCommand, flags are parsed by the parent command instead of the default command. This makes DefaultCommand ususable as soon as the called command expects flags.
To reproduce
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/urfave/cli/v3"
)
func main() {
cmd := &cli.Command{
DefaultCommand: "run1",
Commands: []*cli.Command{
{
Name: "run1",
Usage: "run the main application",
Action: func(ctx context.Context, cmd *cli.Command) error {
fmt.Println("Hello world from run1:", cmd.String("foo"))
return nil
},
Flags: []cli.Flag{
&cli.StringFlag{
Name: "foo",
Required: true,
},
},
},
{
Name: "run2",
Usage: "run the main application",
Action: func(ctx context.Context, cmd *cli.Command) error {
fmt.Println("Hello world from run2:", cmd.String("bar"))
return nil
},
Flags: []cli.Flag{
&cli.StringFlag{
Name: "bar",
Required: true,
},
},
},
},
}
if err := cmd.Run(context.Background(), os.Args); err != nil {
log.Fatal(err)
}
}
Observed behavior
$ go run . --foo foo
Incorrect Usage: flag provided but not defined: -foo
NAME:
reqflag - A new cli application
USAGE:
reqflag [global options] [command [command options]]
COMMANDS:
run1 run the main application
run2 run the main application
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help
2026/01/16 16:19:59 flag provided but not defined: -foo
exit status 1
$ go run . run1 --foo foo
Hello world from run1: foo
$ go run . run2 --bar bar
Hello world from run2: bar
Expected behavior
$ go run . --foo foo
Hello world from run1: foo
$ go run . run1 --foo foo
Hello world from run1: foo
$ go run . run2 --bar bar
Hello world from run2: bar
Additional context
Add any other context about the problem here.
If the issue relates to a specific open source GitHub repo, please
link that repo here.
If you can reproduce this issue with a public CI system, please
link a failing build here.
Want to fix this yourself?
We'd love to have more contributors on this project! If the fix for
this bug is easily explained and very small, feel free to create a
pull request for it.
Run go version and paste its output here
go version go1.25.5 linux/amd64
Run go env and paste its output here
AR='ar'
CC='gcc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='g++'
GCCGO='gccgo'
GO111MODULE=''
GOAMD64='v1'
GOARCH='amd64'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/home/louis/.cache/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/home/louis/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build360663747=/tmp/go-build -gno-record-gcc-switches'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMOD='/home/louis/Téléchargements/tcli/go.mod'
GOMODCACHE='/home/louis/.local/share/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/louis/.local/share/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/home/louis/.local/share/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.5.linux-amd64'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/louis/.config/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/home/louis/.local/share/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.5.linux-amd64/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.25.5'
GOWORK=''
PKG_CONFIG='pkg-config'
My urfave/cli version is
v3.6.1
Checklist
Dependency Management
Describe the bug
When you use
DefaultCommand, flags are parsed by the parent command instead of the default command. This makesDefaultCommandususable as soon as the called command expects flags.To reproduce
Observed behavior
Expected behavior
Additional context
Add any other context about the problem here.
If the issue relates to a specific open source GitHub repo, please
link that repo here.
If you can reproduce this issue with a public CI system, please
link a failing build here.
Want to fix this yourself?
We'd love to have more contributors on this project! If the fix for
this bug is easily explained and very small, feel free to create a
pull request for it.
Run
go versionand paste its output hereRun
go envand paste its output here