/**
 * Startup argument model and command-line parsing for the application entry point.
 * <p>
 * Responsibility: Represent, parse, and validate the CLI arguments passed to
 * {@code main(String[])} so that Bootstrap can derive the startup mode and
 * configuration path without any further raw string handling.
 * <p>
 * Components:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.bootstrap.startup.StartupMode}
 *       — Enumerates the two supported startup modes (GUI default, headless batch).</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.bootstrap.startup.StartupArguments}
 *       — Immutable value object carrying the successfully parsed startup mode
 *         and optional configuration file path.</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.bootstrap.startup.StartupArgumentsParseResult}
 *       — Sealed result type produced by the parser; either
 *         {@link de.gecheckt.pdf.umbenenner.bootstrap.startup.StartupArgumentsParseResult.Valid Valid}
 *         or
 *         {@link de.gecheckt.pdf.umbenenner.bootstrap.startup.StartupArgumentsParseResult.Invalid Invalid}.</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.bootstrap.startup.CliArgumentParser}
 *       — Parses a raw {@code String[]} and returns a {@code StartupArgumentsParseResult}.</li>
 * </ul>
 * <p>
 * Supported CLI options:
 * <ul>
 *   <li>(none) — GUI startup is the default when no options are present.</li>
 *   <li>{@code --headless} — Activates the headless batch/scheduler startup mode.</li>
 *   <li>{@code --config <path>} — Overrides the configuration file path for either startup mode.</li>
 * </ul>
 * <p>
 * Invalid usages (result in {@code Invalid} parse result):
 * <ul>
 *   <li>{@code --config} without a following path value.</li>
 *   <li>{@code --config} followed by another option token instead of a path.</li>
 *   <li>Duplicate occurrence of {@code --headless} or {@code --config}.</li>
 *   <li>Any unrecognised argument token.</li>
 * </ul>
 */
package de.gecheckt.pdf.umbenenner.bootstrap.startup;
