diff --git a/Src/GBX.NET.Tool.CLI/ArgsResolver.cs b/Src/GBX.NET.Tool.CLI/ArgsResolver.cs
new file mode 100644
index 000000000..4c0723abf
--- /dev/null
+++ b/Src/GBX.NET.Tool.CLI/ArgsResolver.cs
@@ -0,0 +1,71 @@
+using GBX.NET.Tool.CLI.Inputs;
+
+namespace GBX.NET.Tool.CLI;
+
+internal sealed class ArgsResolver
+{
+ private readonly string[] args;
+ private readonly HttpClient client;
+
+ public bool HasArgs => args.Length > 0;
+
+ public ArgsResolver(string[] args, HttpClient http)
+ {
+ this.args = args;
+ this.client = http;
+ }
+
+ public ToolConfiguration Resolve()
+ {
+ if (!HasArgs)
+ {
+ return new();
+ }
+
+ var inputs = new List();
+
+ var argsEnumerator = args.GetEnumerator();
+
+ while (argsEnumerator.MoveNext())
+ {
+ var arg = argsEnumerator.Current as string ?? string.Empty;
+
+ if (arg.StartsWith('-'))
+ {
+ continue;
+ }
+
+ // - check http:// and https:// for URLs
+ // - check for individual files and files in zip archives
+ // - check for folders
+ // - check for stdin (maybe?)
+ // - check for configured user data path
+ if (Directory.Exists(arg))
+ {
+ inputs.Add(new DirectoryInput(arg));
+ continue;
+ }
+
+ if (File.Exists(arg))
+ {
+ inputs.Add(new FileInput(arg));
+ continue;
+ }
+
+ if (Uri.TryCreate(arg, UriKind.Absolute, out var uri))
+ {
+ if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
+ {
+ inputs.Add(new UriInput(client, uri));
+ }
+
+ continue;
+ }
+ }
+
+ return new ToolConfiguration
+ {
+ Inputs = inputs
+ };
+ }
+}
diff --git a/Src/GBX.NET.Tool.CLI/ConsoleOptions.cs b/Src/GBX.NET.Tool.CLI/ConsoleOptions.cs
new file mode 100644
index 000000000..68c714b2a
--- /dev/null
+++ b/Src/GBX.NET.Tool.CLI/ConsoleOptions.cs
@@ -0,0 +1,6 @@
+namespace GBX.NET.Tool.CLI;
+
+public sealed class ConsoleOptions
+{
+ public bool DisableUpdateCheck { get; set; }
+}
diff --git a/Src/GBX.NET.Tool.CLI/GBX.NET.Tool.CLI.csproj b/Src/GBX.NET.Tool.CLI/GBX.NET.Tool.CLI.csproj
index 0eeb36c00..c0956c8cd 100644
--- a/Src/GBX.NET.Tool.CLI/GBX.NET.Tool.CLI.csproj
+++ b/Src/GBX.NET.Tool.CLI/GBX.NET.Tool.CLI.csproj
@@ -12,6 +12,7 @@
+
diff --git a/Src/GBX.NET.Tool.CLI/Inputs/DirectoryInput.cs b/Src/GBX.NET.Tool.CLI/Inputs/DirectoryInput.cs
new file mode 100644
index 000000000..9b47c4c1e
--- /dev/null
+++ b/Src/GBX.NET.Tool.CLI/Inputs/DirectoryInput.cs
@@ -0,0 +1,27 @@
+
+using GBX.NET.Exceptions;
+
+namespace GBX.NET.Tool.CLI.Inputs;
+
+internal sealed record DirectoryInput(string DirectoryPath) : Input
+{
+ public override async Task