Skip to content

Comments

Release v0.3.49#207

Merged
bradhe merged 12 commits intomainfrom
develop
Feb 24, 2026
Merged

Release v0.3.49#207
bradhe merged 12 commits intomainfrom
develop

Conversation

@bradhe
Copy link
Contributor

@bradhe bradhe commented Feb 24, 2026

  • Update the Python client
  • Add packaging functions to Tower SDK
  • Align BDD tests with real API behavior
  • Updated README.md
  • Bump version to v0.3.49-rc.3

socksy and others added 11 commits February 11, 2026 15:42
* chore: openapi-python-client 0.24.3->0.28.1

* chore: regenerate python client

* chore: fix test fixtures for new api client

* chore: bump to deb 12 for newer python on arm

* fix: don't globally install pip

we run everything in a venv anyway

* fix: try to get 32 bit ARM build to compile

* chore: make builds run when stuff that affects the build changes

* fix: workaround qemu bug with tmpfs for ~/.cargo

* fix: jettisoning 32 bit ARM building - more trouble than they're worth

* hack: workaround broken old dependency

Could've updated the dependency, but figure if it's affecting
us it's going to affect others too
* Add a wraper function to Tower SDK for packaging code for Tower

* Add tests for this exposed functionality

* Add the Tower CLI binary back in the mix

* Upgrade Maturin usage to find interpreters for us

* Change the way installation happens in the actions script

* Don't limit the installations to just what's local

* Final bits to make windows, linux, and mussllinux builds work/tested

* chore: Yet another attempt to let maturin to do it's thing

* Fix formatting of code in a test

* Stub for mypy. Shouldn't interfere with other stuff

* Updates to integration tests for the new target

* Enable builds on ARM64 targets on Windows

* Some cleanup, please deleting a .so

* Share data between steps

* A few fixes for the last set of failures

* chore: Add separate runner type for Windows ARM

* Addres some feedback from @konstantinoscs
* chore: Builds for all other python versions

* Windows ARM64 only supports starting at 3.11.

* macOS builds only support Python 3.11+
* Explicitly try to install wheels built when doing the tests

* Drop Python 3.9 support
* chore: openapi-python-client 0.24.3->0.28.1

* chore: regenerate python client

* chore: bump autogen rust oapi client

* chore: bump generator + versions, fix API references

* fix: update mock server to be compliant with latest API specs
* fix(mock): use RFC 7807 format for 422 validation response

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mock): match real server warning event and log stream format

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mock): add name field to schedule update endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: update BDD assertions to match real server responses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(test-runner): support running tests against external server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: make CLI build location configurable in tests

* fix: TOWER_JWT being set makes it ignore the actual mock one in the repo 🤦

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Updated Readme for Tower CLI

* Added an MCP guide

* Restored dbt section under optional

* Added pointer to full MCP docs for users of other AI assistants

* Addressing Brad's comments

* Update INSTALL-AND-REFERENCE.md

Co-authored-by: Ben Lovell <ben@tower.dev>

* Applying feedback

* Added some additional case studies

---------

Co-authored-by: Ben Lovell <ben@tower.dev>
* Move `build_package` into a namespace

* chore: Fix test formatting
@coderabbitai
Copy link

coderabbitai bot commented Feb 24, 2026

Important

Review skipped

Too many files!

This PR contains 299 files, which is 149 over the limit of 150.

📥 Commits

