diff --git a/internal/autocomplete/autocomplete.go b/internal/autocomplete/autocomplete.go index 056bfbc6..1a2f3fa4 100644 --- a/internal/autocomplete/autocomplete.go +++ b/internal/autocomplete/autocomplete.go @@ -265,6 +265,9 @@ func getAllPossibleCompletions(completionStyle CompletionStyle, root *cli.Comman // Completing a flag name if isFlag(current) { for _, flag := range cmd.Flags { + if vf, ok := flag.(cli.VisibleFlag); ok && !vf.IsVisible() { + continue + } completions = builder.createFromFlag(current, &flag, completions) } } diff --git a/internal/autocomplete/hidden_flags_test.go b/internal/autocomplete/hidden_flags_test.go new file mode 100644 index 00000000..0fcc52cd --- /dev/null +++ b/internal/autocomplete/hidden_flags_test.go @@ -0,0 +1,38 @@ +package autocomplete + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v3" +) + +func TestFlagCompletionOmitsHiddenFlags(t *testing.T) { + t.Parallel() + + root := &cli.Command{ + Name: "openai", + Flags: []cli.Flag{ + &cli.StringFlag{Name: "visible", Aliases: []string{"v"}}, + &cli.StringFlag{Name: "hidden", Aliases: []string{"h"}, Hidden: true}, + }, + } + + longResult := GetCompletions(CompletionStyleZsh, root, []string{"--"}) + longNames := completionNames(longResult.Completions) + require.Contains(t, longNames, "--visible") + require.NotContains(t, longNames, "--hidden") + + shortResult := GetCompletions(CompletionStyleZsh, root, []string{"-"}) + shortNames := completionNames(shortResult.Completions) + require.Contains(t, shortNames, "-v") + require.NotContains(t, shortNames, "-h") +} + +func completionNames(completions []ShellCompletion) []string { + names := make([]string, 0, len(completions)) + for _, completion := range completions { + names = append(names, completion.Name) + } + return names +}