Passa al contenuto principale Passa alla navigazione Passa al piè di pagina

Riferimento output JSON

Riferimento completo per il formato di output JSON della CLI rdc, schema dell'envelope, gestione degli errori e comandi di discovery per agenti.

Tutti i comandi rdc producono JSON strutturato. Passalo via pipe a uno script oppure forniscilo direttamente a un agente.

Abilitazione dell’output JSON

Flag esplicito

rdc machine status prod-1 --output json
rdc machine status prod-1 -o json

Rilevamento automatico

Quando rdc viene eseguito in un ambiente non-TTY (pipe, subshell o avviato da un agente AI), l’output passa automaticamente a JSON. Nessun flag necessario.

# Produce JSON automaticamente
result=$(rdc machine status prod-1)

Envelope JSON

Ogni risposta JSON utilizza un envelope uniforme:

{
  "success": true,
  "command": "machine query",
  "data": {
    "name": "prod-1",
    "status": "running",
    "repositories": []
  },
  "errors": null,
  "warnings": [],
  "metrics": {
    "duration_ms": 142
  }
}
CampoTipoDescrizione
successbooleanSe il comando si è completato con successo
commandstringIl percorso completo del comando (es. "machine query", "repo up")
dataobject | array | nullPayload specifico del comando in caso di successo, null in caso di errore
errorsarray | nullOggetti errore in caso di fallimento, null in caso di successo
warningsstring[]Avvisi non fatali raccolti durante l’esecuzione
metricsobjectMetadati di esecuzione

Risposte di errore

I comandi falliti restituiscono errori strutturati con suggerimenti di ripristino:

{
  "success": false,
  "command": "machine query",
  "data": null,
  "errors": [
    {
      "code": "NOT_FOUND",
      "message": "Machine \"prod-2\" not found",
      "retryable": false,
      "guidance": "Verify the resource name with \"rdc machine status\" or \"rdc repo list\""
    }
  ],
  "warnings": [],
  "metrics": {
    "duration_ms": 12
  }
}

Campi degli errori

CampoTipoDescrizione
codestringCodice di errore leggibile dalla macchina (vedi le costanti ERROR_CODES per l’elenco canonico)
messagestringDescrizione leggibile dall’utente
retryablebooleanSe riprovare lo stesso comando potrebbe avere successo
guidancestringSuggerimento in formato libero (legacy. Preferire next per dati di azione strutturati)
nextobject?Suggerimento strutturato per l’azione successiva (quando presente). Vedi sotto

Suggerimenti di azione strutturati next

Per i codici di errore ad alto valore come PRECONDITION_MISMATCH, l’errore include un campo next con i comandi esatti da proporre all’utente. Non tutti i codici di errore espongono questo campo: solo quelli con un percorso di recupero definito. Gli agenti devono riprodurre next.options[].run testualmente all’utente, senza sintetizzare un comando proprio. Questo evita il caso in cui l’agente inventa un comando inesistente. Succede più spesso di quanto si pensi.

{
  "errors": [{
    "code": "PRECONDITION_MISMATCH",
    "message": "--current digest mismatch (expected 3264f8ee…, got 611dfd8a…)",
    "next": {
      "summary": "Provide the current value or acknowledge rotation.",
      "options": [
        {
          "description": "Re-read current digest, then retry with --current",
          "run": "rdc repo secret get mail --key STRIPE_KEY"
        },
        {
          "description": "Skip the precondition (rotation, audited)",
          "run": "rdc repo secret set mail --key STRIPE_KEY --value <new> --mode file --rotate-secret"
        }
      ]
    }
  }]
}

Schema:

CampoTipoDescrizione
next.summarystringDescrizione in una riga di ciò che l’utente deve decidere
next.options[]arrayAzioni concrete; ognuna è un’alternativa che l’utente può scegliere
next.options[].descriptionstringSpiegazione leggibile dall’utente di questa opzione
next.options[].runstringComando CLI esatto. Riproducilo testualmente all’utente

Errori riprovabili

Questi tipi di errore sono contrassegnati come retryable: true:

  • NETWORK_ERROR, connessione SSH o errore di rete
  • RATE_LIMITED, troppe richieste, attendi e riprova
  • API_ERROR, errore temporaneo del backend

Gli errori non riprovabili (autenticazione, non trovato, argomenti non validi) richiedono un’azione correttiva prima di riprovare.

Filtraggio dell’output

Usa --fields per limitare l’output a chiavi specifiche e ridurre l’utilizzo dei token:

rdc machine status prod-1 --containers -o json --fields name,status,repository

Output in modalità dry-run

I comandi distruttivi supportano --dry-run per visualizzare in anteprima cosa succederebbe:

rdc repo delete mail@prod-1 --dry-run -o json
{
  "success": true,
  "command": "repo delete",
  "data": {
    "dryRun": true,
    "repository": "mail",
    "machine": "prod-1",
    "guid": "a1b2c3d4-..."
  },
  "errors": null,
  "warnings": [],
  "metrics": {
    "duration_ms": 8
  }
}

Comandi con supporto --dry-run: repo up, repo down, repo delete, snapshot delete, sync upload, sync download.

Esempi di parsing

Shell (jq)

status=$(rdc machine status prod-1 -o json | jq -r '.data.status')

Python

import subprocess, json

result = subprocess.run(
    ["rdc", "machine", "query", "--name", "prod-1", "-o", "json"],
    capture_output=True, text=True
)
envelope = json.loads(result.stdout)

if envelope["success"]:
    print(envelope["data"]["status"])
else:
    error = envelope["errors"][0]
    if error["retryable"]:
        # logica di ripetizione
        pass
    else:
        print(f"Error: {error['message']}")
        print(f"Fix: {error['guidance']}")

Node.js

import { execFileSync } from 'child_process';

const raw = execFileSync('rdc', ['machine', 'query', '--name', 'prod-1', '-o', 'json'], { encoding: 'utf-8' });
const { success, data, errors } = JSON.parse(raw);

if (!success) {
  const { message, retryable, guidance } = errors[0];
  throw new Error(`${message} (retryable: ${retryable}, fix: ${guidance})`);
}