def METHOD_NAME() -> ArgumentParser:
    parser = ArgumentParser(
        description=f"ENIGMA HALFpipe {__version__} is a user-friendly interface "
        "for performing reproducible analysis of fMRI data, including preprocessing, "
        "single-subject feature extraction, and group analysis."
    )
    basegroup = parser.add_argument_group("base", "")
    basegroup.add_argument(
        "--workdir",
        "--wd",
        type=str,
        help="directory where output and intermediate files are stored",
    )
    basegroup.add_argument("--fs-root", help="path to the file system root")
    basegroup.add_argument("--verbose", action="store_true", default=False)
    basegroup.add_argument("--existing-spec-file", action="store_true", default=False)
    stepgroup = parser.add_argument_group("steps", "")
    for step in steps:
        steponlygroup = stepgroup.add_mutually_exclusive_group(required=False)
        steponlygroup.add_argument(f"--only-{step}", action="store_true", default=False)
        steponlygroup.add_argument(f"--skip-{step}", action="store_true", default=False)
    workflowgroup = parser.add_argument_group("workflow", "")
    workflowgroup.add_argument("--nipype-omp-nthreads", type=int)
    workflowgroup.add_argument("--fs-license-file")
    workflowgroup.add_argument(
        "--use-cluster",
        action="store_true",
        default=False,
        help="generate workflow suitable for running on a cluster",
    )
    rungroup = parser.add_argument_group("run", "")
    rungroup.add_argument("--graphs-file", type=str, help="manually select graphs file")
    rungroup.add_argument("--uuid", type=str, help="load graphs based on this uuid")
    rungroup.add_argument(
        "--subject-include",
        action="append",
        default=[],
        help="include only subjects that match",
    )
    rungroup.add_argument(
        "--subject-exclude",
        action="append",
        default=[],
        help="exclude subjects that match",
    )
    rungroup.add_argument("--subject-list", type=str, help="select subjects that match")
    rungroup.add_argument(
        "--n-chunks", type=int, help="merge subject workflows to n chunks"
    )
    rungroup.add_argument(
        "--max-chunk-size",
        type=int,
        help="maximum number of subjects per chunk",
        default=64,
    )
    rungroup.add_argument("--subject-chunks", action="store_true", default=False)
    rungroup.add_argument(
        "--only-chunk-index", type=int, help="select which chunk to run"
    )
    rungroup.add_argument("--only-model-chunk", action="store_true", default=False)
    rungroup.add_argument("--nipype-memory-gb", type=float)
    rungroup.add_argument(
        "--nipype-n-procs", "--n-procs", "--num-threads", type=int, default=cpu_count()
    )
    rungroup.add_argument("--nipype-run-plugin", type=str, default="MultiProc")
    rungroup.add_argument(
        "--nipype-resource-monitor", action="store_true", default=False
    )
    rungroup.add_argument(
        "--keep",
        choices=["all", "some", "none"],
        default="some",
        help="choose which intermediate files to keep",
    )
    parser.add_argument(
        "-v",
        "--version",
        action="store_true",
        help="print the version number and exit",
        default=False,
    )
    debuggroup = parser.add_argument_group("debug", "")
    debuggroup.add_argument("--debug", action="store_true", default=False)
    debuggroup.add_argument("--profile", action="store_true", default=False)
    debuggroup.add_argument("--watchdog", action="store_true", default=False)
    subparsers = parser.add_subparsers(dest="command")
    commands = [
        GroupLevelCommand(),
    ]
    for command in commands:
        command.setup(subparsers.add_parser)
    return parser