---
source: tests/test-cli.rs
expression: format_outputs(&output)
---
stdout:
# cargo vet CLI manual

> This manual can be regenerated with `cargo vet help-markdown`

Version: `cargo-vet 0.8.0`

Supply-chain security for Rust

When run without a subcommand, `cargo vet` will invoke the `check` subcommand. See `cargo vet help
check` for more details.

### USAGE
```
cargo vet [OPTIONS]
```
```
cargo vet <SUBCOMMAND>
```

### OPTIONS
#### `-h, --help`
Print help information

#### `-V, --version`
Print version information

### GLOBAL OPTIONS
#### `--manifest-path <PATH>`
Path to Cargo.toml

#### `--store-path <STORE_PATH>`
Path to the supply-chain directory

#### `--no-all-features`
Don't use --all-features

We default to passing --all-features to `cargo metadata` because we want to analyze your
full dependency tree

#### `--no-default-features`
Do not activate the `default` feature

#### `--features <FEATURES>`
Space-separated list of features to activate

#### `--locked`
Do not fetch new imported audits

#### `--frozen`
Avoid the network entirely, requiring either that the cargo cache is populated or the
dependencies are vendored. Requires --locked

#### `--no-minimize-exemptions`
Prevent commands such as `check` and `certify` from automatically cleaning up unused
exemptions

#### `--no-registry-suggestions`
Prevent commands such as `check` and `suggest` from suggesting registry imports

#### `--verbose <VERBOSE>`
How verbose logging should be (log level)

\[default: warn]  
\[possible values: off, error, warn, info, debug, trace]  

#### `--output-file <OUTPUT_FILE>`
Instead of stdout, write output to this file

#### `--log-file <LOG_FILE>`
Instead of stderr, write logs to this file (only used after successful CLI parsing)

#### `--output-format <OUTPUT_FORMAT>`
The format of the output

\[default: human]  
\[possible values: human, json]  

#### `--cache-dir <CACHE_DIR>`
Use the following path instead of the global cache directory

The cache stores information such as the summary results used by vet's suggestion
machinery, cached results from crates.io APIs, and checkouts of crates from crates.io in
some cases. This is generally automatically managed in the system cache directory.

This mostly exists for testing vet itself.

#### `--filter-graph <FILTER_GRAPH>`
Filter out different parts of the build graph and pretend that's the true graph

Example: `--filter-graph="exclude(any(eq(is_dev_only(true)),eq(name(serde_derive))))"`

This mostly exists to debug or reduce projects that cargo-vet is mishandling.
Combining this with `cargo vet --output-format=json dump-graph` can produce an
input that can be added to vet's test suite.


The resulting graph is computed as follows:

1. First compute the original graph
2. Then apply the filters to find the new set of nodes
3. Create a new empty graph
4. For each workspace member that still exists, recursively add it and its dependencies

This means that any non-workspace package that becomes "orphaned" by the filters will
be implicitly discarded even if it passes the filters.

Possible filters:

* `include($query)`: only include packages that match this filter
* `exclude($query)`: exclude packages that match this filter


Possible queries:

* `any($query1, $query2, ...)`: true if any of the listed queries are true
* `all($query1, $query2, ...)`: true if all of the listed queries are true
* `not($query)`: true if the query is false
* `$property`: true if the package has this property


Possible properties:

* `name($string)`: the package's name (i.e. `serde`)
* `version($version)`: the package's version (i.e. `1.2.0`)
* `is_root($bool)`: whether it's a root in the original graph (ignoring dev-deps)
* `is_workspace_member($bool)`: whether the package is a workspace-member (can be
tested)
* `is_third_party($bool)`: whether the package is considered third-party by vet
* `is_dev_only($bool)`: whether it's only used by dev (test) builds in the original
graph

