Skip to Content
Nuova versione 12 disponibile 🎉
ObfuscatorRiga di comandoModalità compatibile con l'AI

Modalità CLI compatibile con l’AI

A partire da Babel Obfuscator 11.7.0, lo strumento da riga di comando può emettere un flusso di output strutturato e leggibile dalle macchine, adatto alle pipeline di CI, agli orchestratori di build e alle integrazioni con AI e agenti.

L’output di testo predefinito di babel.exe non cambia e resta pienamente compatibile con le versioni precedenti: gli script di CI e le integrazioni dei clienti già esistenti non richiedono modifiche.

La modalità compatibile con l’AI si attiva con tre nuove opzioni globali:

  • --format=text|json|ndjson: seleziona il formato del canale di output
  • --quiet (alias -q): sopprime il banner del logo e termina subito con un errore davanti alle richieste interattive
  • --strict-exit: attiva i codici di uscita semantici

Quando è selezionato --format=json o --format=ndjson, stdout trasporta il flusso strutturato e la diagnostica leggibile dalle persone viene indirizzata su stderr, così i due canali non si mescolano mai.

Opzioni

—format <format>

Seleziona il formato di output usato su stdout. Valori ammessi:

ValoreDescrizione
textPredefinito. L’output di console tradizionale, leggibile dalle persone. Nessuna modifica strutturale rispetto ai rilasci precedenti.
jsonUn unico envelope JSON, accumulato in un buffer e scritto al termine dell’esecuzione (o con --help / --version). È la scelta migliore quando stdout viene salvato in un file o inviato tramite pipe a un consumer JSON.
ndjsonJSON delimitato da caratteri di nuova riga. Un evento per riga, scritto non appena viene prodotto. È la scelta migliore per i consumer in streaming, i sistemi di raccolta dei log e gli agenti attivi che devono reagire prima che l’esecuzione termini.

Esempi:

babel myapp.exe --format=json > result.json babel myapp.exe --format=ndjson | jq -c 'select(.level=="error")'

Con —format=json o —format=ndjson il banner del logo viene soppresso automaticamente, a prescindere da —logo, in modo che il primo byte su stdout sia JSON valido.

—quiet (-q)

Sopprime il banner con copyright e logo e cambia il comportamento delle richieste interattive di password: invece di restare in attesa su Console.In, Babel termina subito con un errore esplicito. In questo modo --quiet è sicuro per le esecuzioni non presidiate avviate da runner di CI, passi di build nei container e agenti AI.

babel myapp.exe --quiet --keyfile mykey.pfx --keypwd env:KEY_PWD

--quiet è indipendente da --format: puoi combinarlo con l’output text tradizionale per mantenere log leggibili dalle persone senza il banner.

—strict-exit

Attiva per il processo i codici di uscita semantici. Senza questa opzione, Babel mantiene il contratto tradizionale, in cui 0 indica il successo e 1 qualsiasi errore.

Codice di uscitaCostanteSignificato
0successL’esecuzione è terminata senza errori.
10invalidArgumentsNon è stato possibile interpretare la riga di comando, oppure conteneva un valore non valido (per esempio un --format sconosciuto).
20inputNotFoundL’assembly principale o un altro file di input obbligatorio non è stato trovato.
30obfuscationFailureL’offuscamento non è riuscito in fase di esecuzione (qualsiasi eccezione dell’offuscatore non classificata).
40licensingFailureIl controllo della licenza non è riuscito (licenza mancante, scaduta o non autorizzata).
50keyOrSigningFailureLa firma con nome sicuro o un’operazione con una chiave crittografica non è riuscita.

La classificazione è riportata anche come exitReason nel record di risultato JSON/NDJSON (vedi Envelope del risultato), anche quando --strict-exit non è attivo, così i consumer possono distinguere le categorie di errore indipendentemente dal codice di uscita numerico.

babel myapp.exe --strict-exit --format=json echo "exit=$?"

