name: Release Agent SDK on: workflow_dispatch: concurrency: group: release-agent-sdk cancel-in-progress: false jobs: publish: if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest permissions: contents: write pull-requests: write defaults: run: working-directory: packages/browseros-agent/packages/agent-sdk steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v6 with: node-version: "20" registry-url: "https://registry.npmjs.org" - name: Install dependencies run: bun ci working-directory: packages/browseros-agent - name: Build run: bun run build - name: Test run: bun test - name: Get version id: version run: | echo "version=$(node -p "require('./package.json').version")" >> "$GITHUB_OUTPUT" echo "release_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" - name: Generate release notes env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | SDK_PATH="packages/browseros-agent/packages/agent-sdk" CURRENT_TAG="agent-sdk-v${{ steps.version.outputs.version }}" # Find the previous tag, excluding the current version's tag # (which may already exist from a prior failed run) PREV_TAG=$(git tag -l "agent-sdk-v*" --sort=-v:refname | grep -v "^${CURRENT_TAG}$" | head -n 1) if [ -z "$PREV_TAG" ]; then echo "Initial release" > /tmp/release-notes.md else # Get commits scoped to the SDK directory COMMITS=$(git log "$PREV_TAG"..HEAD --pretty=format:"%H" -- "$SDK_PATH") if [ -z "$COMMITS" ]; then echo "No notable changes." > /tmp/release-notes.md else echo "## What's Changed" > /tmp/release-notes.md echo "" >> /tmp/release-notes.md # For each commit, find the associated PR and format with author CONTRIBUTORS="" while IFS= read -r SHA; do # Get commit subject and author SUBJECT=$(git log -1 --pretty=format:"%s" "$SHA") AUTHOR=$(git log -1 --pretty=format:"%an" "$SHA") GITHUB_USER=$(gh api "/repos/${{ github.repository }}/commits/${SHA}" --jq '.author.login // empty' 2>/dev/null) # Find associated PR number PR_NUM=$(gh api "/repos/${{ github.repository }}/commits/${SHA}/pulls" --jq '.[0].number // empty' 2>/dev/null) # Format line: skip PR number if already in the commit subject # (squash merges include "(#123)" in the subject automatically) if [ -n "$PR_NUM" ] && ! echo "$SUBJECT" | grep -qF "(#${PR_NUM})"; then echo "- ${SUBJECT} (#${PR_NUM})" >> /tmp/release-notes.md else echo "- ${SUBJECT}" >> /tmp/release-notes.md fi done <<< "$COMMITS" fi fi working-directory: ${{ github.workspace }} - name: Publish run: npm publish --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create GitHub release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG="agent-sdk-v${{ steps.version.outputs.version }}" RELEASE_SHA="${{ steps.version.outputs.release_sha }}" TITLE="@browseros-ai/agent-sdk v${{ steps.version.outputs.version }}" # Create or reuse tag (idempotent for re-runs) if git rev-parse "$TAG" >/dev/null 2>&1; then echo "Tag $TAG already exists, skipping tag creation" else git tag "$TAG" "$RELEASE_SHA" fi # Push tag (skip if already on remote) if git ls-remote --tags origin "$TAG" | grep -q "$TAG"; then echo "Tag $TAG already on remote, skipping push" else git push origin "$TAG" fi # Create or update release if gh release view "$TAG" >/dev/null 2>&1; then echo "Release $TAG already exists, updating" gh release edit "$TAG" --title "$TITLE" --notes-file /tmp/release-notes.md else gh release create "$TAG" --title "$TITLE" --notes-file /tmp/release-notes.md fi working-directory: ${{ github.workspace }} - name: Update CHANGELOG.md via PR env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION="${{ steps.version.outputs.version }}" DATE=$(date -u +"%Y-%m-%d") BRANCH="docs/agent-sdk-changelog-v${VERSION}" CHANGELOG="packages/browseros-agent/packages/agent-sdk/CHANGELOG.md" # Return to main before branching git checkout main # Use head/tail to safely insert without sed quoting issues { head -n 1 "$CHANGELOG" echo "" echo "## v${VERSION} (${DATE})" echo "" cat /tmp/release-notes.md echo "" tail -n +2 "$CHANGELOG" } > /tmp/new-changelog.md mv /tmp/new-changelog.md "$CHANGELOG" git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git checkout -b "$BRANCH" git add "$CHANGELOG" git commit -m "docs: update agent-sdk changelog for v${VERSION}" git push origin "$BRANCH" gh pr create \ --title "docs: update agent-sdk changelog for v${VERSION}" \ --body "Auto-generated changelog update for @browseros-ai/agent-sdk v${VERSION}." \ --base main \ --head "$BRANCH" gh pr merge "$BRANCH" --squash --auto || true working-directory: ${{ github.workspace }}