Skip to main content

Command-line runner for Adagio pipeline files.

Project description

Adagio CLI

Command-line runner for Adagio pipeline files

Requirements

  • Python 3.10+
  • uv (recommended for development)
  • Docker for the default task runtime
  • Apptainer or Singularity when using kind = "apptainer" with local .sif images

Installation

Install from PyPI:

pip install adagio-cli

Install a prerelease from TestPyPI while validating a release candidate:

pip install \
  --index-url https://test.pypi.org/simple/ \
  --extra-index-url https://pypi.org/simple \
  adagio-cli

Install from the current checkout:

pip install .

Or with uv:

uv pip install .

Verify install:

adagio --version
adagio --help

Usage

Run a pipeline

Show command help:

adagio run --help

Run with a pipeline file:

adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache

adagio run executes each plugin task in its own task environment. The default task environment is a Docker image in GHCR derived from the plugin name in the pipeline spec, for example dada2 -> ghcr.io/cymis/qiime2-plugin-dada2:2026.1. Runtime config can override that per default/plugin/task and switch selected work to Apptainer/Singularity with a local .sif image path. The cache directory is required and is reused across reruns by default so unchanged successful tasks can be replayed.

Equivalent positional form:

adagio run path/to/pipeline.json --cache-dir /path/to/cache

Use an arguments file:

adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache --arguments path/to/arguments.json

Use a runtime config file with defaults, plugin-level overrides, and optional task overrides:

adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache --config path/to/runtime.toml

Control which dynamic flags are shown in help:

adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache --show-params required
# choices: all | missing | required

Disable reuse for a run while still writing outputs into the selected cache directory:

adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache --no-reuse

The same boolean pair is available as --reuse / --no-reuse. --reuse is the default.

Clear an existing cache directory:

adagio cache clear --cache-dir /path/to/cache

Inspect a pipeline

Print a dependency-ordered summary of the plugin actions in a pipeline:

adagio pipeline show path/to/pipeline.json

Arguments file format

--arguments can be downloaded from Adagio directly in the "Run" workflow :

{
  "version": 1,
  "inputs": {
    "input_name": "/path/to/input.qza"
  },
  "parameters": {
    "param_name": "value"
  },
  "outputs": "/path/to/output-dir"
}

outputs may also be a map keyed by output name (WIP: not currently generated by Adagio):

{
  "outputs": {
    "output_a": "/path/to/output-a",
    "output_b": "/path/to/output-b"
  }
}

If outputs are omitted, defaults are generated under ./adagio-outputs.

Runtime config format

--config accepts TOML. Defaults apply first, then plugin keys, then task keys:

version = 1

[defaults]
platform = "linux/amd64"

[plugins]
dada2 = { image = "ghcr.io/cymis/qiime2-plugin-dada2:2026.1" }
demux = { image = "ghcr.io/cymis/qiime2-plugin-demux:2026.1" }

[tasks]
"dada2.denoise_single" = { image = "registry.internal/custom-dada2:1.0", platform = "linux/amd64" }

kind, image, and platform are all optional on defaults, plugin entries, and task entries. kind may be docker or apptainer. image remains the environment reference: for Docker it is the container image, and for Apptainer it must be a local .sif path.

Precedence is task override > plugin override > defaults > default resolver.

Task lookup supports graph node id, optional task name when present in the pipeline, and plugin.action as a fallback. Plugin lookup uses the pipeline's plugin name. If platform is omitted all the way through, Adagio uses normal Docker platform resolution with no implicit fallback. Anything not listed in the config uses the default plugin image resolver.

Concrete Apptainer example:

version = 1

[defaults]
kind = "docker"

[plugins]
bowtie2 = { kind = "apptainer", image = "/shared/qiime-images/q2-bowtie2-test.sif" }

For kind = "apptainer", Adagio prefers the apptainer executable and falls back to singularity. The current implementation supports only local .sif paths and runs tasks serially; no scheduler submission or remote image pull behavior is included.

QAPI generation/submission

Generate and submit plugin metadata from the active QIIME environment:

adagio qapi build --action-url http://localhost:81/api/v1

Submit to a protected deployment such as adagio.run with a scoped submission token:

export ACTION_URL=https://adagio.run/api/v1
export QAPI_SUBMISSION_TOKEN=<token copied from https://adagio.run/app/profile>
uv run adagio qapi build

You can also pass --submission-token, but the environment variable is safer because it does not end up in shell history.

Write payload to disk without submitting:

adagio qapi build --output qapi.json --dry-run

Submit selected plugins only:

adagio qapi build --plugin dada2 --plugin feature-table

Development

Setup

Install runtime and dev dependencies:

uv sync --group dev

Run commands inside the project environment:

uv run adagio --help

Linting

uv run ruff check .
uv run ruff format --check .
uv run ruff format .

Tests

uv run pytest

Build distributions

uv run python -m build
uv run python -m twine check dist/*

Running locally during development

uv run adagio run --pipeline path/to/pipeline.json --cache-dir /path/to/cache

Runtime entrypoint (container/integration use)

The runtime subcommand is intended for runtime-adapter jobs:

uv run adagio runtime --spec spec.json --config runtime.toml --arguments arguments.json --cache-dir /path/to/cache

Releasing

See RELEASING.md for the one-time PyPI/GitHub setup, version/tag workflow, and TestPyPI/PyPI publishing steps.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

adagio_cli-0.1.0a1.tar.gz (45.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

adagio_cli-0.1.0a1-py3-none-any.whl (65.3 kB view details)

Uploaded Python 3

File details

Details for the file adagio_cli-0.1.0a1.tar.gz.

File metadata

  • Download URL: adagio_cli-0.1.0a1.tar.gz
  • Upload date:
  • Size: 45.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for adagio_cli-0.1.0a1.tar.gz
Algorithm Hash digest
SHA256 34f295272e7050a0f94548737426ef0cc93f716f46ddc5fc0d739be3cb29a9a6
MD5 cc84da8f78a165820f03f9f100ac2e32
BLAKE2b-256 f8b66f878c3feafa7335a2ce31244c68c5ba863cc90e1dc0f9649c0d74e45e21

See more details on using hashes here.

Provenance

The following attestation bundles were made for adagio_cli-0.1.0a1.tar.gz:

Publisher: publish.yml on cymis/adagio-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file adagio_cli-0.1.0a1-py3-none-any.whl.

File metadata

  • Download URL: adagio_cli-0.1.0a1-py3-none-any.whl
  • Upload date:
  • Size: 65.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for adagio_cli-0.1.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 2e3a39a1d4dea8e2ac73a70a800e9499b3c01170f2408a799a80391419d11d98
MD5 033ab9f076ef00df13b619501806a493
BLAKE2b-256 905ba462dac4a1a1448837b5b8687b96c8f16911b7d85a28ace6172c4647c173

See more details on using hashes here.

Provenance

The following attestation bundles were made for adagio_cli-0.1.0a1-py3-none-any.whl:

Publisher: publish.yml on cymis/adagio-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page