Hidden commands are where CLI trust goes to die. When README documents a feature that does not appear in --help, or when mytool shows four commands but actually ships seven, users stop believing the help output is authoritative. They start grepping source or running strings on the binary. Commands registered without descriptions also silently vanish from generated docs and shell completions, leaving users to discover functionality through support tickets and tribal knowledge.
Low because hidden commands cause discoverability friction but rarely break working integrations.
Audit every .hideHelp(), Hidden: true, or hidden=True flag in src/cli/commands/ and remove it from user-facing commands. Any command useful to end users must appear in --help output with a description:
program
.command('export')
.description('Export data to CSV or JSON format')
.action(exportData)
Reserve the hidden flag for internal debug-only tooling.
ID: cli-quality.command-structure.no-hidden-commands
Severity: low
What to look for: List all commands registered in the CLI codebase. For each, compare the list of registered commands in source code against what appears in --help output. Check for commands explicitly marked as hidden (commander .hideHelp(), cobra Hidden: true, click hidden=True). Check for commands registered but with no description (which may not appear in help listings depending on the framework).
Pass criteria: All commands that a user could run are discoverable via --help. Hidden commands are acceptable only if they are genuinely internal/debug (not user-facing functionality). No functionality is only accessible by knowing an undocumented command name — 0% of functional commands should be undocumented in --help output. Report: "X commands found, all Y documented in help output."
Fail criteria: User-facing functionality is hidden from help output, or commands are registered without descriptions and silently omitted from help listings.
Skip (N/A) when: The CLI has a single command with no subcommands. All checks skip when no CLI entry point is detected.
Do NOT pass when: Commands are registered in code but deliberately excluded from help output without a documented reason.
Detail on fail: "'export' command is marked hidden but is documented in the README as a user feature" or "2 commands ('sync', 'migrate') have no description and don't appear in --help output"
Remediation: If a command is useful to end users, it should be discoverable. Remove the hidden flag or add a description:
// Remove hidden flag for user-facing commands
program
.command('export')
.description('Export data to CSV or JSON format') // now appears in --help
.action(exportData)
Reserve hidden commands for internal debugging tools only. If you have many commands and want to reduce help clutter, use command groups instead of hiding commands.