evOo-local/.github/workflows/autopilot-auto-merge.yml
cynarAI 45d3f1ae11
Equal message sizes and one evOo logo on the way in (#183)
* Read agent replies at the size of the user's own messages

Chat markdown set its own 17px reading size scaled for phones, so agent replies
rendered at about 19px while the user's bubbles on the same phone read at 16px.
The markdown now takes size and leading from the bubble around it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ

* Show the same evOo logo on the welcome and sign-in screens

The welcome screen showed the eyes-only mascot over an "EvOo" title, while sign-in
and sign-up showed the teal face (the favicon and app icon) through a CSS override of
the old two-pill markup. Both screens now render the teal logo directly, the title reads
"evOo", and the CSS override is gone. The welcome lines balance so no word sits alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ

* Run the autopilot auto-merge job on Linux runners again

The macOS runners that joined the evoo-ci pool have no gh on the runner's PATH, so the
job died with "gh: command not found" whenever one of them picked it up. The job takes
seconds, so it gains nothing from the extra runners.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-09 13:33:44 +02:00

123 lines
4.7 KiB
YAML

# Enables GitHub auto-merge for Autopilot PRs once the Product CI gate is green.
# Label a pull request with `autopilot` or `automerge` to opt in.
# This workflow is informational only — never add it to required status checks.
name: autopilot auto-merge
on:
pull_request:
types: [labeled, unlabeled, opened, synchronize, reopened, ready_for_review]
check_suite:
types: [completed]
permissions:
contents: read
pull-requests: write
checks: read
concurrency:
group: autopilot-auto-merge-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: false
jobs:
auto-merge:
name: Autopilot auto-merge
runs-on: [self-hosted, evoo-ci, Linux]
steps:
- name: Resolve pull request
id: pr
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
event_name="${{ github.event_name }}"
number=""
if [[ "$event_name" == "pull_request" ]]; then
number="${{ github.event.pull_request.number }}"
elif [[ "$event_name" == "check_suite" ]]; then
number="$(jq -r '.check_suite.pull_requests[0].number // empty' "$GITHUB_EVENT_PATH")"
fi
if [[ -z "$number" ]]; then
echo "No pull request in event; skipping."
echo "enabled=false" >> "$GITHUB_OUTPUT"
exit 0
fi
pr_json="$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${number}")"
labels="$(jq -r '[.labels[].name] | join(",")' <<<"$pr_json")"
enabled=false
if [[ ",${labels}," == *",autopilot,"* || ",${labels}," == *",automerge,"* ]]; then
enabled=true
fi
{
echo "number=$number"
echo "head_sha=$(jq -r .head.sha <<<"$pr_json")"
echo "draft=$(jq -r .draft <<<"$pr_json")"
echo "labels=$labels"
echo "enabled=$enabled"
} >> "$GITHUB_OUTPUT"
- name: Skip unless Autopilot label is present
if: steps.pr.outputs.enabled != 'true'
run: echo "No autopilot/automerge label; skipping."
- name: Skip draft pull requests
if: steps.pr.outputs.enabled == 'true' && steps.pr.outputs.draft == 'true'
run: echo "Draft pull request; auto-merge waits for ready_for_review."
- name: Verify Product CI on head commit
id: gate
if: steps.pr.outputs.enabled == 'true' && steps.pr.outputs.draft != 'true'
env:
GH_TOKEN: ${{ github.token }}
HEAD_SHA: ${{ steps.pr.outputs.head_sha }}
run: |
set -euo pipefail
conclusions=()
while IFS= read -r conclusion; do
[[ -n "$conclusion" ]] && conclusions+=("$conclusion")
done < <(
gh api "repos/${GITHUB_REPOSITORY}/commits/${HEAD_SHA}/check-runs" --paginate \
--jq '.check_runs[] | select(.name == "Product CI") | .conclusion'
)
if [[ "${#conclusions[@]}" -eq 0 ]]; then
echo "Product CI has not finished yet."
echo "ready=false" >> "$GITHUB_OUTPUT"
exit 0
fi
for conclusion in "${conclusions[@]}"; do
case "$conclusion" in
success)
echo "Product CI succeeded."
echo "ready=true" >> "$GITHUB_OUTPUT"
exit 0
;;
failure|cancelled|timed_out|action_required)
echo "Product CI failed ($conclusion); not enabling auto-merge."
exit 1
;;
esac
done
echo "Product CI still pending."
echo "ready=false" >> "$GITHUB_OUTPUT"
- name: Enable auto-merge
if: steps.pr.outputs.enabled == 'true' && steps.pr.outputs.draft != 'true' && steps.gate.outputs.ready == 'true'
env:
AUTOPILOT_MERGE_TOKEN: ${{ secrets.AUTOPILOT_MERGE_TOKEN }}
DRY_RUN: ${{ vars.AUTOPILOT_MERGE_DRY_RUN }}
PR_NUMBER: ${{ steps.pr.outputs.number }}
run: |
set -euo pipefail
if [[ "$DRY_RUN" == 'true' ]]; then
echo "AUTOPILOT_MERGE_DRY_RUN=true — would run: gh pr merge $PR_NUMBER --auto --squash"
exit 0
fi
if [[ -n "$AUTOPILOT_MERGE_TOKEN" ]]; then
export GH_TOKEN="$AUTOPILOT_MERGE_TOKEN"
echo "Using AUTOPILOT_MERGE_TOKEN."
else
export GH_TOKEN="${{ github.token }}"
echo "Using GITHUB_TOKEN. Add AUTOPILOT_MERGE_TOKEN if branch protection requires a PAT."
fi
gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --auto --squash
echo "Auto-merge enabled (squash). GitHub merges when branch protection allows."