Skip to content

Release

Release #73

Workflow file for this run

name: Release
on:
workflow_run:
workflows: ['CI']
types:
- completed
branches: [main]
workflow_dispatch:
permissions:
contents: write
id-token: write
jobs:
publish:
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Determine release state
id: determine
run: |
set -euo pipefail
CURRENT_VERSION=$(bun -e 'import pkg from "./package.json"; console.log(pkg.version)')
echo "current_version=$CURRENT_VERSION" >> "$GITHUB_OUTPUT"
if git rev-parse HEAD^ >/dev/null 2>&1; then
PREVIOUS_VERSION=$(bun -e "const { execSync } = require('node:child_process'); try { const data = execSync('git show HEAD^:package.json', { stdio: ['ignore', 'pipe', 'ignore'] }); const json = JSON.parse(data.toString()); if (json && typeof json.version === 'string') { process.stdout.write(json.version); } } catch (error) {}")
PREVIOUS_VERSION=${PREVIOUS_VERSION//$'\n'/}
else
PREVIOUS_VERSION=""
fi
echo "previous_version=$PREVIOUS_VERSION" >> "$GITHUB_OUTPUT"
if [ "$CURRENT_VERSION" = "$PREVIOUS_VERSION" ]; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
fi
git fetch --tags --force
if git tag -l "v$CURRENT_VERSION" | grep -q "v$CURRENT_VERSION"; then
echo "tag_exists=true" >> "$GITHUB_OUTPUT"
else
echo "tag_exists=false" >> "$GITHUB_OUTPUT"
fi
- name: Install dependencies
if: steps.determine.outputs.changed == 'true' && steps.determine.outputs.tag_exists == 'false'
run: bun ci
- name: Generate release notes
if: steps.determine.outputs.changed == 'true' && steps.determine.outputs.tag_exists == 'false'
id: release_notes
run: |
set -euo pipefail
CURRENT_VERSION="${{ steps.determine.outputs.current_version }}"
PREVIOUS_VERSION="${{ steps.determine.outputs.previous_version }}"
RANGE=""
COMPARE_URL=""
LAST_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || true)
if [ -z "$LAST_TAG" ] && [ -n "$PREVIOUS_VERSION" ] && git rev-parse "refs/tags/v${PREVIOUS_VERSION}" >/dev/null 2>&1; then
LAST_TAG="v${PREVIOUS_VERSION}"
fi
if [ -n "$LAST_TAG" ]; then
RANGE="${LAST_TAG}..HEAD"
COMPARE_URL="https://github.com/${GITHUB_REPOSITORY}/compare/${LAST_TAG}...v${CURRENT_VERSION}"
fi
if [ -n "$RANGE" ]; then
CHANGELOG=$(git log --no-merges --pretty=format:'- %s (%h)' "$RANGE")
else
CHANGELOG=$(git log --no-merges --pretty=format:'- %s (%h)')
fi
if [ -z "$CHANGELOG" ]; then
CHANGELOG="- Initial release"
fi
BODY_FILE=$(mktemp)
{
echo "## Release v${CURRENT_VERSION}"
echo ""
if [ -n "$COMPARE_URL" ]; then
echo "Compare changes: $COMPARE_URL"
echo ""
fi
printf "%s\n" "$CHANGELOG"
echo ""
echo "### Installation"
echo ""
echo "Add to your \`opencode.json\`:"
echo ""
printf '%s\n' '```json'
printf '%s\n' '{'
printf '%s\n' ' "$schema": "https://opencode.ai/config.json",'
printf '%s\n' ' "plugin": ["opencode-pty"]'
printf '%s\n' '}'
printf '%s\n' '```'
echo ""
echo "### Update Instructions"
echo ""
echo "To get the latest version:"
echo ""
printf '%s\n' '```bash'
printf '%s\n' 'rm -rf ~/.cache/opencode/node_modules/opencode-pty'
printf '%s\n' 'opencode'
printf '%s\n' '```'
} >"$BODY_FILE"
cat "$BODY_FILE"
{
echo "body<<EOF"
cat "$BODY_FILE"
echo "EOF"
} >>"$GITHUB_OUTPUT"
- name: Create GitHub release
if: steps.determine.outputs.changed == 'true' && steps.determine.outputs.tag_exists == 'false'
run: |
gh release create "v${{ steps.determine.outputs.current_version }}" \
--title "v${{ steps.determine.outputs.current_version }}" \
--notes "${{ steps.release_notes.outputs.body }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish to npm
if: steps.determine.outputs.changed == 'true' && steps.determine.outputs.tag_exists == 'false'
run: npm publish --access public --provenance