Reviewing files that changed from the base of the PR and between 9a2c123 and c0ede92.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (299)
  • .github/workflows/build-binaries.yml
  • .gitignore
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • Cargo.toml
  • DEVELOPMENT.md
  • INSTALL-AND-REFERENCE.md
  • README.md
  • crates/tower-api/README.md
  • crates/tower-api/src/apis/configuration.rs
  • crates/tower-api/src/apis/default_api.rs
  • crates/tower-api/src/apis/feature_flags_api.rs
  • crates/tower-api/src/models/account.rs
  • crates/tower-api/src/models/acknowledge_alert_response.rs
  • crates/tower-api/src/models/acknowledge_all_alerts_response.rs
  • crates/tower-api/src/models/alert.rs
  • crates/tower-api/src/models/api_key.rs
  • crates/tower-api/src/models/app.rs
  • crates/tower-api/src/models/app_statistics.rs
  • crates/tower-api/src/models/app_summary.rs
  • crates/tower-api/src/models/app_version.rs
  • crates/tower-api/src/models/authentication_context.rs
  • crates/tower-api/src/models/batch_schedule_params.rs
  • crates/tower-api/src/models/batch_schedule_response.rs
  • crates/tower-api/src/models/cancel_run_response.rs
  • crates/tower-api/src/models/catalog.rs
  • crates/tower-api/src/models/catalog_property.rs
  • crates/tower-api/src/models/claim_device_login_ticket_params.rs
  • crates/tower-api/src/models/claim_device_login_ticket_response.rs
  • crates/tower-api/src/models/create_account_params.rs
  • crates/tower-api/src/models/create_account_params_flags_struct.rs
  • crates/tower-api/src/models/create_account_response.rs
  • crates/tower-api/src/models/create_api_key_params.rs
  • crates/tower-api/src/models/create_api_key_response.rs
  • crates/tower-api/src/models/create_app_params.rs
  • crates/tower-api/src/models/create_app_response.rs
  • crates/tower-api/src/models/create_authenticator_params.rs
  • crates/tower-api/src/models/create_authenticator_response.rs
  • crates/tower-api/src/models/create_catalog_params.rs
  • crates/tower-api/src/models/create_catalog_response.rs
  • crates/tower-api/src/models/create_device_login_ticket_response.rs
  • crates/tower-api/src/models/create_environment_params.rs
  • crates/tower-api/src/models/create_environment_response.rs
  • crates/tower-api/src/models/create_password_reset_params.rs
  • crates/tower-api/src/models/create_password_reset_response.rs
  • crates/tower-api/src/models/create_sandbox_secrets_params.rs
  • crates/tower-api/src/models/create_sandbox_secrets_response.rs
  • crates/tower-api/src/models/create_schedule_params.rs
  • crates/tower-api/src/models/create_schedule_response.rs
  • crates/tower-api/src/models/create_secret_params.rs
  • crates/tower-api/src/models/create_secret_response.rs
  • crates/tower-api/src/models/create_session_params.rs
  • crates/tower-api/src/models/create_session_response.rs
  • crates/tower-api/src/models/create_team_params.rs
  • crates/tower-api/src/models/create_team_response.rs
  • crates/tower-api/src/models/create_webhook_params.rs
  • crates/tower-api/src/models/create_webhook_response.rs
  • crates/tower-api/src/models/delete_api_key_params.rs
  • crates/tower-api/src/models/delete_api_key_response.rs
  • crates/tower-api/src/models/delete_app_response.rs
  • crates/tower-api/src/models/delete_authenticator_params.rs
  • crates/tower-api/src/models/delete_authenticator_response.rs
  • crates/tower-api/src/models/delete_catalog_response.rs
  • crates/tower-api/src/models/delete_schedule_params.rs
  • crates/tower-api/src/models/delete_schedule_response.rs
  • crates/tower-api/src/models/delete_secret_response.rs
  • crates/tower-api/src/models/delete_session_params.rs
  • crates/tower-api/src/models/delete_session_response.rs
  • crates/tower-api/src/models/delete_team_invitation_params.rs
  • crates/tower-api/src/models/delete_team_invitation_response.rs
  • crates/tower-api/src/models/delete_team_params.rs
  • crates/tower-api/src/models/delete_team_response.rs
  • crates/tower-api/src/models/delete_webhook_response.rs
  • crates/tower-api/src/models/deploy_app_request.rs
  • crates/tower-api/src/models/deploy_app_response.rs
  • crates/tower-api/src/models/describe_account_body.rs
  • crates/tower-api/src/models/describe_app_response.rs
  • crates/tower-api/src/models/describe_app_version_response.rs
  • crates/tower-api/src/models/describe_authentication_context_body.rs
  • crates/tower-api/src/models/describe_device_login_session_response.rs
  • crates/tower-api/src/models/describe_email_preferences_body.rs
  • crates/tower-api/src/models/describe_plan_response.rs
  • crates/tower-api/src/models/describe_run_graph_response.rs
  • crates/tower-api/src/models/describe_run_links.rs
  • crates/tower-api/src/models/describe_run_logs_response.rs
  • crates/tower-api/src/models/describe_run_response.rs
  • crates/tower-api/src/models/describe_secrets_key_response.rs
  • crates/tower-api/src/models/describe_session_response.rs
  • crates/tower-api/src/models/describe_team_response.rs
  • crates/tower-api/src/models/describe_webhook_response.rs
  • crates/tower-api/src/models/email_subscriptions.rs
  • crates/tower-api/src/models/encrypted_catalog_property.rs
  • crates/tower-api/src/models/environment.rs
  • crates/tower-api/src/models/error_detail.rs
  • crates/tower-api/src/models/error_model.rs
  • crates/tower-api/src/models/event_alert.rs
  • crates/tower-api/src/models/event_error.rs
  • crates/tower-api/src/models/event_log.rs
  • crates/tower-api/src/models/event_shouldertap.rs
  • crates/tower-api/src/models/event_warning.rs
  • crates/tower-api/src/models/export_catalogs_params.rs
  • crates/tower-api/src/models/export_catalogs_response.rs
  • crates/tower-api/src/models/export_secrets_params.rs
  • crates/tower-api/src/models/export_secrets_response.rs
  • crates/tower-api/src/models/exported_catalog.rs
  • crates/tower-api/src/models/exported_catalog_property.rs
  • crates/tower-api/src/models/exported_secret.rs
  • crates/tower-api/src/models/feature.rs
  • crates/tower-api/src/models/featurebase_identity.rs
  • crates/tower-api/src/models/generate_app_statistics_response.rs
  • crates/tower-api/src/models/generate_authenticator_response.rs
  • crates/tower-api/src/models/generate_run_statistics_response.rs
  • crates/tower-api/src/models/generate_runner_credentials_response.rs
  • crates/tower-api/src/models/get_feature_flag_response_body.rs
  • crates/tower-api/src/models/invite_team_member_params.rs
  • crates/tower-api/src/models/invite_team_member_response.rs
  • crates/tower-api/src/models/leave_team_response.rs
  • crates/tower-api/src/models/list_alerts_response.rs
  • crates/tower-api/src/models/list_api_keys_response.rs
  • crates/tower-api/src/models/list_app_environments_response.rs
  • crates/tower-api/src/models/list_app_versions_response.rs
  • crates/tower-api/src/models/list_apps_response.rs
  • crates/tower-api/src/models/list_authenticators_response.rs
  • crates/tower-api/src/models/list_catalogs_response.rs
  • crates/tower-api/src/models/list_environments_response.rs
  • crates/tower-api/src/models/list_my_team_invitations_response.rs
  • crates/tower-api/src/models/list_runners_response.rs
  • crates/tower-api/src/models/list_runs_response.rs
  • crates/tower-api/src/models/list_schedules_response.rs
  • crates/tower-api/src/models/list_secret_environments_response.rs
  • crates/tower-api/src/models/list_secrets_response.rs
  • crates/tower-api/src/models/list_team_invitations_response.rs
  • crates/tower-api/src/models/list_team_members_response.rs
  • crates/tower-api/src/models/list_teams_response.rs
  • crates/tower-api/src/models/list_webhooks_response.rs
  • crates/tower-api/src/models/mod.rs
  • crates/tower-api/src/models/organization.rs
  • crates/tower-api/src/models/pagination.rs
  • crates/tower-api/src/models/parameter.rs
  • crates/tower-api/src/models/plan.rs
  • crates/tower-api/src/models/refresh_session_params.rs
  • crates/tower-api/src/models/refresh_session_response.rs
  • crates/tower-api/src/models/remove_team_member_params.rs
  • crates/tower-api/src/models/remove_team_member_response.rs
  • crates/tower-api/src/models/resend_team_invitation_params.rs
  • crates/tower-api/src/models/resend_team_invitation_response.rs
  • crates/tower-api/src/models/run.rs
  • crates/tower-api/src/models/run_app_initiator_data.rs
  • crates/tower-api/src/models/run_app_params.rs
  • crates/tower-api/src/models/run_app_response.rs
  • crates/tower-api/src/models/run_failure_alert.rs
  • crates/tower-api/src/models/run_graph_node.rs
  • crates/tower-api/src/models/run_graph_run_id.rs
  • crates/tower-api/src/models/run_initiator.rs
  • crates/tower-api/src/models/run_initiator_details.rs
  • crates/tower-api/src/models/run_log_line.rs
  • crates/tower-api/src/models/run_parameter.rs
  • crates/tower-api/src/models/run_results.rs
  • crates/tower-api/src/models/run_run_initiator_details.rs
  • crates/tower-api/src/models/run_statistics.rs
  • crates/tower-api/src/models/run_timeseries_point.rs
  • crates/tower-api/src/models/runner.rs
  • crates/tower-api/src/models/runner_credentials.rs
  • crates/tower-api/src/models/schedule.rs
  • crates/tower-api/src/models/schedule_run_initiator_details.rs
  • crates/tower-api/src/models/search_runs_response.rs
  • crates/tower-api/src/models/secret.rs
  • crates/tower-api/src/models/server_sent_events_inner.rs
  • crates/tower-api/src/models/server_sent_events_inner_1.rs
  • crates/tower-api/src/models/server_sent_events_inner_2.rs
  • crates/tower-api/src/models/session.rs
  • crates/tower-api/src/models/shoulder_tap.rs
  • crates/tower-api/src/models/sse_warning.rs
  • crates/tower-api/src/models/statistics_settings.rs
  • crates/tower-api/src/models/stream_alerts_200_response_inner.rs
  • crates/tower-api/src/models/stream_run_logs_200_response_inner.rs
  • crates/tower-api/src/models/stream_shouldertaps_200_response_inner.rs
  • crates/tower-api/src/models/team.rs
  • crates/tower-api/src/models/team_invitation.rs
  • crates/tower-api/src/models/team_membership.rs
  • crates/tower-api/src/models/test_webhook_response.rs
  • crates/tower-api/src/models/token.rs
  • crates/tower-api/src/models/unverified_authenticator.rs
  • crates/tower-api/src/models/update_account_params.rs
  • crates/tower-api/src/models/update_account_response.rs
  • crates/tower-api/src/models/update_app_params.rs
  • crates/tower-api/src/models/update_app_response.rs
  • crates/tower-api/src/models/update_catalog_params.rs
  • crates/tower-api/src/models/update_catalog_response.rs
  • crates/tower-api/src/models/update_email_preferences_body.rs
  • crates/tower-api/src/models/update_environment_params.rs
  • crates/tower-api/src/models/update_environment_response.rs
  • crates/tower-api/src/models/update_my_team_invitation_params.rs
  • crates/tower-api/src/models/update_my_team_invitation_response.rs
  • crates/tower-api/src/models/update_organization_params.rs
  • crates/tower-api/src/models/update_organization_response.rs
  • crates/tower-api/src/models/update_password_reset_params.rs
  • crates/tower-api/src/models/update_password_reset_response.rs
  • crates/tower-api/src/models/update_plan_params.rs
  • crates/tower-api/src/models/update_plan_response.rs
  • crates/tower-api/src/models/update_schedule_params.rs
  • crates/tower-api/src/models/update_schedule_response.rs
  • crates/tower-api/src/models/update_secret_params.rs
  • crates/tower-api/src/models/update_secret_response.rs
  • crates/tower-api/src/models/update_team_member_params.rs
  • crates/tower-api/src/models/update_team_member_response.rs
  • crates/tower-api/src/models/update_team_params.rs
  • crates/tower-api/src/models/update_team_response.rs
  • crates/tower-api/src/models/update_user_params.rs
  • crates/tower-api/src/models/update_user_response.rs
  • crates/tower-api/src/models/update_webhook_params.rs
  • crates/tower-api/src/models/update_webhook_response.rs
  • crates/tower-api/src/models/user.rs
  • crates/tower-api/src/models/verified_authenticator.rs
  • crates/tower-api/src/models/verify_email_params.rs
  • crates/tower-api/src/models/verify_email_response.rs
  • crates/tower-api/src/models/webhook.rs
  • crates/tower-cmd/src/api.rs
  • crates/tower-cmd/src/lib.rs
  • crates/tower-runtime/tests/example-apps/03-legacy-app/requirements.txt
  • crates/tower-runtime/tests/example-apps/03-legacy-app/task.py
  • crates/tower-uv/src/lib.rs
  • crates/tower/Cargo.toml
  • crates/tower/src/lib.rs
  • pyproject.toml
  • scripts/generate-rust-api-client.sh
  • scripts/rust-api-client-generator-config.yaml
  • src/tower/__init__.py
  • src/tower/_native.pyi
  • src/tower/cli.py
  • src/tower/packages/__init__.py
  • src/tower/tower_api_client/api/default/acknowledge_alert.py
  • src/tower/tower_api_client/api/default/acknowledge_all_alerts.py
  • src/tower/tower_api_client/api/default/activate_schedules.py
  • src/tower/tower_api_client/api/default/cancel_run.py
  • src/tower/tower_api_client/api/default/check_webhook.py
  • src/tower/tower_api_client/api/default/claim_device_login_ticket.py
  • src/tower/tower_api_client/api/default/create_account.py
  • src/tower/tower_api_client/api/default/create_api_key.py
  • src/tower/tower_api_client/api/default/create_app.py
  • src/tower/tower_api_client/api/default/create_authenticator.py
  • src/tower/tower_api_client/api/default/create_catalog.py
  • src/tower/tower_api_client/api/default/create_device_login_ticket.py
  • src/tower/tower_api_client/api/default/create_environment.py
  • src/tower/tower_api_client/api/default/create_password_reset.py
  • src/tower/tower_api_client/api/default/create_sandbox_secrets.py
  • src/tower/tower_api_client/api/default/create_schedule.py
  • src/tower/tower_api_client/api/default/create_secret.py
  • src/tower/tower_api_client/api/default/create_session.py
  • src/tower/tower_api_client/api/default/create_team.py
  • src/tower/tower_api_client/api/default/create_webhook.py
  • src/tower/tower_api_client/api/default/deactivate_schedules.py
  • src/tower/tower_api_client/api/default/delete_alert.py
  • src/tower/tower_api_client/api/default/delete_api_key.py
  • src/tower/tower_api_client/api/default/delete_app.py
  • src/tower/tower_api_client/api/default/delete_authenticator.py
  • src/tower/tower_api_client/api/default/delete_catalog.py
  • src/tower/tower_api_client/api/default/delete_schedule.py
  • src/tower/tower_api_client/api/default/delete_secret.py
  • src/tower/tower_api_client/api/default/delete_session.py
  • src/tower/tower_api_client/api/default/delete_team.py
  • src/tower/tower_api_client/api/default/delete_team_invitation.py
  • src/tower/tower_api_client/api/default/delete_webhook.py
  • src/tower/tower_api_client/api/default/deploy_app.py
  • src/tower/tower_api_client/api/default/describe_account.py
  • src/tower/tower_api_client/api/default/describe_app.py
  • src/tower/tower_api_client/api/default/describe_app_version.py
  • src/tower/tower_api_client/api/default/describe_authentication_context.py
  • src/tower/tower_api_client/api/default/describe_device_login_session.py
  • src/tower/tower_api_client/api/default/describe_email_preferences.py
  • src/tower/tower_api_client/api/default/describe_plan.py
  • src/tower/tower_api_client/api/default/describe_run.py
  • src/tower/tower_api_client/api/default/describe_run_graph.py
  • src/tower/tower_api_client/api/default/describe_run_logs.py
  • src/tower/tower_api_client/api/default/describe_secrets_key.py
  • src/tower/tower_api_client/api/default/describe_session.py
  • src/tower/tower_api_client/api/default/describe_team.py
  • src/tower/tower_api_client/api/default/describe_webhook.py
  • src/tower/tower_api_client/api/default/export_catalogs.py
  • src/tower/tower_api_client/api/default/export_secrets.py
  • src/tower/tower_api_client/api/default/generate_app_statistics.py
  • src/tower/tower_api_client/api/default/generate_authenticator.py
  • src/tower/tower_api_client/api/default/generate_run_statistics.py
  • src/tower/tower_api_client/api/default/generate_runner_credentials.py
  • src/tower/tower_api_client/api/default/invite_team_member.py
  • src/tower/tower_api_client/api/default/leave_team.py
  • src/tower/tower_api_client/api/default/list_alerts.py
  • src/tower/tower_api_client/api/default/list_api_keys.py
  • src/tower/tower_api_client/api/default/list_app_environments.py
  • src/tower/tower_api_client/api/default/list_app_versions.py
  • src/tower/tower_api_client/api/default/list_apps.py
  • src/tower/tower_api_client/api/default/list_authenticators.py
  • src/tower/tower_api_client/api/default/list_catalogs.py
  • src/tower/tower_api_client/api/default/list_environments.py
  • src/tower/tower_api_client/api/default/list_my_team_invitations.py
  • src/tower/tower_api_client/api/default/list_runners.py
  • src/tower/tower_api_client/api/default/list_runs.py
  • src/tower/tower_api_client/api/default/list_schedules.py
  • src/tower/tower_api_client/api/default/list_secret_environments.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Tower SDK to version 0.3.49rc2 with significant changes to the Python client, new packaging functionality, and infrastructure improvements.

