diff --git a/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs b/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
index 5418023a..4b4b3c32 100644
--- a/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
+++ b/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
@@ -1,6 +1,16 @@
+using JetBrains.Annotations;
+
namespace CreativeCoders.Cli.Core;
+[PublicAPI]
public class CommandResult
{
+ public CommandResult() { }
+
+ public CommandResult(int exitCode)
+ {
+ ExitCode = exitCode;
+ }
+
public int ExitCode { get; init; }
}
diff --git a/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs b/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs
new file mode 100644
index 00000000..df23710e
--- /dev/null
+++ b/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs
@@ -0,0 +1,13 @@
+namespace CreativeCoders.Cli.Core;
+
+///
+/// Interface for command options validation.
+///
+public interface IOptionsValidation
+{
+ ///
+ /// Validates the command options asynchronously.
+ ///
+ /// A indicating the result of the validation.
+ Task ValidateAsync();
+}
diff --git a/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs b/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs
new file mode 100644
index 00000000..523d2f72
--- /dev/null
+++ b/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs
@@ -0,0 +1,19 @@
+namespace CreativeCoders.Cli.Core;
+
+///
+/// Represents the result of a command options validation.
+///
+/// A boolean value indicating whether the options are valid.
+/// An optional collection of validation messages.
+public class OptionsValidationResult(bool isValid, IEnumerable? messages = null)
+{
+ ///
+ /// Gets a value indicating whether the validation was successful.
+ ///
+ public bool IsValid { get; } = isValid;
+
+ ///
+ /// Gets the validation messages.
+ ///
+ public IEnumerable Messages { get; } = messages ?? [];
+}
diff --git a/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs b/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
index d7500d06..1a5a1832 100644
--- a/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
+++ b/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
@@ -9,4 +9,6 @@ public static class CliExitCodes
public const int CommandCreationFailed = int.MinValue + 1;
public const int CommandResultUnknown = int.MinValue + 2;
+
+ public const int CommandOptionsInvalid = int.MinValue + 3;
}
diff --git a/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs b/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
index bf718202..189fb331 100644
--- a/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
+++ b/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
@@ -5,6 +5,7 @@
using CreativeCoders.Cli.Hosting.Exceptions;
using CreativeCoders.Cli.Hosting.Help;
using CreativeCoders.Core;
+using CreativeCoders.Core.Collections;
using CreativeCoders.Core.Reflection;
using CreativeCoders.SysConsole.Cli.Parsing;
using Microsoft.Extensions.DependencyInjection;
@@ -27,6 +28,9 @@ public class DefaultCliHost(
private readonly ICliCommandHelpHandler _commandHelpHandler = Ensure.NotNull(commandHelpHandler);
+ private readonly CliHostSettings _settings =
+ serviceProvider.GetService() ?? new CliHostSettings();
+
private (object Command, string[] Args, CliCommandInfo CommandInfo) CreateCliCommand(string[] args)
{
var findCommandNodeResult = _commandStore.FindCommandNode(args);
@@ -43,7 +47,7 @@ public class DefaultCliHost(
var command =
commandInfo.CommandType.CreateInstance