feat: parallel SDK generation support#1929
Merged
Conversation
Add support for parallel SDK generation workflows where each target generates independently and a finalize step accumulates reports and creates a single PR. - New `TargetGenerationReport` struct captures CI-agnostic per-target generation data (version report, URLs, metadata) - `ci generate` now writes per-target report to .speakeasy/reports/ when INPUT_TARGET is set (matrix mode) - New `ci create-or-update-pr` command reads accumulated reports JSON, merges version reports, generates PR description, and creates/updates the GitHub PR - Export `SetPRLabels` and add `GetClient` accessor on Git ✻ Clauded...
Allows testing the report accumulation and PR description generation locally without requiring GitHub API access. ✻ Clauded...
The create-or-update-pr command now takes a directory of per-target JSON files instead of a single accumulated file. This simplifies the CI accumulation step to just file-level overwrites with no jq merging. Also skips unparseable files gracefully instead of failing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ThomasRooney
approved these changes
Feb 27, 2026
danielkov
added a commit
that referenced
this pull request
Feb 27, 2026
…ix mode (#1930) ## Summary Follow-up fixes for parallel SDK generation support (#1929): - **Write generation report after finalize** — report files were being wiped by git operations (rebase/checkout) during `finalize()`. Moved `writeGenerationReport()` to run after `finalize()` so the file survives to be uploaded as an artifact. - **Use stable branch names** — removed timestamp suffix from regen branch names (`speakeasy-sdk-regen` instead of `speakeasy-sdk-regen-{timestamp}`). This lets subsequent runs reuse the same branch and PR instead of creating new ones each time. - **Find existing PRs by head branch** — changed `FindExistingPR` from brittle title-prefix matching to matching by head branch prefix. Editing a PR title no longer breaks PR reuse. - **Skip MergeBranch in matrix mode** — when `INPUT_BRANCH_NAME` is set (matrix/parallel mode), `finalize()` no longer merges the regen branch back into the source branch. This prevented generated code from leaking onto the source branch. ✻ Clauded... --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
ci create-or-update-prcommand that reads a directory of per-target report JSON files, merges version reports, and creates/updates a GitHub PRci generatenow writes a per-target generation report to.speakeasy/reports/<target>.jsonafter finalize, so the file survives git operationsFindExistingPRmatches by head branch prefix instead of PR title prefix, making it resilient to title editsMergeBranchin direct mode whenINPUT_BRANCH_NAMEis set (matrix mode), preventing generated code from leaking back to the source branchprdescription.sanitizeBranchNameto matchenvironment.SanitizeBranchName✻ Clauded...