capdag è sia l’implementazione di riferimento di questa specifica sia un prodotto
da riga di comando: uno strumento in stile Unix che esegue una singola cap, esegue un
intero grafo .machine, ispeziona il fabric e crea lo scheletro di cartucce e ne
supporta lo sviluppo. Ogni modalità pilota un vero host Bifaci con le cartucce incluse
registrate, così le chiamate peer di una cap (download di modelli, ricerche nel fabric)
funzionano esattamente come all’interno del motore.
Collegamento al fabric
Ogni invocazione di capdag risolve cap, media e alias rispetto a un solo registro
del fabric. Un eseguibile distribuito incorpora l’URL di quel registro al momento della
build (CDG_FABRIC_REGISTRY_URL); una variabile d’ambiente con lo stesso nome, a runtime,
sostituisce il valore incorporato. La base degli schemi (CDG_SCHEMA_BASE_URL) è sempre
e solo abbinata all’URL del fabric, mai separata da esso. È questo che fa sì che una build
--staging risolva disbind-pdf rispetto al fabric di staging anziché a quello di produzione.
Comandi
capdag <cap-alias-or-urn> [cap args] [inputs...] [options] Run one cap
capdag run <machine-file> [inputs...] [options] Run a .machine file
capdag plan <files...> [--to <t>]... [options] Discover targets / plan machines for a file set
capdag dag-viz <machine-file> [--mermaid|--dot] Render the execution plan
capdag find <cap-alias-or-urn> Show the providing cartridge(s)
capdag resolve [--no-cache] <cap-alias-or-urn>... Print cap definition JSON (array for >1)
capdag cache [clear|refresh] Invalidate/renew the local fabric cache
capdag install <cap-alias-or-urn-or-cartridge-id> Download + verify without running
capdag new <name> --<language> [-o <dir>] Scaffold a new cartridge project
capdag dev-install <project-dir> Install/update a dev cartridge under the dev slug
capdag self update Replace this capdag with its channel's latest release
capdag <cap> …: esegue una cap (modalità a cap singola)
La modalità predefinita: un alias o un URN di cap, da solo, viene eseguito come uno strumento in stile Unix, pilotando l’interfaccia dichiarata dalla cap stessa.
- Lo stdin in pipe, oppure il percorso o i percorsi dei file di input, alimentano l’argomento stdin della cap.
- I
--flagse gli argomenti posizionali dichiarati dalla cap vengono accettati nativamente. --arg <name-or-media-urn>=<value>indirizza esplicitamente qualsiasi argomento, con ilnameche gli dà la sua definizione o con il suo media URN (ripetibile;@<path>legge i byte di un file per un argomento binario). Un nome che la cap non dichiara viene rifiutato, indicando quelli che dichiara.
Presentazione dell’interfaccia della cap. capdag <cap> --help stampa l’interfaccia
dichiarata di quella cap, strutturata per ruolo dell’argomento anziché come un
elenco piatto di argomenti:
- Input: l’input PRINCIPALE della cap: l’argomento la cui sorgente
stdindichiarata ha come URN la specificain=del cap URN (identificato tramite equivalenza dei tagged URN, mai tramite confronto di stringhe; vedi Input e output §”Ruoli degli argomenti”). Viene mostrato per primo: è così che la cap viene alimentata, con lo stdin in pipe oppure con il percorso o i percorsi dei file di input posizionali. Le eventuali ulteriori vie, tramite flag o posizione, dichiarate dall’argomento sono elencate accanto. - Opzioni obbligatorie: gli argomenti non principali che sono
requiredsenzadefault_value. Ogni invocazione deve fornire ciascuno di essi; se ne manca uno, il controllo preliminare fallisce con un errore che nomina il flag dell’opzione (oppure la posizione, o la forma--arg), il suo media URN e la sua descrizione, raggruppati sotto “missing required options”. Le opzioni con un valore predefinito non vengono mai richieste né menzionate in quell’errore. - Opzioni: gli argomenti rimanenti, elencati con i loro valori predefiniti (oppure indicati come facoltativi quando non ne hanno).
- Output (disciplina della pipe): un singolo risultato scalare viene trasmesso
GREZZO su stdout; le sequenze e i fan-out scrivono file (
{input}.{node}[.{i}].{ext}) ed elencano i loro percorsi su stdout. Log e avanzamento vanno su stderr.
Le cap astratte (gli ombrelli di dispatch convert-image, convert-audio,
disbind, extract-frames ed extract-audio-track) vengono ristrette qui: capdag risolve l’alias nella cap astratta, rileva il media dell’input
e restringe alla cap concreta tramite is_dispatchable (vedi
Dispatch §”Cap astratte”). Un bersaglio ambiguo viene risolto con
--to <ext|media-urn>; uno non risolvibile fallisce in modo netto.
Ripiego sullo sviluppo locale. Se il token nomina una cap che il fabric non
definisce, capdag ripiega sul manifest di una cartuccia installata localmente in
sviluppo (eseguita tramite il suo alias) ed esegue quella cap attraverso l’host completo,
a condizione che la cap non sia in conflitto con il fabric (nessun suo alias indica già
una cap diversa a monte). È questo che permette di sviluppare ed eseguire una cap
nuovissima prima ancora che venga pubblicata. Vedi
Costruisci ed esegui una cartuccia.
capdag run <machine-file> …
Esegue un grafo di flusso dei dati .machine. Mappe, raccolte, fan-out e macchine incluse
vengono pianificati ed eseguiti dall’orchestratore condiviso. I flag vengono riconosciuti in
qualsiasi posizione: run m.machine input --force e run --force m.machine input sono
equivalenti.
Input. Gli input di una macchina sono le sue ancore di input (Notazione delle macchine).
--input <node>=<value>fornisce l’input che la notazione chiama<node>:@<path>legge un file, qualsiasi altra cosa è il valore stesso (--input window=20). Dati più volte per un nodo, i valori sono una sequenza. Un nome che la macchina non ha viene rifiutato, indicando quelli che ha.- Un percorso posizionale, o un token di sorgente dal vivo, va all’input a cui il suo media
rilevato è conforme più da vicino, fra gli input che
--inputnon ha nominato. Quando è conforme allo stesso modo a più input l’esecuzione viene rifiutata, indicandoli. Un input a cui sono dati più percorsi li prende come una sola sequenza. - Una macchina con esattamente un input, a cui sono dati più percorsi e nient’altro, viene eseguita una volta per percorso.
- A ogni input deve essere dato qualcosa; una macchina che parte da una sorgente
(
() -> step -> ..., o un passo a cui sono date solo costanti) non ne prende nessuno.
Output. Gli output di una macchina sono le sue ancore di output. Un output che contiene
un solo valore va su stdout. Tutto il resto viene scritto come file nella directory di
output, uno per elemento, con nome {input_stem}.{output}[.{index}].{ext}: {output} è il
nome che la notazione dà al nodo di output, e ogni percorso scritto viene stampato su stdout.
Un output che non è stato prodotto, perché il ramo che lo genera non è scattato, non scrive
nulla e viene nominato su stderr. Una macchina che termina in un pozzo (... -> step -> ())
non ha output.
Macchine incluse. Il riferimento dell’intestazione di una macchina (Notazione delle macchine) viene letto come un percorso relativo al file che lo ha scritto.
Tutto il resto è nel file. Una macchina eseguita dalla riga di comando è autosufficiente:
ogni argomento di ogni passo è legato nella notazione (a un nodo o a una costante), oppure ha
un valore predefinito. Un argomento obbligatorio che non è né l’uno né l’altro è un errore di
pre-controllo che nomina il passo e l’argomento, e come dirlo: una costante nel wiring, o un
nodo fornito con --input.
Come termina un’esecuzione.
| Uscita | Significato |
|---|---|
| 0 | Completata: ogni output è stato prodotto, o è stato segnalato come non prodotto da un ramo che non è scattato. |
| 1 | Fallita: la macchina non è valida o non può essere eseguita come scritta, oppure un passo è fallito e la sua politica non lo ha tollerato. Non viene scritto alcun output, e nulla di ciò che l’esecuzione aveva reso persistente resta nella directory di output. |
| 2 | Errore d’uso: l’invocazione è incompleta o nomina qualcosa che la macchina non ha (un input a cui non è stato dato nulla, un nome di --input sconosciuto, un flag sconosciuto). Non è stato eseguito nulla. |
| 3 | Completata con fallimenti tollerati: gli output sono stati scritti; stderr elenca ogni passo fallito con on_error=absent, con la sua classe, il suo codice e il suo messaggio. |
| 130 | Annullata dall’utente. |
Un passo che è stato saltato viene nominato su stderr insieme ai valori che attendeva, con i nomi che la macchina dà loro.
Ctrl-C su un’esecuzione dal vivo. Il primo Ctrl-C è la chiusura degli input
(15.2 §Le esecuzioni si arrestano): ogni input dal vivo viene fermato e la CLI stampa il verdetto
ricevuto: Input stopped: N host tap(s) closed, M feed request(s) stopped, M ended; the
run is draining to complete outputs., oppure il rifiuto (Stop input refused:
no live input is open on this run, oppure un’alimentazione che non è terminata entro il
timeout di svuotamento, indicata per nome). L’esecuzione quindi si svuota ed emette i
suoi output. Un secondo Ctrl-C, in qualsiasi momento (anche mentre il primo arresto sta
ancora attendendo la sua conferma), interrompe con un Cancel attribuito a user
(codice di uscita 130). Gli stessi due controlli valgono per la modalità a cap singola
con una sorgente dal vivo.
capdag plan <files...> [--to <t>]... [options]
Il planner unificato e configurabile su un insieme di file (gli stessi
PlanEngine/LiveCapFab che pilotano le procedure guidate del motore). Prima di ogni
altra cosa, plan riscalda le cache del fabric a partire dal manifest fissato (il
riscaldamento che il motore esegue all’avvio; il recupero di una cap è atomico insieme
alle definizioni di media che essa referenzia, ed è questo che popola l’indice delle
estensioni) e rileva ogni input con la rilevazione del motore discriminata sul
contenuto: candidati per estensione → scelta strutturale di base → discriminazione
statica tramite validation su un prefisso limitato del contenuto. La rilevazione è
deterministica; un input la cui estensione non è nota al fabric è un errore netto che
nomina l’estensione, mai un media: nudo e silenzioso.
- Scoperta (senza
--to): elenca ogni bersaglio raggiungibile per l’insieme (i bersagli convergenti sono contrassegnati con il loro apice), con stime dei passi. --to <t>:tviene risolto come: prima un alias di media registrato (un token nudo; i nomi degli alias non contengono mai:), altrimenti un URN di media (contiene:), altrimenti l’abbreviazione per estensione di file (png→media:ext=png). Il risultato viene confrontato con i bersagli RAGGIUNGIBILI:- equivalente a un nodo raggiungibile → pianifica direttamente verso di esso;
- più generale, esattamente un nodo conforme → restringe a quel nodo (stderr annota la risoluzione) e pianifica;
- più generale, diversi nodi conformi → non c’è modo di sapere quale percorso
voglia l’utente, quindi ogni macchina candidata viene stampata come notazione
delle macchine eseguibile (raggruppata sotto intestazioni
# target: <urn>) e il comando termina con codice 0; l’utente sceglie salvando la notazione che vuole ed eseguendola concapdag run; - nulla è conforme → errore netto (codice di uscita 1) che rimanda alla scoperta.
- Scelta: i candidati vengono ordinati e stampati con la loro notazione.
--pick <rank>ne seleziona uno; non esiste una scelta predefinita:--save/--runcon diversi candidati e senza un--pickesplicito rifiutano (codice di uscita 1) invece di agire in silenzio sul candidato 0. - Parametri di regolazione:
--converge auto|combine|independent,--where auto|earliest|latest|source|target|depth=N,--mechanism any|generalize|collect|merge,--rank intent|shortest|cost,--depth,--max-paths,--max; qualsiasi parametro esplicito porta la richiesta in modalità Configured.
capdag dag-viz <machine-file> [--mermaid|--dot]
Rappresenta il piano di esecuzione completo della macchina (MachinePlan) come
diagramma: i passi, i loro altri output, le mappe con i loro elementi, le raccolte, gli input
e gli output, e gli archi tipizzati. Le macchine incluse sono disegnate come i passi che sono.
--mermaid (predefinito) emette Mermaid; --dot emette Graphviz DOT.
capdag find <cap-alias-or-urn>
Risolve una cap e stampa quale o quali cartucce del registro la forniscono (e se è disponibile un eseguibile firmato per questa piattaforma), senza scaricare nulla.
capdag resolve [--no-cache] <cap-alias-or-urn>...
Stampa il JSON della definizione canonica della cap, risolta tramite il registro del
fabric incorporato: la stessa definizione usata da ogni mirror. Le cartucce lo usano per
(ri)generare gli snapshot delle definizioni di cap che incorporano. Passando più
token viene stampato un array JSON di definizioni di cap (un solo processo, una sola
lettura del manifest); la generazione degli snapshot di una cartuccia risolve in questo
modo un intero cap-aliases.txt in un’unica chiamata raggruppata. --no-cache forza un
nuovo recupero, scavalcando la cache su disco indicizzata per versione (che un canale di
staging mutabile può lasciare non aggiornata).
capdag cache [clear|refresh]
Gestisce la cache locale del fabric indicizzata per versione. clear la svuota (in
memoria e su disco, manifest compreso); refresh (il predefinito) la svuota e poi
recupera di nuovo il manifest, così il comando successivo parte rinnovato. Usalo dopo
che un canale ripubblica con la stessa versione del manifest.
capdag install <cap-alias-or-urn-or-cartridge-id>
Risolve, scarica e verifica una cartuccia (catena di firme + hash) senza eseguire nulla, come riscaldamento della cache. Stampa il percorso dell’eseguibile installato.
capdag new <name> --<language> [-o <dir>]
Crea lo scheletro di un nuovo progetto di cartuccia in <dir>/<name>/ (il <dir>
predefinito è la directory corrente). Scegli esattamente uno fra --python, --rust,
--go o --swift; non c’è un linguaggio predefinito. Ogni opzione produce lo stesso
contratto di capacità iniziale attraverso il runtime di quel linguaggio e scrive le
relative istruzioni di build e di sviluppo. <name> deve essere uno slug minuscolo e
sicuro come percorso ([a-z0-9] con separatori -/_). Vedi
Costruisci ed esegui una cartuccia.
capdag dev-install <project-dir>
Installa o aggiorna una cartuccia di sviluppo sotto lo slug riservato dev della radice
delle cartucce per utente, così che l’host la scopra. capdag legge il manifest del
progetto (eseguendo il sottocomando manifest del suo punto d’ingresso), verifica che
nessuna delle sue cap sia in conflitto con il fabric, quindi la colloca in
~/.capdag/cartridges/dev/v{CARTRIDGE_REGISTRY_VERSION}/{channel}/{name}/{version}/
con un record di installazione cartridge.json (registry_url: null). Eseguirlo di
nuovo sovrascrive la stessa directory di versione; questo è il passo di aggiornamento
del ciclo modifica/reinstallazione. <project-dir> è per impostazione predefinita ..
capdag self update
Sostituisce questo capdag — l’eseguibile e la bundled-cartridges/ accanto a esso — con
l’ultima release del canale su cui è stato pubblicato. Stampa capdag <old> -> <new>, oppure
capdag <version> is the latest release quando non c’è nulla di più recente.
Legge il manifest delle release del registro in cui questo capdag è stato pubblicato, e
installa una release solo quando vale tutto questo:
- la firma del manifest risale alle chiavi radice compilate in questo
capdag: un certificato per la chiave di release, firmato da due di quelle radici, per l’ambiente di firma di questa build e valido ora, e il manifest firmato da quella chiave di release; - il bundle ha la dimensione e il digest SHA-256 che il manifest elenca;
- l’eseguibile nel bundle si avvia e riporta la versione con cui è stato pubblicato.
Altrimenti non viene installato nulla, il motivo viene stampato e lo stato di uscita è 1. Il nuovo
bundle prende il posto del vecchio dove si trova il vecchio: prima le cartucce, poi
l’eseguibile. Un aggiornamento interrotto lascia un bundle che funziona, e il successivo
capdag self update rimette a posto o ripulisce ciò che ha lasciato (in .capdag-update/, accanto
all’eseguibile). Su Windows l’eseguibile in esecuzione non può essere rimosso: viene lasciato
accanto al nuovo come capdag.exe.old, e l’aggiornamento successivo lo rimuove.
Due tipi di capdag non vengono aggiornati in questo modo, e dicono che cosa li aggiorna:
| Installato con | Aggiorna con |
|---|---|
| Homebrew | brew upgrade machinefabric/tap/capdag |
| apt | sudo apt update && sudo apt install --only-upgrade capdag |
| dnf | sudo dnf upgrade capdag |
| Compilato dai sorgenti | compila i sorgenti più recenti |
Il capdag di un gestore di pacchetti viene riconosciuto dal file installed-by che il suo
pacchetto mette accanto all’eseguibile. Un bundle installato dove non puoi scrivere viene
aggiornato con gli stessi diritti con cui è stato installato. self è un sottocomando, quindi un
alias di cap chiamato self si esegue con il suo URN.
Opzioni globali
| Opzione | Si applica a | Significato |
|---|---|---|
-o, --output <dir> |
run, cap singola, new | Directory di output (modalità di esecuzione) / directory padre del progetto (new) |
--force |
modalità di esecuzione | Sovrascrive i file di output esistenti |
--arg <name>=<value> |
cap singola | Argomento esplicito della cap, per nome o media URN (ripetibile) |
--input <node>=<value> |
run | Un input della macchina, con il nome che gli dà la notazione (ripetibile) |
--to <ext|media-urn> |
cap singola | Output di destinazione per restringere una cap astratta |
--dev-bins <binary>… |
modalità di esecuzione | Ospita direttamente eseguibili locali di cartucce |
--trace <file.trace> |
modalità di esecuzione | Scrive una traccia del protocollo Bifaci per segmento (JSONL) |
--fabric <url> |
qualsiasi | Risolve questa invocazione rispetto a un’origine diversa del registro del fabric (flag > variabile d’ambiente CDG_FABRIC_REGISTRY_URL > valore incorporato). Viene rimosso da argv prima del dispatch, quindi funziona davanti a qualsiasi sottocomando. Ripeterlo con due origini diverse è un errore. L’asserzione del fabric condiviso si estende automaticamente: un registro di cartucce che dichiara un fabric diverso viene rifiutato. |
--help, |
qualsiasi | Mostra l’uso; dopo il nome di una cap, l’interfaccia di quella cap (input / opzioni obbligatorie / opzioni) |
La radice delle cartucce per utente
capdag ospita le cartucce da ~/.capdag/cartridges/, usando lo stesso albero
suddiviso per registro, versione e canale che usa ogni host:
{registry_slug}/v{CARTRIDGE_REGISTRY_VERSION}/{channel}/{name}/{version}/. Lo slug
dev è riservato alle cartucce costruite localmente (registry_url: null); vedi
Anatomia di una cartuccia per la scoperta e per la
struttura di slug e versioni.