diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CIAwareMavenOptions.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CIAwareMavenOptions.java
new file mode 100644
index 000000000000..3057dc634415
--- /dev/null
+++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CIAwareMavenOptions.java
@@ -0,0 +1,324 @@
+/*
+ * 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.maven.cling.invoker.mvn;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.UnaryOperator;
+
+import org.apache.maven.api.cli.ParserRequest;
+import org.apache.maven.api.cli.cisupport.CIInfo;
+import org.apache.maven.api.cli.mvn.MavenOptions;
+
+/**
+ * A wrapper around MavenOptions that provides CI-specific defaults when CI is detected.
+ * This class applies the following optimizations for CI environments:
+ *
+ * - Enables batch mode (non-interactive) if not explicitly overridden
+ * - Enables show-version for better CI build identification
+ * - Enables show-errors for better CI debugging
+ *
+ *
+ * All CI optimizations can be overridden by explicit command-line flags.
+ *
+ * @since 4.0.0
+ */
+public class CIAwareMavenOptions implements MavenOptions {
+ private final MavenOptions delegate;
+ private final CIInfo ciInfo;
+ private final boolean hasExplicitShowVersion;
+ private final boolean hasExplicitShowErrors;
+ private final boolean hasExplicitNonInteractive;
+
+ public CIAwareMavenOptions(MavenOptions delegate, CIInfo ciInfo) {
+ this.delegate = delegate;
+ this.ciInfo = ciInfo;
+
+ // Check if user has explicitly set these options
+ this.hasExplicitShowVersion = delegate.showVersion().isPresent();
+ this.hasExplicitShowErrors = delegate.showErrors().isPresent();
+ this.hasExplicitNonInteractive = delegate.nonInteractive().isPresent();
+ }
+
+ @Override
+ public String source() {
+ return "CI-aware(" + delegate.source() + ")";
+ }
+
+ @Override
+ public Optional showVersion() {
+ // If user explicitly set show-version, respect their choice
+ if (hasExplicitShowVersion) {
+ return delegate.showVersion();
+ }
+ // In CI, default to showing version for better build identification
+ return Optional.of(true);
+ }
+
+ @Override
+ public Optional showErrors() {
+ // If user explicitly set show-errors, respect their choice
+ if (hasExplicitShowErrors) {
+ return delegate.showErrors();
+ }
+ // In CI, default to showing errors for better debugging
+ return Optional.of(true);
+ }
+
+ @Override
+ public Optional nonInteractive() {
+ // If user explicitly set non-interactive/batch-mode, respect their choice
+ if (hasExplicitNonInteractive) {
+ return delegate.nonInteractive();
+ }
+ // In CI, default to non-interactive mode (batch mode)
+ return Optional.of(true);
+ }
+
+ // Delegate all other methods to the wrapped options
+ @Override
+ public Optional