tecsas3 pipe ejecuta workflows declarativos definidos en YAML o JSON. Cada step es una llamada real al CLI (tecsas3 <recurso> <comando> --flag valor); el orquestador (cli/src/tecsas3_cli/resources/pipeline.py) se encarga de resolver placeholders, propagar resultados entre steps y reportar el resultado final en JSON determinista. Es la pieza que hace el CLI componible: un agente puede describir un workflow complejo y el CLI lo ejecuta paso a paso sin necesidad de escribir bash.

Anatomía de un pipeline

Campos obligatorios (validados por _validate_steps() en pipeline.py:109-123): id, resource, command. El id no puede contener espacios y debe ser único dentro del pipeline — se usa como clave de contexto para los placeholders.

Placeholders

La resolución ocurre en _resolve() (pipeline.py:46-65) antes de cada invocación. Hay tres formas de expresar una referencia: Los placeholders se interpolan dentro de strings (sustitución parcial) y también se evalúan cuando toda la cadena es un placeholder puro (preservando el tipo original: número, lista, dict).
Los accesores anidados usan dot path o bracket index y se resuelven en _dotted_get() (pipeline.py:27-43). El patrón más habitual es ${step.results[i].campo} para iterar la primera/ensima posición de un array de resultados: por ejemplo ${buscar.results[0].id_paciente} extrae el UUID del primer paciente devuelto por ia v2-patient-search.

Ejemplo: workflow de tres steps

Modos de ejecución

Imprime la definición validada sin ejecutar nada. Útil para revisar el plan antes de invocar APIs reales.
Salida (JSON, recortada):

Comandos disponibles

Cada step se ejecuta dentro de un CliRunner de Typer con el mismo Runtime (rt: Runtime = ctx.obj) que la invocación principal. Esto significa que el token, el tenant configurado y el formato de salida se heredan del proceso padre. Si lanzas tecsas3 --json --no-input pipe run workflow.yml, todos los steps se ejecutan también en modo JSON.

Manejo de errores

  • Default (continue_on_error: false) — el primer step que devuelve exit_code != 0 aborta el pipeline. El orquestador emite {error, step, outputs} con exit_code no-cero.
  • continue_on_error: true — el step que falla se registra con status: "error" y stderr capturado, y el pipeline continúa. Los placeholders que dependan de ese step reventarán en _resolve() (KeyError); protégelos también con continue_on_error en el step que los consume.
  • Placeholder no resuelto — el error aparece antes de invocar el sub-comando, así que el step queda registrado como skipped (no llama a la API).

Validación previa

tecsas3 pipe validate no hace red: solo parsea el YAML/JSON y comprueba que steps contenga una lista de dicts con los campos obligatorios. Es seguro en CI:

Referencias

  • cli/src/tecsas3_cli/resources/pipeline.py:46-65_resolve() (placeholders en strings)
  • cli/src/tecsas3_cli/resources/pipeline.py:27-43_dotted_get() (dot/bracket paths)
  • cli/src/tecsas3_cli/resources/pipeline.py:84-106_args_to_argv() (mapa → flags CLI)
  • cli/src/tecsas3_cli/resources/pipeline.py:109-123_validate_steps() (campos mínimos)
  • cli/data/pipeline_examples/ — ejemplos: triage.yml, export_fhir.yml, icd_workflow.yml