# CLI Tool Help Requirements


## Overview

Command line help, as often provided via `--help` is an important means of
communication with the user. It provides a shorthand for more detailed
documentation and feature discovery.


## Guide

Help documentation must include a usage section written in
[Usage](#bookmark=id.yv0npmd9oldw) format, followed by brief written prose
describing the command, and the following sections (as needed): Options,
Commands, Examples, Notes, and Error codes.

Let's start with a full example before digging into the specifics.

### Example

Each section of this example is described in detail later in this document.
(Note that `blast` is not a real tool).

```text
Usage: blast [-f] [-s <scribble>] <command> [<args>]

Destroy the contents of <file>.

Options:
  -f                force, ignore minor errors. This description
                    is so long that it wraps to the next line.
  -s <scribble>     write <scribble> repeatedly
  -v, --verbose     say more. Defaults to $BLAST_VERBOSE.

Commands:
  blow-up         explosively separate
  grind           make smaller by many small cuts
  help            get help on other commands e.g. `blast help grind`

Examples:
  Scribble 'abc' and then run |grind|.
  $ blast -s 'abc' grind old.txt taxes.cp

Notes:
  Use `blast help <command>` for details on [<args>] for a subcommand.

Error codes:
  2 The blade is too dull.
  3 Out of fuel.
```

#### General layout and style

See above for an example that follows these requirements.

Several sections call for **English prose**. This means writing in proper
sentences using English grammar with US English spelling (as opposed to British
English or others). Use one space between sentences, and adhere to the "Oxford
comma" style. E.g. the Description and Notes sections are written in English
prose.

**Layout**

- Each section is separated by one blank line.
- Section contents are indented two spaces.
- Single line contents will be written on the same line as the label with one
  space separating the colon and the command name. E.g. "`Usage: blast <file>`".
- Multi-line sections will be written immediately following the label (without a
  blank line). Each line after the label will be indented two spaces.
- All output is a single column of text with the exception of Options, Commands,
  and Error codes which are two column tables.
- Use spaces for indentation or alignment. Do not output tab characters.
- Wrap text at 80 columns. When wrapping Option or Command descriptions, align
  the subsequent lines with the start of the description (e.g. about 20
  characters in).

**Style**

- Section titles appear in title-case: capitalize the first and last words. All
  words in between are also capitalized except for articles (a, an, the),
  conjunctions (e.g., and, but, or), and prepositions (e.g., on, in, with).
- Short description fragments (the second column in Options or Commands) begin
  with a lowercase letter and are not expected to be full sentences. Any text
  beyond the short description should be complete sentences, with a period after
  the fragment.
- Try to keep each section concise. If there is more to say, direct the user to
  use `--verbose` when running `--help` or direct them to the full
  documentation.
- Unicode (UTF-8) characters are allowed in descriptive text (prose). The
  command name and usage text will only contain portable ASCII characters
  (without Unicode).

### Usage

Usage is required and includes the "`Usage:`" header.

```text
Usage: blast [-f] [-s <scribble>] <command> [<args>]
```

Usage will commonly be a single line, though multiple lines can be used to
clarify when options are mutually exclusive. If the number of lines needed to
present all the mutually exclusive scenarios becomes excessive, limit the lines
to some common cases and give more details in the full docs. If there are many
mutually exclusive options, consider making subcommands or separate tools to
reduce the complexity.

#### Usage syntax

The command name is listed first. The command name is not hardcoded: it will be
dynamically pulled from the command name, i.e. the last element on the `argv[0]`
path. This allows a single binary to operate as multiple different tools.

The name and usage text will contain portable ASCII characters only. All long
form commands are entirely lowercase, i.e. never all-caps or mixed-case. Single
letter switches should prefer lowercase, but uppercase is allowed.

Use meaningful words for options and placeholders. Avoid abbreviations. Prefer
single words. When more than one word is used, separate words with a hyphen
(`-`), i.e. do not use underscores, camel-case, or run words together.

Aside from the command name there are several kinds of arguments (as described
in [Fuchsia Tool Requirements](http://go.corp.google.com/fuchsia-tool-requirements)).

- Exact text
- Arguments
- Options (Switches and Keys)
- Keyed options
- Option delimiter

##### Exact Text Syntax

Exact text is written as-is in the usage line. In the example "`Usage: copy
<from> to <destination>`", the word `to` is required exact text. If exact text
is optional, it will be enclosed in brackets (`[]`) in the usage line: "`Usage:
copy <from> [to] <destination>`".

##### Argument Syntax

Arguments are enclosed in angle brackets (<>) to differentiate them from
explicit text. In the example `Usage: copy <from> <destination>`, both `<from>`
and `<destination>` are arguments. If an argument is optional, it will be
enclosed in brackets (`[]`) such as: `Usage: copy <from> [<destination>]`. See
also [Option Delimiter](./cli.md#option_delimiter).

##### Mutually Exclusive Option Syntax

There are a couple choices when illustrating mutually exclusive options.

If more than one usage line is provided, each will show a mutually exclusive set
of commands. For example:

```text
Usage:
  swizzle [-z] <file>
  swizzle --reset
```

Indicates that `--reset` and usage with a `<file>` are mutually exclusive
options.

Another way to specify mutually exclusive options is using a vertical bar ('|')
between the options. Note that when a vertical bar is used to indicate data flow
between processes it is called a "Pipe." When used to separate options it is
read as "Or".

For example:

```text
Usage: froth [-y|-z] <file>
```

Indicates that `-y` **_or_** `-z` switches can be used (or neither, since they
are optional), but it's senseless to use both together (they are mutually
exclusive options). To indicate that either value must be used, but not both,
wrap the choices in parentheses, e.g. "`Usage: froth (-a|-b) <file>`" means that
`-a` **_or_** `-b` must be passed.

Note that it's common that `--version` or `--help` causes other arguments to be
ignored and is seldom listed as such. Listing them as separate usage lines is
considered unnecessary.

##### Grouping (implied) options

There is no specific syntax to indicate when enabling one option will also
affect another option. When an option implies that another option is enabled or
disabled, specify that in the Options. E.g. "`passing -e implies -f`" means that
if `-e` is enabled, `-f` will be enabled as if it were passed on the command
line (regardless of whether `-f` was explicitly passed). The redundant passing
of the implied value is harmless (not an error).

Document the implication in the primary switch. E.g. if `-x implies -c and -p`
place that note in the description of `-x` but not in `-c` and `-p`. This is to
keep the `--help` output concise (this rule can be relaxed in the full
documentation).

##### Optional Keys

To create the appearance of a keyed option with an optional Key, create optional
exact text followed by an argument. For example "`Usage: copy [from] <from> [to]
<destination>`". In the example, all of these are valid: "`copy a b`", "`copy
from a b`", "`copy from a to b`", "`copy a to b`".

##### Repeating Options

If the same positional argument may be repeated, indicate that with an ellipsis
('...'). Rather than a Unicode ellipsis, use three consecutive periods. For
example: "`Usage: copy <from> [<from>...] <to>`" means the last argument is
always interpreted as the `<to>`, while the preceding values are multiple
`<from>` entries. Note that "`<from> [<from>...]`" means there is one or more
`<from>` entries, while "`Usage: copy [<from>...] <to>`" means zero or more
`<from>` entries are accepted.

For Key/Value pairs which may be repeated, group them with brackets (if the pair
is optional) or parentheses (if the pair is not optional) and add an ellipsis to
the group, e.g. `[--input <file>]...` or `(--input <file>)...` respectively.

##### Brackets

Angle brackets (`<>`), brackets (`[]`), and parentheses (`()`) will not have
spaces immediately inside.

```text
[from] # correct
<to> # correct
(-a|-b) # correct

[ from ] # incorrect
< to > # incorrect
( -a|-b ) # incorrect
```

Angle brackets (<>) wrap Arguments or Key values.

Brackets (`[]`) wrap optional elements. With nested angle brackets, such as
`[<file>]`, interpret the `<file>` as an Argument that is optional. The nested
"`[<`" is not a separate bracket style, it is a "`[`" with a "`<`" within it.
When nesting, the brackets (`[`) will be outermost (do not use `<[file]>`).

Parentheses (`()`) are used to group elements. Use parentheses when they improve
clarity, such as with required mutually exclusive options.

Braces (`{}`) are reserved for future use. This guide intentionally leaves open
the possibility for braces to have special meaning in a future revision of this
document.

### Description

The description is required and does not include a header. I.e. the description
area is not labeled "description". E.g.

```text
Destroy the contents of <file>.
```

The description is written in US English prose (complete sentences using US
English grammar, spelling, and punctuation).

Every tool should tell you what it does and this is the section to do that.

The Description section should describe

- what the tool does (required)
- the platform configuration used
- schemes, data formats, or protocols used
- golden workflows (critical developer journeys)
- a broad URL to documentation (e.g. fuchsia.com/docs or similar, avoid deep
  links that go stale to easily)

The Description section can also contain a "see also" referring to another tool
by name (avoid using a URL).

What not to put in the Description section

- environment variables used, other than those already listed in Options
  (provide this in Options or Notes)
- security hazards (explain these in the Notes section)
- error codes (put those in an Error codes section)
- copyright (don't include this in the `--help`)
- author (don't include this in the `--help`)
- how to get help on subcommands (put this in the short description for the
  `help` subcommand)
- how to update the tool (that should be in the documentation for the tool
  package, if applicable)
- release notes (use a separate file)

### Options

An Options section is required if the program accepts arguments. E.g.

```text
Options:
  -f              force, ignore minor errors
  -s <scribble>   write <scribble> repeatedly. Defaults to $BLAST_SCRIBBLE.
```

The listed options apply to the tool itself and not to a subcommand. Options for
individual subcommands are listed when requesting help for that subcommand, e.g.
when using `blast help grind` or `blast grind --help`.

Try to keep options to a single, complete word. If two words are needed,
separate the words with a hyphen (`-`). Avoid uncommon abbreviations.

Present the list of options in alphabetical order.

Options will list each argument, switch, and keyed option on separate lines with
the exception of arguments that have both a short and long form. If an argument
has both a short and long form they are listed on the same line, short form
first, and separated by `, ` (comma space), e.g. `-f, --force`.

Exact text arguments will not be listed in the Options section. They are shown
in the Usage section.

Text that will be typed as-is is not wrapped in brackets, while variable entries
appear in angle brackets (`<>`) and optional entries appear in square brackets
(`[]`). When listing options, the Key is never optional. For example:

```text
  -a                   a good example
  [-b]                 a bad example, to use -b it must be typed as-is
```

A short description will follow each option. There's no limit on the length of
this description, but be concise. Try to put more details in the overall tool
description, the Examples, or the Notes instead of creating a lengthy option
description.

What to describe

- a brief reminder of what the option implies, e.g. `ignore minor errors`
- if the option overrides another option, e.g. `-x implies -c and -p`
- default value, e.g. `defaults to $BLAST_SCRIBBLE`

The column on which the description sentence fragment begins may vary depending
on the needs of the tool. Use 20 characters from the left edge if it looks okay,
but adjust if a bit more or less reads better.

If there is a large number of options, consider showing a useful subset and
explaining how to get further help to see all of them, e.g. by passing
`--verbose` along with `--help`.

### Commands

A commands section is required if the program has subcommands. If present it
will be labeled, "Commands:". E.g.

```text
Commands:
  blow-up         explosively separate
  grind           make smaller by many small cuts
  help            get help on other commands e.g. `blast help grind`
```

If the program does not have subcommands, the commands section will not be
present.

When a tool has subcommands, it will also have a `help` command to get further
help on the subcommands, i.e.` blast help grind`.

Try to keep subcommands to a single, complete word. If two words are needed,
separate the words with a hyphen (`-`). Avoid uncommon abbreviations. Present
the list of commands in alphabetical order.

Each command name appears with a short description on a separate line. For a
more lengthy command description, the user will specifically ask for help on
that command. This description serves as a short reminder of the command and to
assist in discovery of commands.

If there is a large number of commands, consider showing a useful subset and
explaining how to get further help to see all of them, e.g. by passing
`--verbose` along with `--help`.

### Examples

An examples section is optional. If present it will be labeled, "Examples:".
E.g.

```text
Examples:
  Scribble 'abc' and then run |grind|.
  $ blast -s 'abc' grind old.txt taxes.cp
```

Each example will have US English prose (i.e. complete sentences using US
English grammar, spelling, and punctuation) describing the example, followed by
an example command line. Each line that would be entered on the command line
literally will be prefixed with a "`$ `" to mimic a command prompt.

To wrap an example that is overly long, end the previous line with "`\ `" and
begin subsequent lines with "`  `" (spaces) to indicate line continuation.

```text
  This example wraps onto multiple lines.
  $ blast -s 2332 some/long/path/cats.o \
    more/long/path/dogs.o more/long/path/bears.o \
    more/long/path/deer.o
```

If it is helpful to show some of the output from the example command, write the
output immediately following the example.

Separate examples with one blank line.

If the Examples section is getting overly long, move examples to a help doc.
Interactive help examples are for quick reference and discoverability rather
than exhaustive documentation.

### Notes

Notes are optional and begin with a "Notes:" header. E.g.

```text
Notes:
  Use `blast help <command>` for details on [<args>] for a subcommand.
```

The notes are written in US English prose (i.e. complete sentences using US
English grammar, spelling, and punctuation).

What to put in the Notes

- environment variables used, other than those already listed in Options (for
  default values)
- security hazards
- reminders to help the user

What not to put in the Notes

- error codes (put those in an Error codes section)
- copyright (don't include this in the `--help`)
- author (don't include this in the `--help`)
- how to get help on subcommands (put this in the short description for the
  `help` subcommand)
- how to update the tool (that should be in the documentation for the tool
  package, if applicable)
- release notes (use a separate file)

### Error codes

The Error codes section is required if codes other than `0` or `1` are
generated. E.g.

```text
Error codes:
  2  The blade is too dull.
  3  Out of fuel.
```

This section is omitted if only `0` or `1` results are generated by the program.

Error code `0` is always treated as "no error" and error code `1` is always a
"general error". Neither are documented in the `--help` output. Every error code
other than `0` or `1` that may be generated by the tool must be documented.

### Platform specifics

Some platforms (e.g. DOS) use a different option prefix (e.g. `/`) or may allow
case insensitive switches. Tools will use a dash prefix (`-`) and case sensitive
options regardless of the platform. This means that the documentation for a tool
generally doesn't need to consider the platform being used.

### What not to include in --help output

Do not show Key/Value pairs with an equals sign (`=`), e.g. `--scribble=abc`.
The Key and Value are parsed using whitespace as a delimiter (`--scribble abc`).
Showing the equals in the help is potentially confusing.

Do not implement a pager (something like the `more` program that pauses output
on each screenful of text).

Do not include

- a copyright in the help output (put that where legal specifies)
- release notes (put that in release notes)
- full documentation (put that in the markdown documentation)
- version information (output that from `--version`)
- documentation on result codes `0` or `1` (put in .md docs)
- shell-specific help (such as how to redirect output or pipe to a pager)