### SUBCOMMANDS
* [check](#cargo-vet-check): \[default\] Check that the current project has been vetted
* [suggest](#cargo-vet-suggest): Suggest some low-hanging fruit to review
* [init](#cargo-vet-init): Initialize cargo-vet for your project
* [inspect](#cargo-vet-inspect): Fetch the source of a package
* [diff](#cargo-vet-diff): Yield a diff against the last reviewed version
* [certify](#cargo-vet-certify): Mark a package as audited
* [import](#cargo-vet-import): Import a new peer's imports
* [trust](#cargo-vet-trust): Trust a given crate and publisher
* [regenerate](#cargo-vet-regenerate): Explicitly regenerate various pieces of information
* [add-exemption](#cargo-vet-add-exemption): Mark a package as exempted from review
* [record-violation](#cargo-vet-record-violation): Declare that some versions of a package violate certain audit criteria
* [fmt](#cargo-vet-fmt): Reformat all of vet's files (in case you hand-edited them)
* [prune](#cargo-vet-prune): Prune unnecessary imports and exemptions
* [aggregate](#cargo-vet-aggregate): Fetch and merge audits from multiple sources into a single `audits.toml` file
* [dump-graph](#cargo-vet-dump-graph): Print the cargo build graph as understood by `cargo vet`
* [gc](#cargo-vet-gc): Clean up old packages from the vet cache
* [renew](#cargo-vet-renew): Renew wildcard audit expirations
* [help](#cargo-vet-help): Print this message or the help of the given subcommand(s)

<br><br><br>
## cargo vet check
\[default\] Check that the current project has been vetted

This is the default behaviour if no subcommand is specified.

If the check fails due to lack of audits, we will do our best to explain why vetting failed, and
what should be done to fix it. This can involve a certain amount of guesswork, as there are many
possible solutions and we only want to recommend the "best" one to keep things simple.

Failures and suggestions can either be "Certain" or "Speculative". Speculative items are greyed
out and sorted lower to indicate that the Certain entries should be looked at first. Speculative
items are for packages that probably need audits too, but only appear as transitive dependencies of
Certain items.

During review of Certain issues you may take various actions that change what's needed for the
Speculative ones. For instance you may discover you're enabling a feature you don't need, and
that's the only reason the Speculative package is in your tree. Or you may determine that the
Certain package only needs to be safe-to-run, which may make the Speculative requirements weaker or
completely resolved. For these reasons we recommend fixing problems "top down", and Certain items
are The Top.

Suggested fixes are grouped by the criteria they should be reviewed for and sorted by how easy the
review should be (in terms of lines of code). We only ever suggest audits (and provide the command
you need to run to do it), but there are other possible fixes like an `exemption` or `policy`
change.

The most aggressive solution is to run `cargo vet regenerate exemptions` which will add whatever
exemptions necessary to make `check` pass (and remove uneeded ones). Ideally you should avoid doing
this and prefer adding audits, but if you've done all the audits you plan on doing, that's the way
to finish the job.

### USAGE
```
cargo vet check [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet suggest
Suggest some low-hanging fruit to review

This is essentially the same as `check` but with all your `exemptions` temporarily removed as a way
to inspect your "review backlog". As such, we recommend against running this command while `check`
is failing, because this will just give you worse information.

If you don't consider an exemption to be "backlog", add `suggest = false` to its entry and we won't
remove it while suggesting.

See also `regenerate exemptions`, which can be used to "garbage collect" your backlog (if you run it
while `check` is passing).

### USAGE
```
cargo vet suggest [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet init
Initialize cargo-vet for your project

This will add `exemptions` and `audit-as-crates-io = false` for all packages that need it to make
`check` pass immediately and make it easy to start using vet with your project.

At this point you can either configure your project further or start working on your review backlog
with `suggest`.

### USAGE
```
cargo vet init [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet inspect
Fetch the source of a package

We will attempt to guess what criteria you want to audit the package for based on the current check/
suggest status, and show you the meaning of those criteria ahead of time.

### USAGE
```
cargo vet inspect [OPTIONS] <PACKAGE> <VERSION>
```

### ARGS
#### `<PACKAGE>`
The package to inspect

#### `<VERSION>`
The version to inspect

### OPTIONS
#### `--mode <MODE>`
How to inspect the source

\[default: sourcegraph]  
\[possible values: local, sourcegraph]  

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet diff
Yield a diff against the last reviewed version

We will attempt to guess what criteria you want to audit the package for based on the current check/
suggest status, and show you the meaning of those criteria ahead of time.

### USAGE
```
cargo vet diff [OPTIONS] <PACKAGE> <VERSION1> <VERSION2>
```

### ARGS
#### `<PACKAGE>`
The package to diff

#### `<VERSION1>`
The base version to diff

#### `<VERSION2>`
The target version to diff

### OPTIONS
#### `--mode <MODE>`
How to inspect the source

\[default: sourcegraph]  
\[possible values: local, sourcegraph]  

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet certify
Mark a package as audited

This command will do its best to guess what you want to be certifying.

If invoked with no args, it will try to certify the last thing you looked at with `inspect` or
`diff`. Otherwise you must either supply the package name and one version (for a full audit) or two
versions (for a delta audit).

Once the package+version(s) have been selected, we will try to guess what criteria to certify it
for. First we will `check`, and if the check fails and your audit would seemingly fix this package,
we will use the criteria recommended for that fix. If `check` passes, we will assume you are working
on your backlog and instead use the recommendations of `suggest`.

If this removes the need for an `exemption` will we automatically remove it.

### USAGE
```
cargo vet certify [OPTIONS] [ARGS]
```

### ARGS
#### `<PACKAGE>`
The package to certify as audited

#### `<VERSION1>`
The version to certify as audited

#### `<VERSION2>`
If present, instead certify a diff from version1->version2

### OPTIONS
#### `--wildcard <WILDCARD>`
If present, certify a wildcard audit for the user with the given username.

Use the --start-date and --end-date options to specify the date range to certify for.

#### `--criteria <CRITERIA>`
The criteria to certify for this audit

If not provided, we will prompt you for this information.

#### `--who <WHO>`
Who to name as the auditor

If not provided, we will collect this information from the local git.

#### `--notes <NOTES>`
A free-form string to include with the new audit entry

If not provided, there will be no notes.

#### `--start-date <START_DATE>`
Start date to create a wildcard audit from.

Only valid with `--wildcard`.

If not provided, will be the publication date of the first version published by the
given user.

#### `--end-date <END_DATE>`
End date to create a wildcard audit from. May be at most 1 year in the future.

Only valid with `--wildcard`.

If not provided, will be 1 year from the current date.

#### `--accept-all`
Accept all criteria without an interactive prompt

#### `--force`
Force the command to ignore whether the package/version makes sense

To catch typos/mistakes, we check if the thing you're trying to talk about is part of
your current build, but this flag disables that.

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet import
Import a new peer's imports

If invoked without a URL parameter, it will look up the named peer in the cargo-vet registry, and
import that peer.

### USAGE
```
cargo vet import [OPTIONS] <NAME> [URL]...
```

### ARGS
#### `<NAME>`
The name of the peer to import

#### `<URL>...`
The URL(s) of the peer's audits.toml file(s).

If a URL is not provided, a peer with the given name will be looked up in the cargo-vet
registry to determine the import URL(s).

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet trust
Trust a given crate and publisher

### USAGE
```
cargo vet trust [OPTIONS] [ARGS]
```

### ARGS
#### `<PACKAGE>`
The package to trust

Must be specified unless --all has been specified.

#### `<PUBLISHER_LOGIN>`
The username of the publisher to trust

If not provided, will be inferred to be the sole known publisher of the given crate.
If there is more than one publisher for the given crate, the login must be provided
explicitly.

### OPTIONS
#### `--criteria <CRITERIA>`
The criteria to certify for this trust entry

If not provided, we will prompt you for this information.

#### `--start-date <START_DATE>`
Start date to create the trust entry from.

If not provided, will be the publication date of the first version published by the
given user.

#### `--end-date <END_DATE>`
End date to create the trust entry from. May be at most 1 year in the future.

If not provided, will be 1 year from the current date.

#### `--notes <NOTES>`
A free-form string to include with the new audit entry

If not provided, there will be no notes.

#### `--all <ALL>`
If specified, trusts all packages with exemptions or failures which are solely published
by the given user

#### `--allow-multiple-publishers`
If specified along with --all, also trusts packages with multiple publishers, so long as
at least one version was published by the given user

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet regenerate
Explicitly regenerate various pieces of information

There are several things that `cargo vet` *can* do for you automatically but we choose to make
manual just to keep a human in the loop of those decisions. Some of these might one day become
automatic if we agree they're boring/reliable enough.

See the subcommands for specifics.

### USAGE
```
cargo vet regenerate [OPTIONS] <SUBCOMMAND>
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)
### SUBCOMMANDS
* [exemptions](#cargo-vet-exemptions): Regenerate your exemptions to make `check` pass minimally
* [imports](#cargo-vet-imports): Regenerate your imports and accept changes to criteria
* [audit-as-crates-io](#cargo-vet-audit-as-crates-io): Add `audit-as-crates-io` to the policy entry for all crates which require one
* [unpublished](#cargo-vet-unpublished): Remove all outdated `unpublished` entries for crates which have since been published, or
should now be audited as a more-recent version
* [help](#cargo-vet-help): Print this message or the help of the given subcommand(s)

<br><br><br>
## cargo vet exemptions
Regenerate your exemptions to make `check` pass minimally

This command can be used for two purposes: to force your supply-chain to pass `check` when it's
currently failing, or to minimize/garbage-collect your exemptions when it's already passing. These
are ultimately the same operation.

We will try our best to preserve existing exemptions, removing only those that aren't needed,
and adding only those that are needed. Exemptions that are overbroad may also be weakened (i.e.
safe-to-deploy may be reduced to safe-to-run).

### USAGE
```
cargo vet regenerate exemptions [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet imports
Regenerate your imports and accept changes to criteria

This is equivalent to `cargo vet fetch-imports` but it won't produce an error if the descriptions of
foreign criteria change.

### USAGE
```
cargo vet regenerate imports [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet audit-as-crates-io
Add `audit-as-crates-io` to the policy entry for all crates which require one.

Crates which have a matching `description` and `repository` entry to a published crate on crates.io
will be marked as `audit-as-crates-io = true`.

### USAGE
```
cargo vet regenerate audit-as-crates-io [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet unpublished
Remove all outdated `unpublished` entries for crates which have since been published, or should now
be audited as a more-recent version.

Unlike `cargo vet prune`, this will remove outdated `unpublished` entries even if it will cause
`check` to start failing.

### USAGE
```
cargo vet regenerate unpublished [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet help
Print this message or the help of the given subcommand(s)

### USAGE
```
cargo vet regenerate help [OPTIONS] [SUBCOMMAND]...
```

### ARGS
#### `<SUBCOMMAND>...`
The subcommand whose help message to display

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet add-exemption
Mark a package as exempted from review

Exemptions are *usually* just "backlog" and the expectation is that you will review them
"eventually". You should usually only be trying to remove them, but sometimes additions are
necessary to make progress.

`regenerate exemptions` will do this for your automatically to make `check` pass (and remove any
unnecessary ones), so we recommend using that over `add-exemption`. This command mostly exists as
"plumbing" for building tools on top of `cargo vet`.

### USAGE
```
cargo vet add-exemption [OPTIONS] <PACKAGE> <VERSION>
```

### ARGS
#### `<PACKAGE>`
The package to mark as exempted

#### `<VERSION>`
The version to mark as exempted

### OPTIONS
#### `--criteria <CRITERIA>`
The criteria to assume (trust)

If not provided, we will prompt you for this information.

#### `--notes <NOTES>`
A free-form string to include with the new forbid entry

If not provided, there will be no notes.

#### `--no-suggest`
Suppress suggesting this exemption for review

#### `--force`
Force the command to ignore whether the package/version makes sense

To catch typos/mistakes, we check if the thing you're trying to talk about is part of
your current build, but this flag disables that.

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet record-violation
Declare that some versions of a package violate certain audit criteria

**IMPORTANT**: violations take *VersionReqs* not *Versions*. This is the same syntax used by
Cargo.toml when specifying dependencies. A bare `1.0.0` actually means `^1.0.0`. If you want to
forbid a *specific* version, use `=1.0.0`. This command can be a bit awkward because syntax like `*`
has special meaning in scripts and terminals. It's probably easier to just manually add the entry to
your audits.toml, but the command's here in case you want it.

Violations are essentially treated as integrity constraints on your supply-chain, and will only
result in errors if you have `exemptions` or `audits` (including imported ones) that claim criteria
that are contradicted by the `violation`. It is not inherently an error to depend on a package with
a `violation`.

For instance, someone may review a package and determine that it's horribly unsound in the face of
untrusted inputs, and therefore *un*safe-to-deploy. They would then add a "safe-to-deploy" violation
for whatever versions of that package seem to have that problem. But if the package basically works
fine on trusted inputs, it might still be safe-to-run. So if you use it in your tests and have an
audit that only claims safe-to-run, we won't mention it.

When a violation *does* cause an integrity error, it's up to you and your peers to figure out what
to do about it. There isn't yet a mechanism for dealing with disagreements with a peer's published
violations.

### USAGE
```
cargo vet record-violation [OPTIONS] <PACKAGE> <VERSIONS>
```

### ARGS
#### `<PACKAGE>`
The package to forbid

#### `<VERSIONS>`
The versions to forbid

### OPTIONS
#### `--criteria <CRITERIA>`
The criteria that have failed to be satisfied.

If not provided, we will prompt you for this information(?)

#### `--who <WHO>`
Who to name as the auditor

If not provided, we will collect this information from the local git.

#### `--notes <NOTES>`
A free-form string to include with the new forbid entry

If not provided, there will be no notes.

#### `--force`
Force the command to ignore whether the package/version makes sense

To catch typos/mistakes, we check if the thing you're trying to talk about is part of
your current build, but this flag disables that.

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet fmt
Reformat all of vet's files (in case you hand-edited them)

Most commands will implicitly do this, so this mostly exists as "plumbing" for building tools on top
of vet, or in case you don't want to run another command.

### USAGE
```
cargo vet fmt [OPTIONS]
```

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet prune
Prune unnecessary imports and exemptions

This will fetch the updated state of imports, and attempt to remove any now-unnecessary imports or
exemptions from the supply-chain.

### USAGE
```
cargo vet prune [OPTIONS]
```

### OPTIONS
#### `--no-imports`
Don't prune unused imports

#### `--no-exemptions`
Don't prune unused exemptions

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet aggregate
Fetch and merge audits from multiple sources into a single `audits.toml` file.

Will fetch the audits from each URL in the provided file, combining them into a single file. Custom
criteria will be merged by-name, and must have identical descriptions in each source audit file.

### USAGE
```
cargo vet aggregate [OPTIONS] <SOURCES>
```

### ARGS
#### `<SOURCES>`
Path to a file containing a list of URLs to aggregate the audits from

### OPTIONS
#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet dump-graph
Print the cargo build graph as understood by `cargo vet`

This is a debugging command, the output's format is not guaranteed. Use `cargo metadata` to get a
stable version of what *cargo* thinks the build graph is. Our graph is based on that result.

With `--output-format=human` (the default) this will print out mermaid-js diagrams, which things
like github natively support rendering of.

With `--output-format=json` we will print out more raw statistics for you to search/analyze.

Most projects will have unreadably complex build graphs, so you may want to use the global
`--filter-graph` argument to narrow your focus on an interesting subgraph. `--filter-graph` is
applied *before* doing any semantic analysis, so if you filter out a package and it was the problem,
the problem will disappear. This can be used to bisect a problem if you get ambitious enough with
your filters.

### USAGE
```
cargo vet dump-graph [OPTIONS]
```

### OPTIONS
#### `--depth <DEPTH>`
The depth of the graph to print (for a large project, the full graph is a HUGE MESS)

\[default: first-party]  
\[possible values: roots, workspace, first-party, first-party-and-directs, full]  

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet gc
Clean up old packages from the vet cache

Removes packages which haven't been accessed in a while, and deletes any extra files which aren't
recognized by cargo-vet.

In the future, many cargo-vet subcommands will implicitly do this.

### USAGE
```
cargo vet gc [OPTIONS]
```

### OPTIONS
#### `--max-package-age-days <MAX_PACKAGE_AGE_DAYS>`
Packages in the vet cache which haven't been used for this many days will be removed

\[default: 30]  

#### `--clean`
Remove the entire cache directory, forcing it to be regenerated next time you use cargo
vet

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet renew
Renew wildcard audit expirations

This will set a wildcard audit expiration to be one year in the future from when it is run. It can
optionally do this for all audits which are expiring soon.

### USAGE
```
cargo vet renew [OPTIONS] [CRATE]
```

### ARGS
#### `<CRATE>`
The name of a crate to renew

### OPTIONS
#### `--expiring`
Renew all wildcard audits which will have expired six weeks from now

#### `-h, --help`
Print help information

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)

<br><br><br>
## cargo vet help
Print this message or the help of the given subcommand(s)

### USAGE
```
cargo vet help [OPTIONS] [SUBCOMMAND]...
```

### ARGS
#### `<SUBCOMMAND>...`
The subcommand whose help message to display

### GLOBAL OPTIONS
This subcommand accepts all the [global options](#global-options)


stderr:

