Skip to content

Check for Updates

Check for Updates #34

name: Check for Updates
on:
schedule:
# Run daily at 2 AM UTC
- cron: '0 2 * * *'
workflow_dispatch:
inputs:
force_update:
description: 'Force update even if versions match'
type: boolean
default: false
permissions:
contents: write
pull-requests: write
jobs:
check-versions:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Check latest versions
id: check
run: |
set -euo pipefail
# --- Read current versions from versions.json ---
CURRENT_CLI=$(jq -r '."claude-code-cli"' versions.json)
CURRENT_SDK=$(jq -r '."claude-agent-sdk-cli"' versions.json)
CURRENT_PYTHON=$(jq -r '."claude-agent-sdk-python"' versions.json)
echo "Current Claude Code CLI: $CURRENT_CLI"
echo "Current Claude Agent SDK: $CURRENT_SDK"
echo "Current Python SDK: $CURRENT_PYTHON"
# --- Fetch latest versions from registries ---
LATEST_CLI=$(curl -sf https://registry.npmjs.org/@anthropic-ai/claude-code/latest | jq -r '.version')
LATEST_SDK=$(curl -sf https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/latest | jq -r '.version')
LATEST_PYTHON=$(curl -sf https://pypi.org/pypi/claude-agent-sdk/json | jq -r '.info.version')
echo "Latest Claude Code CLI: $LATEST_CLI"
echo "Latest Claude Agent SDK: $LATEST_SDK"
echo "Latest Python SDK: $LATEST_PYTHON"
# --- Determine what changed ---
NPM_CHANGED=false
PYTHON_CHANGED=false
if [[ "$CURRENT_CLI" != "$LATEST_CLI" ]] || [[ "$CURRENT_SDK" != "$LATEST_SDK" ]]; then
NPM_CHANGED=true
fi
if [[ "$CURRENT_PYTHON" != "$LATEST_PYTHON" ]]; then
PYTHON_CHANGED=true
fi
# Force flag overrides both
if [[ "${{ github.event.inputs.force_update }}" == "true" ]]; then
NPM_CHANGED=true
PYTHON_CHANGED=true
fi
UPDATE_NEEDED=false
if [[ "$NPM_CHANGED" == "true" ]] || [[ "$PYTHON_CHANGED" == "true" ]]; then
UPDATE_NEEDED=true
fi
echo "npm_changed=$NPM_CHANGED" | tee -a "$GITHUB_OUTPUT"
echo "python_changed=$PYTHON_CHANGED" | tee -a "$GITHUB_OUTPUT"
echo "update_needed=$UPDATE_NEEDED" | tee -a "$GITHUB_OUTPUT"
echo "cli_version=$LATEST_CLI" | tee -a "$GITHUB_OUTPUT"
echo "sdk_version=$LATEST_SDK" | tee -a "$GITHUB_OUTPUT"
echo "python_version=$LATEST_PYTHON" | tee -a "$GITHUB_OUTPUT"
- name: Update versions and Dockerfiles
if: steps.check.outputs.update_needed == 'true'
env:
NPM_CHANGED: ${{ steps.check.outputs.npm_changed }}
PYTHON_CHANGED: ${{ steps.check.outputs.python_changed }}
CLI_VERSION: ${{ steps.check.outputs.cli_version }}
SDK_VERSION: ${{ steps.check.outputs.sdk_version }}
PYTHON_VERSION: ${{ steps.check.outputs.python_version }}
run: |
set -euo pipefail
TODAY=$(date -u +%Y-%m-%d)
# --- Update versions.json with all latest versions + today's date ---
jq --arg cli "$CLI_VERSION" \
--arg sdk "$SDK_VERSION" \
--arg py "$PYTHON_VERSION" \
--arg date "$TODAY" \
'
.["claude-code-cli"] = $cli |
.["claude-agent-sdk-cli"] = $sdk |
.["claude-agent-sdk-python"] = $py |
.last_updated = $date |
.last_check = $date
' versions.json > versions.json.tmp && mv versions.json.tmp versions.json
echo "--- Updated versions.json ---"
cat versions.json
# --- Update Dockerfile comments (only affected files) ---
if [[ "$NPM_CHANGED" == "true" ]]; then
for f in Dockerfile.typescript Dockerfile.alpine; do
echo "Updating $f (npm packages)"
sed -i "s|^# Build Date: .*|# Build Date: $TODAY|" "$f"
sed -i "s|^# Claude Code CLI: @anthropic-ai/claude-code ~v.*|# Claude Code CLI: @anthropic-ai/claude-code ~v${CLI_VERSION}|" "$f"
sed -i "s|^# Claude Agent SDK: @anthropic-ai/claude-agent-sdk ~v.*|# Claude Agent SDK: @anthropic-ai/claude-agent-sdk ~v${SDK_VERSION}|" "$f"
done
fi
if [[ "$PYTHON_CHANGED" == "true" ]]; then
for f in Dockerfile Dockerfile.alpine-python; do
echo "Updating $f (python package)"
sed -i "s|^# Build Date: .*|# Build Date: $TODAY|" "$f"
sed -i "s|^# Python SDK: claude-agent-sdk ~v.*|# Python SDK: claude-agent-sdk ~v${PYTHON_VERSION}|" "$f"
done
fi
- name: Create pull request
if: steps.check.outputs.update_needed == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_CHANGED: ${{ steps.check.outputs.npm_changed }}
PYTHON_CHANGED: ${{ steps.check.outputs.python_changed }}
CLI_VERSION: ${{ steps.check.outputs.cli_version }}
SDK_VERSION: ${{ steps.check.outputs.sdk_version }}
PYTHON_VERSION: ${{ steps.check.outputs.python_version }}
run: |
set -euo pipefail
TODAY=$(date -u +%Y-%m-%d)
BRANCH="auto-update/sdk-${TODAY}"
# --- Configure git identity ---
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# --- Delete remote branch if it already exists (same-day re-runs) ---
git push origin --delete "$BRANCH" 2>/dev/null || true
# --- Create branch and commit ---
git checkout -b "$BRANCH"
git add versions.json Dockerfile*
# Build a meaningful commit message
COMMIT_LINES="chore: update SDK versions ($TODAY)"
COMMIT_LINES+=$'\n'
if [[ "$NPM_CHANGED" == "true" ]]; then
COMMIT_LINES+=$'\n'"- Claude Code CLI: v${CLI_VERSION}"
COMMIT_LINES+=$'\n'"- Claude Agent SDK: v${SDK_VERSION}"
fi
if [[ "$PYTHON_CHANGED" == "true" ]]; then
COMMIT_LINES+=$'\n'"- Python SDK: v${PYTHON_VERSION}"
fi
git commit -m "$COMMIT_LINES"
git push -u origin "$BRANCH"
# --- Build PR body ---
BODY="## Automated SDK Version Update"
BODY+=$'\n\n'"**Date:** ${TODAY}"
BODY+=$'\n\n'"### Changes"
if [[ "$NPM_CHANGED" == "true" ]]; then
BODY+=$'\n'"- Claude Code CLI updated to v${CLI_VERSION}"
BODY+=$'\n'"- Claude Agent SDK updated to v${SDK_VERSION}"
BODY+=$'\n'"- Updated Dockerfile.typescript and Dockerfile.alpine"
fi
if [[ "$PYTHON_CHANGED" == "true" ]]; then
BODY+=$'\n'"- Python SDK updated to v${PYTHON_VERSION}"
BODY+=$'\n'"- Updated Dockerfile and Dockerfile.alpine-python"
fi
BODY+=$'\n\n'"### Automated actions"
BODY+=$'\n'"- Updated \`versions.json\` with latest versions"
BODY+=$'\n'"- Updated version comments in affected Dockerfiles"
BODY+=$'\n'"- Container images will be rebuilt automatically upon merge"
# --- Ensure labels exist ---
gh label create "dependencies" --description "Dependency version updates" --color "0366d6" 2>/dev/null || true
gh label create "automated" --description "Automated pull requests" --color "ededed" 2>/dev/null || true
# --- Create PR ---
PR_URL=$(gh pr create \
--title "chore: update SDK versions (${TODAY})" \
--body "$BODY" \
--label "dependencies,automated" \
--base main)
echo "Created PR: $PR_URL"
# --- Enable auto-merge ---
gh pr merge --auto --squash "$PR_URL"
echo "Auto-merge enabled for $PR_URL"