Schema: babel.cli.v1

Tutti i payload strutturati sono conformi allo schema versionato babel.cli.v1. All’interno di una versione principale dello schema sono ammesse le modifiche additive (nuovi campi, nuovi codici di evento, nuovi motivi di uscita); le modifiche incompatibili comportano un nuovo nome dello schema.

Record di evento

Ogni messaggio di diagnostica emesso durante un’esecuzione viene associato a un evento:

event
{ "ts": "2026-05-08T14:32:11.482Z", "level": "info", "code": "BAB1234", "message": "Renaming phase, elapsed time 00.082s", "data": { "phase": "renaming", "elapsedMs": 82 } }
CampoTipoNote
tsstring (ISO-8601, UTC)Data e ora in cui l’evento è stato prodotto.
leveldebug | info | warning | errorGravità.
codestring | nullCodice di diagnostica di Babel (per esempio BAB1234, W00013), quando applicabile.
messagestringMessaggio leggibile dalle persone.
dataobject | nullPayload strutturato facoltativo associato all’evento.

Envelope del risultato

—format=json

Al termine dell’esecuzione viene scritto su stdout un unico oggetto JSON. Contiene il riepilogo dell’esecuzione e tutti gli eventi accumulati nel buffer durante l’esecuzione:

result (json)
{ "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

Ogni evento viene scritto non appena è prodotto, su una riga a sé. Dopo l’ultimo evento viene aggiunta una riga finale con il risultato (senza l’array events, perché gli eventi sono già stati trasmessi):

result (ndjson)
{"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}
CampoTipoNote
exitCodeintegerCodice di uscita numerico effettivamente restituito dal processo (tradizionale o semantico, a seconda di --strict-exit).
exitReasonstringToken di classificazione stabile. Riflette sempre la classe semantica, anche senza --strict-exit.
elapsedMsintegerDurata totale in tempo reale, in millisecondi.
warningsintegerNumero di eventi di livello warning.
errorsintegerNumero di eventi di livello error.
eventsarray | nullPresente in modalità json; omesso in ndjson (gli eventi vengono trasmessi come righe separate).

—help leggibile dalle macchine

babel --help --format=json emette una descrizione completa di ogni opzione pubblica, adatta agli strumenti che devono esaminare l’interfaccia della CLI (completamento automatico della shell, agenti AI, generatori di documentazione):

--help --format=json (excerpt)
{ "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 ..." } ] }

È supportata anche una forma limitata a una sola opzione. babel --help controlflow --format=json emette lo stesso envelope, che però contiene solo l’opzione controlflow (con i suoi details ricavati dalle risorse dell’opzione).

Le opzioni nascoste o interne non vengono mai restituite.

—version leggibile dalle macchine

babel --version --format=json emette le informazioni sul runtime e sulla piattaforma:

--version --format=json
{ "product": "Babel Obfuscator", "version": "11.7.0.0", "fileVersion": "11.7.0.0", "runtime": ".NET 8.0.11", "platform": "win-x64" }

Il campo platform usa il RuntimeIdentifier (RID) di .NET quando l’esecuzione avviene su .NET 5 o versioni successive, e una stringa sintetica <os>-<arch> sui target precedenti (net472-x64, unix-x64, …).

Compatibilità con le versioni precedenti

  • Il valore predefinito di --format è text; l’output testuale tradizionale, i codici di uscita e il comportamento non cambiano se non specifichi nessuna delle nuove opzioni.
  • Senza --strict-exit, il processo continua a restituire 0 in caso di successo e 1 per qualsiasi errore: i controlli di CI esistenti che decidono in base a $? continuano a funzionare.
  • --quiet è indipendente e può essere attivato senza abilitare l’output strutturato.

L’output strutturato è disponibile anche tramite il task MSBuild e il pacchetto NuGet Babel.Obfuscator, passando le stesse opzioni attraverso i consueti meccanismi di proprietà e argomenti.

Last updated on