* 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>
123 lines
4.7 KiB
YAML
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."
|