# Référence de la CLI
> Traduction de la [page originale en anglais](https://github.com/lmonteirotech/OmsiLaunch/blob/v0.1.0-beta.3/docs/reference/cli.md) d’OmsiLaunch 0.1.0-beta3. La page anglaise fait foi : en cas de divergence, la page anglaise et le code prévalent.
Cette page est la référence complète et normative de la ligne de commande d'OmsiLaunch `0.1.0-beta3` : les trois exécutables, la grammaire des arguments, l'ordre de dispatch, chaque mot de commande, chaque route hiérarchique, chaque option, les enveloppes de sortie et le comportement en cas d'erreur de chaque commande. Elle est générée à partir de `tools\OmsiLaunch.Cli\Program.cs` (`CliProgram.RunAsync`, `OwnerSession.RunAsync`, `CliInput.Parse`, `CliInput.KnownFlags`, `CliInput.AcceptedNoEffectFlags`, `CliInput.CommandWordsAccepted`, `CliInput.HierarchicalRoutes`, `CliInput.BuildSpecAsync`, `CliEventWatch`), de `tools\OmsiLaunch.Cli\LaunchSpecJson.cs` et des deux shims natifs situés sous `tools\OmsiLaunch.Bootstrapper`. Les résultats de processus sont listés dans [codes de sortie](https://omsilaunch.omsimods.com.br/fr/docs/reference/exit-codes/index.md) ; les codes d'erreur dans [erreurs](https://omsilaunch.omsimods.com.br/fr/docs/reference/errors/index.md) ; des invocations commentées dans [exemples de CLI](https://omsilaunch.omsimods.com.br/fr/docs/reference/cli-examples/index.md).
## Exécutables
| Fichier | Sous-système | Rôle | Différences |
|---|---|---|---|
| `OmsiLaunch.exe` | Console | Bootstrapper natif (`OmsiLaunch.Bootstrapper.cpp`) : il résout son propre répertoire, découpe la ligne de commande avec `CommandLineToArgvW`, localise `hostfxr` via `nethost.dll` et exécute `OmsiLaunch.Controller.dll` avec les mêmes arguments. | La sortie console est écrite ; le code de sortie du processus est celui du contrôleur managé, ou un code de shim `100`..`106` si l'hôte .NET n'a pas pu être démarré. |
| `OmsiLaunchW.exe` | Windows (GUI) | Même shim (`OmsiLaunch.WindowsHost.cpp`) compilé pour le sous-système Windows. Il définit la variable d'environnement `OMSILAUNCH_WINDOWS_HOST=1` avant de démarrer le contrôleur. | Pas de console : la sortie console est supprimée sauf si `--json` est indiqué (`WindowsHost.SuppressConsole`), les échecs sont affichés dans des boîtes de message (`WindowsHost.ShowFailure` : message, `Code: OL_E_...` et l'indication `See .omsilaunch\diagnostics for details.`), et un échec du shim `100`..`106` est affiché sous la forme `OmsiLaunch could not start the .NET host (code N).` Comportement complet : [référence d'OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/fr/docs/reference/omsilaunchw/index.md). |
| `OmsiLaunch.Controller.dll` | Managé (x64, `net6.0-windows`, Windows Forms) | Le contrôleur lui-même. Il n'est jamais invoqué directement par les utilisateurs ; les deux shims passent le chemin du contrôleur comme premier argument de l'hôte, de sorte qu'il n'apparaît jamais dans la liste publique des arguments. | Nécessite le runtime .NET 6 x64 avec `Microsoft.WindowsDesktop.App` ; voir [installation](https://omsilaunch.omsimods.com.br/fr/docs/getting-started/installation/index.md). |
`nethost.dll` doit se trouver à côté des shims. Les shims ne lisent eux-mêmes aucun argument ; chaque argument parvient inchangé à `CliInput.Parse`, de sorte que `OmsiLaunch.exe` et `OmsiLaunchW.exe` acceptent exactement la même syntaxe.
## Modèle d'invocation
### Grammaire des arguments (`CliInput.Parse`)
| Forme | Signification |
|---|---|
| `/key:value`, `/key`, `-key:value`, `-key` | Une option. La clé est insensible à la casse ; la valeur est tout ce qui suit le premier `:`. Les clés inconnues échouent avec `OL_E_INVALID_ARGUMENT` (`Unknown argument: ...`), sortie `2`. |
| `--key=value` | Un argument runtime pour l'opération runtime sélectionnée (par exemple `--handle=rv-000001`). Tout jeton `--` contenant `=` est un argument runtime, jamais une option. |
| `--json`, `/json` | Sortie structurée (voir [Formats de sortie](#output-formats)). `--json` est le seul jeton `--` sans `=` qui ait un sens ; il est analysé comme l'option `/json`. |
| mot nu | Si aucun mot de commande n'a encore été rencontré et que le mot fait partie des [mots de commande](#command-words), il devient la commande. Dès qu'un mot de commande est présent, chaque mot nu suivant est un mot de commande (la route). Sinon, le premier mot nu est la racine de l'installation et tout mot nu ultérieur est ajouté à la route. |
Conséquences : une route hiérarchique (`time get`) ne peut pas être combinée avec un argument d'installation placé après elle (`time get D:\OMSI` est la route inconnue `time get d:\omsi`, sortie `2`). `D:\OMSI time get` est accepté mais relève du **mode propriétaire** (une nouvelle session est démarrée et l'opération s'exécute une fois à l'intérieur). Les erreurs d'analyse (`ArgumentException`, `FormatException`, `InvalidDataException`, `OverflowException`) et les erreurs de profil de session (`SessionProfileException`) sont signalées avant toute exécution, toujours avec la sortie `2`.
### Racine de l'installation
- Un argument d'installation explicite sous forme de mot nu l'emporte sur `RootPath` dans un fichier `/spec` (`CliInput.BuildSpecAsync`).
- `.` désigne le répertoire qui contient l'exécutable (`AppContext.BaseDirectory`), jamais le répertoire de travail de l'appelant (`CliInput.ResolveInstallationRoot`). Un paquet portable s'appuie sur ce comportement.
- Lorsque l'argument est omis, les opérations du mode propriétaire (`/new`, `/saved`, `/spec`, `/list`, `/recovery-status`, `/recover`) utilisent également le répertoire de l'exécutable. Le chemin est normalisé avec `Path.GetFullPath`.
- Les commandes du mode client ne prennent jamais d'argument d'installation : elles s'adressent au point de terminaison de contrôle local de l'installation dans laquelle se trouve l'exécutable (`AppContext.BaseDirectory`). Voir [contrôle local](https://omsilaunch.omsimods.com.br/fr/docs/reference/local-control/index.md).
### Propriétaire et client
- **Propriétaire** : le processus qui planifie, démarre, supervise et restaure une session (`OwnerSession.RunAsync`). Il détient le bail d'installation (`Local\OmsiLaunch.Installation.`) et la transaction de configuration, expose le point de terminaison de contrôle local tant que la session est active et affiche l'[icône de la zone de notification](https://omsilaunch.omsimods.com.br/fr/docs/reference/windows-tray/index.md). Exactement un propriétaire par installation : si un propriétaire répond déjà à `session.status` sur le point de terminaison de contrôle, un second lancement échoue avec `OL_E_SESSION_ALREADY_ACTIVE` (sortie `7`).
- **Client** : toute invocation sans argument d'installation qui envoie `session status`, `session stop`, `events read`, `events watch` ou une opération runtime. Elle est transmise via le pipe de contrôle local ; sans propriétaire, elle échoue avec `OL_E_NO_ACTIVE_SESSION` (sortie `4`).
### Ordre de dispatch (`CliProgram.RunAsync`)
1. `/silent` (lorsque le processus ne s'exécute pas déjà sous `OmsiLaunchW.exe`) : démarre `OmsiLaunchW.exe` depuis le répertoire de l'exécutable via `ShellExecute` (sans héritage de handles) avec les mêmes arguments moins `/silent`/`--silent`, écrit l'enveloppe `silent` (`delegated`, `host_process_id`) et renvoie `0`. Le processus console n'attend pas la session ; voir [OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/fr/docs/reference/omsilaunchw/index.md#silent-delegation). `OL_E_WINDOWS_HOST_MISSING` / `OL_E_WINDOWS_HOST_START_FAILED` renvoient `7`.
2. `/version` : enveloppe `version` avec `product`, `version` (version informationnelle de l'assembly, estampillée à partir de `OmsiLaunch.Version.props`, `0.1.0-beta3`), `protocol_version` (`0.1`), `supported_family` (`OMSI_2_3_004_COMMON`) ; sortie `0`.
3. `capabilities` : enveloppe contenant chaque descripteur `PublicStableBeta` ou `PublicExperimental` de `PublicCapabilityRegistry` ; sortie `0`.
4. `help [family]` : enveloppe `help` avec `usage`, `product_version`, `protocol_version`, `family` et les `commands` publiques (`CliRoute`, `Description`, `Classification`, `RuntimeValidation`), éventuellement filtrées par famille ; sortie `0`.
5. `profiles` : enveloppe avec `family` et les variantes d'exécutable `supported` (`ALTERNATE_LAA` `692EBFBF...`, `runtime_validated=true` ; le hash Steam LAA `7DAB063D...` avec `validation_status=pending_beta_field_validation`) ; sortie `0`.
6. Opération runtime client (pas d'argument d'installation et une route ou `/runtime:`) : les arguments sont validés par `PublicCapabilityRegistry.ValidateRuntimeArguments` (`OL_E_RUNTIME_OPERATION_UNKNOWN`, `OL_E_RUNTIME_ARGUMENT_REQUIRED`, sortie `2`), puis `runtime.execute` est transmis avec un timeout de 8 s (30 s pour `road-vehicles.spawn`).
7. Client `session status` (750 ms), `session stop` (lié à l'identifiant de la session active, 750 ms), `events read` (750 ms), `events watch` (interroge toutes les 250 ms jusqu'à Ctrl+C).
8. `detect`, ou **aucun argument du tout** (pas d'installation, pas de commande, pas de `/?`, pas de `/spec`, pas d'option de lancement, pas d'option de récupération, pas de `/list`) : énumère les processus `Omsi` et sonde le point de terminaison de contrôle (250 ms) ; enveloppe `detect` ; sortie `0`.
9. `/?` ou `/help` : affiche le texte d'utilisation, sortie `0`. Toute autre invocation qui comporte un mot de commande mais aucune route pouvant être dispatchée (par exemple `d3d` seul ou `session status D:\OMSI`) affiche le texte d'utilisation et sort avec `2`.
10. Mode propriétaire. Préconditions : `plugins\OmsiLaunch.Plugin.opl` et `plugins\OmsiLaunch.Native.x86.dll` doivent exister à côté de l'exécutable (`OL_E_RUNTIME_INSTALLATION_INCOMPLETE`, sortie `7`). `release-manifest.json` à côté de l'exécutable, lorsqu'il est présent, fournit les hashs attendus du plugin.
11. `/recovery-status` / `/recover` : `RecoverPendingAsync` ; enveloppe `recover` avec `pending`, `recovered`, `diagnostics` ; sortie `8` uniquement lorsqu'une restauration a été demandée et ne s'est pas achevée, sinon `0`.
12. `/list:` : `DiscoverAsync` ; enveloppe `content.list` ; sortie `0`.
13. Construction du `LaunchSpec` (`BuildSpecAsync`), planification (`PlanSessionAsync`), affichage du plan. `/plan` ou `/validate` : sortie `0` si `IsRunnable`, sinon `1`. Un plan non exécutable ne démarre jamais OMSI (sortie `1`) ; sous `OmsiLaunchW.exe`, un lancement avec un plan non exécutable affiche son dernier diagnostic `OL_E_` dans une boîte de message (audit de documentation BUG-06). La planification vérifie également la closure du plugin permanent installé par rapport à `release-manifest.json`, de sorte qu'un plugin manquant ou modifié rend le plan non exécutable (`OL_E_PERMANENT_PLUGIN_*`).
14. Recherche d'un propriétaire existant (`OL_E_SESSION_ALREADY_ACTIVE`, sortie `7`), puis `OwnerSession.RunAsync`.
### Cycle de vie du propriétaire (`OwnerSession.RunAsync`)
1. `StartSessionAsync(plan)`. À partir de là, chaque chemin de sortie atteint `CloseAsync` dans un bloc `finally` : exceptions, Ctrl+C (`Console.CancelKeyPress`), fermeture de la console / déconnexion (`AppDomain.ProcessExit` avec un budget de 4 s pour l'arrêt et la restauration ; ce qui reste est récupéré par le journal au démarrage suivant), « End session » (`Terminer la session`) dans la zone de notification, `session.stop` via le pipe et `/observe-seconds`.
2. L'icône de la zone de notification est créée, sauf si `Presentation.SuppressTrayIcon` est défini dans la spec.
3. Attente de `Running` pendant `StartupTimeoutSeconds + 5` secondes. L'état est affiché. Si l'état n'est pas `Running`, sortie `1` (`OmsiLaunchW.exe` affiche `The OMSI session did not reach gameplay.` avec le dernier diagnostic `OL_E_` ou `OL_E_SESSION_START_FAILED`).
4. Les lots de validation (`/runtime-batch`, `/runtime-write-batch`, `/d3d-batch`) s'exécutent et écrivent leurs artefacts.
5. Le point de terminaison de contrôle local démarre.
6. `/runtime:` s'exécute une fois (5 s, 15 s pour `road-vehicles.spawn`) ; le résultat est écrit dans `\.omsilaunch\diagnostics\-runtime-operation.json` et affiché. Une commande runtime en échec ne met jamais fin à la session (`runtime_error` est affiché à la place).
7. Attente : avec `/observe-seconds:n`, la session est arrêtée après `n` secondes **ou** plus tôt lors d'un arrêt par la zone de notification ou le pipe, ou lorsque OMSI se termine ; sans cette option, le propriétaire attend que OMSI se termine ou qu'un arrêt soit demandé.
8. L'état final est affiché ; sortie `0` si `Completed`, `1` sinon.
`session.stop`, « End session » (`Terminer la session`) dans la zone de notification, Ctrl+C et `CloseAsync` demandent tous l'arrêt canonique : OMSI est terminé avec `TerminateProcess` (la routine d'arrêt propre à OMSI ne s'exécute pas et `options.cfg` n'est pas réécrit par OMSI), puis chaque fichier appartenant à la session est restauré. Voir [cycle de vie de la session](https://omsilaunch.omsimods.com.br/fr/docs/concepts/session-lifecycle/index.md) et [transactions et récupération](https://omsilaunch.omsimods.com.br/fr/docs/concepts/transactions-and-recovery/index.md).
## Mots de commande
Chaque mot accepté en première position (`CliInput.CommandWordsAccepted`) :
| Mot | Objet | Mode | Remarques |
|---|---|---|---|
| `capabilities` | Lister les capacités publiques | Local, sans session | Enveloppe `capabilities`. |
| `profiles` | Lister les variantes de `Omsi.exe` prises en charge | Local, sans session | Enveloppe `profiles`. |
| `detect` | Signaler les processus `Omsi.exe` et un propriétaire actif | Local, sans session | C'est aussi le comportement par défaut lorsqu'aucun argument n'est fourni. États : `NO_OMSI_FOUND`, `OMSI_FOUND_UNMANAGED`, `UNKNOWN_BINARY_FOUND` par processus lorsque le binaire ne peut pas être inspecté ; `active_omsilaunch_instance`, `managed_session`. |
| `help` | Utilisation et catalogue public des commandes | Local, sans session | `help ` filtre par famille de capacités (`session`, `time`, `weather`, `map`, `camera`, `vehicles`, `player`, `humans`, `timetable`, `scripts`, `constants`, `curves`, `hof`, `drivers`, `tickets`, `d3d`, `events`). |
| `session` | `session status`, `session stop` | Client | Exactement un mot à la suite ; toute autre forme affiche l'utilisation, sortie `2`. `session plan`/`session start` sont des noms de routes de l'API, pas des mots de la CLI : utilisez `/plan` et `/new`. |
| `events` | `events read`, `events watch` | Client | `read` renvoie une fois la liste bornée des événements ; `watch` affiche chaque nouvel événement (selon `Sequence`) sous forme d'enveloppe `events.watch` toutes les 250 ms jusqu'à Ctrl+C (sortie `0`), `4` lorsqu'aucun propriétaire ne répond, `7` en cas d'erreur de contrôle. |
| `time` | `time get`, `time set` | Route client | |
| `weather` | `weather get`, `weather set`, `weather actual get` | Route client | |
| `map` | `map get` | Route client | |
| `camera` | `camera get`, `camera set`, `camera lock`, `camera unlock` | Route client | |
| `vehicles` | `vehicles list`, `vehicles get`, `vehicles summary`, `vehicles spawn`, `vehicles place-random` | Route client | |
| `player` | `player get` | Route client | |
| `humans` | `humans list`, `humans get`, `humans summary` | Route client | |
| `timetable` | `timetable get`, `timetable
list`, `timetable logs list` | Route client | |
| `scripts` | `scripts variable list|get|set`, `scripts string list|get` | Route client | |
| `constants` | `constants list`, `constants get` | Route client | |
| `curves` | `curves list`, `curves evaluate` | Route client | |
| `hof` | `hof get` | Route client | |
| `drivers` | `drivers list` | Route client | |
| `tickets` | `tickets get` | Route client | |
| `d3d` | Mot de famille réservé | Aucun | `d3d` n'a **aucune route hiérarchique** : `d3d texture ...` est une route inconnue (sortie `2`) et `d3d` seul affiche l'utilisation (sortie `2`). Les opérations D3D s'atteignent avec `/runtime:d3d.status`, `/runtime:d3d.texture.create`, etc. (voir [Opérations sans route](#operations-without-a-route)). |
## Routes hiérarchiques
`CliInput.HierarchicalRoutes` associe une route en minuscules à un identifiant d'opération runtime. Toutes les routes nécessitent une session `Running` et sont exécutées via la boîte aux lettres runtime (`ExecuteRuntimeAsync`). Les écritures runtime ne modifient que l'état en mémoire d'OMSI : elles ne touchent jamais de fichiers, ne font pas partie de la transaction de configuration et ne sont **pas** annulées à l'arrêt (OMSI est terminé). La stabilité suit `PublicCapabilityRegistry` et la [matrice de validation](https://omsilaunch.omsimods.com.br/fr/docs/status/runtime-validation-status/index.md) ; les détails et les champs de résultat figurent dans [contrôle runtime](https://omsilaunch.omsimods.com.br/fr/docs/reference/runtime-control/index.md).
| Route | Opération runtime | Type | Nécessite Running | Modifie OMSI | Participation à la restauration | Stabilité | Remarques |
|---|---|---|---|---|---|---|---|
| `time get` | `time.read` | Read | Oui | Non | Aucune | STABLE_BETA | Champs d'horloge et de calendrier. |
| `time set` | `time.set` | Write | Oui | Oui (horloge en mémoire) | Aucune, non annulée | EXPERIMENTAL | Par exemple `--minute=<0..59>` ; écriture, relecture et restauration validées le 2026-09-20. |
| `weather get` | `weather.read` | Read | Oui | Non | Aucune | STABLE_BETA | |
| `weather set` | `weather.set` | Write | Oui | Non (toujours rejetée) | Aucune | UNAVAILABLE | Renvoie `OL_E_RUNTIME_SETTING_NOT_PERSISTENT` ; OMSI écrase la valeur à son prochain cycle météo. |
| `weather actual get` | `weather.actual.read` | Read | Oui | Non | Aucune | EXPERIMENTAL | État du contrôleur météo actuelle/ICAO. |
| `map get` | `map.read` | Read | Oui | Non | Aucune | STABLE_BETA | Nom, fichier, description, nombre de tuiles, plage d'années et sens de circulation de la carte ; revalidé à l'exécution sur le slot de carte corrigé. |
| `camera get` | `camera.read` | Read | Oui | Non | Aucune | STABLE_BETA | |
| `camera set` | `camera.set` | Write | Oui | Oui (scalaires de caméra, p. ex. `--field_of_view=`) | Aucune, non annulée | EXPERIMENTAL | Écriture et relecture du FOV validées. |
| `camera lock` | `camera.lock` | Action | Oui | Oui (politique limitée à la session) | Aucune | EXPERIMENTAL | Nécessite `--family=<0..3>` (conducteur=0, passager=1, extérieur=2, carte=3), `--preset=` facultatif (famille 0 ou 1). Nécessite un véhicule du joueur (par exemple une situation enregistrée). Validé à l'exécution dans la closure runtime (`CAM01`) ; la chaîne `RuntimeValidation` du registre indique toujours `STATICALLY_VALIDATED` (voir [capacités](https://omsilaunch.omsimods.com.br/fr/docs/reference/capabilities/index.md)). |
| `camera unlock` | `camera.unlock` | Action | Oui | Oui | Aucune | EXPERIMENTAL | Libère la politique définie par `camera lock` (`CAM01`). |
| `vehicles list` | `road-vehicles.list` | Read | Oui | Non | Aucune | STABLE_BETA | Renvoie des handles `rv-NNNNNN` limités à la session. |
| `vehicles get` | `road-vehicle.read` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`. Handle obsolète : `OL_E_RUNTIME_OBJECT_HANDLE_STALE`. |
| `vehicles summary` | `road-vehicles.read` | Read | Oui | Non | Aucune | STABLE_BETA | Décomptes et état du joueur, sans handles. |
| `vehicles spawn` | `road-vehicles.spawn` | Action | Oui | Oui (ajoute un RoadVehicle) | Aucune, non supprimé | EXPERIMENTAL | Nécessite `--model=Vehicles\...\*.bus`. Timeout client de 30 s, timeout propriétaire de 15 s. N'attribue pas le véhicule du joueur. RV-003 `RUNTIME_PASS`. |
| `vehicles place-random` | `road-vehicles.place-random` | Action | Oui | Oui | Aucune | EXPERIMENTAL | `PlaceRandomBus` profilé. |
| `player get` | `player-vehicle.read` | Read | Oui | Non | Aucune | STABLE_BETA | Null sémantique lorsqu'il n'y a pas de véhicule du joueur. |
| `humans list` | `humans.list` | Read | Oui | Non | Aucune | EXPERIMENTAL | Renvoie des handles `hb-NNNNNN`. |
| `humans get` | `human.read` | Read | Oui | Non | Aucune | EXPERIMENTAL | Nécessite `--handle=`. |
| `humans summary` | `humans.read` | Read | Oui | Non | Aucune | EXPERIMENTAL | Décomptes uniquement. |
| `timetable get` | `timetable.read` | Read | Oui | Non | Aucune | STABLE_BETA | État du gestionnaire d'horaires. |
| `timetable tracks list` | `timetable.tracks.list` | Read | Oui | Non | Aucune | STABLE_BETA | Fait partie de la capacité `timetable.read` ; preuves de lecture par lot du 2026-09-20. |
| `timetable trips list` | `timetable.trips.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable lines list` | `timetable.lines.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable tours list` | `timetable.tours.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable profiles list` | `timetable.profiles.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable bus-stops list` | `timetable.bus-stops.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable station-links list` | `timetable.station-links.list` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `timetable logs list` | `timetable.logs.read` | Read | Oui | Non | Aucune | STABLE_BETA | Idem. |
| `drivers list` | `drivers.read` | Read | Oui | Non | Aucune | EXPERIMENTAL | Enregistrements de conducteurs. |
| `tickets get` | `tickets.read` | Read | Oui | Non | Aucune | EXPERIMENTAL | Enregistrements de jeux de billets. |
| `hof get` | `vehicle.hofs.read` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`. |
| `constants list` | `vehicle.constants.list` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`. |
| `constants get` | `vehicle.constant.get` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`, `--name=`. |
| `curves list` | `vehicle.curves.list` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`. |
| `curves evaluate` | `vehicle.curve.evaluate` | Read | Oui | Non | Aucune | STABLE_BETA | Nécessite `--handle=`, `--name=`, `--x=`. |
| `scripts variable list` | `vehicle.variables.list` | Read | Oui | Non | Aucune | EXPERIMENTAL | Nécessite `--handle=`. |
| `scripts variable get` | `vehicle.variable.get` | Read | Oui | Non | Aucune | EXPERIMENTAL | Nécessite `--handle=`, `--name=`. |
| `scripts variable set` | `vehicle.variable.set` | Write | Oui | Oui (variable de script) | Aucune, non annulée | EXPERIMENTAL | Nécessite `--handle=`, `--name=`, `--value=` (nombre fini). |
| `scripts string list` | `vehicle.string-variables.list` | Read | Oui | Non | Aucune | EXPERIMENTAL | Nécessite `--handle=`. |
| `scripts string get` | `vehicle.string-variable.get` | Read | Oui | Non | Aucune | EXPERIMENTAL | Nécessite `--handle=`, `--name=`. |
### Opérations sans route
Ces identifiants d'opération publics (`PublicCapabilityRegistry.PublicRuntimeOperationIds`) n'ont pas de route hiérarchique et s'invoquent avec `/runtime:` accompagné de `--key=value` ou `/runtime-arg:key=value` : `timetable.rv-files.list`, `timetable.track-entries.list`, `timetable.tour-entries.list`, `d3d.status`, `d3d.texture.create` (`width`, `height`, `format` obligatoires ; `levels` facultatif), `d3d.texture.describe` (`handle` ; `level` facultatif), `d3d.texture.update` (`handle`, `width`, `height`, `pixels_base64` obligatoires ; `level`, `x`, `y` facultatifs), `d3d.texture.release` (`handle`). Les opérations D3D sont EXPERIMENTAL ; le cycle de vie des textures et l'invalidation lors d'une réinitialisation du périphérique sont validés à l'exécution (closure runtime `H02`, `D01` ; voir [capacités](https://omsilaunch.omsimods.com.br/fr/docs/reference/capabilities/index.md)). `timetable.track-entries.list` et `timetable.tour-entries.list` sont des listes bornées : un résultat qui ne tient pas dans le slot runtime est raccourci (`truncated=true`). `internal.road-vehicles.make-basic` est INTERNAL et est rejeté avec `OL_E_RUNTIME_OPERATION_UNKNOWN` par la CLI comme par l'API.
## Options
Chaque option de `CliInput.KnownFlags`. La « phase » est *lancement* (façonne le `LaunchSpec`/le plan d'une nouvelle session), *runtime* (agit sur une session en cours d'exécution) ou *contrôle* (modifie le comportement de la CLI elle-même). Les options analysées uniquement par compatibilité (`CliInput.AcceptedNoEffectFlags`) sont signalées sur leur ligne.
### Contrôle et sortie
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/?` | `/?` | désactivée | contrôle | STABLE_BETA | Affiche le texte d'utilisation, sortie `0`. |
| `/help` | `/help` | désactivée | contrôle | STABLE_BETA | Identique à `/?`. (Le mot nu `help` renvoie à la place le catalogue structuré.) |
| `/version` | `/version` | désactivée | contrôle | STABLE_BETA | Enveloppe `version`, sortie `0`. Évaluée avant toute autre commande, sauf `/silent`. |
| `/json` | `/json` ou `--json` | désactivée | contrôle | STABLE_BETA | Émet des enveloppes JSON ; force aussi la sortie console, même sous `OmsiLaunchW.exe`. |
| `/quiet` | `/quiet` | désactivée | contrôle | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Définit `CliInput.Quiet` ; rien ne le lit. |
| `/silent` | `/silent` (également `--silent`) | désactivée | contrôle | EXPERIMENTAL | Délègue toute la ligne de commande à `OmsiLaunchW.exe` et renvoie `0` dès que le processus hôte a démarré. Le résultat de la session est signalé par `OmsiLaunchW.exe` (boîtes de message, icône de la zone de notification), `.omsilaunch\diagnostics` et le point de terminaison de contrôle local. La délégation et les boîtes de dialogue d'échec sont validées à l'exécution (closure runtime `T04`) ; voir [OmsiLaunchW.exe](https://omsilaunch.omsimods.com.br/fr/docs/reference/omsilaunchw/index.md). |
| `/serve` | `/serve` | désactivée | contrôle | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Définit `CliInput.Serve` ; rien ne le lit. Le point de terminaison de contrôle est toujours démarré par un propriétaire. |
| `/verbose` | `/verbose` | désactivée | lancement | PARTIAL | `DiagnosticsSpec.Verbose`. Les valeurs sont transportées dans la spec ; leur effet se limite à la trace de l'hôte sous `.omsilaunch\diagnostics`. |
| `/log` | `/log` | activée (`DiagnosticsSpec.Log` vaut `true` par défaut) | lancement | PARTIAL | `DiagnosticsSpec.Log`. Toujours activée en pratique. |
| `/logall` | `/logall` | désactivée | lancement | PARTIAL | Définit ensemble `Verbose`, `ProcessTrace`, `PluginTrace` et `NativeTrace`. |
| `/omsi-logall` | `/omsi-logall` | désactivée | lancement | PARTIAL | `DiagnosticsSpec.OmsiLogAll`. |
| `/trace` | `/trace` | désactivée | lancement | PARTIAL | Alias de `/trace-process`. |
| `/trace-process` | `/trace-process` | désactivée | lancement | PARTIAL | `DiagnosticsSpec.ProcessTrace`. |
| `/trace-plugin` | `/trace-plugin` | désactivée | lancement | PARTIAL | `DiagnosticsSpec.PluginTrace`. |
| `/trace-native` | `/trace-native` | désactivée | lancement | PARTIAL | `DiagnosticsSpec.NativeTrace`. |
### Planification, validation et harnais
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/plan` | `/plan` | désactivée | lancement | STABLE_BETA | Construit et affiche le `SessionPlan`, sans démarrer OMSI. Sortie `0` si `IsRunnable`, `1` sinon. Nécessite une sélection de lancement (`/new`, `/saved`, `/spec` ou un argument d'installation) ; `/plan` seul, sans rien d'autre, exécute `detect`. |
| `/validate` | `/validate` | désactivée | lancement | STABLE_BETA | Identique à `/plan` dans ce build. |
| `/runtime-batch` | `/runtime-batch` | désactivée | runtime (propriétaire) | INTERNAL | Harnais de validation : après `Running`, exécute l'ensemble des opérations de lecture et écrit `-runtime-read-batch.json`. |
| `/runtime-write-batch` | `/runtime-write-batch` | désactivée | runtime (propriétaire) | INTERNAL | Harnais de validation : lectures plus `time.set`, `camera.set` et `vehicle.variable.set` avec restauration ; écrit `-runtime-write-batch.json`. |
| `/d3d-batch` | `/d3d-batch` | désactivée | runtime (propriétaire) | INTERNAL | Harnais de validation du cycle de vie des textures D3D ; écrit `-d3d-wave-d-batch.json`. |
| `/runtime` | `/runtime:` | aucune | runtime | STABLE_BETA (dispatch) | Sélectionne une opération runtime publique par son identifiant. Mode client (pas d'argument d'installation) : transmise au propriétaire. Mode propriétaire : exécutée une fois après `Running`. Identifiants inconnus : `OL_E_RUNTIME_OPERATION_UNKNOWN`, sortie `2`. |
| `/runtime-arg` | `/runtime-arg:=` (répétable) | aucune | runtime | STABLE_BETA (dispatch) | Argument runtime ; équivalent à `--key=value`. `=` manquant : `/runtime-arg requires key=value`, sortie `2`. |
### Sélection du monde
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/new` | `/new` | `WorldMode.NewMap` est le mode par défaut, mais un lancement n'est demandé que si l'une des options `/new`, `/saved`, `/last`, `/spec` est présente | lancement | STABLE_BETA | NEW_MAP. Nécessite `/map` et `/entrypoint-index` (un plan sans index de point d'entrée présenté signale `OL_E_ENTRYPOINT_REQUIRED` ; sans `/map`, aucune carte n'est résolue). `/new` ne sélectionne jamais une carte de manière implicite. |
| `/saved` | `/saved:` | aucune | lancement | STABLE_BETA | SAVED_SITUATION. La carte et la position proviennent du `.osn` ; `/map`, `/entrypoint`, `/entrypoint-index` sont rejetées avec `/saved` (sortie `2`). Situation manquante : `OL_E_SITUATION_NOT_FOUND` ; sa carte manquante : `OL_E_SITUATION_MAP_NOT_FOUND`. |
| `/last` | `/last` | aucune | lancement | UNAVAILABLE | LAST_MAP_STATE. Produit toujours `OL_E_CAPABILITY_UNAVAILABLE` (non exécutable, sortie `1`) sur ce profil ; aucun repli sur un `.osn` choisi d'après l'horodatage n'est effectué. |
| `/map` | `/map:` (par exemple `maps\Grundorf\global.cfg`) | aucune | lancement | STABLE_BETA | Identité de la carte pour `/new`, ou portée de `/list:Entrypoints`. Inconnue : `OL_E_MAP_NOT_FOUND`. |
| `/entrypoint` | `/entrypoint:` | aucune | lancement | UNAVAILABLE | Point d'entrée par libellé. Bloqué : le plan enregistre `world.entrypoint-identity` comme `RUNTIME_PARTIAL` et devient non exécutable (`OL_E_CAPABILITY_UNAVAILABLE`). Mutuellement exclusive avec `/entrypoint-index` (l'identité l'emporte et efface l'index). |
| `/entrypoint-index` | `/entrypoint-index:`, `0..2147483647` | aucune | lancement | STABLE_BETA | Index du point d'entrée dans la liste présentée (à partir de 1, tel qu'OMSI le présente). Obligatoire pour un plan NEW_MAP exécutable. |
### Date, heure et météo
Ces quatre options sont acceptées et transportées dans le `LaunchSpec`, mais le chemin de démarrage natif ne les applique pas : le planificateur les enregistre comme `STATICALLY_PARTIAL` **et ajoute `OL_E_CAPABILITY_UNAVAILABLE`, de sorte que le plan est NON EXÉCUTABLE (sortie `1`)**. Un fichier `/spec` ou un profil de session qui les définit a le même effet.
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/date` | `/date:` ou `/date:system` | non définie | lancement | UNAVAILABLE | `DateSpec` explicite/système. Valeur non analysable : `OL_E_INVALID_ARGUMENT`, sortie `2`. |
| `/time` | `/time:` ou `/time:system` | non définie | lancement | UNAVAILABLE | `TimeSpec` explicite/système. |
| `/year` | `/year:` ou `/year:system` | non définie | lancement | UNAVAILABLE | `YearSpec`. |
| `/weather` | `/weather:` | non définie | lancement | UNAVAILABLE | `WeatherMode.Preset`. |
| `/weather-icao` | `/weather-icao:` | non définie | lancement | UNAVAILABLE | `WeatherMode.Icao`. |
| `/weather-real` | `/weather-real` | non définie | lancement | UNAVAILABLE | `WeatherMode.RealCurrent`. La dernière option parmi `/weather`, `/weather-icao`, `/weather-real` l'emporte. |
### Véhicule du joueur
Acceptées et résolues par rapport à l'installation, mais non appliquées par le runtime : chaque champ défini est `STATICALLY_PARTIAL` et ajoute `OL_E_CAPABILITY_UNAVAILABLE` (plan NON EXÉCUTABLE, sortie `1`).
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/vehicle` | `/vehicle:` (`Vehicles\...\*.bus`) | non définie | lancement | UNAVAILABLE | Résolue en premier (`OL_E_VEHICLE_NOT_FOUND` si inconnue). |
| `/repaint` | `/repaint:` | non définie | lancement | UNAVAILABLE | Résolue uniquement conjointement avec `/vehicle` (`OL_E_REPAINT_NOT_FOUND`). |
| `/hof` | `/hof:` | non définie | lancement | UNAVAILABLE | `OL_E_HOF_NOT_FOUND` si inconnue. |
| `/fleet` | `/fleet:` | non définie | lancement | UNAVAILABLE | Numéro de flotte. |
| `/registration` | `/registration:` | non définie | lancement | UNAVAILABLE | Immatriculation. |
| `/no-vehicle` | `/no-vehicle` | désactivée | lancement | STABLE_BETA | Efface tout véhicule du joueur provenant de la base (`/spec` ou profil). Sans effet indésirable. |
### Overlays de configuration
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/set` | `/set:=` (répétable ; clés insensibles à la casse) | aucune | lancement | STABLE_BETA | Overlay sémantique de `options.cfg` issu de `ConfigurationCatalog` (par exemple `graphics.maxFPS=60`, `traffic.randomVehicles=150`). Clé inconnue : `OL_E_UNKNOWN_SETTING` (sortie `2`) ; clé en lecture seule (`advanced.multithreadingCalculate`, `advanced.multithreadingTextureLoad`, `graphics.texture`, `graphics.textureFilter`) : `OL_E_SETTING_NOT_WRITABLE` (sortie `2`) ; valeur hors plage ou mal formée : `OL_E_INVALID_SETTING_VALUE` lors de la construction de l'overlay. L'overlay est une mutation de session : capturé dans un instantané, appliqué avant le démarrage d'OMSI, restauré octet pour octet à l'arrêt (RV-005 `RUNTIME_PASS`). Conflit avec une clé détenue par le préréglage d'un profil sélectionné : `OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT`. |
### Présentation de l'écran de démarrage
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/splash` | `/splash:Managed`, `/splash:Native`, `/splash:Unset` (insensible à la casse) | `Managed` | lancement | STABLE_BETA | `Managed` : les BMP 640x480 24 bits du paquet sont copiés une fois dans `\.omsilaunch\assets\splash`, et `GUI\NewSplashscreen_ENG.bmp` ainsi que `GUI\NewSplashscreen_.bmp` sont remplacés par overlay de manière transactionnelle et restaurés à l'identique (RV-006 `RUNTIME_PASS`). `Native`/`Unset` (alias) : fichiers OMSI non modifiés. Valeur manquante : `/splash requires Unset, Native, or Managed`, sortie `2`. |
| `/splash-language` | `/splash-language:PTB|ENG|DEU|FRA` (également `pt-BR`, `de`, `fr`, `en` ; toute autre valeur se replie sur `ENG`) | `[language]` de `options.cfg`, sinon `ENG` | lancement | STABLE_BETA | Sélectionne le fichier cible localisé. |
| `/splash-assets` | `/splash-assets:` (les chemins relatifs sont résolus sous la racine de l'installation) | `\.omsilaunch\assets\splash`, sinon l'ensemble fourni dans le paquet | lancement | STABLE_BETA | Répertoire de ressources personnalisé ; doit contenir `ENG.bmp` et, pour une langue autre que l'anglais, `.bmp`. Erreurs : `OL_E_SPLASH_ASSET_DIRECTORY_MISSING`, `OL_E_SPLASH_ASSET_MISSING`, `OL_E_SPLASH_FORMAT_UNSUPPORTED` (remontées sous la forme `OL_E_SESSION_PRESENTATION_INVALID` dans le plan ; non exécutable). |
### Textures Internet
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/internet-textures` | `/internet-textures:Native|Disabled|Override` | `Native` | lancement | EXPERIMENTAL | `Native` : aucune modification. `Disabled` : le téléchargeur profilé intégré au processus est neutralisé. `Override` : le profil `.itx` indiqué est appliqué par overlay en tant que `Texture\standard.itx` ; chaque cible HTTP(S) qu'il liste ainsi que `Texture\standard.ipr` deviennent des suppressions de session (supprimées pour la session, restaurées à l'arrêt). Valeur manquante : sortie `2`. |
| `/internet-textures-profile` | `/internet-textures-profile:` | aucune | lancement | EXPERIMENTAL | Obligatoire avec `Override` (`OL_E_ITX_PROFILE_REQUIRED`, sortie `2`). `OL_E_ITX_PROFILE_MISSING`, `OL_E_ITX_PROFILE_INVALID` (doit être composé de paires de lignes URL/cible avec des URL `http`/`https`), `OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH` (les cibles doivent se résoudre sous `Texture\`, sans chemins absolus, sans `..` ni points d'analyse). |
### Profils de session
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/predefined-profile` | `/predefined-profile:` | aucune | lancement | STABLE_BETA (compilation ; `OmsiLaunch.ProfileTests` hors ligne) | Charge `\.omsilaunch\session-profiles\\profile.yaml` (voir [profils de session](https://omsilaunch.omsimods.com.br/fr/docs/reference/session-profiles/index.md)). Nécessite `/predefined-profile-index` (`OL_E_SESSION_PROFILE_PRESET_NOT_FOUND`, sortie `2`). Le bloc `new:` ne s'applique qu'avec `/new` ; `compatibility.maps` est appliqué pour `/new` et `/saved` (`OL_E_SESSION_PROFILE_MAP_MISMATCH`). Les options explicites qui entrent en collision avec un champ détenu par le profil sont rejetées avec `OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT` (`CliInput.RejectProfileConflicts`) : carte/point d'entrée/date/heure/année/météo lorsque le bloc `new:` les détient, clés `/set` détenues par le préréglage, options d'écran de démarrage lorsque le préréglage contient `presentation`, options de textures Internet lorsqu'il contient `internet-textures`, timeouts lorsqu'il contient `behavior`. |
| `/predefined-profile-index` | `/predefined-profile-index:<1..5>` | aucune | lancement | STABLE_BETA | Sélectionne le préréglage par son `index`. Hors plage : sortie `2`. |
### Fichier LaunchSpec
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/spec` | `/spec:` | aucune | lancement | STABLE_BETA (chargeur testé hors ligne ; sémantique de session identique à celle des options) | Charge un fichier JSON `LaunchSpec` comme base (voir [LaunchSpec](https://omsilaunch.omsimods.com.br/fr/docs/reference/launchspec/index.md)) et marque un lancement comme demandé. Règles (`LaunchSpecJson`) : le fichier doit exister (`OL_E_SPEC_NOT_FOUND`, sortie `6`) ; 1 MiB au maximum (`OL_E_SPEC_TOO_LARGE`, sortie `2`) ; la racine doit être un objet (`OL_E_SPEC_INVALID`) ; noms de propriétés insensibles à la casse ; commentaires `//` et virgules finales autorisés ; profondeur de 32 au maximum ; chaque propriété inconnue est rejetée avec son chemin JSON (`OL_E_SPEC_UNKNOWN_PROPERTY: $.Presentation.Foo`, sortie `2`). |
**Priorité** (`CliInput.BuildSpecAsync`) : valeurs par défaut → fichier `/spec` → `/predefined-profile` (remplace `Installation` et `World`, puis applique le profil) → options explicites. Un argument d'installation explicite l'emporte sur `RootPath` dans la spec. `/no-vehicle` efface le véhicule du joueur de la spec ; `/vehicle` et les options associées y sont fusionnées champ par champ. Les clés `/set` sont fusionnées dans `Environment.General`. `/splash`, `/splash-language`, `/splash-assets`, `/internet-textures`, `/internet-textures-profile` ne remplacent la valeur que lorsqu'elles sont indiquées. `/startup-timeout` et `/shutdown-timeout` ne remplacent la valeur que lorsqu'elles sont indiquées ; `Presentation.SuppressTrayIcon` provient uniquement de la spec (aucune option). Les options de diagnostic sont combinées par OU avec les `Diagnostics` de la spec.
### Découverte du contenu
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/list` | `/list:` ; les catégories sont les valeurs de `ContentQueryKind` `Maps`, `Situations`, `Vehicles`, `Repaints`, `Hofs`, `FleetNumbers`, `Registrations`, `Addons`, `Entrypoints` (insensibles à la casse) | aucune | local, sans session | STABLE_BETA | `DiscoverAsync` sur l'installation ; enveloppe `content.list` avec des entrées `Identity`, `Kind`, `DisplayName` ; sortie `0`. Catégorie inconnue : `Unknown discovery category`, sortie `2`. Les points d'analyse (jonctions/liens symboliques) sont ignorés, les fichiers OMSI sont lus en Windows-1252. |
| `/vehicle-scope` | `/vehicle-scope:` | aucune | local | STABLE_BETA | Portée transmise pour chaque catégorie sauf `Entrypoints`, qui utilise `/map` comme portée. |
### Timeouts et observation
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/startup-timeout` | `/startup-timeout:<1..600>` secondes | valeur de la spec/du profil, sinon `180` | lancement | STABLE_BETA | `Behavior.StartupTimeoutSeconds`. Le propriétaire attend `Running` pendant cette valeur plus 5 s ; `OL_E_STARTUP_TIMEOUT` met fin à la session avec la sortie `1`. |
| `/shutdown-timeout` | `/shutdown-timeout:<1..600>` secondes | valeur de la spec/du profil, sinon `30` | lancement | ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT | Transportée dans `Behavior.ShutdownTimeoutSeconds` ; le superviseur ne l'utilise pas dans ce build (OMSI est terminé, on ne lui demande pas de se fermer). |
| `/observe-seconds` | `/observe-seconds:<0..2147483647>` | aucune (exécution jusqu'à ce que OMSI se termine ou qu'un arrêt soit demandé) | runtime (propriétaire) | STABLE_BETA | Borne supérieure de la phase d'exécution : après `n` secondes en `Running`, l'arrêt canonique est demandé. Un arrêt par la zone de notification ou le pipe, ou la fin d'OMSI, y met fin plus tôt. `0` arrête immédiatement après `Running`. |
### Récupération
| Option | Syntaxe et valeurs | Défaut | Phase | Stabilité | Comportement |
|---|---|---|---|---|---|
| `/recovery-status` | `/recovery-status` | désactivée | local | STABLE_BETA | Indique si `\.omsilaunch\journal.json` est en attente (`pending`), ne restaure jamais ; sortie `0`. Prend le bail d'installation : `OL_E_INSTALLATION_BUSY` (sortie `7`) tant qu'un propriétaire le détient. |
| `/recover` | `/recover` | désactivée | local | STABLE_BETA | Restaure un journal en attente (sauvegardes d'abord vérifiées par rapport au SHA-256 de l'instantané ; `OL_E_RECOVERY_BACKUP_CORRUPT`, `OL_E_RECOVERY_ABSENT_OWNERSHIP_MISMATCH`, `OL_W_RESTORE_FOREIGN_FILE_RETAINED` signalés dans `diagnostics`). Sortie `0` lorsque rien n'était en attente ou que la restauration s'est achevée ; `8` lorsqu'un journal était en attente et le reste. Refusée avec `OL_E_INSTALLATION_BUSY` tant que le processus OMSI journalisé (PID, heure de création, chemin de l'exe) ou, pour un journal ayant dépassé `HandoffCreated` sans PID, tout `Omsi.exe` issu de cette racine est actif. Chaque démarrage de session effectue automatiquement la même récupération avant de lire l'installation. |
## Formats de sortie
- **Enveloppe de succès** (`CliInput.WriteEnvelope`, avec `--json`) : `{"ok": true, "command": "", "protocol_version": "0.1", "result":