FuguWeb

App::FuguWeb::CLI(3p) Perl Library Manual App::FuguWeb::CLI(3p)

App::FuguWeb::CLI - subcommand dispatch for fuguweb

    use App::FuguWeb::CLI;
    exit App::FuguWeb::CLI->run(@ARGV);

Fugu::CLI parses the command line and dispatches. This class holds the command table, the global options, and one method for each command. Nothing here repeats a Getopt::Long block.

"App::FuguWeb::CLI->run(@argv)" returns the exit code. bin/fuguweb passes it straight to "exit".

Before a command runs, the class applies the global options and loads the site description with App::FuguWeb::Config. A description that is absent or does not parse gives "EXIT_CONFIG_ERROR" and one message on standard error.

See fuguweb(1) for the user documentation of the subcommands.

The project root. Without it, the class walks up from the working directory to the first .fuguwebrc.
Suppress informational output.

"build" and "clean" take "--out" dir, which overrides the "out_dir" setting. "init" writes a starter description and is the one command that runs without one.

"mint-key", "import-key" and "promote-key" write one key directory, and App::FuguWeb::Rotate holds the work. Each one takes a "--purpose" word and a "--dir" name. A description with one "keys" block needs no "--dir", and one with several refuses a step without it. "mint-key" and "import-key" take a "--type", which defaults to "signify", and a "--secret" path. "import-key" also takes "--file", the public key file that it publishes. "promote-key" takes "--retiring", the private half of the key that retires.

"mint-key" makes a "signify" key or an "openpgp" key. An OpenPGP mint takes "--email", the one user id of the key, and an optional "--expires" date of the form "YYYY-MM-DD".

"import-key" publishes a key of every type, "x509" included. An issuer makes a certificate, so no verb mints one: "--file" names one PEM certificate, and "--secret" names its unencrypted PEM private key.

One signify key of the directory is the root of trust, and its purpose word is "root". Every step but two takes "--signer", the private half of the current root. A root step takes one "--bind" stem=path for each key in force. The verbs are the commands that sign, so they are the commands that need signify(1), and the command of each other type: gpg(1) for an OpenPGP key and openssl(1) for a certificate. Each one exits "EXIT_TOOL_MISSING" without the command that its step needs.

A directory that publishes its first key holds no "keys" block, because such a block cannot load until a "key" block stands beside it. The first mint therefore takes "--bootstrap" and "--org", and it can take "--dir" and "--url". "--dir" defaults to "keys" for a description that holds no "keys" block, so the first mint of a whole site needs none. One commit carries the block and the key.

"--bootstrap" is the intent to make a key directory, and "mint-key" and "import-key" alone take it. A step without it refuses a "--dir" that no "keys" block names. Each key directory holds a root of trust of its own, so a mistyped "--dir" would otherwise publish a second root in silence.

The first five come from Fugu::CLI and mean the same in every Fugu tool. The rest belong to a site build.

    0   EXIT_SUCCESS
    1   EXIT_ERROR
    2   EXIT_INVALID_ARGS
    3   EXIT_CONFIG_ERROR
    4   EXIT_RENDER_FAILED
    5   EXIT_CHECK_FAILED
    6   EXIT_TOOL_MISSING

A caller that builds in a container can thus tell a renderer that is not installed from a page that is malformed.

fuguweb(1), App::FuguWeb, App::FuguWeb::Config, Fugu::CLI

Dick Olsson <hi@senzilla.io>

2026-10-21 OpenBSD