Skip to content

2.4.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 02:37
· 37 commits to main since this release

For more detailed setup instructions, see https://rules-python.readthedocs.io/en/latest/getting-started.html

For the user-facing changelog see here

Using Bzlmod

Add to your MODULE.bazel file:

bazel_dep(name = "rules_python", version = "2.4.0")

python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
    python_version = "3.14",
)

pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
    hub_name = "pypi",
    python_version = "3.14",
    requirements_lock = "//:requirements_lock.txt",
)

use_repo(pip, "pypi")

Using WORKSPACE

Paste this snippet into your WORKSPACE file:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_python",
    sha256 = "4f4e68bd0e385fb8550b72c77f11ff51c8abd39ea872bfb2f62cc9032c600751",
    strip_prefix = "rules_python-2.4.0",
    url = "https://github.com/bazel-contrib/rules_python/releases/download/2.4.0/rules_python-2.4.0.tar.gz",
)

load("@rules_python//python:repositories.bzl", "py_repositories")

py_repositories()

Gazelle plugin

Paste this snippet into your WORKSPACE file:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "rules_python_gazelle_plugin",
    sha256 = "4f4e68bd0e385fb8550b72c77f11ff51c8abd39ea872bfb2f62cc9032c600751",
    strip_prefix = "rules_python-2.4.0/gazelle",
    url = "https://github.com/bazel-contrib/rules_python/releases/download/2.4.0/rules_python-2.4.0.tar.gz",
)

# To compile the rules_python gazelle extension from source,
# we must fetch some third-party go dependencies that it uses.

load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps")

_py_gazelle_deps()