Changes:

  • Modernized Python API client error handling and type annotations
  • Added native package building capabilities via PyO3 bindings
  • Updated OpenAPI client generator and API models to align with v0.9.29 spec

Reviewed changes

Copilot reviewed 297 out of 552 changed files in this pull request and generated no comments.

Show a summary per file
File Description
pyproject.toml Updated version to 0.3.49rc2, added tower CLI entrypoint, changed bindings from bin to pyo3, bumped Python requirement to 3.10+
src/tower/packages/init.py New module exposing build_package function from native bindings
src/tower/cli.py New CLI entrypoint that delegates to Rust implementation via _run_cli
src/tower/_native.pyi Type stubs for native Rust functions (build_package, _run_cli)
crates/tower/src/lib.rs New PyO3 bindings for package building and CLI execution
crates/tower/Cargo.toml Added pyo3 feature and dependencies for Python bindings
crates/tower-uv/src/lib.rs Added setuptools<82 workaround for legacy pkg_resources compatibility
scripts/generate-rust-api-client.sh Bumped OpenAPI generator version from 7.13.0 to 7.19.0
scripts/rust-api-client-generator-config.yaml Added App→deprecated_app name mapping
src/tower/tower_api_client/api/default/*.py Standardized error handling across all API endpoints, replacing Optional returns with ErrorModel unions
crates/tower-api/src/models/*.rs Updated API models with new fields and OpenAPI spec version v0.9.29
crates/tower-cmd/src/api.rs Simplified schedule creation with Default::default() pattern
DEVELOPMENT.md New development guide with setup instructions and workflow

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@sammuti sammuti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@bradhe bradhe merged commit 3fbb83d into main Feb 24, 2026
86 of 89 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants