v9.0.0
- Breaking: Raise the Click floor from
8.3.1to8.4.1, dropping the compatibility shims the8.3.xreleases needed. - Breaking: Rename every camel-cased spinner preset to kebab case, so
boxBounceis nowbox-bounce. - Breaking: Rename the
solarized_darktheme tosolarized-dark. - Breaking: Remove the
timeTravelspinner preset, which isSPINNERS["clock"]withreverse=True. - Breaking:
--mannow typesets the manual and pages it, the waymandoes, instead of printing roff to stdout; the source moved to--help-format man. - Breaking: Remove
click-extra wrap --carapacein favor ofwrap --help-format carapace, one option carrying every rendering. - Breaking: Rename the
click_extra.man_pagemodule toclick_extra.command_doc, after the model it is built around rather than one of the four formats it renders. - Breaking: Rename
ManPagetoCommandDoc,ManOptionItemtoDocOptionItem,ManOptionGrouptoDocOptionGroupandextract_manpage()toextract_command_doc(). - Breaking: Remove every deprecated alias scheduled for removal in
9.0.0: theclick_extra.test_planmodule, the root-level test-plan and config-schema names, and the invocation and pre-baking helpers' old homes. - Breaking:
ConfigOption.search_and_read_file()yields(location, content, media_type)triples instead of(location, content)pairs. - Breaking:
LazyGroup.lazy_subcommandsholdsLazySubcommandinstances instead of import-path strings; the constructor still accepts either. - Deprecated: Rename the
color_envvarsandnocolor_themeconstants toCOLOR_ENVVARSandNOCOLOR_THEME, following the uppercase convention; the old names resolve until10.0.0. - Deprecated: Move the generic
patch_attr(),generator_tag()andmissing_extra_message()helpers fromclick_extra.parametersto the newclick_extra._utilsmodule; the old homes resolve until10.0.0. - Add a
click-extra screenshotsubcommand capturing any CLI's colored output as an SVG image, an HTML document or raw escape sequences. - Add a
click_extra.screenshotmodule rendering a capture on a character grid, needing no optional dependency for either format. - Draw a capture as a macOS, Windows, GNOME or plain terminal with
--preset, each catalogued in the newclick_extra.screenshot_presetsmodule. - Restate the window a capture is drawn in with
--background,--border,--border-width,--radius,--shadow,--margin,--padding,--opacity,--titleand a--backdropaccepting a plain color or a CSS gradient. - Number and band a capture's lines with
--line-numbersand--emphasize-lines, and credit it with--watermarkand--watermark-color. - Lay a capture out at the longest line it holds with an
autowidth, or emit it as a bare inline-styled HTML block with--fragment. - Add a
--wrapoption toclick-extra screenshot, routing the target through thewrapsubcommand so a foreign Click CLI is captured with its colors. - Tell a captured command its chrome through
CLITHEMEandCOLORFGBG, so a CLI passing--theme autorenders for the window it lands in. - Add a
click-extra snippetsubcommand and aclick_extra.snippetmodule coloring a source file with Pygments and drawing it in a screenshot's window, painted by--syntax-style. - Capture a
click:runblock's output, or aclick:sourceorpython:sourceblock's own code, beside the documentation with:screenshot:, every command option restated as:screenshot-*:and defaulted byclick_extra_screenshot_*settings. - Add a
:mirror:option to theclick:rundirective, keeping a Markdown link to that capture in the source, refreshed byrefresh-directives. - Add a
click_extra.recordingmodule rebuilding a terminal's screen from the stream a command writes at it, in-process withScreenRecorderor from a Unix command withrecord_command. - Render an animated SVG capture from a sequence of frames, tuned by
hold,blank,speedandquantize(), and fed by the newSpinner.frame_lines(). - Animate a documented capture with
:screenshot-animate:,:screenshot-interval:and:screenshot-record:, the last committing a recording once instead of rewriting it on every build. - Harden every SVG capture and brand asset against renderers ignoring
<style>or resolving clips, filters and glyph widths differently, so an image draws the same outside a browser. - Add a
--help-format FORMAToption on every command, rendering it asjson,json-full,man,markdown,markdown-fullorcarapace. - Add a
--help-formatmode toclick-extra wrap, rendering any foreign Click CLI in those same formats without running it. - Add
render_help(), theHELP_FORMATSandINSTALLABLE_FORMATSregistries, and theto_markdown(),to_dict(),to_json(),read_manpage(),format_manpage()andinstall_manpages()backends behind them. - Add
--output-dirand--installto every installablewrap --help-formatrendering, so a man page reaches your man directory the way a Carapace spec reaches Carapace's. - Strip the man page's overstrike emphasis under
--accessible, which a screen reader voices instead of skipping. - Add an
examples=[("description", "command")]parameter to@commandand@group, rendered in help screens, man pages and every--help-format. - Add a
sqliteconfiguration file format, reading aconfigtable of dotted keys and JSON-encoded values from*.sqliteand*.sqlite3databases with the built-insqlite3module. Closes #124. - Add a
plistconfiguration file format, reading*.plistproperty lists in both their XML and binary variant through the built-inplistlibmodule, and dumping them with--export-config. Closes #123. - Add an
argfileconfiguration file format, reading*.conffiles as a plain-text list of command-line options, one per line, in the style ofmpvandyt-dlp. Closes #340. - Add a
cascadeargument to@config_option, layering every discovered configuration file into the defaults, most-local first, and listing them in a newCONF_SOURCEScontext key. Closes #581. - Guess the format of a configuration downloaded over HTTP from the
Content-Typethe server advertises, resolved by the newformat_from_mime()and per-formatmime_types. - Add opt-in
helpandconfig_filecolumns to--params, naming a parameter's help text and the configuration layer its value came from, backed by a newoptionalfield onColumnSpec. - Add
sort_subcommandsandsubcommand_prioritiesto@group, plus asort_subcommandscontext setting inherited by every subgroup, ordering subcommands by registration or priority. Closes #544. - Add an
option_prioritiesargument to@commandand@group, reordering the help screen without moving the order option callbacks run in, plusiter_params_for_display(). Closes #544. - Add
LazySubcommand, declaring a lazy subcommand's Cloupsectionandfallback_to_default_sectionbeside its import path. - Add
@multicall_group, BusyBox-styleargv[0]dispatch: invoked under a subcommand's name, the group runs as that subcommand, exposed asINVOCATION_NAME. Closes #1619. - Add the
{build_time},{build_os},{build_target}and{build_target_arch}version template variables, baked byclick-extra prebake allfromSOURCE_DATE_EPOCH. - Add a
VersionScreendrawing--versionas a logo with facts beside it, mounted via@version_option(screen=…), plus aclick_extra.logomodule andVersionOption.field_style(). - Add a machine-wide
CLICK_EXTRA_THEMEenvironment variable naming the help-screen palette of every Click Extra CLI at once, withautonow advertised in the help screen and in shell completion. - Add
parse_envvar_flag()toclick_extra.envvar, the one permissive boolean reading shared by the color,--accessibleand--telemetryenvironment flags. - Add
themeandpromptparameters toformat_cli_prompt(), and athemeparameter tohighlight_bin_name(), so a caller picks the palette and sigil it draws. - Add a
--debugflag to every Click Extra CLI, shorthand for--verbosity DEBUG, which outranks--verbosity,-vand-q, and dump{env_info}as indented JSON in those logs. - Set or remove a
test-suitecase's environment withenvandunset_env, and run it elsewhere with--work-directoryor the newcwdargument ofrun_cli(). - Add
:show-prompt:and:hide-prompt:options to theclick:runSphinx directive, drawing or dropping the invocation above the output it produced. - Count CPUs for
--jobswithos.process_cpu_count()on Python 3.13+, honoring a container's cgroup quota and affinity, and use both CPUs of a two-CPU host. - Align a table carrying an emoji-presentation sequence (
⁉️) the way the running terminal advances and paints it, rather than assuming one column. - Split a test case's
cli_parametersstring with the Windows tokenizer on Windows, so--city "San Francisco"stays one argument instead of three. - Render a
click:runblock's environment variables as assignments on the invocation ($ WEATHER_UNITS=fahrenheit weather Paris) instead of a separate$ exportline. - Deduplicate the Sphinx
todolistpage, whichsphinx.ext.todofills with one entry per rendering of a{todo}directive instead of one per directive. - Track Click
8.5.0: keepclick_extra.testing.isolated_filesystem()alive, re-exportcustom_version_option, and keepget_binary_streamandget_text_streambound by a star import. - Speed up ANSI tokenization, help-screen keyword highlighting and SVG grid layout.
- Fix
--versionpainting the program name and version from thedarkpalette whatever--themewas picked, and caching the first invocation's name forever. - Fix
--versionrendering no version at all in aclick:rundocumentation block, which resolved the CLI against the directive's own runner instead of the documented command. - Fix a
--themeresolved from the environment, or typed after--help, not reaching the screens that render and exit. - Fix options computing their help from the context (
-v,-q) rendering blank in man pages and--params. - Fix
--paramsresolving subcommand parameter values and sources against the root context, which left theirValueandSourcecolumns at the defaults. - Fix the configuration parse-error message leaving a dangling
orwhen the--configoption accepts a single format. - Fix
--color=alwaysleaving a wrapped CLI uncolored when its commands come from plain@click.command()decorators. - Fix
--colorand--no-colorcallbacks publishing the process-wide color state from resilient introspection contexts, pinning aNO_COLORenvironment onto every CLI lacking its own color option. - Fix
wrapnaming a target after click-extra's own launch mode in its usage line, and after the script path in a rendering, which produced a Carapace spec binding to nothing. - Fix
env_copy()rejecting aNonevalue instead of removing that variable, as itsMapping[str, str | None]type andclick.testing.CliRunnerboth promise. - Fix
HelpFormatterinstances sharing one class-level keyword collection as their default. - Fix
click_extra.sphinxrefusing to import whenmyst-parseris not installed, which broke reST-only documentation builds. - Fix the source line a Sphinx warning reports when raised inside a block a
click:*orpython:*directive generates. - Fix the
click:rundirective handing Click only the last word of a multi-wordprog_name, which made a wrapped CLI report a name its own prompt line contradicted. - Fix the
gradientdemo overflowing an 80-column terminal by one character, which wrapped every ramp onto a second line. - Escape quotes in an OSC 8 hyperlink's URL when
AnsiHtmlFormatterrenders it, so a quote in the URL can no longer break out of thehrefattribute. - Trim the trailing space upstream pads its emoji spinner frames with, so a label sits one space from the glyph and a capture centers it.
- Reword the
--accessiblehelp so cross-reference highlighting stops painting itsplainas a--table-formatchoice. - Illustrate the readme and the documentation with live captures, superseding hand-drawn screenshots that still advertised the long-gone
--show-paramsand-C, --configoptions. - Ship a subset of JuliaMono with the documentation, so box-drawing and Braille glyphs stop breaking the alignment of captured terminal tables.
- Document
CliRunner, the Pytest fixtures and helpers, and the parameter tree behind--params, replacing four placeholder sections. - Give the machine-readable renderings a page of their own, move the
examples=guide beside the other command-authoring options, and trim the mechanics no reader acts on. - Illustrate how the
--jobsdefault,autoandmaxresolve across CPU arrangements in a table on the parallel-jobs page. - Refresh the readme's list of projects using Click Extra, split between those building a CLI on it and those rendering their documentation with it.
- Collect this project's scattered
TODOandFIXMEnotes into{todo}admonitions, so thetodolistpage carries every planned change. - Replace the star-history.com embed on the benchmark page, broken by GitHub's 2026 stargazer restriction, with a chart sampled weekly into the repository.
Full changelog: v8.9.1...v9.0.0