name: Release on: push: tags: ['v*'] permissions: contents: write id-token: write jobs: release: name: Create Release runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: '20.x' registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: npm ci - name: Verify OpenCode package payload run: node tests/scripts/build-opencode.test.js - name: Validate version tag run: | if ! [[ "${REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Invalid version tag format. Expected vX.Y.Z" exit 1 fi env: REF_NAME: ${{ github.ref_name }} - name: Verify package version matches tag env: TAG_NAME: ${{ github.ref_name }} run: | TAG_VERSION="${TAG_NAME#v}" PACKAGE_VERSION=$(node -p "require('./package.json').version") if [ "$TAG_VERSION" != "$PACKAGE_VERSION" ]; then echo "::error::Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)" echo "Run: ./scripts/release.sh $TAG_VERSION" exit 1 fi - name: Verify release metadata stays in sync run: node tests/plugin-manifest.test.js - name: Check npm publish state id: npm_publish_state run: | PACKAGE_NAME=$(node -p "require('./package.json').name") PACKAGE_VERSION=$(node -p "require('./package.json').version") if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then echo "already_published=true" >> "$GITHUB_OUTPUT" else echo "already_published=false" >> "$GITHUB_OUTPUT" fi - name: Publish npm package if: steps.npm_publish_state.outputs.already_published != 'true' run: npm publish --access public --provenance - name: Generate release highlights id: highlights env: TAG_NAME: ${{ github.ref_name }} run: | TAG_VERSION="${TAG_NAME#v}" cat > release_body.md <