name: Release Packages
on:
push:
tags:
- "v*" # Release all packages with same version
- "tauri-plugin-mcp-bridge/v*" # Release only the plugin
- "mcp-server/v*" # Release only the server
jobs:
determine-packages:
name: Determine packages to release
runs-on: ubuntu-latest
outputs:
release-plugin: ${{ steps.check.outputs.plugin }}
release-server: ${{ steps.check.outputs.server }}
version: ${{ steps.check.outputs.version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
persist-credentials: false
- name: Extract version and check packages
id: check
run: |
TAG=${GITHUB_REF#refs/tags/}
# Check if we should release plugin
if [[ "$TAG" == "tauri-plugin-mcp-bridge/v"* ]]; then
VERSION=${TAG#tauri-plugin-mcp-bridge/v}
echo "plugin=true" >> $GITHUB_OUTPUT
echo "server=false" >> $GITHUB_OUTPUT
elif [[ "$TAG" == "mcp-server/v"* ]]; then
VERSION=${TAG#mcp-server/v}
echo "plugin=false" >> $GITHUB_OUTPUT
echo "server=true" >> $GITHUB_OUTPUT
else
# Generic version tag - release all packages
VERSION=${TAG#v}
echo "plugin=true" >> $GITHUB_OUTPUT
echo "server=true" >> $GITHUB_OUTPUT
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
test-plugin:
name: Test tauri-plugin-mcp-bridge
needs: determine-packages
if: needs.determine-packages.outputs.release-plugin == 'true'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "npm"
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install dependencies
run: npm ci
- name: Build and test plugin
run: |
cd packages/tauri-plugin-mcp-bridge
npm run build
cargo test --all-features
cargo fmt -- --check
cargo clippy -- -D warnings
test-server:
name: Test @hypothesi/tauri-mcp-server
needs: determine-packages
if: needs.determine-packages.outputs.release-server == 'true'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node: ["24", "20"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Build and test server
run: |
cd packages/mcp-server
npm run build
npm test
npx tsc --noEmit
release-plugin:
name: Release tauri-plugin-mcp-bridge
needs: [determine-packages, test-plugin]
if: needs.determine-packages.outputs.release-plugin == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
registry-url: "https://registry.npmjs.org"
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Install and update versions
run: |
npm ci
cd packages/tauri-plugin-mcp-bridge
sed -i.bak "s/^version = \".*\"/version = \"${{ needs.determine-packages.outputs.version }}\"/" Cargo.toml && rm Cargo.toml.bak
npm version ${{ needs.determine-packages.outputs.version }} --no-git-tag-version --allow-same-version
- name: Build
run: |
cd packages/tauri-plugin-mcp-bridge
npm run build
cargo build --release
- name: Publish to NPM
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
cd packages/tauri-plugin-mcp-bridge
npm publish --access public --provenance
continue-on-error: false
- name: Publish to crates.io
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
cd packages/tauri-plugin-mcp-bridge
cargo publish --token "${CARGO_REGISTRY_TOKEN}"
continue-on-error: false
release-server:
name: Release @hypothesi/tauri-mcp-server
needs: [determine-packages, test-server]
if: needs.determine-packages.outputs.release-server == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
registry-url: "https://registry.npmjs.org"
- name: Install and update version
run: |
npm ci
cd packages/mcp-server
npm version ${{ needs.determine-packages.outputs.version }} --no-git-tag-version --allow-same-version
- name: Build
run: |
cd packages/mcp-server
npm run build
- name: Publish to NPM
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
cd packages/mcp-server
npm publish --access public --provenance
continue-on-error: false
create-release:
name: Create GitHub Release
needs: [determine-packages, release-plugin, release-server]
if: ${{ !cancelled() && (needs.release-plugin.result == 'success' || needs.release-server.result == 'success' || needs.release-plugin.result == 'skipped' || needs.release-server.result == 'skipped') }}
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Generate release notes
id: release_notes
run: |
VERSION=${{ needs.determine-packages.outputs.version }}
TAG=${GITHUB_REF#refs/tags/}
echo "notes<<EOF" >> $GITHUB_OUTPUT
echo "# Release $VERSION" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
if [[ "${{ needs.determine-packages.outputs.release-plugin }}" == "true" ]]; then
echo "## tauri-plugin-mcp-bridge" >> $GITHUB_OUTPUT
echo "- Published to [crates.io](https://crates.io/crates/tauri-plugin-mcp-bridge)" >> $GITHUB_OUTPUT
echo "- Published to [npm](https://www.npmjs.com/package/@hypothesi/tauri-plugin-mcp-bridge)" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
fi
if [[ "${{ needs.determine-packages.outputs.release-server }}" == "true" ]]; then
echo "## @hypothesi/tauri-mcp-server" >> $GITHUB_OUTPUT
echo "- Published to [npm](https://www.npmjs.com/package/@hypothesi/tauri-mcp-server)" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
fi
echo "See individual CHANGELOG.md files for detailed changes." >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create GitHub Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref_name }}
name: "Release ${{ needs.determine-packages.outputs.version }}"
body: ${{ steps.release_notes.outputs.notes }}
draft: false
prerelease: false