Mode CLI adapté à l’IA
À partir de Babel Obfuscator 11.7.0, l’outil en ligne de commande peut émettre un flux de sortie structuré et lisible par machine, adapté aux pipelines de CI, aux orchestrateurs de build et aux intégrations d’IA et d’agents.
La sortie texte par défaut de babel.exe est inchangée et reste entièrement rétrocompatible :
les scripts de CI existants et les intégrations des clients ne nécessitent aucune modification.
Le mode adapté à l’IA s’active avec trois nouvelles options globales :
--format=text|json|ndjson: sélectionne le format du canal de sortie--quiet(alias-q) : supprime la bannière du logo et échoue immédiatement sur les invites interactives--strict-exit: active les codes de sortie sémantiques
Lorsque --format=json ou --format=ndjson est sélectionné, stdout transporte le
flux structuré et les diagnostics lisibles par une personne sont dirigés vers stderr, de sorte
que les deux canaux ne s’entremêlent jamais.
Options
—format <format>
Sélectionne le format de sortie utilisé sur stdout. Valeurs autorisées :
| Valeur | Description |
|---|---|
text | Valeur par défaut. Sortie console historique, lisible par une personne. Aucun changement de structure par rapport aux versions précédentes. |
json | Enveloppe JSON unique, mise en tampon et écrite à la fin de l’exécution (ou avec --help / --version). À privilégier lorsque stdout est capturé dans un fichier ou redirigé vers un consommateur JSON. |
ndjson | JSON délimité par des sauts de ligne. Un événement par ligne, écrit dès qu’il est produit. À privilégier pour les consommateurs en flux continu, les collecteurs de journaux et les agents en direct qui doivent réagir avant la fin de l’exécution. |
Exemples :
babel myapp.exe --format=json > result.json
babel myapp.exe --format=ndjson | jq -c 'select(.level=="error")'Avec —format=json ou —format=ndjson, la bannière du logo
est automatiquement supprimée, quelle que soit la valeur de —logo, afin que le tout
premier octet sur stdout soit du JSON valide.
—quiet (-q)
Supprime la bannière de copyright et de logo et modifie le comportement des invites
interactives de mot de passe : au lieu de se bloquer sur Console.In, Babel échoue immédiatement avec
une erreur explicite. --quiet convient ainsi aux exécutions sans intervention lancées depuis
des exécuteurs de CI, des étapes de build de conteneurs et des agents IA.
babel myapp.exe --quiet --keyfile mykey.pfx --keypwd env:KEY_PWD--quiet est indépendant de --format : il peut être combiné avec la sortie text
historique pour conserver des journaux lisibles par une personne sans la bannière.
—strict-exit
Active les codes de sortie sémantiques pour le processus. Sans cette option, Babel conserve
le contrat historique, dans lequel 0 signifie la réussite et 1 tout échec.
| Code de sortie | Constante | Signification |
|---|---|---|
0 | success | L’exécution s’est terminée sans erreur. |
10 | invalidArguments | La ligne de commande n’a pas pu être analysée ou contenait une valeur non valide (par exemple un --format inconnu). |
20 | inputNotFound | L’assembly principal ou un autre fichier d’entrée obligatoire est introuvable. |
30 | obfuscationFailure | L’obfuscation a échoué à l’exécution (toute exception non classée de l’obfuscateur). |
40 | licensingFailure | La vérification de la licence a échoué (licence absente, expirée ou non autorisée). |
50 | keyOrSigningFailure | La signature par nom fort ou une opération sur une clé cryptographique a échoué. |
La classification est aussi exposée sous le nom exitReason dans l’enregistrement de résultat
JSON/NDJSON (voir Enveloppe de résultat), même lorsque --strict-exit n’est
pas actif. Les consommateurs peuvent ainsi distinguer les catégories d’échec indépendamment
du code de sortie numérique.
babel myapp.exe --strict-exit --format=json
echo "exit=$?"Schéma : babel.cli.v1
Toutes les charges utiles structurées sont conformes au schéma versionné babel.cli.v1.
Au sein d’une version majeure du schéma, les ajouts (nouveaux champs, nouveaux codes d’événement,
nouveaux motifs de sortie) sont autorisés ; un changement incompatible entraîne un nouveau nom de schéma.
Enregistrement d’événement
Chaque diagnostic émis pendant une exécution est converti en événement :
{
"ts": "2026-05-08T14:32:11.482Z",
"level": "info",
"code": "BAB1234",
"message": "Renaming phase, elapsed time 00.082s",
"data": { "phase": "renaming", "elapsedMs": 82 }
}| Champ | Type | Remarques |
|---|---|---|
ts | chaîne (ISO-8601, UTC) | Horodatage de la production de l’événement. |
level | debug | info | warning | error | Gravité. |
code | chaîne | null | Code de diagnostic Babel (par exemple BAB1234, W00013), le cas échéant. |
message | chaîne | Message lisible par une personne. |
data | objet | null | Charge utile structurée facultative jointe à l’événement. |
Enveloppe de résultat
—format=json
Un seul objet JSON est écrit sur stdout à la fin de l’exécution. Il contient
le résumé de l’exécution et tous les événements mis en tampon pendant celle-ci :
{
"exitCode": 0,
"exitReason": "success",
"elapsedMs": 4218,
"warnings": 1,
"errors": 0,
"events": [
{ "ts": "2026-05-08T14:32:09.500Z", "level": "info", "code": null, "message": "Babel Obfuscator 11.7.0.0", "data": null },
{ "ts": "2026-05-08T14:32:11.482Z", "level": "info", "code": "BAB1234", "message": "Renaming phase ...", "data": { "phase": "renaming" } },
{ "ts": "2026-05-08T14:32:13.012Z", "level": "warning", "code": "W00013", "message": "Could not resolve ...", "data": null }
]
}—format=ndjson
Chaque événement est écrit dès qu’il est produit, sur sa propre ligne. Après le
dernier événement, une ligne de résultat finale est ajoutée (sans tableau events, puisque
les événements ont déjà été transmis en continu) :
{"ts":"2026-05-08T14:32:09.500Z","level":"info","code":null,"message":"Babel Obfuscator 11.7.0.0","data":null}
{"ts":"2026-05-08T14:32:11.482Z","level":"info","code":"BAB1234","message":"Renaming phase ...","data":{"phase":"renaming"}}
{"ts":"2026-05-08T14:32:13.012Z","level":"warning","code":"W00013","message":"Could not resolve ...","data":null}
{"exitCode":0,"exitReason":"success","elapsedMs":4218,"warnings":1,"errors":0}| Champ | Type | Remarques |
|---|---|---|
exitCode | entier | Code de sortie numérique réellement renvoyé par le processus (historique ou strict, selon --strict-exit). |
exitReason | chaîne | Jeton de classification stable. Reflète toujours la classe sémantique, même sans --strict-exit. |
elapsedMs | entier | Durée totale écoulée, en millisecondes. |
warnings | entier | Nombre d’événements de niveau warning. |
errors | entier | Nombre d’événements de niveau error. |
events | tableau | null | Présent en mode json ; omis en mode ndjson (les événements sont transmis en continu sur des lignes distinctes). |
—help lisible par machine
babel --help --format=json émet une description complète de chaque option
publique, utile aux outils qui doivent inspecter la surface du CLI (complétion
du shell, agents IA, générateurs de documentation) :
{
"version": "11.7.0.0",
"usage": "babel.exe <primary assembly source> [<other assemblies>...] [options]",
"options": [
{
"name": "controlflow",
"aliases": ["nocontrolflow", "no-controlflow", "control-flow", "no-control-flow", "i"],
"description": "Enable ([no]disable) MSIL control flow obfuscation",
"args": null,
"argRequired": false,
"argOptional": false,
"negatable": true,
"incremental": false,
"container": "scalar",
"type": "boolean",
"group": "- Code Obfuscation -",
"details": "Use this option to alter the method control flow ..."
}
]
}Une forme ciblée est également prise en charge. babel --help controlflow --format=json émet
la même enveloppe, mais limitée à l’option controlflow (avec ses
details résolus à partir des ressources de l’option).
Les options masquées ou internes ne sont jamais renvoyées.
—version lisible par machine
babel --version --format=json émet des informations sur le runtime et la plateforme :
{
"product": "Babel Obfuscator",
"version": "11.7.0.0",
"fileVersion": "11.7.0.0",
"runtime": ".NET 8.0.11",
"platform": "win-x64"
}Le champ platform utilise le RuntimeIdentifier (RID) de .NET lors d’une exécution sur
.NET 5 ou une version ultérieure, et une chaîne synthétique <os>-<arch> sur les cibles plus anciennes (net472-x64,
unix-x64, …).
Rétrocompatibilité
- La valeur par défaut de
--formatesttext; la sortie textuelle, les codes de sortie et le comportement historiques sont inchangés lorsqu’aucune nouvelle option n’est indiquée. - Sans
--strict-exit, le processus continue de renvoyer0en cas de réussite et1en cas d’échec : les contrôles de CI existants qui testent$?continuent de fonctionner. --quietest indépendant et peut être activé sans activer la sortie structurée.
La sortie structurée est également disponible avec la tâche MSBuild et le package NuGet Babel.Obfuscator : il suffit de transmettre les mêmes options par le mécanisme standard des propriétés et des arguments.