// Package help renders help and help-brief output for the hf CLI. package help import ( "fmt" "strings" ) // Command describes a CLI command or group. type Command struct { Name string Description string Permitted bool // whether the current user can execute this SubCommands []Command } // Group describes a top-level command group. type Group struct { Name string Description string Permitted bool SubCommands []Command } // RenderTopHelp renders `hf --help` output showing all groups. func RenderTopHelp(version string, groups []Group) string { var b strings.Builder b.WriteString("hf - HarborForge CLI") if version != "" { b.WriteString(" (" + version + ")") } b.WriteString("\n\nUsage: hf [flags]\n\n") b.WriteString("Commands:\n") maxLen := 0 for _, g := range groups { if len(g.Name) > maxLen { maxLen = len(g.Name) } } for _, g := range groups { b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, g.Name, g.Description)) } b.WriteString("\nGlobal flags:\n") b.WriteString(" --help Show help\n") b.WriteString(" --help-brief Show only permitted commands\n") b.WriteString(" --json Output in JSON format\n") return b.String() } // RenderTopHelpBrief renders `hf --help-brief` showing only permitted groups. func RenderTopHelpBrief(version string, groups []Group) string { var b strings.Builder b.WriteString("hf - HarborForge CLI") if version != "" { b.WriteString(" (" + version + ")") } b.WriteString("\n\nPermitted commands:\n") maxLen := 0 for _, g := range groups { if g.Permitted && len(g.Name) > maxLen { maxLen = len(g.Name) } } for _, g := range groups { if g.Permitted { b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, g.Name, g.Description)) } } return b.String() } // RenderGroupHelp renders `hf --help` showing all subcommands. func RenderGroupHelp(groupName string, cmds []Command) string { var b strings.Builder b.WriteString(fmt.Sprintf("hf %s - subcommands:\n\n", groupName)) maxLen := 0 for _, c := range cmds { if len(c.Name) > maxLen { maxLen = len(c.Name) } } for _, c := range cmds { desc := c.Description if !c.Permitted { desc = "(not permitted)" } b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, c.Name, desc)) } return b.String() } // RenderGroupHelpBrief renders `hf --help-brief` showing only permitted subcommands. func RenderGroupHelpBrief(groupName string, cmds []Command) string { var b strings.Builder b.WriteString(fmt.Sprintf("hf %s - permitted subcommands:\n\n", groupName)) maxLen := 0 for _, c := range cmds { if c.Permitted && len(c.Name) > maxLen { maxLen = len(c.Name) } } for _, c := range cmds { if c.Permitted { b.WriteString(fmt.Sprintf(" %-*s %s\n", maxLen, c.Name, c.Description)) } } return b.String() } // RenderNotPermitted renders the short message for an unpermitted leaf command. func RenderNotPermitted(group, cmd string) string { return fmt.Sprintf("hf %s %s: not permitted", group, cmd) }