Flag Add
Add a new CLI flag to a shipctl command end-to-end.
Inputs
- Command path (e.g.,
release,build cross,config set) - Flag name (long form, e.g.,
--output-dir) - Short alias (optional, e.g.,
-o) - Type (string, bool, integer, path)
- Default value (or
requiredif mandatory) - Description (one-line, used in help text and docs)
Steps
Define the flag in the parser
For Rust +
clap:// In the relevant Args struct (src/cmd/{command}.rs) #[arg(long, short = '{alias}', default_value = "{default}", help = "{description}")] pub {flag_name}: {type},For Go +
cobra:// In the relevant command file (cmd/{command}.go) cmd.Flags().{TypeVar}(&opts.{FlagName}, "{flag-name}", {default}, "{description}")Wire the value into the command logic Pass the flag value through to whatever downstream call needs it. Verify the happy path compiles:
cargo check/go build ./....Update the help text Run
shipctl {command} --helpand confirm the flag appears with the correct description and default.Add shell completions Regenerate completions (invoke
manpage-syncskill, or manually):shipctl completions bash > completions/shipctl.bash shipctl completions zsh > completions/_shipctl shipctl completions fish > completions/shipctl.fishCommit the updated completion files.
Update documentation Edit
docs/reference/{command}.md:- Add a row to the Flags table:
| --{flag-name} | {type} | {default} | {description} | - Add an Examples entry if the flag has a non-obvious use
- Add a row to the Flags table:
Write or extend a test
// tests/cmd_{command}.rs #[test] fn test_{flag_name}_flag() { let output = Command::cargo_bin("shipctl").unwrap() .arg("{command}") .arg("--{flag-name}").arg("{test-value}") .assert().success(); // assert output contains expected value }Verify the full suite passes
cargo test --workspace
Conventions
- Long flags are kebab-case (
--output-dir, not--outputDir) - Boolean flags use
--flag/--no-flagpair when toggling a default-on behavior - Flags that accept file paths validate existence (return error with
ENOENTmessage) - Help text: imperative mood, no trailing period, max 72 chars
- Short aliases: only for the top 10 most-used flags; don't add new ones without team sign-off
Edge Cases
- Conflicting short alias: Run
shipctl --helpon the parent command to audit existing aliases; pick a different letter or omit the alias. - Required flag without a default: Add a clear error message with the flag name and an example invocation.
- Flag affects multiple subcommands: Define it at the parent command level with
PersistentFlags()(cobra) orArgsflattening (clap). - Boolean flag default is
true: Document this prominently; many users expect flags to be opt-in.