{"id":16298796,"url":"https://github.com/kdeldycke/click-extra","last_synced_at":"2026-05-14T22:05:24.120Z","repository":{"id":37090539,"uuid":"418402236","full_name":"kdeldycke/click-extra","owner":"kdeldycke","description":"🌈 Drop-in replacement for Click to make user-friendly and colorful CLI","archived":false,"fork":false,"pushed_at":"2026-03-01T06:11:53.000Z","size":25004,"stargazers_count":109,"open_issues_count":14,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T09:34:22.257Z","etag":null,"topics":["ansi-colors","cli","click","cloup","colorization","console","json","logging","multiplatform","pygments","pytest","python","python-tabulate","sphinx","terminal","toml","yaml"],"latest_commit_sha":null,"homepage":"https://kdeldycke.github.io/click-extra","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kdeldycke.png","metadata":{"files":{"readme":"readme.md","changelog":"changelog.md","contributing":null,"funding":".github/funding.yml","license":"license","code_of_conduct":".github/code-of-conduct.md","threat_model":null,"audit":null,"citation":"citation.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"kdeldycke"}},"created_at":"2021-10-18T08:02:27.000Z","updated_at":"2026-02-28T06:37:16.000Z","dependencies_parsed_at":"2023-10-01T16:10:35.482Z","dependency_job_id":"8f59c19a-7a7e-46c0-b85e-1eaca7aaa5d0","html_url":"https://github.com/kdeldycke/click-extra","commit_stats":{"total_commits":1010,"total_committers":5,"mean_commits":202.0,"dds":"0.15841584158415845","last_synced_commit":"5759c140a8636e8e49281940ecde1fcb78323963"},"previous_names":[],"tags_count":116,"template":false,"template_full_name":null,"purl":"pkg:github/kdeldycke/click-extra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdeldycke%2Fclick-extra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdeldycke%2Fclick-extra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdeldycke%2Fclick-extra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdeldycke%2Fclick-extra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kdeldycke","download_url":"https://codeload.github.com/kdeldycke/click-extra/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdeldycke%2Fclick-extra/sbom","scorecard":{"id":553088,"data":{"date":"2025-08-11","repo":{"name":"github.com/kdeldycke/click-extra","commit":"a26254a7a300ec9c129c4a03c96e3fb6eff67e01"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/23 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/autofix.yaml:1","Warn: no topLevel permission defined: .github/workflows/autolock.yaml:1","Warn: no topLevel permission defined: .github/workflows/changelog.yaml:1","Warn: no topLevel permission defined: .github/workflows/docs.yaml:1","Warn: no topLevel permission defined: .github/workflows/label-sponsors.yaml:1","Warn: no topLevel permission defined: .github/workflows/labeller-content-based.yaml:1","Warn: no topLevel permission defined: .github/workflows/labeller-file-based.yaml:1","Warn: no topLevel permission defined: .github/workflows/labels.yaml:1","Warn: no topLevel permission defined: .github/workflows/lint.yaml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Warn: no topLevel permission defined: .github/workflows/tests.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: invalid parameter name: .github/workflows/tests.yaml:141","Warn: third-party GitHubAction not pinned by hash: .github/workflows/autofix.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/autofix.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/autolock.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/autolock.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/changelog.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/changelog.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/docs.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/docs.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yaml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/docs.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/label-sponsors.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/label-sponsors.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/labeller-content-based.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/labeller-content-based.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/labeller-file-based.yaml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/labeller-file-based.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/labels.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/labels.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lint.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/lint.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yaml:132: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/tests.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yaml:150: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/tests.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yaml:155: update your workflow using https://app.stepsecurity.io/secureworkflow/kdeldycke/click-extra/tests.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/docs.yaml:22","Warn: pipCommand not pinned by hash: .github/workflows/tests.yaml:135","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  13 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license:0","Info: FSF or OSI recognized license: GNU General Public License v2.0: license:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v5.1.0 not signed: https://api.github.com/repos/kdeldycke/click-extra/releases/237118512","Warn: release artifact v5.0.2 not signed: https://api.github.com/repos/kdeldycke/click-extra/releases/222219135","Warn: release artifact v5.0.1 not signed: https://api.github.com/repos/kdeldycke/click-extra/releases/221519310","Warn: release artifact v5.0.0 not signed: https://api.github.com/repos/kdeldycke/click-extra/releases/218270539","Warn: release artifact v4.15.0 not signed: https://api.github.com/repos/kdeldycke/click-extra/releases/203838613","Warn: release artifact v5.1.0 does not have provenance: https://api.github.com/repos/kdeldycke/click-extra/releases/237118512","Warn: release artifact v5.0.2 does not have provenance: https://api.github.com/repos/kdeldycke/click-extra/releases/222219135","Warn: release artifact v5.0.1 does not have provenance: https://api.github.com/repos/kdeldycke/click-extra/releases/221519310","Warn: release artifact v5.0.0 does not have provenance: https://api.github.com/repos/kdeldycke/click-extra/releases/218270539","Warn: release artifact v4.15.0 does not have provenance: https://api.github.com/repos/kdeldycke/click-extra/releases/203838613"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T11:29:14.256Z","repository_id":37090539,"created_at":"2025-08-20T11:29:14.257Z","updated_at":"2025-08-20T11:29:14.257Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30221193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T14:02:48.375Z","status":"ssl_error","status_checked_at":"2026-03-07T14:02:43.192Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi-colors","cli","click","cloup","colorization","console","json","logging","multiplatform","pygments","pytest","python","python-tabulate","sphinx","terminal","toml","yaml"],"created_at":"2024-10-10T20:45:25.137Z","updated_at":"2026-05-14T22:05:24.113Z","avatar_url":"https://github.com/kdeldycke.png","language":"Python","funding_links":["https://github.com/sponsors/kdeldycke"],"categories":["CLI Development"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/kdeldycke/click-extra/\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/kdeldycke/click-extra/main/docs/assets/logo-banner.svg\" alt=\"Click Extra\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n[![Last release](https://img.shields.io/pypi/v/click-extra.svg)](https://pypi.org/project/click-extra/)\n[![Python versions](https://img.shields.io/pypi/pyversions/click-extra.svg)](https://pypi.org/project/click-extra/)\n[![Downloads](https://static.pepy.tech/badge/click-extra/month)](https://pepy.tech/projects/click-extra)\n[![Unittests status](https://github.com/kdeldycke/click-extra/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/kdeldycke/click-extra/actions/workflows/tests.yaml?query=branch%3Amain)\n[![Coverage status](https://codecov.io/gh/kdeldycke/click-extra/graph/badge.svg?token=PMEcGfrVEs)](https://codecov.io/gh/kdeldycke/click-extra)\n[![Documentation status](https://github.com/kdeldycke/click-extra/actions/workflows/docs.yaml/badge.svg?branch=main)](https://github.com/kdeldycke/click-extra/actions/workflows/docs.yaml?query=branch%3Amain)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7116050.svg)](https://doi.org/10.5281/zenodo.7116050)\n\n## What is Click Extra?\n\nIt should be easy to write a good CLI in Python. [Click](https://click.palletsprojects.com) makes it so. But there is still hundrends of tweaks to implement by yourself to have a user-friendly CLI.\n\nClick Extra is a **ready-to-use wrapper around Click** to make your CLI look good and behave well. It is a drop-in replacement with good defaults that saves lots of boilerplate code and frustration by making all parts working together.\n\nIt also comes with [workarounds and patches](https://kdeldycke.github.io/click-extra/upstream.html) that have not reached upstream yet (or are unlikely to).\n\n## Who is this for?\n\nAnyone building a CLI who doesn't have time to assemble the pieces from scratch:\n\n- You use Click and want professional defaults without the boilerplate.\n- You're a security researcher turning a proof-of-concept into a presentable tool to hand off, demo, or attach to an advisory.\n- You're a DevOps engineer or sysadmin whose one-off script grew into a team tool and needs `--help`, `--verbose`, `--config`, and colored output.\n\nClick Extra's defaults-first design means one decorator gets you there. See the [30-second quick start](https://kdeldycke.github.io/click-extra/tutorial.html#from-script-to-cli-in-30-seconds).\n\n## Demo\n\nYou can try Click Extra right now in your terminal, without installing any dependency or virtual env [thanks to `uvx`](https://docs.astral.sh/uv/guides/tools/):\n\n```shell-session\n$ uvx click-extra\n```\n\nThis is a great way to play with Click Extra and check that it runs fine on your system, and renders properly in your terminal.\n\n## Example\n\nIt transforms this vanilla `click` CLI:\n\n![click CLI help screen](https://raw.githubusercontent.com/kdeldycke/click-extra/main/docs/assets/click-help-screen.png)\n\nInto this:\n\n![click-extra CLI help screen](https://raw.githubusercontent.com/kdeldycke/click-extra/main/docs/assets/click-extra-screen.png)\n\nTo undestrand how we ended up with the result above, [go read the tutorial](https://kdeldycke.github.io/click-extra/tutorial.html).\n\n## Features\n\n### Configuration\n\n- [Multi-format configuration file](https://kdeldycke.github.io/click-extra/config.html) loader for:\n  - `TOML`\n  - `YAML`\n  - `JSON`, `JSON5`, `JSONC` and `HJSON`\n  - `INI`, with extended interpolation, multi-level sections and non-native types (`list`, `set`, …)\n  - `XML`\n- Automatic [`pyproject.toml` integration](https://kdeldycke.github.io/click-extra/config.html#dotted-keys): the CLI reads its `[tool.\u003ccli\u003e]` section from the user's project file, including a CWD-aware walk that skips unrelated `pyproject.toml` files\n- [Inference of the configuration file structure](https://kdeldycke.github.io/click-extra/config.html#standalone-option) from your CLI's options, with optional [dataclass schema typing](https://kdeldycke.github.io/click-extra/config.html#schema-only-configuration) so values arrive parsed and validated\n- Remote loading of [configuration from URLs](https://kdeldycke.github.io/click-extra/config.html#remote-url)\n- Optional [strict validation](https://kdeldycke.github.io/click-extra/config.html#strictness) of configuration with `--validate-config`\n- [Extension hook](https://kdeldycke.github.io/click-extra/config.html#extending-validation) (`ConfigValidator`) for user-defined sub-trees whose keys are *data* rather than CLI flags (per-plugin overrides, matrix axes, user-defined IDs), with rooted `ValidationError` reporting\n- Respect the [default application path](https://kdeldycke.github.io/click-extra/config.html#default-folder) on each platform (XDG spec. on Linux)\n- [Glob search patterns](https://kdeldycke.github.io/click-extra/config.html#search-pattern) for configuration files\n- A `--no-config` option to disable configuration file loading\n- Respect of `CLI` \u003e `Configuration` \u003e `Environment` \u003e `Defaults` [precedence](https://kdeldycke.github.io/click-extra/config.html#precedence)\n\n### Help screens and theming\n\n- [Colorized help screens](https://kdeldycke.github.io/click-extra/colorize.html): options, choices, metavars, arguments, defaults, ranges, required labels, environment variables, subcommands and aliases all get distinct styles. Option names referenced in descriptions and docstrings are [highlighted automatically](https://kdeldycke.github.io/click-extra/colorize.html#cross-reference-highlighting)\n- [Theme system](https://kdeldycke.github.io/click-extra/theme.html) with six built-in palettes ([`dark`, `light`, `dracula`, `monokai`, `nord`, `solarized_dark`](https://kdeldycke.github.io/click-extra/theme.html#built-in-themes))\n- [User-defined themes and partial overrides loaded from the CLI's `--config` file](https://kdeldycke.github.io/click-extra/theme.html#themes-from-your-config-file) (`[tool.\u003ccli\u003e.themes.\u003cname\u003e]`), scoped per invocation so concurrent runs don't bleed into each other\n- [`--theme` flag](https://kdeldycke.github.io/click-extra/theme.html#the-theme-option) on every command, with case-insensitive validation against the live registry\n- `-h`/`--help` option names (see [rant on other inconsistencies](https://blog.craftyguy.net/cmdline-help/))\n- Built-in [`help` subcommand](https://kdeldycke.github.io/click-extra/commands.html#help-subcommand) with a `--search` mode for groups\n\n### Standard options on every CLI\n\n- [Colored `--version`](https://kdeldycke.github.io/click-extra/version.html) with [template variables](https://kdeldycke.github.io/click-extra/version.html#variables) for git metadata (branch, hash, date, tag) and [pre-baking](https://kdeldycke.github.io/click-extra/version.html#pre-baking-git-metadata) for compiled binaries (Nuitka, PyInstaller)\n- [Colored `--verbosity` LEVEL and logs](https://kdeldycke.github.io/click-extra/logging.html), plus `-v`/`--verbose` repetition for incremental bumping\n- [`--show-params`](https://kdeldycke.github.io/click-extra/parameters.html#show-params-option) to debug parameter defaults, values, environment variables and provenance\n- [`--time`/`--no-time`](https://kdeldycke.github.io/click-extra/timer.html) to measure command execution duration\n- [`--table-format`](https://kdeldycke.github.io/click-extra/table.html#table-formats) to switch between 40+ table-rendering styles (uses [`print_table()`](https://kdeldycke.github.io/click-extra/table.html) and [`serialize_data()`](https://kdeldycke.github.io/click-extra/table.html#data-serialization))\n- [`--jobs`](https://kdeldycke.github.io/click-extra/jobs.html) for parallel-execution worker counts\n- `--telemetry`/`--no-telemetry` flag to opt-in/out of tracking code\n- `--color`/`--no-color` option flag, with recognition of `NO_COLOR` ([no-color.org](https://no-color.org)), `FORCE_COLOR`, `CLICOLOR`, and `LLM` environment variables\n- Recognition of `DO_NOT_TRACK` from [consoledonottrack.com](https://consoledonottrack.com) for telemetry\n- Global `show_envvar` option to display all environment variables in help screens\n- Global `show_choices` to activate selection of choices on user input prompts\n- Auto-generation and normalization of environment variables for all options\n\n### Types and parameters\n\n- [`EnumChoice`](https://kdeldycke.github.io/click-extra/types.html#enumchoice) — `click.Choice` subclass with proper `Enum` rendering, case-insensitive matching, alias support, and pluggable [choice sources](https://kdeldycke.github.io/click-extra/types.html#choice-source)\n- [Click parameter introspection](https://kdeldycke.github.io/click-extra/parameters.html#introspecting-parameters) and a [shared parameter structure](https://kdeldycke.github.io/click-extra/parameters.html#parameter-structure) used by both `--show-params` and the config loader\n\n### CLI wrapper\n\n- [CLI wrapper](https://kdeldycke.github.io/click-extra/wrap.html) (`click-extra wrap`) applies help colorization, themes, and config loading to any Click CLI without modifying its source code\n- [`show-params` subcommand](https://kdeldycke.github.io/click-extra/wrap.html#introspecting-external-clis) to introspect any external Click CLI's parameters\n- [User-defined themes via `--config`](https://kdeldycke.github.io/click-extra/wrap.html#custom-themes-via-config) work transparently through the wrapper, so users can theme third-party CLIs from their own `pyproject.toml`\n\n### Performance and structure\n\n- [Lazy-loading of subcommands](https://kdeldycke.github.io/click-extra/commands.html#lazily-loading-subcommands) from module paths to speed up CLI startup time\n- [Composition with third-party Click CLIs](https://kdeldycke.github.io/click-extra/commands.html#third-party-commands-composition) (`wrap_other_commands`)\n\n### Documentation tooling\n\n- [`click:source` and `click:run` Sphinx directives](https://kdeldycke.github.io/click-extra/sphinx.html#click-directives) in MyST Markdown and reStructuredText to document CLI source code and their execution\n- [`python:source`, `python:run`, `python:render`, `python:render-myst`, `python:render-rst`](https://kdeldycke.github.io/click-extra/sphinx.html#python-directives) — the same machinery for arbitrary Python, with a `render*` family that parses the captured output as live document content (replaces the `docs_update.py` + marker-region pattern)\n- [Inline testing of CLI examples](https://kdeldycke.github.io/click-extra/sphinx.html#inline-tests) in documentation: every `click:run` block runs at build time and assertions fail the build\n- Render [GitHub alerts](https://kdeldycke.github.io/click-extra/sphinx.html) into MyST admonitions in both Sphinx and MkDocs\n- [ANSI-capable Pygments lexers](https://kdeldycke.github.io/click-extra/pygments.html#ansi-language-lexers) for shell session and console output, with [24-bit true-color rendering](https://kdeldycke.github.io/click-extra/pygments.html#bit-true-color) on by default\n- [`AnsiHtmlFormatter`](https://kdeldycke.github.io/click-extra/pygments.html#ansi-html-formatter) for HTML output of ANSI-colored text\n- [MkDocs plugin](https://kdeldycke.github.io/click-extra/mkdocs.html) for ANSI color rendering in code blocks\n\n### Testing\n\n- [`ExtraCliRunner`](https://kdeldycke.github.io/click-extra/testing.html) — `click.testing.CliRunner` subclass that captures `stdout` and `stderr` separately and preserves ANSI codes for assertion against colored output\n- [pytest fixtures](https://kdeldycke.github.io/click-extra/pytest.html#fixtures) (`invoke`, `extra_runner`, `create_config`) and ready-made regex helpers (`default_options_uncolored_help`, `default_debug_*`) for click-extra-aware test suites\n\n### Upstream\n\n- [Fixes 100+ bugs and addresses missing features](https://kdeldycke.github.io/click-extra/upstream.html) across Click, Cloup, Pygments, tabulate, MyST-Parser, Furo, and unmaintained `click-contrib` packages\n- Drop-in replacement for [Click](https://click.palletsprojects.com) and [Cloup](https://github.com/janluke/cloup): every `from click_extra import …` and `@click_extra.command` works as a transparent superset. Cloup provides option groups, constraints, subcommand sections, aliases, and `Did you mean \u003csubcommand\u003e?` suggestions; click-extra adds everything above on top.\n\n## Used in\n\nCheck these projects to get real-life examples of `click-extra` usage:\n\n- ![GitHub stars](https://img.shields.io/github/stars/kdeldycke/meta-package-manager?label=%E2%AD%90\u0026style=flat-square) [Meta Package Manager](https://github.com/kdeldycke/meta-package-manager#readme)\n  \\- A unifying CLI for multiple package managers.\n- ![GitHub stars](https://img.shields.io/github/stars/kdeldycke/mail-deduplicate?label=%E2%AD%90\u0026style=flat-square) [Mail Deduplicate](https://github.com/kdeldycke/mail-deduplicate#readme) - A\n  CLI to deduplicate similar emails.\n- ![GitHub stars](https://img.shields.io/github/stars/Sprocket-Security/fireproxng?label=%E2%AD%90\u0026style=flat-square) [fireproxng](https://github.com/Sprocket-Security/fireproxng#readme) - A rewrite of the fireprox tool.\n- ![GitHub stars](https://img.shields.io/github/stars/couchbaselabs/agent-catalog?label=%E2%AD%90\u0026style=flat-square) [agent-catalog](https://github.com/couchbaselabs/agent-catalog#readme) - Couchbase agent catalog.\n- ![GitHub stars](https://img.shields.io/github/stars/hugolundin/badger?label=%E2%AD%90\u0026style=flat-square) [badger-proxy](https://github.com/hugolundin/badger#readme) - An mDNS-based reverse\n  proxy for naming services on a local network.\n\nFeel free to send a PR to add your project in this list if you are relying on Click Extra in any way.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdeldycke%2Fclick-extra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkdeldycke%2Fclick-extra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdeldycke%2Fclick-extra/lists"}