This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 16b6e9dfbe82 CAMEL-25696: camel-jbang - A boolean option given without 
a value is on (#27951)
16b6e9dfbe82 is described below

commit 16b6e9dfbe82939fc0a1131f7b20780570bd5936
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Oct 16 17:35:49 2026 +0200

    CAMEL-25696: camel-jbang - A boolean option given without a value is on 
(#27951)
    
    picocli sets a boolean flag to the opposite of its default value, so the
    flag of an option that is on by default turned it off: camel export
    --maven-wrapper exported no Maven wrapper, camel config set --global wrote
    the local configuration, camel cmd receive --show-body hid the body, and
    camel kubernetes run --dev --cleanup left the deployment behind.
    
    All 82 boolean options that are on by default, also those whose default
    comes from the field (such as --global) or from the environment (run
    --logging-color), take arity 0..1 with the fallback value true, as --follow
    does since CAMEL-25396: a bare flag is on, --option=false is off, and a
    name or file after the flag is not taken as its value. A test in
    camel-jbang-core and in the kubernetes and validate plugins walks the
    commands and fails for a new option without it.
    
    A test checks the colors option of camel run on run, dev and debug
    whatever the environment, as its default is off in CI.
    
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
---
 .../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc    |   8 ++
 .../camel/dsl/jbang/core/commands/Debug.java       |  12 +--
 .../camel/dsl/jbang/core/commands/Explain.java     |   2 +-
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  11 +-
 .../camel/dsl/jbang/core/commands/Harden.java      |   2 +-
 .../jbang/core/commands/MavenResolverMixin.java    |   2 +-
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  11 +-
 .../jbang/core/commands/TransformDataWeave.java    |   2 +-
 .../dsl/jbang/core/commands/TransformRoute.java    |   2 +-
 .../jbang/core/commands/action/CamelBeanDump.java  |   4 +-
 .../core/commands/action/CamelBrowseAction.java    |   7 +-
 .../jbang/core/commands/action/CamelHeapDump.java  |   3 +-
 .../core/commands/action/CamelHistoryAction.java   |  13 +--
 .../jbang/core/commands/action/CamelLogAction.java |   5 +-
 .../core/commands/action/CamelReceiveAction.java   |   9 +-
 .../commands/action/CamelRouteDiagramAction.java   |   2 +-
 .../core/commands/action/CamelRouteDumpAction.java |   2 +-
 .../commands/action/CamelRouteTopologyAction.java  |   2 +-
 .../core/commands/action/CamelSendAction.java      |   9 +-
 .../core/commands/action/CamelSpanAction.java      |   2 +-
 .../core/commands/action/CamelStubAction.java      |  11 +-
 .../core/commands/action/CamelTraceAction.java     |  15 +--
 .../commands/action/RouteControllerAction.java     |   6 +-
 .../commands/action/TransformMessageAction.java    |   9 +-
 .../dsl/jbang/core/commands/config/ConfigGet.java  |   3 +-
 .../dsl/jbang/core/commands/config/ConfigList.java |   3 +-
 .../dsl/jbang/core/commands/config/ConfigSet.java  |   3 +-
 .../jbang/core/commands/config/ConfigUnset.java    |   3 +-
 .../dsl/jbang/core/commands/process/ListError.java |   3 +-
 .../core/commands/process/ListProperties.java      |   2 +-
 .../jbang/core/commands/version/VersionGet.java    |   3 +-
 .../jbang/core/commands/version/VersionList.java   |   9 +-
 .../jbang/core/commands/version/VersionSet.java    |   3 +-
 .../jbang/core/commands/BooleanOptionsTest.java    | 120 +++++++++++++++++++++
 .../core/commands/kubernetes/KubernetesExport.java |   2 +-
 .../core/commands/kubernetes/KubernetesRun.java    |   8 +-
 .../kubernetes/KubernetesBooleanOptionsTest.java   |  73 +++++++++++++
 .../commands/validate/YamlValidateCommand.java     |   2 +-
 .../validate/ValidateBooleanOptionsTest.java       |  60 +++++++++++
 39 files changed, 366 insertions(+), 82 deletions(-)

diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
index 0594c881d9fa..02549e8aedc7 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
@@ -466,6 +466,14 @@ or follows, like Enter does.
 * A plugin that cannot be loaded ends the command with exit code `1` and the 
error, as before, but no longer exits the
   JVM while the plugins load, which ended a program that embeds the CLI.
 
+=== camel-jbang - a boolean option given without a value is on
+
+A boolean option that is on by default is now on when it is given without a 
value, like any other boolean option:
+`camel export --maven-wrapper` exports the Maven wrapper, `camel config set 
--global key=value` writes the global
+configuration, `camel cmd receive --show-body` shows the body, and `camel 
kubernetes run --dev --cleanup` removes the
+deployment when it stops. Such a flag turned the option off before (picocli 
sets a flag to the opposite of its default).
+Turn the option off with `=false`, such as `--maven-wrapper=false`, which 
works as before.
+
 === camel-jbang - exit codes of config set, dependency list, jolokia and cmd 
memory-leak
 
 * `camel jolokia` with a name or pid that matches no running integration, or 
more than one, exits with `3`, as
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
index 5eaae7402c07..d03ef334d49a 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
@@ -98,7 +98,7 @@ public class Debug extends Run {
                         description = "File to store the current message body 
(will override). This allows for manual inspecting the message later.")
     String output;
 
-    @CommandLine.Option(names = { "--stop-on-exit" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--stop-on-exit" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Whether to stop the running Camel on 
exit")
     boolean stopOnExit = true;
 
@@ -106,7 +106,7 @@ public class Debug extends Run {
                         description = "Number of log lines to display on top 
of screen")
     int logLines = 10;
 
-    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Print timestamp.")
     boolean timestamp = true;
 
@@ -126,19 +126,19 @@ public class Debug extends Run {
                         description = "Show exchange properties in debug 
messages")
     boolean showExchangeProperties;
 
-    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true",
+    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true", arity = "0..1", fallbackValue = "true",
                         description = "Show exchange variables in debug 
messages")
     boolean showExchangeVariables = true;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in debug messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in debug messages")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show exception and stacktrace for 
failed messages")
     boolean showException = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
index f984d6688f9b..9fc0e51ea173 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
@@ -141,7 +141,7 @@ public class Explain extends CamelCommand {
 
     @Option(names = { "--stream" },
             description = "Stream the response as it's generated (shows 
progress)",
-            defaultValue = "true")
+            defaultValue = "true", arity = "0..1", fallbackValue = "true")
     boolean stream = true;
 
     public Explain(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 637b941a8391..b69572be99ff 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -154,11 +154,12 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         description = "Optional location of Maven 
settings-security.xml file to decrypt settings.xml")
     protected String mavenSettingsSecurity;
 
-    @CommandLine.Option(names = { "--maven-central-enabled" }, defaultValue = 
"true",
+    @CommandLine.Option(names = { "--maven-central-enabled" }, defaultValue = 
"true", arity = "0..1", fallbackValue = "true",
                         description = "Whether downloading JARs from Maven 
Central repository is enabled")
     protected boolean mavenCentralEnabled = true;
 
-    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" }, 
defaultValue = "true",
+    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" }, 
defaultValue = "true", arity = "0..1",
+                        fallbackValue = "true",
                         description = "Whether downloading JARs from ASF Maven 
Snapshot repository is enabled")
     protected boolean mavenApacheSnapshotEnabled = true;
 
@@ -207,7 +208,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         hidden = true)
     protected String quarkusPackageType = "fast-jar";
 
-    @CommandLine.Option(names = { "--maven-wrapper" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--maven-wrapper" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Include Maven Wrapper files in exported 
project")
     protected boolean mavenWrapper = true;
 
@@ -215,7 +216,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         description = "Include Camel Wrapper scripts in 
exported project for version pinning")
     protected boolean camelWrapper;
 
-    @CommandLine.Option(names = { "--docker" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--docker" }, defaultValue = "true", arity = 
"0..1", fallbackValue = "true",
                         description = "Include Docker files in exported 
project")
     protected boolean docker = true;
 
@@ -299,7 +300,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
-    @CommandLine.Option(names = { "--lazy-bean" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--lazy-bean" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Whether to use lazy bean initialization 
(can help with complex classloading issues")
     protected boolean lazyBean = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
index 7a27199e3bcb..6cfef2eba744 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
@@ -190,7 +190,7 @@ public class Harden extends CamelCommand {
 
     @Option(names = { "--stream" },
             description = "Stream the response as it's generated (shows 
progress)",
-            defaultValue = "true")
+            defaultValue = "true", arity = "0..1", fallbackValue = "true")
     boolean stream = true;
 
     private final HttpClient httpClient = HttpClient.newBuilder()
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/MavenResolverMixin.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/MavenResolverMixin.java
index ccdacd272bfb..6ff48bd38092 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/MavenResolverMixin.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/MavenResolverMixin.java
@@ -29,7 +29,7 @@ import picocli.CommandLine;
  */
 public class MavenResolverMixin implements MavenResolverMixinSpec {
     @CommandLine.Option(names = {
-            "--download" }, defaultValue = "true",
+            "--download" }, defaultValue = "true", arity = "0..1", 
fallbackValue = "true",
                         description = "Whether to allow automatic downloading 
JAR dependencies (over the internet)")
     boolean download = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 28a911053fe4..c81ca8ef00ee 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -269,11 +269,11 @@ public class Run extends CamelCommand {
             description = "Optional location of Maven settings-security.xml 
file to decrypt settings.xml")
     String mavenSettingsSecurity;
 
-    @Option(names = { "--maven-central-enabled" }, defaultValue = "true",
+    @Option(names = { "--maven-central-enabled" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
             description = "Whether downloading JARs from Maven Central 
repository is enabled")
     boolean mavenCentralEnabled = true;
 
-    @Option(names = { "--maven-apache-snapshot-enabled" }, defaultValue = 
"true",
+    @Option(names = { "--maven-apache-snapshot-enabled" }, defaultValue = 
"true", arity = "0..1", fallbackValue = "true",
             description = "Whether downloading JARs from ASF Maven Snapshot 
repository is enabled")
     boolean mavenApacheSnapshotEnabled = true;
 
@@ -343,7 +343,7 @@ public class Run extends CamelCommand {
 
     // port, managementPort, console, health, metrics, observe options are in 
ServerOptions @ArgGroup
 
-    @Option(names = { "--modeline" }, defaultValue = "true",
+    @Option(names = { "--modeline" }, defaultValue = "true", arity = "0..1", 
fallbackValue = "true",
             description = "Whether to support JBang style //DEPS to specify 
additional dependencies")
     boolean modeline = true;
 
@@ -3636,14 +3636,15 @@ public class Run extends CamelCommand {
     }
 
     static class LoggingOptions {
-        @Option(names = { "--logging" }, defaultValue = "true", description = 
"Can be used to turn off logging")
+        @Option(names = { "--logging" }, defaultValue = "true", arity = 
"0..1", fallbackValue = "true",
+                description = "Can be used to turn off logging")
         boolean logging = true;
 
         @Option(names = { "--logging-level" }, completionCandidates = 
LoggingLevelCompletionCandidates.class,
                 defaultValue = "info", description = "Logging level 
(${COMPLETION-CANDIDATES})")
         String loggingLevel;
 
-        @Option(names = { "--logging-color" },
+        @Option(names = { "--logging-color" }, arity = "0..1", fallbackValue = 
"true",
                 description = "Use colored logging. Default is auto-detected 
based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal 
capabilities")
         boolean loggingColor = EnvironmentHelper.isColorEnabled();
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
index 10a68aab89d7..d1762d7b5835 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
@@ -49,7 +49,7 @@ public class TransformDataWeave extends CamelCommand {
                         description = "Inline DataWeave expression to convert")
     private String expression;
 
-    @CommandLine.Option(names = { "--include-comments" }, defaultValue = 
"true",
+    @CommandLine.Option(names = { "--include-comments" }, defaultValue = 
"true", arity = "0..1", fallbackValue = "true",
                         description = "Include conversion notes as comments in 
output")
     private boolean includeComments = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
index e903a69a4cb6..402ac2f6e31e 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
@@ -76,7 +76,7 @@ public class TransformRoute extends CamelCommand {
                         description = "Whether to resolve property 
placeholders in the dumped output")
     boolean resolvePlaceholders;
 
-    @CommandLine.Option(names = { "--uri-as-parameters" }, defaultValue = 
"true",
+    @CommandLine.Option(names = { "--uri-as-parameters" }, defaultValue = 
"true", arity = "0..1", fallbackValue = "true",
                         description = "Whether to expand URIs into separated 
key/value parameters (only in use for YAML format)")
     boolean uriAsParameters = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
index cd86eb33721c..0cb0eb048bea 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
@@ -81,11 +81,11 @@ public class CamelBeanDump extends ActionBaseCommand {
     String filter = "all";
 
     @CommandLine.Option(names = { "--properties" },
-                        description = "Show bean properties", defaultValue = 
"true")
+                        description = "Show bean properties", defaultValue = 
"true", arity = "0..1", fallbackValue = "true")
     boolean properties;
 
     @CommandLine.Option(names = { "--nulls" },
-                        description = "Include null values", defaultValue = 
"true")
+                        description = "Include null values", defaultValue = 
"true", arity = "0..1", fallbackValue = "true")
     boolean nulls;
 
     @CommandLine.Option(names = { "--scope" }, completionCandidates = 
ScopeCompletionCandidates.class,
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
index f03a9d5e295d..11c8d9e4eed9 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
@@ -96,11 +96,11 @@ public class CamelBrowseAction extends ActionBaseCommand {
                         description = "Sort by uri, or size", defaultValue = 
"uri")
     String sort;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in browsed 
messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in browsed messages")
     boolean showBody = true;
 
@@ -112,7 +112,8 @@ public class CamelBrowseAction extends ActionBaseCommand {
                         description = "Maximum size of the message body to 
include in the dump")
     int bodyMaxChars;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--pretty" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHeapDump.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHeapDump.java
index bd907f5ac4d4..62aa4351b4a1 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHeapDump.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHeapDump.java
@@ -45,7 +45,8 @@ public class CamelHeapDump extends ActionBaseCommand {
     String dumpName;
 
     @CommandLine.Option(names = { "--live" },
-                        description = "Whether to dump only live objects", 
defaultValue = "true")
+                        description = "Whether to dump only live objects", 
defaultValue = "true", arity = "0..1",
+                        fallbackValue = "true")
     boolean live = true;
 
     @CommandLine.Option(names = { "--timeout" }, defaultValue = "60000", 
converter = TimeoutConverter.class,
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
index 64fe8b4ca71e..11cf64001c85 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
@@ -104,7 +104,7 @@ public class CamelHistoryAction extends ActionWatchCommand {
                         description = "Limit Split to a maximum number of 
entries to be displayed")
     int limitSplit;
 
-    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Print timestamp.")
     boolean timestamp = true;
 
@@ -116,19 +116,19 @@ public class CamelHistoryAction extends 
ActionWatchCommand {
                         description = "Show exchange properties in debug 
messages")
     boolean showExchangeProperties;
 
-    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true",
+    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true", arity = "0..1", fallbackValue = "true",
                         description = "Show exchange variables in debug 
messages")
     boolean showExchangeVariables = true;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in debug messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in debug messages")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show exception and stacktrace for 
failed messages")
     boolean showException = true;
 
@@ -140,7 +140,8 @@ public class CamelHistoryAction extends ActionWatchCommand {
                         description = "Output in JSON Format")
     boolean jsonOutput;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--diagram" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
index 8ca3dfa5379e..c93497d259fb 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
@@ -79,10 +79,11 @@ public class CamelLogAction extends ActionBaseCommand {
     @CommandLine.Parameters(description = "Name or pid of running Camel 
integration. (default selects all)", arity = "0..1")
     String name = "*";
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
-    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Print timestamp.")
     boolean timestamp = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
index ae12a20e2efc..398aecafd8b0 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
@@ -183,11 +183,11 @@ public class CamelReceiveAction extends ActionBaseCommand 
{
                         description = "Show exchange variables in received 
messages")
     boolean showExchangeVariables;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in received 
messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in received messages")
     boolean showBody = true;
 
@@ -195,10 +195,11 @@ public class CamelReceiveAction extends ActionBaseCommand 
{
                         description = "Show only message body in received 
messages")
     boolean onlyBody;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
-    @CommandLine.Option(names = { "--compact" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--compact" }, defaultValue = "true", arity 
= "0..1", fallbackValue = "true",
                         description = "Compact output (no empty line 
separating messages)")
     boolean compact = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
index 47ee6f8bb047..7065cfc43adc 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
@@ -119,7 +119,7 @@ public class CamelRouteDiagramAction extends 
ActionWatchCommand {
                         defaultValue = "both")
     String nodeLabel;
 
-    @CommandLine.Option(names = { "--metric" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--metric" }, defaultValue = "true", arity = 
"0..1", fallbackValue = "true",
                         description = "Whether to include live metrics (only 
possible for running Camel application)")
     boolean metric;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDumpAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDumpAction.java
index 794511e2103c..5ef366a93e9b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDumpAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDumpAction.java
@@ -80,7 +80,7 @@ public class CamelRouteDumpAction extends ActionBaseCommand {
 
     @CommandLine.Option(names = { "--uri-as-parameters" },
                         description = "Whether to expand URIs into separated 
key/value parameters (only in use for YAML format)",
-                        defaultValue = "true")
+                        defaultValue = "true", arity = "0..1", fallbackValue = 
"true")
     boolean uriAsParameters;
 
     @CommandLine.Option(names = { "--filter" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteTopologyAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteTopologyAction.java
index 9dd91f611703..53875c0fe67f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteTopologyAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteTopologyAction.java
@@ -97,7 +97,7 @@ public class CamelRouteTopologyAction extends 
ActionBaseCommand {
                         description = "Prefer route description over route id 
in node labels")
     boolean description;
 
-    @CommandLine.Option(names = { "--metric" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--metric" }, defaultValue = "true", arity = 
"0..1", fallbackValue = "true",
                         description = "Whether to include live metrics (only 
possible for a running Camel application)")
     boolean metric;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
index c45c29c169bd..ee39a8323030 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
@@ -116,15 +116,15 @@ public class CamelSendAction extends ActionBaseCommand {
                         description = "Show exchange variables from response 
message (InOut)")
     boolean showExchangeVariables;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers from response 
message (InOut)")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body from response message 
(InOut)")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show exception and stacktrace for 
failed messages")
     boolean showException = true;
 
@@ -132,7 +132,8 @@ public class CamelSendAction extends ActionBaseCommand {
                         description = "Pretty print response message body 
(InOut) when using JSon or XML format")
     boolean pretty;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--infra" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSpanAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSpanAction.java
index 83657a509724..7e337eeb3152 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSpanAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSpanAction.java
@@ -93,7 +93,7 @@ public class CamelSpanAction extends ActionBaseCommand {
                         description = "Show flat list of individual spans 
instead of grouped traces")
     boolean flat;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Use colored logging")
     boolean loggingColor = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
index addf88d3f59d..3f5d53a4bcda 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
@@ -60,7 +60,7 @@ public class CamelStubAction extends ActionWatchCommand {
                         description = "Whether to browse messages queued in 
the stub endpoints")
     boolean browse;
 
-    @CommandLine.Option(names = { "--top" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--top" }, defaultValue = "true", arity = 
"0..1", fallbackValue = "true",
                         description = "Whether to browse top (latest) messages 
queued in the stub endpoints")
     boolean top = true;
 
@@ -77,15 +77,15 @@ public class CamelStubAction extends ActionWatchCommand {
                         arity = "0..*")
     String[] grep;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in traced 
messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in traced messages")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--compact" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--compact" }, defaultValue = "true", arity 
= "0..1", fallbackValue = "true",
                         description = "Compact output (no empty line 
separating browsed messages)")
     boolean compact = true;
 
@@ -97,7 +97,8 @@ public class CamelStubAction extends ActionWatchCommand {
                         description = "Pretty print message body when using 
JSon or XML format")
     boolean pretty;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--json" }, description = "Output in JSON 
Format")
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
index 40f479aae071..200c02a14c81 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
@@ -113,7 +113,7 @@ public class CamelTraceAction extends ActionBaseCommand {
     @CommandLine.Mixin
     ActionTimeoutMixin timeoutOption;
 
-    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--timestamp" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Print timestamp.")
     boolean timestamp = true;
 
@@ -161,26 +161,27 @@ public class CamelTraceAction extends ActionBaseCommand {
                         description = "Show exchange properties in traced 
messages")
     boolean showExchangeProperties;
 
-    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true",
+    @CommandLine.Option(names = { "--show-exchange-variables" }, defaultValue 
= "true", arity = "0..1", fallbackValue = "true",
                         description = "Show exchange variables in traced 
messages")
     boolean showExchangeVariables = true;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers in traced 
messages")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body in traced messages")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show exception and stacktrace for 
failed messages")
     boolean showException = true;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
-    @CommandLine.Option(names = { "--compact" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--compact" }, defaultValue = "true", arity 
= "0..1", fallbackValue = "true",
                         description = "Compact output (no empty line 
separating traced messages)")
     boolean compact = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
index 6793f09ffde0..2b485d82def6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
@@ -66,11 +66,13 @@ public class RouteControllerAction extends 
ActionWatchCommand {
     String sort;
 
     @CommandLine.Option(names = { "--header" },
-                        description = "Include controller configuration 
details", defaultValue = "true")
+                        description = "Include controller configuration 
details", defaultValue = "true", arity = "0..1",
+                        fallbackValue = "true")
     boolean header;
 
     @CommandLine.Option(names = { "--trace" },
-                        description = "Include stack-traces in error 
messages", defaultValue = "true")
+                        description = "Include stack-traces in error 
messages", defaultValue = "true", arity = "0..1",
+                        fallbackValue = "true")
     boolean trace;
 
     @CommandLine.Option(names = { "--depth" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
index 6d82094ea37b..bee1c4036ddd 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
@@ -100,15 +100,15 @@ public class TransformMessageAction extends 
ActionWatchCommand {
                         description = "Show exchange properties from the 
output message")
     boolean showExchangeProperties;
 
-    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-headers" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message headers from the output 
message")
     boolean showHeaders = true;
 
-    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-body" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show message body from the output 
message")
     boolean showBody = true;
 
-    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--show-exception" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Show exception and stacktrace for 
failed transformation")
     boolean showException = true;
 
@@ -116,7 +116,8 @@ public class TransformMessageAction extends 
ActionWatchCommand {
                         description = "Timeout waiting for message to be 
transformed, in millis or as a duration such as 30s")
     long timeout = 20000;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--pretty" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigGet.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigGet.java
index bedd9ab99f38..f25e7d71aea0 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigGet.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigGet.java
@@ -38,7 +38,8 @@ public class ConfigGet extends CamelCommand {
     @CommandLine.Parameters(description = "Configuration key", arity = "1")
     String key;
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configuration")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configuration")
     boolean global = true;
 
     @CommandLine.Option(names = { "--json" }, description = "Output in JSON 
Format")
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigList.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigList.java
index 1a42ad445bd1..b9530a234afd 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigList.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigList.java
@@ -34,7 +34,8 @@ import picocli.CommandLine;
                              "  camel config list --json" })
 public class ConfigList extends CamelCommand {
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configuration")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configuration")
     boolean global = true;
 
     @CommandLine.Option(names = { "--json" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigSet.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigSet.java
index 2feb0e57693d..378b8a805038 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigSet.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigSet.java
@@ -36,7 +36,8 @@ public class ConfigSet extends CamelCommand {
     @CommandLine.Parameters(description = "Configuration parameter (ex. 
key=value)", arity = "1")
     String configuration;
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configuration")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configuration")
     boolean global = true;
 
     public ConfigSet(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigUnset.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigUnset.java
index 2721897c1606..f91627932b6f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigUnset.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/config/ConfigUnset.java
@@ -31,7 +31,8 @@ public class ConfigUnset extends CamelCommand {
     @CommandLine.Parameters(description = "Configuration key", arity = "1")
     String key;
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configurations")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configurations")
     boolean global = true;
 
     public ConfigUnset(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListError.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListError.java
index b53a23e324bc..749fd173b935 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListError.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListError.java
@@ -91,7 +91,8 @@ public class ListError extends ProcessWatchCommand {
                         description = "Comma-separated detail sections to 
show: body, headers, properties, variables, history, stackTrace, or 'all' for 
all sections")
     String show;
 
-    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
description = "Use colored logging")
+    @CommandLine.Option(names = { "--logging-color" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
+                        description = "Use colored logging")
     boolean loggingColor = true;
 
     @CommandLine.Option(names = { "--detail" },
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
index b3e35cf47570..185bfa82efe2 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
@@ -74,7 +74,7 @@ public class ListProperties extends ProcessWatchCommand {
 
     @CommandLine.Option(names = { "--mask" },
                         description = "Whether to mask configuration values to 
avoid printing sensitive information such as password or access keys",
-                        defaultValue = "true")
+                        defaultValue = "true", arity = "0..1", fallbackValue = 
"true")
     boolean mask = true;
 
     public ListProperties(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGet.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGet.java
index b7d95d56885a..ad7a1d0d0331 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGet.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGet.java
@@ -31,7 +31,8 @@ import picocli.CommandLine;
                              "  camel version get" })
 public class VersionGet extends CamelCommand {
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configuration")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configuration")
     boolean global = true;
 
     public VersionGet(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
index d461580807fb..36a8c5432ac6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
@@ -129,16 +129,19 @@ public class VersionList extends CamelCommand {
     @CommandLine.Option(names = { "--lts" }, description = "Only show LTS 
supported releases", defaultValue = "false")
     public boolean lts;
 
-    @CommandLine.Option(names = { "--eol" }, description = "Include releases 
that are end-of-life", defaultValue = "true")
+    @CommandLine.Option(names = { "--eol" }, description = "Include releases 
that are end-of-life", defaultValue = "true",
+                        arity = "0..1", fallbackValue = "true")
     public boolean eol = true;
 
-    @CommandLine.Option(names = { "--patch" }, description = "Whether to 
include patch releases (x.y.z)", defaultValue = "true")
+    @CommandLine.Option(names = { "--patch" }, description = "Whether to 
include patch releases (x.y.z)", defaultValue = "true",
+                        arity = "0..1", fallbackValue = "true")
     public boolean patch = true;
 
     @CommandLine.Option(names = { "--rc" }, description = "Include also 
milestone or RC releases", defaultValue = "false")
     public boolean rc;
 
-    @CommandLine.Option(names = { "--days" }, description = "Whether to 
include days since release", defaultValue = "true")
+    @CommandLine.Option(names = { "--days" }, description = "Whether to 
include days since release", defaultValue = "true",
+                        arity = "0..1", fallbackValue = "true")
     public boolean days;
 
     @CommandLine.Option(names = { "--date-format" }, description = "The format 
to show the date (such as dd-MM-yyyy)",
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionSet.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionSet.java
index a6c2833004b4..ef2ab9b453c5 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionSet.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionSet.java
@@ -49,7 +49,8 @@ public class VersionSet extends CamelCommand {
     @CommandLine.Option(names = { "--reset" }, description = "Reset by 
removing any custom version settings")
     boolean reset;
 
-    @CommandLine.Option(names = { "--global" }, description = "Use global or 
local configuration")
+    @CommandLine.Option(names = { "--global" }, arity = "0..1", fallbackValue 
= "true",
+                        description = "Use global or local configuration")
     boolean global = true;
 
     public VersionSet(CamelJBangMain main) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/BooleanOptionsTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/BooleanOptionsTest.java
new file mode 100644
index 000000000000..0c35373e6576
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/BooleanOptionsTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import picocli.CommandLine;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.Model.OptionSpec;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * A boolean option given without a value is on. picocli sets a flag to the 
opposite of its default, so an option that
+ * is on by default needs <tt>arity = "0..1", fallbackValue = "true"</tt>: 
otherwise <tt>--maven-wrapper</tt> would turn
+ * the Maven wrapper off.
+ */
+class BooleanOptionsTest extends CamelCommandBaseTestSupport {
+
+    private CommandLine commandLine;
+
+    @BeforeEach
+    void commandLine() {
+        StringWriter help = new StringWriter();
+        CamelJBangMain main = new CamelJBangMain() {
+            @Override
+            public void quit(int exitCode) {
+                // in the test
+            }
+
+            @Override
+            public void postAddCommands(CommandLine commandLine, String[] 
args) {
+                commandLine.setOut(new PrintWriter(help));
+                BooleanOptionsTest.this.commandLine = commandLine;
+            }
+        }.withPrinter(printer);
+        main.setDiscoverPlugins(false);
+        main.execute("--help");
+    }
+
+    @Test
+    void everyOptionThatIsOnByDefaultIsOnWhenGivenWithoutValue() {
+        List<String> wrong = new ArrayList<>();
+        check(commandLine, wrong);
+
+        assertThat(wrong).as("boolean options that are on by default, without 
arity = \"0..1\", fallbackValue = \"true\"")
+                .isEmpty();
+    }
+
+    @Test
+    void optionThatIsOnByDefaultDependingOnTheEnvironment() {
+        // the colors of camel run are on in a terminal with colors and off in 
CI, so the check of the defaults above
+        // sees this option only where its default is on
+        for (String command : List.of("run", "dev", "debug")) {
+            OptionSpec option = 
commandLine.getSubcommands().get(command).getCommandSpec().findOption("--logging-color");
+            assertThat(option.arity().min()).as(command).isZero();
+            assertThat(option.fallbackValue()).as(command).isEqualTo("true");
+        }
+    }
+
+    @Test
+    void flagWithoutValue() {
+        assertThat(option("--maven-wrapper", "export", 
"--maven-wrapper")).isEqualTo(true);
+        assertThat(option("--maven-wrapper", "export", 
"--maven-wrapper=false")).isEqualTo(false);
+        assertThat(option("--maven-wrapper", "export")).isEqualTo(true);
+
+        // the local configuration is written only with --global=false
+        assertThat(option("--global", "config", "set", "--global", 
"foo=bar")).isEqualTo(true);
+        assertThat(option("--global", "config", "set", "--global=false", 
"foo=bar")).isEqualTo(false);
+
+        // the name after the flag is not taken as its value
+        CommandSpec log = parse("log", "--timestamp", "orders");
+        assertThat(log.findOption("--timestamp").<Boolean> 
getValue()).isTrue();
+        assertThat(log.positionalParameters().get(0).<String> 
getValue()).isEqualTo("orders");
+    }
+
+    // the value of the option of the command, once the command line is parsed
+    private Object option(String name, String... args) {
+        return parse(args).findOption(name).getValue();
+    }
+
+    private CommandSpec parse(String... args) {
+        CommandLine.ParseResult result = commandLine.parseArgs(args);
+        while (result.hasSubcommand()) {
+            result = result.subcommand();
+        }
+        return result.commandSpec();
+    }
+
+    private static void check(CommandLine commandLine, List<String> wrong) {
+        CommandSpec spec = commandLine.getCommandSpec();
+        for (OptionSpec option : spec.options()) {
+            boolean flag = option.type() == boolean.class || option.type() == 
Boolean.class;
+            boolean onByDefault = "true".equals(option.defaultValue()) || 
Boolean.TRUE.equals(option.initialValue());
+            if (flag && onByDefault && !(option.arity().min() == 0 && 
"true".equals(option.fallbackValue()))) {
+                wrong.add(spec.qualifiedName(" ") + " " + 
option.longestName());
+            }
+        }
+        commandLine.getSubcommands().values().forEach(sub -> check(sub, 
wrong));
+    }
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
index 89f027806e8c..4440133deeef 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
@@ -114,7 +114,7 @@ public class KubernetesExport extends Export {
                         description = "The image builder used to build the 
container image (e.g. docker, jib, s2i).")
     protected String imageBuilder = "jib";
 
-    @CommandLine.Option(names = { "--image-push" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--image-push" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Whether to push the container image to 
a given image registry.")
     protected boolean imagePush = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
index 2ef670883a52..a387fa9ebf13 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java
@@ -137,7 +137,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
     boolean verbose;
 
     @CommandLine.Option(names = { "--cleanup" },
-                        defaultValue = "true",
+                        defaultValue = "true", arity = "0..1", fallbackValue = 
"true",
                         description = "Automatically removes deployment when 
process is stopped. Only in combination with --dev, --reload option.")
     boolean cleanup = true;
 
@@ -171,7 +171,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
                         description = "The target cluster type 
(${COMPLETION-CANDIDATES}). Special configurations may be applied to different 
cluster types such as Kind or Minikube.")
     String clusterType;
 
-    @CommandLine.Option(names = { "--image-build" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--image-build" }, defaultValue = "true", 
arity = "0..1", fallbackValue = "true",
                         description = "Whether to build container image as 
part of the run.")
     boolean imageBuild = true;
 
@@ -232,11 +232,11 @@ public class KubernetesRun extends KubernetesBaseCommand {
                         description = "Optional location of Maven 
settings-security.xml file to decrypt settings.xml")
     String mavenSettingsSecurity;
 
-    @CommandLine.Option(names = { "--maven-central-enabled" },
+    @CommandLine.Option(names = { "--maven-central-enabled" }, arity = "0..1", 
fallbackValue = "true",
                         description = "Whether downloading JARs from Maven 
Central repository is enabled")
     boolean mavenCentralEnabled = true;
 
-    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" },
+    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" }, arity = 
"0..1", fallbackValue = "true",
                         description = "Whether downloading JARs from ASF Maven 
Snapshot repository is enabled")
     boolean mavenApacheSnapshotEnabled = true;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBooleanOptionsTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBooleanOptionsTest.java
new file mode 100644
index 000000000000..a8c40fd50501
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBooleanOptionsTest.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.kubernetes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import picocli.CommandLine;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.Model.OptionSpec;
+
+/**
+ * A boolean option given without a value is on, also for an option that is on 
by default: <tt>camel kubernetes run
+ * --dev --cleanup</tt> removes the deployment when it stops.
+ */
+class KubernetesBooleanOptionsTest {
+
+    @Test
+    void everyOptionThatIsOnByDefaultIsOnWhenGivenWithoutValue() {
+        CamelJBangMain main = new CamelJBangMain();
+        CommandLine commandLine = new CommandLine(main);
+        new KubernetesPlugin().customize(commandLine, main);
+
+        List<String> wrong = new ArrayList<>();
+        check(commandLine, wrong);
+
+        Assertions.assertEquals(List.of(), wrong,
+                "boolean options that are on by default, without arity = 
\"0..1\", fallbackValue = \"true\"");
+    }
+
+    @Test
+    void cleanupWithoutValue() {
+        CamelJBangMain main = new CamelJBangMain();
+        CommandLine commandLine = new CommandLine(main);
+        new KubernetesPlugin().customize(commandLine, main);
+
+        CommandLine.ParseResult result = commandLine.parseArgs("kubernetes", 
"run", "--dev", "--cleanup", "route.yaml");
+        CommandSpec run = result.subcommand().subcommand().commandSpec();
+
+        Assertions.assertEquals(Boolean.TRUE, 
run.findOption("--cleanup").getValue());
+        // the file after the flag is not taken as its value
+        Assertions.assertEquals(List.of("route.yaml"), ((KubernetesRun) 
run.userObject()).files);
+    }
+
+    private static void check(CommandLine commandLine, List<String> wrong) {
+        CommandSpec spec = commandLine.getCommandSpec();
+        for (OptionSpec option : spec.options()) {
+            boolean flag = option.type() == boolean.class || option.type() == 
Boolean.class;
+            boolean onByDefault = "true".equals(option.defaultValue()) || 
Boolean.TRUE.equals(option.initialValue());
+            if (flag && onByDefault && !(option.arity().min() == 0 && 
"true".equals(option.fallbackValue()))) {
+                wrong.add(spec.qualifiedName(" ") + " " + 
option.longestName());
+            }
+        }
+        commandLine.getSubcommands().values().forEach(sub -> check(sub, 
wrong));
+    }
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
index 84ec7c2cd711..94fbf7de378b 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
@@ -49,7 +49,7 @@ public class YamlValidateCommand extends CamelCommand {
                                       + " implicit expressions) with the 
canonical form to write")
     boolean canonical;
 
-    @CommandLine.Option(names = { "--catalog" }, defaultValue = "true",
+    @CommandLine.Option(names = { "--catalog" }, defaultValue = "true", arity 
= "0..1", fallbackValue = "true",
                         description = "Also check endpoint URIs and simple 
expressions against the Camel catalog"
                                       + " (use --catalog=false for the schema 
only)")
     boolean catalog = true;
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/test/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateBooleanOptionsTest.java
 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/test/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateBooleanOptionsTest.java
new file mode 100644
index 000000000000..f82b3b90e988
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/test/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateBooleanOptionsTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.validate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.junit.jupiter.api.Test;
+import picocli.CommandLine;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.Model.OptionSpec;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * A boolean option given without a value is on, also for an option that is on 
by default, such as <tt>camel validate
+ * yaml --catalog</tt>.
+ */
+class ValidateBooleanOptionsTest {
+
+    @Test
+    void everyOptionThatIsOnByDefaultIsOnWhenGivenWithoutValue() {
+        CamelJBangMain main = new CamelJBangMain();
+        CommandLine commandLine = new CommandLine(main);
+        new ValidatePlugin().customize(commandLine, main);
+
+        List<String> wrong = new ArrayList<>();
+        check(commandLine, wrong);
+
+        assertThat(wrong).as("boolean options that are on by default, without 
arity = \"0..1\", fallbackValue = \"true\"")
+                .isEmpty();
+    }
+
+    private static void check(CommandLine commandLine, List<String> wrong) {
+        CommandSpec spec = commandLine.getCommandSpec();
+        for (OptionSpec option : spec.options()) {
+            boolean flag = option.type() == boolean.class || option.type() == 
Boolean.class;
+            boolean onByDefault = "true".equals(option.defaultValue()) || 
Boolean.TRUE.equals(option.initialValue());
+            if (flag && onByDefault && !(option.arity().min() == 0 && 
"true".equals(option.fallbackValue()))) {
+                wrong.add(spec.qualifiedName(" ") + " " + 
option.longestName());
+            }
+        }
+        commandLine.getSubcommands().values().forEach(sub -> check(sub, 
wrong));
+    }
+}

Reply via email to