code: def list_recipes():
      file_current_dir = Path(__file__).resolve().parent
      recipe_dir = file_current_dir.parent.parent / "recipes"
      file_list = list(recipe_dir.glob("*.yaml"))
      header = "| {:<30} |  {:<18} | {:<20} |".format(
          "Filename", "Pipeline", "Dataset"
      )
      typer.echo("=" * len(header))
      typer.echo(header)
      typer.echo("=" * len(header))
      output_list = []
      for file in file_list:
          cfg = yaml.safe_load(Path(file).open("r"))
          output_list.append(
              {
                  "file_name": file.name,
                  "pipeline_name": cfg["pipeline_name"],
                  "dataset_name": cfg["data"]["name"],
              }
          )
      # sort by pipeline, if same sort by dataset, if same sort by file name
      output_list.sort(
          key=lambda f: (
              f["pipeline_name"],
              f["dataset_name"],
              f["file_name"],
          )
      )
      for f in output_list:
          typer.echo(
              "| {:<30} |  {:<18} | {:<20} |".format(
                  f["file_name"], f["pipeline_name"], f["dataset_name"]
              )
          )
      typer.echo("=" * len(header))
  
file_path: dgl/dglgo/dglgo/cli/recipe_cli.py
imports: import os
  import shutil
  from pathlib import Path
  from typing import Optional
  import typer
  import yaml
label_desc: Use image node_id 1 for calling a global function with example usage: list_recipes() without return types