Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bun-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.4.2
1.4.4
5 changes: 2 additions & 3 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,10 @@ runs:
commit: ${{ steps.sticky.outputs.commit }}

- name: Install toolchains
uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
uses: jdx/mise-action@8418fedb1110381a0d3ba51a7a415d7c1b884550 # v5.2.2
with:
version: 2026.9.0
version: 2026.10.17
install_args: ${{ inputs.tools }}
cache_key: ${{ inputs.tools != '' && format('mise-{0}-{1}-{2}-{3}', runner.os, runner.arch, inputs.tools, hashFiles('mise.toml', 'mise.lock', '.node-version', '.bun-version', 'package.json')) || '' }}

- name: Resolve pnpm store path
if: inputs.dependency-cache == 'true'
Expand Down
10 changes: 9 additions & 1 deletion .github/jactionlint.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
require-commit-hash: true # actions, reusable workflows and docker:// must be pinned to a full SHA / @sha256 digest
rules:
missing-timeout: off
concurrency-limits: off
unpinned-uses: error # actions, reusable workflows and docker:// must be pinned to a full SHA / @sha256 digest
self-hosted-runner:
labels:
- arm-runner
Expand All @@ -8,3 +11,8 @@ self-hosted-runner:
- blacksmith-8vcpu-ubuntu-2404
- blacksmith-8vcpu-windows-2025
- blacksmith-32vcpu-ubuntu-2404
paths:
# Other projects' repositories, pulled in as git submodules. CI never checks them out.
".repos/**":
ignore:
- ".*"
3 changes: 1 addition & 2 deletions .github/scripts/ai-review/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
* `resolveDecision` is the pure orchestration function (I/O injected) a test
* can drive without the network; `main()` wires up the real GitHub I/O,
* writes `should_run`/`pr_number`/`head_ref`/`trigger` to `$GITHUB_OUTPUT`,
* writes `should_run`/`pr_number`/`head_sha`/`trigger` to `$GITHUB_OUTPUT`,
* and surfaces the skip reason (if any) in `$GITHUB_STEP_SUMMARY`.
*
* Run in CI as: `bun .github/scripts/ai-review/resolve.ts`.
Expand Down Expand Up @@ -374,7 +374,6 @@ function writeOutputs(result: ResolveResult, prNumber: number): void {
const entries: Record<string, string> = {
should_run: String(result.shouldRun),
pr_number: String(prNumber),
head_ref: `refs/pull/${prNumber}/head`,
head_sha: result.headSha ?? "",
trigger: result.trigger,
};
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/ai-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ on:
description: "PR number to review"
required: true
type: string
# A `/ai-review` comment on a pull request starts a review. The resolve job checks who
# commented, and the one job that can write to the pull request runs code from the default
# branch only, never from the pull request.
# jactionlint ignore=dangerous-triggers
issue_comment:
types:
- created
Expand Down Expand Up @@ -65,7 +69,6 @@ jobs:
outputs:
should_run: ${{ steps.resolve.outputs.should_run }}
pr_number: ${{ steps.resolve.outputs.pr_number }}
head_ref: ${{ steps.resolve.outputs.head_ref }}
# Every job reviews this commit, so a push during the run is never reported as reviewed.
head_sha: ${{ steps.resolve.outputs.head_sha }}
trigger: ${{ steps.resolve.outputs.trigger }}
Expand Down Expand Up @@ -161,7 +164,10 @@ jobs:
# behavior mid-rollout. Installed from the trusted checkout with npm config isolation so a
# PR-supplied `.npmrc` in the untrusted `pr` checkout can never redirect this install to a
# hostile registry.
# 2.1.280 is the first release that accepts claude-opus-5-5.
# 2.1.280 is the first release that accepts claude-opus-5-5. The CLI is installed on its
# own, not through the repository's lockfile, so nothing in the pull request's checkout
# can change what gets installed.
# jactionlint ignore=adhoc-packages
- name: Install Claude Code CLI
working-directory: trusted
run: |
Expand Down Expand Up @@ -544,7 +550,7 @@ jobs:
steps:
# Security-critical: this is the only job with write permission, so it must only ever
# execute trusted base-branch code — never the PR head. Checking out `develop` explicitly
# (never `needs.resolve.outputs.head_ref`) keeps a malicious PR from smuggling a script
# (never the PR's own ref) keeps a malicious PR from smuggling a script
# change into the one job that can write back to the PR. (For `pull_request` events GitHub
# runs the workflow file from the PR's own ref; acceptable since the auto path only admits
# same-repo PRs, whose authors hold write access anyway, and fork PRs run with a read-only
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/apply-release-notes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,14 @@ jobs:
outputs:
authorized: ${{ steps.check.outputs.authorized }}
steps:
# App token needs org membership read, repo write to edit the release, and PR write to
# comment and close.
# The token reads the approver's team membership and comments on the pull request.
- id: app-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.GH_APP_CLIENT_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
permission-members: read
permission-pull-requests: write

- name: Authorize approver against supabase/cli team
id: check
Expand Down Expand Up @@ -66,11 +67,16 @@ jobs:
contents: write
pull-requests: write
steps:
# The token edits the GitHub release, deletes the branch, and comments on and closes the
# pull request. The script below runs from the pull request's own checkout, so the token
# must not be able to change workflow files.
- id: app-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.GH_APP_CLIENT_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
permission-contents: write
permission-pull-requests: write

# Checkout the PR head so reviewer edits made before approval are captured;
# apply-release-notes.ts reads from the working tree.
Expand Down Expand Up @@ -99,7 +105,7 @@ jobs:
exit 1
fi
echo "==> Applying notes for $tag"
pnpm exec bun apps/cli/scripts/apply-release-notes.ts --tag "$tag"
bun apps/cli/scripts/apply-release-notes.ts --tag "$tag"
release_url="https://github.com/${{ github.repository }}/releases/tag/${tag}"
gh pr comment "$PR_NUMBER" --repo "${{ github.repository }}" --body \
"Applied to [${tag}](${release_url}) after approval by @${APPROVER}."
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/bot-pr-auto-merge.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: Bot PR auto-merge

on:
# Only this event lets the job use the auto-approve environment's secret. The job never
# checks out or runs code from the pull request.
# jactionlint ignore=dangerous-triggers
pull_request_target:
types: [opened, reopened, synchronize, ready_for_review]
branches: [develop]
Expand All @@ -14,6 +17,9 @@ jobs:
# Other apps (coding agents, CI vendors) also open PRs here and still need a maintainer.
# Release-notes PRs are published by a maintainer approval and must never merge. Branch sync
# PRs land by fast-forward on a maintainer approval, never by a squash.
# The first condition checks who opened the pull request. The second checks who caused this
# event, so a person pushing to a bot's pull request does not get it approved.
# jactionlint ignore=bot-conditions
if: >-
contains(fromJSON('["dependabot[bot]", "supabase-cli-releaser[bot]"]'), github.event.pull_request.user.login) &&
contains(fromJSON('["dependabot[bot]", "supabase-cli-releaser[bot]"]'), github.event.sender.login) &&
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-cli-artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@ jobs:
rcodesign --version

- name: Sync versions
run: pnpm exec bun apps/cli/scripts/sync-versions.ts --version "${VERSION}"
run: bun apps/cli/scripts/sync-versions.ts --version "${VERSION}"

- name: Build CLI artifacts
timeout-minutes: ${{ inputs.build_timeout_minutes }}
run: pnpm exec bun apps/cli/scripts/build.ts --version "${VERSION}"
run: bun apps/cli/scripts/build.ts --version "${VERSION}"

- name: Verify build artifacts
run: |
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/close-stale-issues-and-prs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ on:
type: string
default: "security,pinned,do-not-close,keep-open,do not merge"

permissions:
contents: read
issues: write
pull-requests: write
permissions: {}

concurrency:
group: close-stale-issues-and-prs
Expand All @@ -35,6 +32,10 @@ jobs:
close-stale:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
issues: write
pull-requests: write
steps:
- name: Close stale issues and PRs
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
Expand Down
20 changes: 16 additions & 4 deletions .github/workflows/contribution-gate.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: Contribution Gate

on:
# The gate has to comment on pull requests from forks, which only this event's token can do.
# It checks out the base branch, never the pull request.
# jactionlint ignore=dangerous-triggers
pull_request_target:
types:
- opened
Expand All @@ -16,10 +19,7 @@ on:
type: boolean
default: false

permissions:
pull-requests: write
issues: read
contents: read
permissions: {}

concurrency:
# Per-PR for pull_request_target; unique per run for manual sweeps (which
Expand All @@ -31,6 +31,10 @@ jobs:
gate-single:
name: Contribution Gate
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: read
contents: read
# Exempt maintainers/collaborators and bots. External contributors are gated.
if: >
github.event_name == 'pull_request_target' &&
Expand All @@ -42,6 +46,8 @@ jobs:
# Checks out the base repo (default for pull_request_target), so the gate
# runs trusted code from the base branch, never the untrusted PR head.
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: ".bun-version"
Expand All @@ -58,11 +64,17 @@ jobs:
gate-all:
name: Contribution Gate (all open PRs)
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: read
contents: read
if: github.event_name == 'workflow_dispatch'
steps:
# Base-branch checkout only — the sweep makes API calls and never runs
# any PR's code.
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: ".bun-version"
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/dispatch-cli-e2e-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
CLI_SHA: ${{ github.event.pull_request.head.sha }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
set -o pipefail
echo "Dispatching cli-e2e-ci live run for PR #${PR_NUMBER} @ ${CLI_SHA}"
# Build the nested client_payload with jq — `gh api -f` sends a flat
# body and would not nest `client_payload.*` correctly.
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/fill-sticky-disks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,15 @@ jobs:

- name: Pull stack package images
run: |
set -o pipefail
pnpm --silent --filter @supabase/stack prepare:test-artifacts --images |
xargs --max-procs 4 --max-args 1 docker pull --quiet

# Also runs after a failed step so leftover stack containers and volumes never persist.
- name: Prune Docker before saving its image disk
if: always()
run: |
set -o pipefail
docker ps --all --quiet | xargs --no-run-if-empty docker rm --force
docker system prune --force
docker volume prune --all --force
Expand Down
14 changes: 4 additions & 10 deletions .github/workflows/flaky-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,9 @@ jobs:
persist-credentials: false

- name: Install Bun
uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
version: 2026.9.0
install: true
install_args: bun
working_directory: .flaky-tooling
bun-version-file: .flaky-tooling/.bun-version

- name: Plan runs
id: plan
Expand Down Expand Up @@ -203,12 +200,9 @@ jobs:
persist-credentials: false

- name: Install Bun
uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
version: 2026.9.0
install: true
install_args: bun
working_directory: .flaky-tooling
bun-version-file: .flaky-tooling/.bun-version

- name: Download results
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/live-e2e-notify.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Live E2E Notifications

on:
# The job only reads whether the run passed. It runs nothing the run produced.
# jactionlint ignore=dangerous-triggers
workflow_run:
workflows: [Live E2E, Release]
types: [completed]
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/mirror-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ on:
required: true
type: string

permissions:
contents: read
packages: write
id-token: write
permissions: {}

jobs:
mirror:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- id: strip
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/mirror-template-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ jobs:
# are skipped, so a re-run produces an empty list.
- name: Detect images missing from the mirror
id: detect
run: pnpm exec bun apps/cli/scripts/detect-unmirrored-images.ts
run: bun apps/cli/scripts/detect-unmirrored-images.ts

mirror:
name: Mirror image
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/propose-release-notes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ jobs:
with:
client-id: ${{ vars.GH_APP_CLIENT_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
permission-contents: write
permission-issues: read
permission-pull-requests: write

- uses: useblacksmith/checkout@6fd481652155169ed4d2f25ebaf97464f685175f # v1
with:
Expand All @@ -82,4 +85,4 @@ jobs:
- name: Propose release notes
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: pnpm exec bun apps/cli/scripts/propose-release-notes.ts --tag "${TAG}" --apply
run: bun apps/cli/scripts/propose-release-notes.ts --tag "${TAG}" --apply
2 changes: 0 additions & 2 deletions .github/workflows/publish-migra.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ jobs:
arch: arm64
runs-on: ${{ matrix.runner }}
timeout-minutes: 180
outputs:
image_digest: ${{ steps.build.outputs.digest }}
steps:
- run: docker context create builders
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/publish-pg-prove.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ jobs:
arch: arm64
runs-on: ${{ matrix.runner }}
timeout-minutes: 180
outputs:
image_digest: ${{ steps.build.outputs.digest }}
steps:
- run: docker context create builders
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-preview-cli-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ jobs:
- name: Prepare package files
run: |
set -euo pipefail
pnpm exec bun apps/cli/scripts/sync-versions.ts --version "${PREVIEW_VERSION}"
bun apps/cli/scripts/sync-versions.ts --version "${PREVIEW_VERSION}"
pnpm --dir apps/cli build:shim
find packages -path '*/bin/supabase*' -type f -exec chmod +x {} +

Expand Down
Loading
Loading