You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the Click 8.4.1 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
Fix Fish shell completion broken in 8.4.0 by #3126. Newlines and
tabs in option help text are now escaped, keeping the original completion
format while still supporting multi-line help. #3502#3043#3504#3508
Deprecated commands and options with empty or missing help text no longer
render a stray leading space before the (DEPRECATED) label. #3509
A {class}Group with invoke_without_command=True marks its subcommand as
optional in the usage help, showing [COMMAND] instead of COMMAND.
#3059#3507
echo_via_pager flushes after each write, so passing a generator streams
output to the pager incrementally instead of staying hidden until the pipe
buffer fills. #3242#2542#3534
echo_via_pager and get_pager_file no longer close a borrowed stdout
stream when no external pager runs, completing the partial
I/O operation on closed file fix from #3482. #3449#3533
Fix CLI usage symopsis for optional arguments producing double square brackets
[[a|b|c]]... whose type already brackets their metavar. #3578
{func}version_option resolves a package_name that does not match an
installed distribution as an import (top-level module) name via
{func}importlib.metadata.packages_distributions. Packages whose
top-level module name differs from their distribution name (PIL vs
Pillow, jwt vs PyJWT) no longer raise RuntimeError out of the
box. #2331#1884#3125#3582
Fix Fish shell completion broken in 8.4.0 by {pr}3126. Newlines and
tabs in option help text are now escaped, keeping the original completion
format while still supporting multi-line help. {issue}3502
{issue}3043 {pr}3504 {pr}3508
Deprecated commands and options with empty or missing help text no longer
render a stray leading space before the (DEPRECATED) label. {pr}3509
A {class}Group with invoke_without_command=True marks its subcommand as
optional in the usage help, showing [COMMAND] instead of COMMAND.
{issue}3059 {pr}3507
echo_via_pager flushes after each write, so passing a generator streams
output to the pager incrementally instead of staying hidden until the pipe
buffer fills. {issue}3242 {issue}2542 {pr}3534
echo_via_pager and get_pager_file no longer close a borrowed stdout
stream when no external pager runs, completing the partial
I/O operation on closed file fix from {pr}3482. {issue}3449
{pr}3533
Version 8.4.1
Released 2026-05-21
get_parameter_source() is available during eager callbacks and type
conversion again. {issue}3458 {pr}3484
Zsh completion scripts parse correctly on Windows. {issue}3277 {pr}3466
Shell completion of Enum values used as Choice options produces a
valid completion result. {issue}3015 {pr}3471
Fix empty byte-string handling in echo. {issue}3487 {pr}3493
Fix closed file error with echo_via_pager. {issue}3449 {pr}3482
Fix open_url on Windows when the file path contains spaces.
{issue}2994 {pr}3478
Version 8.4.0
Released 2026-05-17
{class}ParamType typing improvements. {pr}3371
{class}ParamType is now a generic abstract base class,
parameterized by its converted value type.
{meth}~ParamType.convert return types are narrowed on all
concrete types (str for {class}STRING, int for
{class}INT, etc.).
{meth}~ParamType.to_info_dict returns specific
{class}~typing.TypedDict subclasses instead of
dict[str, Any].
{class}CompositeParamType and the number-range base are now
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebase will rebase this PR
@dependabot recreate will recreate this PR, overwriting any edits that have been made to it
@dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
@dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Performance tests skipped in parallel mode due to memory ove...
3
Checkov not installed (pip install checkov)
3
Circuit breaker tests are timing-sensitive and don't run rel...
3
Requires VERTEX_PROJECT and NO GOOGLE_APPLICATION_CREDENTIAL...
2
Requires both VERTEX_PROJECT and GOOGLE_APPLICATION_CREDENTI...
2
Requires ANTHROPIC_API_KEY
2
Skipped inside Docker - Dockerfile not available in test ima...
2
Docker build tests skipped in parallel mode
2
⚠️ Action Items (94 tests need GitHub issues)
Action Items: Skipped Tests Without GitHub Issues
94 tests need GitHub issues created
For each test below, create a GitHub issue to track why it's skipped and when it should be enabled:
tests/builder/test_code_generator.py
test_generate_with_black_formatting_error_returns_unformatted_code (line 471)
- Reason: Black not installed - cannot test black formatting error path
- Action: Create issue and update skip decorator with issue number
tests/e2e/test_full_user_journey.py
test_01_concurrent_users (line 1202)
- Reason: Performance tests skipped in parallel mode due to memory overhead
- Action: Create issue and update skip decorator with issue number
test_02_large_conversation (line 1217)
- Reason: Performance tests skipped in parallel mode due to memory overhead
- Action: Create issue and update skip decorator with issue number
test_03_bulk_search (line 1232)
- Reason: Performance tests skipped in parallel mode due to memory overhead
- Action: Create issue and update skip decorator with issue number
tests/infrastructure/test_terraform_security.py
test_checkov_azure_secrets_compliance (line 389)
- Reason: Checkov not installed (pip install checkov)
- Action: Create issue and update skip decorator with issue number
test_checkov_aws_secrets_compliance (line 410)
- Reason: Checkov not installed (pip install checkov)
- Action: Create issue and update skip decorator with issue number
test_checkov_backend_setup_compliance (line 427)
- Reason: Checkov not installed (pip install checkov)
- Action: Create issue and update skip decorator with issue number
test_validate_uses_indexed_search_not_enumeration (line 84)
- Reason: API key validation tests skipped in parallel mode due to memory overhead with AsyncMock
- Action: Create issue and update skip decorator with issue number
test_indexed_lookup_performance_with_large_user_base (line 179)
- Reason: Performance tests skipped in parallel mode due to memory overhead (133GB VIRT, 42GB RES observed)
- Action: Create issue and update skip decorator with issue number
test_allowlist_mode_fails_closed_with_warning (line 63)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_none_network_mode_works_correctly (line 89)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_unrestricted_network_mode_enables_network (line 103)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_docker_sandbox_documents_allowlist_limitation (line 169)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_allowed_domains_ignored_when_network_disabled (line 211)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_empty_allowed_domains_with_unrestricted_mode (line 231)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_allowlist_will_require_allowed_domains (line 261)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
test_allowlist_mode_preserves_allowed_domains_config (line 280)
- Reason: Docker package not available
- Action: Create issue and update skip decorator with issue number
tests/integration/test_agent.py
test_real_llm_invocation (line 442)
- Reason: Requires ANTHROPIC_API_KEY
- Action: Create issue and update skip decorator with issue number
test_agent_with_dynamic_context (line 279)
- Reason: Requires full infrastructure (Qdrant, Redis, LLM) - set RUN_FULL_INTEGRATION_TESTS=1
- Action: Create issue and update skip decorator with issue number
test_agent_with_verification_loop (line 316)
- Reason: Requires full infrastructure - set RUN_FULL_INTEGRATION_TESTS=1 and ANTHROPIC_API_KEY
- Action: Create issue and update skip decorator with issue number
test_mock_full_workflow (line 364)
- Reason: Requires langchain-google-genai - set RUN_FULL_INTEGRATION_TESTS=1
- Action: Create issue and update skip decorator with issue number
tests/integration/test_context_manager_llm.py
test_full_extraction_workflow (line 515)
- Reason: Requires ANTHROPIC_API_KEY
- Action: Create issue and update skip decorator with issue number
test_check_database_connectivity_with_real_postgres (line 53)
- Reason: PostgreSQL not available on test port
- Action: Create issue and update skip decorator with issue number
test_create_connection_pool_with_real_postgres (line 78)
- Reason: PostgreSQL not available on test port
- Action: Create issue and update skip decorator with issue number
test_check_database_connectivity_with_invalid_credentials (line 123)
- Reason: PostgreSQL not available on test port
- Action: Create issue and update skip decorator with issue number
test_check_database_connectivity_with_nonexistent_database (line 144)
- Reason: PostgreSQL not available on test port
- Action: Create issue and update skip decorator with issue number
test_check_database_connectivity_timeout (line 165)
- Reason: PostgreSQL not available on test port
- Action: Create issue and update skip decorator with issue number
test_create_redis_checkpointer (line 53)
- Reason: Redis checkpointer not installed
- Action: Create issue and update skip decorator with issue number
tests/integration/test_docker_image_assets.py
test_dockerfile_excludes_deployments_directory (line 60)
- Reason: Skipped inside Docker - Dockerfile not available in test image
- Action: Create issue and update skip decorator with issue number
test_dockerfile_excludes_scripts_directory (line 110)
- Reason: Skipped inside Docker - Dockerfile not available in test image
- Action: Create issue and update skip decorator with issue number
test_docker_test_image_excludes_deployments_at_runtime (line 185)
- Reason: Docker build tests skipped in parallel mode
- Action: Create issue and update skip decorator with issue number
test_docker_test_image_excludes_scripts_at_runtime (line 255)
- Reason: Docker build tests skipped in parallel mode
- Action: Create issue and update skip decorator with issue number
tests/integration/test_openfga_client.py
test_full_authorization_flow (line 453)
- Reason: Requires running OpenFGA instance (set RUN_INTEGRATION_TESTS=1)
- Action: Create issue and update skip decorator with issue number
test_circuit_breaker_fails_closed_for_critical_resources (line 530)
- Reason: Circuit breaker tests are timing-sensitive and don't run reliably in pytest-xdist parallel mode
- Action: Create issue and update skip decorator with issue number
test_circuit_breaker_fails_open_for_non_critical_resources (line 576)
- Reason: Circuit breaker tests are timing-sensitive and don't run reliably in pytest-xdist parallel mode
- Action: Create issue and update skip decorator with issue number
test_circuit_breaker_defaults_to_critical_true (line 622)
- Reason: Circuit breaker tests are timing-sensitive and don't run reliably in pytest-xdist parallel mode
- Action: Create issue and update skip decorator with issue number
tests/integration/test_postgres_storage.py
test_concurrent_audit_log_writes (line 266)
- Reason: Requires RUN_CONCURRENT_POOL_TESTS=true and real asyncpg pool (SimplePool doesn't support concurrent operations)
- Action: Create issue and update skip decorator with issue number
tests/integration/test_secrets_manager.py
test_full_secret_lifecycle (line 424)
- Reason: Requires Infisical credentials (TEST_INFISICAL_CLIENT_ID, TEST_INFISICAL_CLIENT_SECRET, TEST_INFISICAL_PROJECT_ID)
- Action: Create issue and update skip decorator with issue number
tests/integration/test_vertex_ai_anthropic.py
test_claude_sonnet_4_5_via_vertex_ai (line 90)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_claude_haiku_4_5_via_vertex_ai (line 113)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_claude_opus_4_5_via_vertex_ai (line 136)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_claude_sonnet_4_5_reasoning (line 159)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_claude_with_conversation (line 182)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_uses_project_from_config (line 222)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_supports_multiple_regions (line 240)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_invalid_model_name (line 286)
- Reason: No reason provided
- Action: Create issue and update skip decorator with issue number
tests/integration/test_vertex_ai_auth_methods.py
test_workload_identity_claude (line 48)
- Reason: Requires VERTEX_PROJECT and NO GOOGLE_APPLICATION_CREDENTIALS (Workload Identity)
- Action: Create issue and update skip decorator with issue number
test_workload_identity_gemini (line 71)
- Reason: Requires VERTEX_PROJECT and NO GOOGLE_APPLICATION_CREDENTIALS (Workload Identity)
- Action: Create issue and update skip decorator with issue number
test_service_account_key_claude (line 102)
- Reason: Requires both VERTEX_PROJECT and GOOGLE_APPLICATION_CREDENTIALS
- Action: Create issue and update skip decorator with issue number
test_service_account_key_gemini (line 125)
- Reason: Requires both VERTEX_PROJECT and GOOGLE_APPLICATION_CREDENTIALS
- Action: Create issue and update skip decorator with issue number
test_auto_detect_auth_method (line 156)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
tests/integration/test_vertex_ai_google.py
test_gemini_3_pro_via_vertex_ai_explicit_prefix (line 41)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_gemini_3_pro_via_vertex_ai_implicit_routing (line 64)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_gemini_2_5_flash_via_vertex_ai (line 87)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_gemini_2_5_flash_via_vertex_ai_implicit (line 110)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_gemini_with_conversation (line 133)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_gemini_uses_project_from_config (line 171)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_gemini_supports_multiple_regions (line 191)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_prefix_vs_no_prefix_equivalence (line 212)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_gemini_invalid_model_name (line 269)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
test_vertex_ai_gemini_empty_message (line 289)
- Reason: VERTEX_PROJECT not set - requires Vertex AI access
- Action: Create issue and update skip decorator with issue number
tests/meta/test_docker_environment.py
test_docker_working_directory_is_app (line 226)
- Reason: Only in Docker test environment
- Action: Create issue and update skip decorator with issue number
tests/meta/validation/test_mermaid_validation.py
test_sequence_diagram_with_classdef_is_invalid (line 51)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_sequence_diagram_with_class_assignment_is_invalid (line 66)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_sequence_diagram_with_both_classdef_and_class_is_invalid (line 84)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_sequence_diagram_without_classdef_is_valid (line 102)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_flowchart_with_classdef_is_valid (line 118)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_non_sequence_diagram_skips_validation (line 131)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_mismatched_subgraph_end_is_invalid (line 153)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_matched_subgraph_end_is_valid (line 170)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_nested_subgraph_is_valid (line 186)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_simple_flowchart_without_subgraph_is_valid (line 202)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_sequence_diagram_skips_subgraph_validation (line 214)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_detects_sequence_diagram (line 235)
- Reason: Function not imported
- Action: Create issue and update skip decorator with issue number
test_detects_sequence_diagram_with_init (line 245)
- Reason: Function not imported
- Action: Create issue and update skip decorator with issue number
test_flowchart_is_not_sequence_diagram (line 256)
- Reason: Function not imported
- Action: Create issue and update skip decorator with issue number
test_detects_flowchart_diagram (line 265)
- Reason: Function not imported
- Action: Create issue and update skip decorator with issue number
test_detects_graph_as_flowchart (line 274)
- Reason: Function not imported
- Action: Create issue and update skip decorator with issue number
test_terraform_aws_irsa_diagram_pattern (line 292)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_keycloak_sso_diagram_pattern (line 325)
- Reason: Function not implemented yet
- Action: Create issue and update skip decorator with issue number
test_demonstrate_async_override_bug_explicitly (line 230)
- Reason: Intentionally skipped - this test demonstrates the bug and is expected to fail
- Action: Create issue and update skip decorator with issue number
test_parallel_execution_creates_independent_storage_instances (line 190)
- Reason: This test only meaningful in parallel execution mode
- Action: Create issue and update skip decorator with issue number
tests/unit/auth/test_api_key_manager.py
test_validate_api_key_beyond_first_page (line 542)
- Reason: Pagination tests skipped in parallel mode - creates 150 mock users causing memory overhead
- Action: Create issue and update skip decorator with issue number
test_validate_api_key_not_found_after_pagination (line 594)
- Reason: Pagination tests skipped in parallel mode - creates 150 mock users causing memory overhead
- Action: Create issue and update skip decorator with issue number
test_validate_api_key_pagination_stops_on_match (line 630)
- Reason: Pagination tests skipped in parallel mode - creates 250 mock users causing memory overhead
- Action: Create issue and update skip decorator with issue number
tests/unit/execution/test_security_practices.py
test_kubernetes_sandbox_does_not_use_insecure_md5 (line 46)
- Reason: kubernetes library not installed (optional dependency for kubernetes sandbox)
- Action: Create issue and update skip decorator with issue number
test_settings_injection_does_not_affect_global_settings (line 131)
- Reason: Settings isolation test may interfere with parallel execution
- Action: Create issue and update skip decorator with issue number
Target: Reduce untracked skipped tests to <20 (currently 94)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updates the requirements on click to permit the latest version.
Release notes
Sourced from click's releases.
Changelog
Sourced from click's changelog.
... (truncated)
Commits
b2e30a1Release version 8.4.27a16b20Fixpackage_nameresolution when module differs from distribution name (#3582)bec5928Fixpackage_nameresolution when top-level module differs from distribution...916883aFix tests to not rely on-Wdefaultoption (#3591)09195f6Fix double-bracketing of choices in synopsis (#3578)1557e26Check for warning exception with idiomatic context managerd9ff133Static typing improvements inclick.shell_completion(#3460)762c97eFix double-bracketing of choices in synopsis8929d39Convert changes to markdown. (#3559)237be50Move changes headings down a level.Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)