JanDeDobbeleer/oh-my-posh · error
no such flag
Error message
no such flag -%v
What it means
MarkPersistentFlagRequired can only mark flags registered on the command's own PersistentFlags set. It looks the name up in PersistentFlags() and returns this error when the flag is not found there - typically because it was registered as a local flag (Flags()), on a different command, or never registered at all. No state is changed when this happens.
Solutions
- Register the flag on the command's persistent set first: cmd.PersistentFlags().StringVar(...) before MarkPersistentFlagRequired.
- Verify the exact flag name matches the registered name (watch for typos).
- If the flag is meant to be local-only, add a check in Run or use the requiredFlags mechanism appropriate to local flags instead.
- Check you are calling the method on the command that owns the flag, not a parent or child.
Example fix
// before
cmd.Flags().Bool("upgrade", false, "upgrade")
err := cmd.MarkPersistentFlagRequired("upgrade") // no such flag -upgrade
// after
cmd.PersistentFlags().BoolVar(&upgrade, "upgrade", false, "upgrade")
err := cmd.MarkPersistentFlagRequired("upgrade") // nil Defensive patterns
Strategy: try-catch
Validate before calling
func requirePersistent(cmd *cmdtree.Command, names ...string) error {
for _, n := range names {
if cmd.PersistentFlags().Lookup(n) == nil {
return fmt.Errorf("flag %q must be registered via PersistentFlags before MarkPersistentFlagRequired", n)
}
}
return nil
} Type guard
func hasPersistentFlag(cmd *cmdtree.Command, name string) bool {
return cmd.PersistentFlags().Lookup(name) != nil
} Try / catch
if err := cmd.MarkPersistentFlagRequired("config"); err != nil {
// "no such flag -config": registration order or ownership problem
panic(fmt.Sprintf("CLI setup bug: %v", err)) // fail fast at startup, not at runtime
} Prevention
- Always register on PersistentFlags() before calling MarkPersistentFlagRequired.
- Call Mark... on the command that owns the flag, never on a parent/child.
- Grep for both the registration and the Mark call when renaming flags to keep names in sync.
- Check the returned error at startup - it signals a wiring bug, not user input.
When it happens
Trigger: Calling cmd.MarkPersistentFlagRequired("name") where cmd.PersistentFlags().Lookup("name") returns nil - e.g. the flag was declared with cmd.Flags().StringVar(...) instead of cmd.PersistentFlags().StringVar(...), or a typo in the name.
Common situations: Copy-pasted cobra-style setup code where the flag was added as a local flag; marking a child's flag required from the parent command; renaming a flag in one place but not in the Mark... call; forgetting registration entirely before marking required.
Related errors
- flag does not exist
- required flag(s) " " not set
- unknown command for
- accepts between and arg(s), received
- accepts arg(s), received
AI-assisted analysis of JanDeDobbeleer/oh-my-posh@0976794618 (2026-08-31).
Data as JSON: /api/errors/a7020f5660faa7c5.
Report an issue: GitHub.
Appendix: source
Thrown at src/cmdtree/cmdtree.go:132
func (c *Command) PersistentFlags() *cmdflag.FlagSet {
if c.pflags == nil {
c.pflags = cmdflag.NewFlagSet(c.Name(), cmdflag.ContinueOnError)
}
return c.pflags
}
func (c *Command) SetArgs(args []string) {
c.setArgs = args
}
// MarkPersistentFlagRequired only applies to a flag registered on this
// command's own persistent set and errors otherwise.
func (c *Command) MarkPersistentFlagRequired(name string) error {
flag := c.PersistentFlags().Lookup(name)
if flag == nil {
return fmt.Errorf("no such flag -%v", name)
}
c.requiredFlags = append(c.requiredFlags, name)
return nil
}
func (c *Command) hasSubCommands() bool {
for _, cmd := range c.commands {
if !cmd.Hidden && cmd.Name() != "help" {
return true
}
}
return false
}
func (c *Command) findChild(name string) *Command {
for _, cmd := range c.commands {View on GitHub (pinned to 0976794618)