What's Changed

  • chore: generate release changelog from news entries by @rickeylev in #3827
  • fix(coverage): skip lcov report when no data was collected by @maxbirkner in #3832
  • fix(pypi): respect empty envsubst expansion in experimental_index_url by @kriscfoster in #3828
  • refactor(pypi): don't use Python to patch wheels by @aignas in #3808
  • feat(py_info): expose VenvSymlinkEntry and VenvSymlinkKind as public APIs by @rickeylev in #3835
  • doc: merge news into generated changelog by @rickeylev in #3836
  • ci: enable bazel-diff by @rickeylev in #3838
  • fix: run bazel-diff in cquery mode under bazelci by @rickeylev in #3839
  • ci: disable bazel-diff due to platform compatibility conflicts by @rickeylev in #3840
  • chore: warn on implicit init.py creation by @rickeylev in #3841
  • fix(bootstrap): use retry loop for win32 version lookup in site init template by @rickeylev in #3842
  • fix(rules): disambiguate slash target venv outputs by @gleyba in #3845
  • chore: automate releases by @rickeylev in #3833
  • build(deps): bump actions/checkout from 6 to 7 by @dependabot[bot] in #3843
  • chore: remove accidentally committed release automation plan by @rickeylev in #3846
  • feat: unified pypi hub repository by @rickeylev in #3837
  • feat(pypi): support importing uv.lock file by @aignas in #3785
  • chore: add agent rule to base new branches on upstream/main by @rickeylev in #3849
  • build(ci): consolidate PR guardrails and block draft files by @rickeylev in #3859
  • refactor: use gazelle for bzl_library management by @rickeylev in #3852
  • fix(ci): use --repo flag in gh pr diff to avoid checkout by @rickeylev in #3861
  • feat: stop using chmod on Bazel 8.6+ by @aignas in #3855
  • ci: make pr-metadata-check run on PR body edit by @rickeylev in #3862
  • chore(pypi): cleanup unused code by @aignas in #3864
  • chore(release): correct version tagging and improve promotion flow by @rickeylev in #3866
  • chore(release): add dry-run to release tool prepare command by @rickeylev in #3869
  • chore(release): reuse existing PRs and avoid early exit in prep tool by @rickeylev in #3870
  • chore(release): use force push and clean up git helpers in prep tool by @rickeylev in #3873
  • Prepare release v2.2.0 by @github-actions[bot] in #3874
  • chore(release): fix release label consistency in workflows and templates by @rickeylev in #3876
  • fix: avoid stage1 bootstrap stdlib shadowing by @gleyba in #3854
  • build(deps): bump bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml from 1.1.0 to 1.4.1 by @dependabot[bot] in #3822
  • chore(release): support custom remote in create-release-branch and refactor by @rickeylev in #3877
  • chore(release): refactor create-rc and handle existing remote release branch by @rickeylev in #3879
  • chore(release): various fixes to release tool and workflows by @rickeylev in #3880
  • feat(pypi): add pip.dep to declare abstract pypi dependencies by @rickeylev in #3850
  • chore(release): refactor process-backports and various release tool fixes by @rickeylev in #3881
  • chore(release): factor code, make testable, clarify workflow names by @rickeylev in #3882
  • chore(release): pass missing --remote argument to release workflows by @rickeylev in #3883
  • chore(release): enable execution in process-backports workflow by @rickeylev in #3884
  • chore(release): release automation fixes and refactoring by @rickeylev in #3885
  • fix: use locale-neutral Windows ACL for build data by @alex-the-third in #3887
  • feat(py_test): add opt-in safeguard against accidental no-op tests by @thirtyseven in #3825
  • feat: enable pyproject.toml as single source of truth for Python version by @golithe in #3514
  • Fix release tool links and improve workflow robustness by @rickeylev in #3888
  • build(release): support triggering release workflows via comments by @rickeylev in #3889
  • chore(release): allow comments to trigger actions, update releasing docs by @rickeylev in #3891
  • chore(release): grant write permissions to on_issue_comment workflow by @rickeylev in #3892
  • chore(release): add pull-requests: write permission to on_issue_comment workflow by @rickeylev in #3893
  • chore(release): auto-add RC tasks to checklist in create-rc by @rickeylev in #3894
  • chore(release): secure workflows against shell injection by @rickeylev in #3895
  • fix: run executable zip action with execution Python to better support windows building by @dzbarsky in #3890
  • chore(release): process backports as part of creating RC by @rickeylev in #3896
  • chore(release): automate backport processing on PR merge, and have add-backports accept hashtag and url refs by @rickeylev in #3897
  • chore(release): fix promote_rc arguments and align comments by @rickeylev in #3898
  • chore(release): fix promote-rc command and update workflow args by @rickeylev in #3899
  • chore(release): make promote_rc workflow call publish_release workflow to finish publishing by @rickeylev in #3900
  • docs: sync 2.2 changelog and news to main by @rickeylev in #3901
  • chore(release): sync changelog and version markers to main during backports by @rickeylev in #3903
  • chore: remove stale process-backports-before-rc news file by @rickeylev in #3904
  • chore(release): fix invalid workflow file syntax by @rickeylev in #3908
  • build(deps): bump astral-sh/ruff-action from 4.0.0 to 4.1.0 by @dependabot[bot] in #3910
  • fix(pip): parse the index_url from uv.lock file by @aignas in #3906
  • chore: automated code review using antigravity by @rickeylev in #3905
  • fix: add explicit data attribute to compile_pip_requirements and forward it to the generated py_binary by @granatam in #3865
  • chore(pr-review): trigger automated review workflow on issue comments by @rickeylev in #3918
  • chore(reviewbot): fix antigravity_review execution and configuration by @rickeylev in #3921
  • fix(sphinxdocs): invalidate cache on branch change by @kaycebasques in #3917
  • refactor: use centralized NOT_ACTUALLY_PUBLIC across internal targets by @rickeylev in #3920
  • fix: make executable implicit defaults public so other modules can use rule builders by @13steinj in #3919
  • chore(reviewbot): expand multi-model cascade with fallback endpoints by @rickeylev in #3922
  • fix(sphinxdocs): clean stale worker output dir and doctrees on first request by @MartinNeudecker in #3933
  • build(deps): bump myst-parser from 4.0.1 to 5.1.0 in /docs by @dependabot[bot] in #3927
  • build(deps): bump astral-sh/setup-uv from 8.3.0 to 8.3.2 by @dependabot[bot] in #3924
  • fix(pypi): handle absolute file URLs in wheel downloader by @aignas in #3935
  • chore(release): automate multi-version backports and support direct patch promotion by @rickeylev in #3936
  • tests: implement pytest_test rule for internal test usage by @rickeylev in #3931
  • feat: add flag aliases to Starlark-defined flags by @gregestren in #3932
  • refactor(tools): migrate private release tool tests to pytest and pytest-mock by @rickeylev in #3937
  • refactor(release): extract pypi publishing to standalone workflow by @rickeylev in #3940
  • docs(releasing): update PyPI account owner information by @rickeylev in #3941
  • fix(pypi): don't expose source-less uv.lock packages by @lpulley in #3938
  • refactor(reviewbot): use separate jobs to protect access to credentials by @rickeylev in #3943
  • test(tools): auto-patch release CLI helpers in conftest.py by @rickeylev in #3939
  • tests: add workspace-compatible unified pypi hub so @pypi refs work by @rickeylev in #3946
  • tests: convert private tool tests to pytest_test and pytest style by @rickeylev in #3945
  • refactor(tests): create conftest py_library target by @rickeylev in #3947
  • refactor(pypi): make whl_library a macro and split impl into whl_archive and pip_archive by @aignas in #3948
  • build(deps): bump myst-parser from 4.0.1 to 5.1.0 in /docs by @dependabot[bot] in #3942
  • refactor(pypi): a seam for source vs library targets by @aignas in #3949
  • docs(pypi): add versionadded 2.2.0 directive to uv_lock attribute by @rickeylev in #3953
  • agents: clarify fast-tests config flag usage for building by @rickeylev in #3954
  • sphinxdocs: create sphinxdocs-specific pyproject and requirements by @rickeylev in #3951
  • agents: emphasize trailing ampersand in CI monitor skill invocation by @rickeylev in #3956
  • build(deps): bump charset-normalizer from 3.4.3 to 3.4.9 in /tools/publish by @dependabot[bot] in #3928
  • fix(pip.parse): allow uv_lock to be set without requirements_lock by @rickeylev in #3952
  • agents: add rule for PR descriptions and news entries by @rickeylev in #3959
  • fix(coverage): warn about a missing coverage wheel only for the selected runtime by @Syndic in #3955
  • build: move requirements and lock files out of docs/ to dev/ by @rickeylev in #3957
  • build(deps): bump actions/download-artifact from 4 to 8 by @dependabot[bot] in #3963
  • feat(coverage): fallback to pure Python wheel by @aignas in #3961
  • agents: add merge-pr skill for shepherding pull request merges by @rickeylev in #3969
  • build(deps): bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in #3964
  • build(deps): bump bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml from 1.4.1 to 1.4.2 by @dependabot[bot] in #3925
  • build(agents): handle blocked Buildkite jobs in CI monitoring and update create-pr skill by @rickeylev in #3975
  • build(deps): bump nh3 from 0.3.0 to 0.3.6 in /tools/publish by @dependabot[bot] in #3966
  • build(deps): bump secretstorage from 3.3.3 to 3.5.0 in /tools/publish by @dependabot[bot] in #3967
  • build(deps): bump the pip group across 1 directory with 3 updates by @dependabot[bot] in #3912
  • build(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 by @dependabot[bot] in #3965
  • feat(ci): support GitHub Actions log retrieval and subagent failure analysis by @rickeylev in #3976
  • refactor(pypi): add whl_deps_library repo rule by @aignas in #3960
  • tests(pypi): add test for excluding bazel files from wheels by @aignas in #3979
  • agents: relocate analyze-ci-failure logs to skill scratch directory by @rickeylev in #3980
  • agents: update create-pr and analyze-ci-failure skills by @rickeylev in #3981
  • agents: update buildkite-retry-job skill to support job-level retries and rebuilds by @rickeylev in #3983
  • agents: prevent duplicate CI monitoring processes in monitor-ci-results skill by @rickeylev in #3984
  • test: improve error reporting and artifact generation for lockfile test by @rickeylev in #3982
  • feat(pypi): support non-sha256 --hash pins and index digests by @abcdabcd987 in #3974
  • fix(gazelle)!: use per-version stdlib lists for Python 3.13 and 3.14 by @cj81499 in #3978
  • feat(cc): introduce py_extension rule for C/C++ Python extension modules by @rickeylev in #3973
  • agents: add technical rules for Starlark, Windows, C++, and testing by @rickeylev in #3986
  • docs: convert raw URLs in generated docs and docstrings to hyperlinks by @rickeylev in #3987
  • docs(cc): clarify abi_tag is equivalent to SOABI and cite PEP 3149 by @rickeylev in #3985
  • agents(monitor-ci-results): ignore superseded retried Buildkite jobs in CI monitor by @rickeylev in #3991
  • agents: add concurrent multi-subagent pre-review audit to create-pr skill by @rickeylev in #3992
  • fix(sphinxdocs): include stderr in Sphinx worker response output by @rickeylev in #3994
  • agents(pr): prohibit per-file edit lists in PR descriptions by @rickeylev in #3996
  • agents: explain force-merging while requiring user consent by @rickeylev in #3998
  • feat(cc): populate abi and platform settings on local py_cc_toolchain by @rickeylev in #3990
  • refactor(cc): simplify _current_py_cc_libs_impl by @rickeylev in #3993
  • docs(cc): add py_extension to doc generation and update versionadded markup by @rickeylev in #3989
  • agents(monitor-ci-results): autonomous flake retries via subagent and forbid file lists in PRs by @rickeylev in #4001
  • agents(rules): add manual tag rule and frontmatter to starlark.md by @rickeylev in #4002
  • feat(python): add py_extension to features loadable_symbols by @rickeylev in #4000
  • agents: update create-pr skill with interactive artifact requirements by @rickeylev in #4004
  • docs(howto): add optional feature loading guide by @rickeylev in #4003
  • fix(sphinxdocs): materialize source symlinks to resolve relative cross-references (#3977) by @rickeylev in #4005
  • fix(sphinxdocs): fix path resolution for conf.py in separate directory by @rickeylev in #4006
  • refactor(toolchain): rename abi_tag to soabi to eliminate PEP ambiguity by @rickeylev in #4008
  • build: add static type checking for runfiles with rules_pyrefly by @rickeylev in #4009
  • chore(release): ignore .agents directory in version marker replacement by @rickeylev in #4012
  • chore(release): indent multi-line bullet points in changelog by @rickeylev in #4013
  • chore(release): fix duplicate argument in NamedTemporaryFile by @rickeylev in #4014
  • Prepare release v2.3.0 by @github-actions[bot] in #4011
  • chore(release): add release-prepared label to prepare PRs by @rickeylev in #4015
  • refactor(tests): convert legacy py_extension in local_toolchains to official rule by @rickeylev in #3988
  • chore(release): support manual dispatch and /prepare-complete for complete prepare workflow by @rickeylev in #4016
  • chore(release): invoke create release branch from prepare complete and support /create-release-branch by @rickeylev in #4017
  • agents: optimize rules and clarify create-pr subagent requirements by @rickeylev in #4018
  • agents: document Windows machine normalization and SOABI support by @rickeylev in #4019
  • build(deps): bump cryptography from 49.0.0 to 50.0.0 in /tools/publish by @dependabot[bot] in #3995
  • agents: add merge queue CI monitoring and lockfile sync rules by @rickeylev in #4021
  • agents(rules): document linking external objects in TypedDict docstrings by @rickeylev in #4022
  • agents: rename pre-review-audit to review-code and add news file checks by @rickeylev in #4027
  • feat(runfiles): add CreateOrRaise API by @rickeylev in #4028
  • build(dev): bump dev requirements python version to 3.10 by @rickeylev in #4024
  • agents(rules): document git push -u guardrail and delegating function docstrings by @rickeylev in #4030
  • agents: document dev python version bump and merge queue fields by @rickeylev in #4031
  • build(deps): bump packaging from 26.2 to 26.3 in /tools/publish by @dependabot[bot] in #4032
  • build(deps): bump cffi from 2.1.0 to 2.1.1 in /tools/publish by @dependabot[bot] in #4033
  • build(pyrefly): enable Pyrefly static type checking across Python targets by @rickeylev in #4020
  • fix: preserve arguments with spaces by @stanbot8 in #4026
  • agents(rules): update python rules with typing and runfiles conventions by @rickeylev in #4035
  • feat(bzlmod): make init.py generation configurable module-wide by @armandomontanez in #3997
  • build(ci): remove legacy mypy type checking workflow and comments by @rickeylev in #4036
  • agents(analyze-ci-failure): enhance network reset and macOS sandbox flake detection by @rickeylev in #4037
  • fix(pypi): rewrite RECORD file entries for extracted .data contents by @rickeylev in #4025
  • fix(pypi): resolve self-referencing extras to a real fixed point by @muravev-vasilii in #4039
  • agents(rules): add Starlark dict union and Pyrefly PackagePath conventions by @rickeylev in #4038
  • fix(pypi): do not return rctx.metadata for pip_archive by @aignas in #4043
  • refactor(release): move on_comment workflow logic into Python script by @rickeylev in #4045
  • workflows: auto-create patch release tracking issue on /backport by @rickeylev in #4046
  • agents(rules): update github_actions_workflows rule with python script and testing conventions by @rickeylev in #4047
  • agents(review-code): export review results artifact and factor report format by @rickeylev in #4048
  • workflows(release): support /backport comment on release tracking issue and pr by @rickeylev in #4050
  • workflows(release): remove non-patch release tasks from patch release issues by @rickeylev in #4051
  • tests: use runfiles.CreateOrRaise in release_test_helper by @rickeylev in #4052
  • agents: clarify commit and PR type conventions in pr.md by @rickeylev in #4055
  • workflow(release): surface subprocess output and improve error handling in backport operations by @rickeylev in #4056
  • agents: add workflow type convention and python exception rules by @rickeylev in #4057
  • refactor: split code into multiple files by @aignas in #4044
  • chore(release): sync changelog and version markers for 2.3 backports by @rickeylev in #4058
  • feat(sphinxdocs): make SphinxDocsLibraryInfo provider public by @JoHoenk in #4041
  • agents(starlark): document depset element immutability and provider conventions by @rickeylev in #4060
  • build(release): add process-news command with PR and version marker support by @rickeylev in #4062
  • agents: refine commit type definitions and interface docstring rules by @rickeylev in #4063
  • agents: update review-code skill to initialize and update artifact on responses by @rickeylev in #4066
  • test(pytest): support python_versions in pytest_test macro by @rickeylev in #4064
  • agents: add native.test_suite API tag invariant rule by @rickeylev in #4068
  • build(release): separate sync changelog into standalone workflow and CLI tool by @rickeylev in #4067
  • agents: update CI soft-fail handling and GHA event parsing rules by @rickeylev in #4069
  • tests(runfiles): migrate runfiles tests to pytest_test by @rickeylev in #4061
  • workflows: make on_pr_closed.py executable and add permissions test by @rickeylev in #4076
  • build(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 by @dependabot[bot] in #4072
  • build(deps): bump actions/setup-python from 5 to 7 by @dependabot[bot] in #4074
  • build(deps): bump charset-normalizer from 3.4.9 to 3.5.0 in /tools/publish by @dependabot[bot] in #4073
  • build(deps): bump bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml from 1.4.2 to 1.5.0 by @dependabot[bot] in #4075
  • agents: document rf.root() path navigation and Runfiles.CreateOrRaise() in python rules by @rickeylev in #4078
  • fix(py_test): fix Windows crash in py_test main validation by @rdesgroppes in #4079
  • agents: document direct integration test execution in testing rules by @rickeylev in #4080
  • workflows: grant pull-requests write to release_process_backports by @rickeylev in #4081
  • fix(pypi): drop unsupported args in the whl_library macro by @aignas in #4083
  • fix(toolchain): fix crash on Windows when precompiling is enabled by @rdesgroppes in #4082
  • fix(pypi): handle revisions in uv.lock Git sources by @henriquejsza in #4086
  • fix(windows): use extended paths in Python bootstraps by @belitskiy in #4071
  • fix(pypi): support source-less wheels with dependencies by @hartikainen in #4054
  • chore: cherry-pick 2.3.2 changelog prep by @aignas in #4090
  • agents: document Windows extended path rules and test organization by @rickeylev in #4092
  • build(release): remove patch release template and streamline backport workflow by @rickeylev in #4093
  • agents: specify docs and build(release) commit types by @rickeylev in #4095
  • build: upgrade Python 3.9 usages across dev tools, examples, and tests by @rickeylev in #4094
  • chore: remove unused rules in whl_library_targets by @aignas in #4087
  • build(deps): bump the pip group across 3 directories with 7 updates by @dependabot[bot] in #4096
  • build(deps): bump the pip group across 5 directories with 5 updates by @dependabot[bot] in #4097
  • build(deps): bump the uv group across 5 directories with 5 updates by @dependabot[bot] in #4098
  • agents: add lockfile and dependency bump rule by @rickeylev in #4103
  • refactor(pypi): split whl_library_targets by @aignas in #4101
  • chore: migrate requirements.in files to pyproject.toml by @rickeylev in #4099
  • fix(runfiles): update Path method signatures for Python 3.14 compatibility and fix match() by @rickeylev in #4100
  • build(deps): bump the pip group across 1 directory with 3 updates by @dependabot[bot] in #4102
  • agents: add constraint synchronization rule for dependency bumps by @rickeylev in #4107
  • agents: document runtime version checks and multi-version pytest_test bzlmod rules by @rickeylev in #4108
  • agents: add Windows lockfile migration and Gazelle manifest rules by @rickeylev in #4109
  • fix: various fixes for the deps library by @aignas in #4106
  • agents: add external PR push guidance, refactor commit type, and fix news frontmatter by @rickeylev in #4112
  • feat(pypi): allow defining deps in through pkg_aliases macro by @aignas in #4105
  • fix(precompile): skip precompilation for directory and pyc inputs in srcs by @rickeylev in #4113
  • agents: add VERSION_NEXT_PATCH docs rule and Strunk & White PR guidelines by @rickeylev in #4116
  • fix(pypi): append .bat extension for rewritten shebang scripts in RECORD on Windows by @rickeylev in #4114
  • agents: add Windows shebang RECORD rewriting and PR metadata discrepancy rules by @rickeylev in #4118
  • feat(gazelle): support generic manifest lockfiles by @anisayakmitra-in in #4117
  • feat: Update CPython 3.15.0 from -a8 to -rc1. by @hawkinsp in #4122
  • fix(zipapp): guard against null runtime files by @rickeylev in #4119
  • fix: generate publish wheels for target platforms by @tomatotomata in #4007
  • agents: add sync-git-branch-continuously skill by @rickeylev in #4126
  • agents: remove _bzl suffix requirement for bzl_library targets by @rickeylev in #4131
  • fix(venv_shebang_rewriter): avoid depending on host coreutils by @nicdumz in #4125
  • docs(support): document nix as a tier 2 platform by @rickeylev in #4130
  • refactor(config_settings): remove unused private distribution target by @rickeylev in #4129
  • fix(gazelle): fix module map for old-style namespaces by @gholms in #4135
  • agents: update news and PR conventions by @rickeylev in #4138
  • chore: update default Python version to 3.14 by @rickeylev in #4023
  • refactor: move tools/private/zipapp to tools/zipapp by @rickeylev in #4127
  • build: configure repository cache in .bazelrc by @rickeylev in #4137
  • feat(uv): add --directory support for locking by @aignas in #4029
  • build(deps): bump pip from 26.1.2 to 26.2 in /examples/wheel in the pip group across 1 directory by @dependabot[bot] in #4136
  • build(deps): bump pip from 26.1.2 to 26.2 in /examples/wheel in the uv group across 1 directory by @dependabot[bot] in #4140
  • build(tools): remove reviewbot tool and workflow by @rickeylev in #4142
  • feat: Add win32 versions by @rsartor-cmd in #4141
  • build: move requirements update multirun from //private to //dev by @rickeylev in #4143
  • fix(bootstrap): remap stdlib sys.path entries to runfiles during site init by @rickeylev in #4104
  • build(dev): remove unused requirements update aliases by @rickeylev in #4144
  • build(release): allow process-news to create missing release sections by @rickeylev in #4145
  • docs(release): document sync-changelog command in template and guide by @rickeylev in #4148
  • chore(release): sync changelog for v2.3.3 backports by @github-actions[bot] in #4147
  • agents: add conversation-done skill by @rickeylev in #4150
  • build(dev): move internal dev tools from //tools/private to //dev by @rickeylev in #4149
  • refactor: introduce helper for defining distribution filegroups by @rickeylev in #4152
  • build(dev): move release management tooling from //tools/private to //dev by @rickeylev in #4153
  • fix(bzlmod): convert coverage_tool Label to string by @kocolosk in #4157
  • refactor(zipapp): implement rust exe_zip_maker program by @rickeylev in #4151
  • refactor(toolchains): share Python version config settings by @dzbarsky in #4159
  • fix(stamping): skip build data spawn when --stamp=false by @alloveras in #4160
  • fix(cc): include toolchain libraries in cc_shared_library by @dzbarsky in #4166
  • build(release): fetch PR body in get_pr_info and grant PR read permissions by @rickeylev in #4177
  • Prepare release v2.4.0 by @github-actions[bot] in #4176
  • build(release): exclude devguide.md from version marker checks by @rickeylev in #4185

New Contributors

Full Changelog: 2.1.0...2.4.0