From cbbf4ed3b5738a87a85bf584ad44cab838a44835 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:45:41 +0000 Subject: [PATCH 1/7] feat: add preview release workflows for NPM and Rust --- .changeset/config.json | 6 +- .github/workflows/npm-beta-release.yml | 88 ++++++++++++++++++++++++++ .github/workflows/release.yml | 1 + .github/workflows/rust-release.yml | 13 +++- 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/npm-beta-release.yml diff --git a/.changeset/config.json b/.changeset/config.json index a01341a4efa..cdc4180d3e9 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -30,5 +30,9 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [] + "ignore": [], + "snapshot": { + "useCalculatedVersion": true, + "prereleaseTemplate": "{tag}.{commit}" + } } diff --git a/.github/workflows/npm-beta-release.yml b/.github/workflows/npm-beta-release.yml new file mode 100644 index 00000000000..72de3376d51 --- /dev/null +++ b/.github/workflows/npm-beta-release.yml @@ -0,0 +1,88 @@ +name: NPM Beta Release + +on: + workflow_dispatch: + inputs: + snapshot_tag: + description: 'NPM dist-tag for the beta release' + required: true + default: 'beta' + type: choice + options: + - beta + - alpha + - rc + - preview + +concurrency: + group: npm-beta-release + cancel-in-progress: false + +env: + LOG_FORMAT: PRETTY + TURBO_TELEMETRY_DISABLED: 1 + TURBO_API: https://cache.depot.dev + TURBO_TOKEN: ${{ secrets.DEPOT_TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.DEPOT_ORG_ID }} + +jobs: + beta-release: + runs-on: ubuntu-latest + permissions: + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 + submodules: recursive + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Get short SHA + id: sha + run: echo "short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: Get base version + id: version + run: | + BASE_VERSION=$(node -p "require('./typescript/sdk/package.json').version") + BETA_VERSION="${BASE_VERSION}-${{ inputs.snapshot_tag }}.${{ steps.sha.outputs.short }}" + echo "base=$BASE_VERSION" >> $GITHUB_OUTPUT + echo "beta=$BETA_VERSION" >> $GITHUB_OUTPUT + + - name: Install dependencies + run: yarn install --immutable + + - name: Create snapshot versions + run: yarn changeset version --snapshot ${{ inputs.snapshot_tag || 'beta' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Build packages + run: yarn build + + - name: Publish beta packages + run: | + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> $HOME/.npmrc + yarn changeset publish --tag ${{ inputs.snapshot_tag || 'beta' }} + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_CONFIG_PROVENANCE: true + + - name: Summary + run: | + echo "### Beta Release Published" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Version:** \`${{ steps.version.outputs.beta }}\`" >> $GITHUB_STEP_SUMMARY + echo "**NPM Tag:** \`${{ inputs.snapshot_tag }}\`" >> $GITHUB_STEP_SUMMARY + echo "**Branch:** \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Install with:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY + echo "npm install @hyperlane-xyz/sdk@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY + echo "npm install @hyperlane-xyz/cli@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ec77b87401..bdc74f67fed 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,6 +59,7 @@ jobs: id: changesets uses: changesets/action@v1 with: + title: 'chore: release npm packages' version: yarn version:prepare env: NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/rust-release.yml b/.github/workflows/rust-release.yml index be45fcc0cfe..bf0f1facd5f 100644 --- a/.github/workflows/rust-release.yml +++ b/.github/workflows/rust-release.yml @@ -279,12 +279,19 @@ jobs: # Determine final version based on release type # workflow_dispatch always creates pre-releases if [ "$IS_PRERELEASE" = "true" ]; then - # Pre-release: append suffix + # For prereleases, calculate the next version (like changesets does for NPM) + # This ensures prerelease versions reflect what the next release will be + # e.g., if current is 1.7.0, prerelease will be 1.8.0-preview.1 (not 1.7.0-preview.1) + OUTPUT=$(./rust/scripts/ci/determine-next-version.sh "$BASE_VERSION") + NEXT_VERSION=$(echo "$OUTPUT" | sed -n '1p') + echo "Calculated next version: $NEXT_VERSION (from base $BASE_VERSION)" + + # Pre-release: append suffix to the NEXT version if [ -n "$PRERELEASE_SUFFIX" ]; then SUFFIX="$PRERELEASE_SUFFIX" else # Auto-generate preview.N - LAST_PREVIEW=$(git tag -l "agents-v${BASE_VERSION}-preview.*" | sort -V | tail -1) + LAST_PREVIEW=$(git tag -l "agents-v${NEXT_VERSION}-preview.*" | sort -V | tail -1) if [ -z "$LAST_PREVIEW" ]; then SUFFIX="preview.1" else @@ -292,7 +299,7 @@ jobs: SUFFIX="preview.$((PREVIEW_NUM + 1))" fi fi - VERSION="${BASE_VERSION}-${SUFFIX}" + VERSION="${NEXT_VERSION}-${SUFFIX}" TITLE="Agents $VERSION (Pre-release)" PRERELEASE_FLAG="--prerelease" RELEASE_TYPE="Pre-release" From c011ab27fc4ecd3d04d06685527b5144f008f303 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:45:52 +0000 Subject: [PATCH 2/7] test: temporarily trigger npm-beta-release on push --- .changeset/test-beta-release.md | 5 +++++ .github/workflows/npm-beta-release.yml | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/test-beta-release.md diff --git a/.changeset/test-beta-release.md b/.changeset/test-beta-release.md new file mode 100644 index 00000000000..d91dcdafbac --- /dev/null +++ b/.changeset/test-beta-release.md @@ -0,0 +1,5 @@ +--- +"@hyperlane-xyz/sdk": patch +--- + +test: temporary changeset for beta release workflow testing diff --git a/.github/workflows/npm-beta-release.yml b/.github/workflows/npm-beta-release.yml index 72de3376d51..637f2c32f2f 100644 --- a/.github/workflows/npm-beta-release.yml +++ b/.github/workflows/npm-beta-release.yml @@ -1,6 +1,10 @@ name: NPM Beta Release on: + # TEMPORARY: for testing - remove after + push: + branches: + - pbio/preview-release-workflows workflow_dispatch: inputs: snapshot_tag: From 3c82951245e425913794f2a25f2d5f01f4a6db85 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:00:32 +0000 Subject: [PATCH 3/7] Revert "test: temporarily trigger npm-beta-release on push" This reverts commit c011ab27fc4ecd3d04d06685527b5144f008f303. --- .changeset/test-beta-release.md | 5 ----- .github/workflows/npm-beta-release.yml | 4 ---- 2 files changed, 9 deletions(-) delete mode 100644 .changeset/test-beta-release.md diff --git a/.changeset/test-beta-release.md b/.changeset/test-beta-release.md deleted file mode 100644 index d91dcdafbac..00000000000 --- a/.changeset/test-beta-release.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/sdk": patch ---- - -test: temporary changeset for beta release workflow testing diff --git a/.github/workflows/npm-beta-release.yml b/.github/workflows/npm-beta-release.yml index 637f2c32f2f..72de3376d51 100644 --- a/.github/workflows/npm-beta-release.yml +++ b/.github/workflows/npm-beta-release.yml @@ -1,10 +1,6 @@ name: NPM Beta Release on: - # TEMPORARY: for testing - remove after - push: - branches: - - pbio/preview-release-workflows workflow_dispatch: inputs: snapshot_tag: From 326cbc8b1f9156316b777f7f36c8f37462520da4 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:01:06 +0000 Subject: [PATCH 4/7] feat: add changeset check to npm-beta-release workflow Skip build and publish steps when no changesets are present, and display a helpful summary explaining how to create a beta release. --- .github/workflows/npm-beta-release.yml | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/npm-beta-release.yml b/.github/workflows/npm-beta-release.yml index 72de3376d51..09cba6f5db3 100644 --- a/.github/workflows/npm-beta-release.yml +++ b/.github/workflows/npm-beta-release.yml @@ -54,18 +54,34 @@ jobs: echo "base=$BASE_VERSION" >> $GITHUB_OUTPUT echo "beta=$BETA_VERSION" >> $GITHUB_OUTPUT + - name: Check for changesets + id: changesets + run: | + CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" ! -name "config.json" 2>/dev/null | wc -l | tr -d ' ') + echo "count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT + if [ "$CHANGESET_COUNT" -eq 0 ]; then + echo "::warning::No pending changesets found. Beta releases require pending changeset files." + echo "To create a beta release, first add a changeset with: yarn changeset" + else + echo "Found $CHANGESET_COUNT changeset(s)" + fi + - name: Install dependencies + if: steps.changesets.outputs.count != '0' run: yarn install --immutable - name: Create snapshot versions + if: steps.changesets.outputs.count != '0' run: yarn changeset version --snapshot ${{ inputs.snapshot_tag || 'beta' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build packages + if: steps.changesets.outputs.count != '0' run: yarn build - name: Publish beta packages + if: steps.changesets.outputs.count != '0' run: | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> $HOME/.npmrc yarn changeset publish --tag ${{ inputs.snapshot_tag || 'beta' }} @@ -74,6 +90,7 @@ jobs: NPM_CONFIG_PROVENANCE: true - name: Summary + if: steps.changesets.outputs.count != '0' run: | echo "### Beta Release Published" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -86,3 +103,15 @@ jobs: echo "npm install @hyperlane-xyz/sdk@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY echo "npm install @hyperlane-xyz/cli@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + + - name: No changesets summary + if: steps.changesets.outputs.count == '0' + run: | + echo "### No Beta Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "No pending changesets found. Beta releases require pending changeset files." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "To create a beta release:" >> $GITHUB_STEP_SUMMARY + echo "1. Add a changeset: \`yarn changeset\`" >> $GITHUB_STEP_SUMMARY + echo "2. Commit the changeset file" >> $GITHUB_STEP_SUMMARY + echo "3. Run this workflow again" >> $GITHUB_STEP_SUMMARY From 512b4749a93b6b56748b208b03906385c7b51dc1 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Tue, 2 Dec 2025 11:44:57 +0000 Subject: [PATCH 5/7] CR andrey --- .github/workflows/npm-beta-release.yml | 62 ++++++++------------------ 1 file changed, 19 insertions(+), 43 deletions(-) diff --git a/.github/workflows/npm-beta-release.yml b/.github/workflows/npm-beta-release.yml index 09cba6f5db3..d63bd0783d3 100644 --- a/.github/workflows/npm-beta-release.yml +++ b/.github/workflows/npm-beta-release.yml @@ -41,60 +41,48 @@ jobs: uses: actions/setup-node@v6 with: node-version-file: .nvmrc - - - name: Get short SHA - id: sha - run: echo "short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - - name: Get base version - id: version - run: | - BASE_VERSION=$(node -p "require('./typescript/sdk/package.json').version") - BETA_VERSION="${BASE_VERSION}-${{ inputs.snapshot_tag }}.${{ steps.sha.outputs.short }}" - echo "base=$BASE_VERSION" >> $GITHUB_OUTPUT - echo "beta=$BETA_VERSION" >> $GITHUB_OUTPUT + registry-url: 'https://registry.npmjs.org' - name: Check for changesets - id: changesets run: | CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" ! -name "config.json" 2>/dev/null | wc -l | tr -d ' ') - echo "count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT if [ "$CHANGESET_COUNT" -eq 0 ]; then - echo "::warning::No pending changesets found. Beta releases require pending changeset files." - echo "To create a beta release, first add a changeset with: yarn changeset" - else - echo "Found $CHANGESET_COUNT changeset(s)" + echo "::error::No pending changesets found. Beta releases require pending changeset files." + echo "" + echo "To create a beta release:" + echo "1. Add a changeset: yarn changeset" + echo "2. Commit the changeset file" + echo "3. Run this workflow again" + exit 1 fi + echo "Found $CHANGESET_COUNT changeset(s)" - name: Install dependencies - if: steps.changesets.outputs.count != '0' run: yarn install --immutable - name: Create snapshot versions - if: steps.changesets.outputs.count != '0' - run: yarn changeset version --snapshot ${{ inputs.snapshot_tag || 'beta' }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: yarn changeset version --snapshot ${{ inputs.snapshot_tag }} + + - name: Get snapshot version + id: version + run: | + SNAPSHOT_VERSION=$(node -p "require('./typescript/sdk/package.json').version") + echo "snapshot=$SNAPSHOT_VERSION" >> $GITHUB_OUTPUT - name: Build packages - if: steps.changesets.outputs.count != '0' run: yarn build - name: Publish beta packages - if: steps.changesets.outputs.count != '0' - run: | - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> $HOME/.npmrc - yarn changeset publish --tag ${{ inputs.snapshot_tag || 'beta' }} + run: yarn changeset publish --tag ${{ inputs.snapshot_tag }} --no-git-tag env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Summary - if: steps.changesets.outputs.count != '0' run: | echo "### Beta Release Published" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "**Version:** \`${{ steps.version.outputs.beta }}\`" >> $GITHUB_STEP_SUMMARY + echo "**Version:** \`${{ steps.version.outputs.snapshot }}\`" >> $GITHUB_STEP_SUMMARY echo "**NPM Tag:** \`${{ inputs.snapshot_tag }}\`" >> $GITHUB_STEP_SUMMARY echo "**Branch:** \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -103,15 +91,3 @@ jobs: echo "npm install @hyperlane-xyz/sdk@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY echo "npm install @hyperlane-xyz/cli@${{ inputs.snapshot_tag }}" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - - - name: No changesets summary - if: steps.changesets.outputs.count == '0' - run: | - echo "### No Beta Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "No pending changesets found. Beta releases require pending changeset files." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "To create a beta release:" >> $GITHUB_STEP_SUMMARY - echo "1. Add a changeset: \`yarn changeset\`" >> $GITHUB_STEP_SUMMARY - echo "2. Commit the changeset file" >> $GITHUB_STEP_SUMMARY - echo "3. Run this workflow again" >> $GITHUB_STEP_SUMMARY From 3ad124494c1e40e747c26f90aa51d44fd1c87d53 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:45:52 +0000 Subject: [PATCH 6/7] test: add dummy changeset --- .changeset/test-beta-release.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/test-beta-release.md diff --git a/.changeset/test-beta-release.md b/.changeset/test-beta-release.md new file mode 100644 index 00000000000..d91dcdafbac --- /dev/null +++ b/.changeset/test-beta-release.md @@ -0,0 +1,5 @@ +--- +"@hyperlane-xyz/sdk": patch +--- + +test: temporary changeset for beta release workflow testing From 31d942b83c2ec4b590171dd0c8b66af3eececf18 Mon Sep 17 00:00:00 2001 From: pbio <10051819+paulbalaji@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:07:01 +0000 Subject: [PATCH 7/7] Revert "test: add dummy changeset" This reverts commit 3ad124494c1e40e747c26f90aa51d44fd1c87d53. --- .changeset/test-beta-release.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/test-beta-release.md diff --git a/.changeset/test-beta-release.md b/.changeset/test-beta-release.md deleted file mode 100644 index d91dcdafbac..00000000000 --- a/.changeset/test-beta-release.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperlane-xyz/sdk": patch ---- - -test: temporary changeset for beta release workflow testing