Skip to main content

Global options in specialist CLI packages

For Git, Terraform, dotnet, Go, nbgv, Cargo, Packer, and Vault, see the developer and infrastructure CLI audit. For pip, Homebrew, WinGet, Chocolatey, Yarn, npm, and pnpm, see the package-manager CLI audit.

Some tools have subcommands with inherited settings. Others accept one invocation with files, goals, tasks, or a filter. An empty abstract base class does not mean options are missing when the executable has one generated Execute command.

The following audit covers the specialist tools tracked in issue #5711. Versions identify the checked-in generation manifests at the start of the audit; official references were checked on 4 October 2026. Snyk and Flyway also have captured help fixtures in the generator tests, from Snyk 1.1302.0 and the hosted Flyway 10.20.1 installation.

ToolAudited representationGlobal-option result and evidence
Maven 3.9.16MavenExecuteOptions, including Define, Quiet, Debug, and GoalsAndPhasesGoals and lifecycle phases are operands of one invocation. Root options already belong to the concrete class. Maven CLI reference.
Gradle 9.8.0GradleExecuteOptions, including Tasks and build settingsTasks are operands. Gradle-wide options already belong to the concrete class; task-specific options must remain associated with their task. Gradle command-line reference.
SonarScanner CLI 8.0.1.6346SonarScannerExecuteOptions, including repeated Define properties and DebugOne scanner invocation has no child command tree requiring inherited flags. SonarScanner CLI.
Snyk 1.1302.0 helpSnykOptions.Debug inherited by command classesRoot help documents -d; command help repeats it. Generate it once on the base class. Do not promote --unmanaged from a root-help example: it is limited to scanning commands. Snyk CLI help, debugging.
Hadolint 2.15.1HadolintExecuteOptions, including Config, Format, and file operandsOne Dockerfile-linting invocation; options are already available on its concrete class. Hadolint CLI.
jq 1.8.2JqExecuteOptions, including Filter and input/output optionsFilters are jq programs, not CLI subcommands. Root options stay on the execution class. jq manual.
Flyway 10.20.1FlywayOptions inherited by migration and other command classesParse the root configuration table and -X, -q, and -n flags. Root configuration uses -key=value; list settings accept a comma-delimited string. Keep command-only settings on their command. Flyway command-line parameters.
Liquibase 5.0.3LiquibaseOptions, including SearchPath, LogLevel, and supplemental licensed settingsExisting parsed and supplemental globals already share the base class. Preserve them, their value syntax, secret marking, and command-level deduplication. Liquibase parameters.
Ansible core 2.21.4AnsibleExecuteOptions, including Pattern, repeated Inventory, and Verboseansible is one executable; ansible-playbook and other executables are not its subcommands. Ansible CLI.
ShellCheck 0.11.0ShellcheckExecuteOptions, including Format and FilesOne file-analysis invocation; no child command requires inherited settings. ShellCheck manual.
Newman 6.2.2NewmanRunOptionsRoot options are help/version control actions. Collection, reporter, timeout, and variable options belong to run; “global variables” do not mean executable-wide flags. A separate value-arity defect is tracked in #5721. Newman command-line options.

Migrating callers​

Snyk command initializers can continue setting Debug; the property is inherited from SnykOptions instead of repeated on each generated command class. Reflection code that uses DeclaredOnly must account for inherited properties.

Set Flyway connection and configuration settings directly on the chosen command options, for example Url, User, Password, and Locations. These are inherited from FlywayOptions. Supply Locations as one comma-delimited string. The generator emits configuration before the subcommand using -key=value and emits the diagnostic and non-interactive switches as flags. Passwords and license keys retain secret metadata.

Supply Placeholders and JdbcProperties as KeyValue collections. Each entry renders as -placeholders.name=value or -jdbcProperties.name=value, respectively. JDBC properties are marked as secrets because drivers can accept credentials through this map. See Flyway placeholders and JDBC properties.

The flat-tool execution classes and Liquibase's existing global properties keep their current placement. Help/version actions are not configuration to apply to every command.