name: "\U0001F504 Auto-Update All Dependencies"
on:
# Daily check at 6 AM UTC (11:30 AM IST)
schedule:
- cron: '0 6 * * *'
# Manual trigger
workflow_dispatch:
inputs:
force_update:
description: 'Force update all dependencies'
required: false
default: false
type: boolean
dry_run:
description: 'Dry run (check only, no update)'
required: false
default: false
type: boolean
env:
NODE_VERSION: '20'
jobs:
# ==================== CHECK & UPDATE DEPENDENCIES ====================
update-dependencies:
name: "\U0001F504 Check & Update Dependencies"
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
outputs:
blocker_updated: ${{ steps.update-blocker.outputs.updated }}
launcher_updated: ${{ steps.update-launcher.outputs.updated }}
puppeteer_updated: ${{ steps.update-puppeteer.outputs.updated }}
root_updated: ${{ steps.update-root.outputs.updated }}
any_updated: ${{ steps.summary.outputs.any_updated }}
steps:
- name: "\U0001F4E5 Checkout"
uses: actions/checkout@v4
with:
token: ${{ secrets.GH_TOKEN || github.token }}
fetch-depth: 0
- name: "\U0001F7E2 Setup Node.js"
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: 'https://registry.npmjs.org'
- name: "\u2699\uFE0F Configure Git"
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: "\U0001F4E6 Install Dependencies"
run: npm install
# ==================== UPDATE BLOCKER ====================
- name: "\U0001F6E1\uFE0F Update brave-real-blocker dependencies"
id: update-blocker
run: |
echo "=================================================="
echo "\U0001F6E1\uFE0F Checking brave-real-blocker dependencies..."
echo "=================================================="
cd packages/brave-real-blocker
# Check outdated
echo "π Current outdated packages:"
npm outdated || true
OUTDATED=$(npm outdated --json 2>/dev/null || echo "{}")
if [ "$OUTDATED" != "{}" ] && [ -n "$OUTDATED" ]; then
echo "π¦ Found outdated dependencies!"
echo "$OUTDATED" | jq -r 'to_entries[] | "\(.key): \(.value.current) β \(.value.latest)"' || true
if [ "${{ github.event.inputs.dry_run }}" != "true" ]; then
# Update all dependencies
npm update
# Update to latest major versions for key packages
npm install @cliqz/adblocker-puppeteer@latest --save 2>/dev/null || true
npm install @ghostery/adblocker-puppeteer@latest --save 2>/dev/null || true
npm install cross-fetch@latest fs-extra@latest --save 2>/dev/null || true
echo "updated=true" >> $GITHUB_OUTPUT
echo "β
Updated brave-real-blocker dependencies"
else
echo "updated=false" >> $GITHUB_OUTPUT
echo "π§ͺ Dry run - skipping update"
fi
else
echo "β
All dependencies are up to date"
echo "updated=false" >> $GITHUB_OUTPUT
fi
# ==================== UPDATE LAUNCHER ====================
- name: "\U0001F680 Update brave-real-launcher dependencies"
id: update-launcher
run: |
echo "=================================================="
echo "\U0001F680 Checking brave-real-launcher dependencies..."
echo "=================================================="
cd packages/brave-real-launcher
echo "π Current outdated packages:"
npm outdated || true
OUTDATED=$(npm outdated --json 2>/dev/null || echo "{}")
if [ "$OUTDATED" != "{}" ] && [ -n "$OUTDATED" ]; then
echo "π¦ Found outdated dependencies!"
if [ "${{ github.event.inputs.dry_run }}" != "true" ]; then
npm update
npm install which@latest escape-string-regexp@latest is-wsl@latest --save 2>/dev/null || true
echo "updated=true" >> $GITHUB_OUTPUT
echo "β
Updated brave-real-launcher dependencies"
else
echo "updated=false" >> $GITHUB_OUTPUT
fi
else
echo "β
All dependencies are up to date"
echo "updated=false" >> $GITHUB_OUTPUT
fi
# ==================== UPDATE PUPPETEER-CORE ====================
- name: "\U0001F3AD Update brave-real-puppeteer-core dependencies"
id: update-puppeteer
run: |
echo "=================================================="
echo "\U0001F3AD Checking brave-real-puppeteer-core dependencies..."
echo "=================================================="
cd packages/brave-real-puppeteer-core
echo "π Current outdated packages:"
npm outdated || true
OUTDATED=$(npm outdated --json 2>/dev/null || echo "{}")
if [ "$OUTDATED" != "{}" ] && [ -n "$OUTDATED" ]; then
echo "π¦ Found outdated dependencies!"
if [ "${{ github.event.inputs.dry_run }}" != "true" ]; then
npm update
# Update puppeteer-core and playwright-core to latest
npm install puppeteer-core@latest --save-optional 2>/dev/null || true
npm install playwright-core@latest --save-optional 2>/dev/null || true
npm install yargs@latest --save 2>/dev/null || true
echo "updated=true" >> $GITHUB_OUTPUT
echo "β
Updated brave-real-puppeteer-core dependencies"
else
echo "updated=false" >> $GITHUB_OUTPUT
fi
else
echo "β
All dependencies are up to date"
echo "updated=false" >> $GITHUB_OUTPUT
fi
# ==================== UPDATE ROOT ====================
- name: "\U0001F981 Update root (mcp-server) dependencies"
id: update-root
run: |
echo "=================================================="
echo "\U0001F981 Checking root package dependencies..."
echo "=================================================="
echo "π Current outdated packages:"
npm outdated || true
OUTDATED=$(npm outdated --json 2>/dev/null || echo "{}")
if [ "$OUTDATED" != "{}" ] && [ -n "$OUTDATED" ]; then
echo "π¦ Found outdated dependencies!"
if [ "${{ github.event.inputs.dry_run }}" != "true" ]; then
npm update
# Update key dependencies
npm install ghost-cursor@latest --save 2>/dev/null || true
npm install puppeteer-extra@latest puppeteer-extra-plugin-stealth@latest --save 2>/dev/null || true
echo "updated=true" >> $GITHUB_OUTPUT
echo "β
Updated root dependencies"
else
echo "updated=false" >> $GITHUB_OUTPUT
fi
else
echo "β
All dependencies are up to date"
echo "updated=false" >> $GITHUB_OUTPUT
fi
# ==================== SUMMARY ====================
- name: "\U0001F4CB Check if any updates"
id: summary
run: |
if [ "${{ steps.update-blocker.outputs.updated }}" = "true" ] || \
[ "${{ steps.update-launcher.outputs.updated }}" = "true" ] || \
[ "${{ steps.update-puppeteer.outputs.updated }}" = "true" ] || \
[ "${{ steps.update-root.outputs.updated }}" = "true" ] || \
[ "${{ github.event.inputs.force_update }}" = "true" ]; then
echo "any_updated=true" >> $GITHUB_OUTPUT
echo "π¦ Dependencies were updated!"
else
echo "any_updated=false" >> $GITHUB_OUTPUT
echo "β
No updates needed"
fi
# ==================== SYNC INTERNAL VERSIONS ====================
- name: "\U0001F504 Sync internal dependency versions"
if: steps.summary.outputs.any_updated == 'true'
run: |
echo "π Syncing internal dependency versions..."
node scripts/prepare-publish.js
# ==================== BUILD TEST ====================
- name: "\U0001F528 Build all packages"
if: steps.summary.outputs.any_updated == 'true'
run: |
echo "π¨ Building all packages..."
cd packages/brave-real-blocker && npm run build 2>/dev/null || true && cd ../..
cd packages/brave-real-launcher && npm run build 2>/dev/null || true && cd ../..
cd packages/brave-real-puppeteer-core && npm run build 2>/dev/null || true && cd ../..
npm run build || true
echo "β
Build completed"
# ==================== COMMIT & PUSH ====================
- name: "\U0001F4DD Commit dependency updates"
if: steps.summary.outputs.any_updated == 'true'
run: |
# Check for changes
if git diff --quiet && git diff --staged --quiet; then
echo "No changes to commit"
exit 0
fi
# Create detailed commit message
COMMIT_MSG="chore(deps): \U0001F504 Auto-update dependencies\n\n"
if [ "${{ steps.update-blocker.outputs.updated }}" = "true" ]; then
COMMIT_MSG="${COMMIT_MSG}- Updated brave-real-blocker dependencies\n"
fi
if [ "${{ steps.update-launcher.outputs.updated }}" = "true" ]; then
COMMIT_MSG="${COMMIT_MSG}- Updated brave-real-launcher dependencies\n"
fi
if [ "${{ steps.update-puppeteer.outputs.updated }}" = "true" ]; then
COMMIT_MSG="${COMMIT_MSG}- Updated brave-real-puppeteer-core dependencies\n"
fi
if [ "${{ steps.update-root.outputs.updated }}" = "true" ]; then
COMMIT_MSG="${COMMIT_MSG}- Updated root package dependencies\n"
fi
git add .
echo -e "$COMMIT_MSG" | git commit -F -
git push origin main
echo "β
Changes committed and pushed"
# ==================== TRIGGER PUBLISH ====================
trigger-publish:
name: "\U0001F680 Trigger NPM Publish"
runs-on: ubuntu-latest
needs: update-dependencies
if: needs.update-dependencies.outputs.any_updated == 'true' && github.event.inputs.dry_run != 'true'
steps:
- name: "\U0001F680 Trigger Monorepo Publish"
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN || github.token }}
script: |
console.log("π Triggering Monorepo Publish Workflow...");
try {
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'monorepo-publish.yml',
ref: 'main',
inputs: {
force_publish: 'true',
increment_type: 'patch'
}
});
console.log("β
Successfully triggered publish workflow!");
} catch (error) {
console.log("β οΈ Could not trigger workflow:", error.message);
console.log("Manual trigger may be needed.");
}
# ==================== SUMMARY ====================
summary:
name: "\U0001F4CB Update Summary"
runs-on: ubuntu-latest
needs: [update-dependencies, trigger-publish]
if: always()
steps:
- name: "\U0001F4CB Generate Summary"
run: |
echo "## \U0001F504 Dependency Auto-Update Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### \U0001F4E6 Package Updates" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Package | Updated |" >> $GITHUB_STEP_SUMMARY
echo "|---------|---------|" >> $GITHUB_STEP_SUMMARY
echo "| brave-real-blocker | ${{ needs.update-dependencies.outputs.blocker_updated }} |" >> $GITHUB_STEP_SUMMARY
echo "| brave-real-launcher | ${{ needs.update-dependencies.outputs.launcher_updated }} |" >> $GITHUB_STEP_SUMMARY
echo "| brave-real-puppeteer-core | ${{ needs.update-dependencies.outputs.puppeteer_updated }} |" >> $GITHUB_STEP_SUMMARY
echo "| brave-real-browser-mcp-server | ${{ needs.update-dependencies.outputs.root_updated }} |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### \U0001F680 Publish Status" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ needs.update-dependencies.outputs.any_updated }}" = "true" ]; then
echo "β
Dependencies updated and publish triggered" >> $GITHUB_STEP_SUMMARY
else
echo "β
All dependencies are up to date - no publish needed" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "*Auto-generated by GitHub Actions*" >> $GITHUB_STEP_SUMMARY