# PIN 9: Prefect CLI

Date: May 20, 2019 Author: Josh Meek

# Status

Accepted

# Context

A command line interface is an incredibly powerful and useful tool for many software products. Having a well rounded CLI in Prefect should be no exception. After this is adopted, Prefect Cloud will have three modes to work with: visually through the UI, programmatically through the GraphQL API, and textually through the CLI.

# Proposal

I am proposing the creation of a Prefect CLI that will be used both for Prefect Cloud control as well as local flow execution. The CLI will definitely be more Cloud focused however it will also allow for some control of locally existing flows, storage, and environments.

All of the groups and commands do not need to be built out on first pass and instead they should gradually evolve over time to suit user needs. Below I will go into small details about each group. These are not the final groups and are subject to change.

# Help Texts

Mock of the main help text when running prefect from the command line:

$ prefect
Usage: prefect [OPTIONS] COMMAND [ARGS]...

  The Prefect CLI for creating, managing, and inspecting your flows.

  Note: a Prefect Cloud auth token is required for all Cloud related commands. If a token
  is not set in your Prefect config.toml then run `prefect auth add` to set it.

  Query Commands:
      get         List high-level object information
      describe    Retrieve detailed object descriptions
      summarize   Aggregate query information

  Execution Commands:
      execute     Execute a flow's environment
      run         Run a flow

  Setup Commands:
      auth        Handle Prefect Cloud authorization

  Miscellaneous Commands:
      version     Get your current Prefect version
      config      Output your Prefect config

Options:
  -h, --help  Show this message and exit.

Mock of a group's commands (from prefect get):

$ prefect get --help
Usage: prefect get [OPTIONS] COMMAND [ARGS]...

  Get commands that refer to querying Prefect Cloud metadata.

  Usage:
      $ prefect get [OBJECT]

  Arguments:
      flow-runs   Query flow runs
      flows       Query flows
      projects    Query projects
      tasks       Query tasks

  Examples:
      $ prefect get flows
      NAME      VERSION   PROJECT NAME   AGE
      My-Flow   3         My-Project     3 days ago

      $ prefect get flows --project New-Proj --all-versions
      NAME        VERSION   PROJECT NAME   AGE
      Test-Flow   2         New-Proj       22 hours ago
      Test-Flow   1         New-Proj       1 month ago

      $ prefect get tasks --flow-name Test-Flow
      NAME          FLOW NAME   FLOW VERSION   AGE          MAPPED   TYPE
      first_task    Test-Flow   1              5 days ago   False    prefect.tasks.core.function.FunctionTask
      second_task   Test-Flow   1              5 days ago   True     prefect.tasks.core.function.FunctionTask

Options:
  -h, --help  Show this message and exit.

# Query Commands

These commands will be strictly cloud focused. Since Prefect Cloud allows rich metadata object manipulation and inspection, the CLI can query for their information in various ways.

prefect get will retrieve table formatted high level information about Prefect objects

prefect describe will retrieve more detailed JSON formatted metadata about Prefect objects

prefect summarize will retrieve summary statistics over time for Prefect objects

# Execution Commands

These commands deal with actual execution of code (both Cloud and local).

prefect execute allows users to specify environment information from Flow objects and both the setup and execute environment functions will be run

prefect run allows users to run their Flows via platforms and storage options such as Cloud, local, Docker, etc...

# Setup Commands

These commands enable users to easily manipulate Prefect configuration. Whether it be setting auth tokens for Prefect Cloud or handling environment-level changes; they can happen here.

# Miscallaneous Commands

These commands do not fall into another specific group and instead deal with processes such as viewing the current Prefect version or outputting a user's local config.

# Consequences

Adopting this CLI will allow for quicker user control over Prefect Cloud directly from the command line. The only downside I see is that this is largely based on Cloud so we need to take the necessary measures to include as many useful commands for working with local Prefect only.

# Actions

First pass PR will be accompanied with this PIN after it is debated on in the proposed issue. I already have a big CLI branch waiting to open a pull request if we decide that we are ready for this first pass.

Process we could take:

  • Merge in first draft of CLI
  • Start using it and write documentation
  • Improve and iterate on useful commands