CLI Skeleton
Completion specs are defined in a declarative schema that specifies subcommands, options and arguments.
Broadly speaking, every CLI tool can be expressed as a tree-like structure with a root command that potentially has its own subcommands, options and arguments.
For instance, git has many subcommands, like commit, checkout and push, which in turn have options and arguments of their own.
The primary purpose of a completion spec is to map out this structure or 'skeleton' for a given CLI tool.

It is very important that the mapping between a CLI tool and the completion spec is accurate. An inaccurate mapping (e.g. forgetting to signal that an option takes an argument) will cause Fig to render the wrong suggestions.
Mapping from skeleton to spec
The skeleton of the CLI is mapped out using the following objects and fields.
Subcommand
These properties on Subcommand define how it is interpreted by the parser.
nameThis is a mandatory field and must precisely match the text value of the subcommand.
subcommandsAny nested subcommands that are associated with current command must be defined.
optionsAny options that are associated with the current command must be defined.
argsIf the subcommand takes an argument, the
argsfield must have a value besidesnullor an[], otherwise Fig will present incorrect suggestions.If the subcommand takes multiple arguments, each should have a corresponding entry in the
argsarray.
See "Subcommand" for a full description of all properties.
Option
These properties on Option define how it is interpreted by the parser.
nameThis is a mandatory field and must precisely match the text value of the option.
Note: Do not include any additional text in the
namefield. Even if an option accepts a value passed in using an equals sign — for instance,--port=1234— thenamefield should not include the=.argsIf the option takes an argument, the
argsfield must have a value besidesnullor an[], otherwise Fig will present incorrect suggestions.If the option takes multiple arguments, each should have a corresponding entry in the
argsarray.
See "Option" for a full description of all properties.
Argument
These properties on Argument define how it is interpreted by the parser.
variadicIf an argument is variadic, Fig will expect one or more values.
isOptionalIf an argument is optional, Fig will expect zero or one value(s).
Note: The
nameproperty of an Argument object is not used in parsing. However, it provides additional contextual information while the user types, and still should be defined.
See "Argument" for a full description of all properties.
All other properties besides those defined above are used for rendering or generating suggestions, rather than parsing the command.
Bringing it all together
Here is a simplified, 'skeletal' completion spec for git that only includes the commit subcommand and the -m flag:
const completionSpec: Fig.Spec = {
name: "git",
subcommands: [
{
name: "commit",
options: [
{
name: ["-m", "--message"],
args: [
{
name: "message"
}
]
}
]
}
]
}
Note: A more fleshed out spec might add
descriptions, customize icons or provide dynamic suggestions. However, these additions are not essential for the command line to be parsed correctly.
A few things warrant special attention.
The Option's
nameproperty takes an array of string, so that both the short flag and the long flag can be defined simultaneously.(This functionality also works on the Subcommand object, so if a subcommand has multiple aliases, these can be declared in the same manner.)
The
--messageoption takes an argument, so itsargsproperty contains an Argument object. Including an argument object here is essential. Without it, Fig will render incorrect suggestions as the user is typing their message input.
Next Steps
Once you have the basic structure or skeleton, you can enrich the autocomplete experience by writing code that produces dynamic suggestions for argument values.
Generating Suggestions at Runtime
To learn how to run shell commands and read local files in order to list contextually relevant options, see "Dynamic Suggestions".
You can also specify how you want the suggestions to look and behave.
Customizing the Appearance of Suggestions
For an overview of the different properties that you can tweak, see "Customizing Suggestions".