diff --git a/.github/workflows/release-v1x.yml b/.github/workflows/release-v1x.yml new file mode 100644 index 000000000..3bebc9b50 --- /dev/null +++ b/.github/workflows/release-v1x.yml @@ -0,0 +1,105 @@ +# Publish v1.x releases when a v1.* tag is pushed +# This allows releasing from the v1.x branch without switching GitHub's default branch +# +# Automatic (latest v1.x): +# git checkout v1.x +# npm version patch # bumps version and creates tag +# git push origin v1.x --tags +# +# Manual (for older minor versions like v1.23.x): +# 1. Create a release branch: git checkout -b release/1.23 v1.23.1 +# 2. Apply your fixes +# 3. Bump version: npm version patch # creates v1.23.2 tag +# 4. Push: git push origin release/1.23 --tags +# 5. Run this workflow manually from GitHub Actions, specifying the tag +# +# The workflow will automatically build, test, and publish to npm. + +name: Publish v1.x + +on: + push: + tags: + - 'v1.*' + workflow_dispatch: + inputs: + ref: + description: 'Git ref to release (tag, e.g., v1.23.2)' + required: true + type: string + +permissions: + contents: read + +concurrency: ${{ github.workflow }}-${{ inputs.ref || github.ref }} + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + + - run: npm ci + - run: npm run check + - run: npm run build + + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: [18, 24] + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: npm + + - run: npm ci + - run: npm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + environment: release + + permissions: + contents: read + id-token: write + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + registry-url: 'https://registry.npmjs.org' + + - run: npm ci + + - name: Determine npm tag + id: npm-tag + run: | + VERSION=$(node -p "require('./package.json').version") + # Use "release-X.Y" as tag for v1.x releases + # This allows users to install specific minor versions: + # npm install @modelcontextprotocol/sdk@release-1.25 + MAJOR_MINOR=$(echo "$VERSION" | cut -d. -f1,2) + echo "tag=release-${MAJOR_MINOR}" >> $GITHUB_OUTPUT + + - run: npm publish --provenance --access public --tag ${{ steps.npm-tag.outputs.tag }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64c8ab140..767c3f0d4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,6 +60,48 @@ pnpm --filter @modelcontextprotocol/examples-server exec tsx src/simpleStreamabl pnpm --filter @modelcontextprotocol/examples-client exec tsx src/simpleStreamableHttp.ts ``` +## Releasing v1.x Patches + +The `v1.x` branch contains the stable v1 release. To release a patch: + +### Latest v1.x (e.g., v1.25.3) + +```bash +git checkout v1.x +git pull origin v1.x +# Apply your fix or cherry-pick commits +npm version patch # Bumps version and creates tag (e.g., v1.25.3) +git push origin v1.x --tags +``` + +The tag push automatically triggers the release workflow. + +### Older minor versions (e.g., v1.23.2) + +For patching older minor versions that aren't on the `v1.x` branch: + +```bash +# 1. Create a release branch from the last release tag +git checkout -b release/1.23 v1.23.1 + +# 2. Apply your fixes (cherry-pick or manual) +git cherry-pick + +# 3. Bump version and push +npm version patch # Creates v1.23.2 tag +git push origin release/1.23 --tags +``` + +Then manually trigger the "Publish v1.x" workflow from [GitHub Actions](https://github.com/modelcontextprotocol/typescript-sdk/actions/workflows/release-v1x.yml), specifying the tag (e.g., `v1.23.2`). + +### npm Tags + +v1.x releases are published with `release-X.Y` npm tags (e.g., `release-1.25`), not `latest`. To install a specific minor version: + +```bash +npm install @modelcontextprotocol/sdk@release-1.25 +``` + ## Code of Conduct This project follows our [Code of Conduct](CODE_OF_CONDUCT.md). Please review it before contributing.