Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
a7de767
chore(stack): bump storage to v1.84.20-r0 (#7298)
supabase-cli-releaser[bot] Oct 23, 2026
2bdf6c5
chore(stack): bump storage to v1.84.21-r0 (#7303)
supabase-cli-releaser[bot] Oct 23, 2026
da27a34
ci: bump toolchains and upgrade mise-action to v5 (#7285)
kanadgupta Oct 23, 2026
e125d0f
chore(ci): bump jactionlint to 2.3.0 and address its new rules (#7287)
kanadgupta Oct 23, 2026
f1834ed
chore(stack): bump storage to v1.84.22-r0 (#7306)
supabase-cli-releaser[bot] Oct 23, 2026
9740741
chore(stack): bump storage to v1.84.23-r0 (#7308)
supabase-cli-releaser[bot] Oct 23, 2026
666bb77
chore(stack): bump realtime to v2.147.2-r0 (#7314)
supabase-cli-releaser[bot] Oct 23, 2026
1d50d0a
chore: sync API types from infrastructure (#7316)
supabase-cli-releaser[bot] Oct 23, 2026
4664850
chore(stack): bump realtime to v2.147.3-r0 (#7317)
supabase-cli-releaser[bot] Oct 23, 2026
41d66c9
chore(stack): bump studio to 2026.10.26-sha-478bd88-r0 (#7323)
supabase-cli-releaser[bot] Oct 26, 2026
e2a524f
feat(cli): carry plan-gate entitlement on machine-mode errors (#7271)
pamelachia Oct 26, 2026
e3d4723
docs: Add SECURITY.md (#7322)
idawson-sb Oct 26, 2026
249b048
chore(stack): bump postgres to 17.11.0.007-r0 (#7293)
supabase-cli-releaser[bot] Oct 26, 2026
9417476
chore(stack): bump realtime to v2.147.4-r0 (#7328)
supabase-cli-releaser[bot] Oct 26, 2026
3b098d8
fix(cli): skip reserved-role parameter grants in role dump (CLI-2843)…
7ttp Oct 26, 2026
40238ec
refactor(cli): move the delegated binary and project link to effect (…
7ttp Oct 26, 2026
58c3596
refactor(cli): resolve local config values through effect (CLI-2837) …
7ttp Oct 26, 2026
391a5cd
refactor(api): cover the client sources with effect lint (CLI-2841) (…
7ttp Oct 26, 2026
a64030e
refactor(api): cover the generator scripts with effect lint (CLI-2842…
7ttp Oct 26, 2026
0238c48
test(cli): cover `apps/cli/tests` with effect lint (CLI-2852) (#7327)
7ttp Oct 26, 2026
f6f7859
feat(config): publish x-secret markers in the config JSON schema (#7330)
Coly010 Oct 26, 2026
3e91ac6
chore(stack): bump realtime to v2.148.0-r0 (#7332)
supabase-cli-releaser[bot] Oct 26, 2026
b113cd3
chore(stack): bump storage to v1.84.25-r0 (#7335)
supabase-cli-releaser[bot] Oct 26, 2026
cef7020
chore(stack): bump realtime to v2.148.1-r0 (#7337)
supabase-cli-releaser[bot] Oct 26, 2026
3584594
chore(stack): bump realtime to v2.148.2-r0 (#7341)
supabase-cli-releaser[bot] Oct 27, 2026
071b58f
ci(cli): unblock the go test job (#7343)
7ttp Oct 27, 2026
af99918
refactor(cli): cover `apps/cli/scripts` with effect lint (CLI-2853) (…
7ttp Oct 27, 2026
11559a9
chore(stack): bump storage to v1.84.28-r0 (#7346)
supabase-cli-releaser[bot] Oct 27, 2026
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 @@ -126,11 +126,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 @@ -104,11 +104,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
8 changes: 4 additions & 4 deletions .github/workflows/cli-go-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ jobs:
# Required by: internal/utils/credentials/keyring_test.go
- uses: t1m0thyj/unlock-keyring@cbcf205c879ebd86add70bab3a6abfcce59a5cae # v1.2.0
- run: |
pkgs=$(go list ./pkg/... | grep -Ev 'pkg/api' | paste -sd ',' -)
set -o pipefail
pkgs=$(go list -C pkg ./... | grep -Ev 'pkg/api' | paste -sd ',' -)
go tool gotestsum -- -race -v -count=1 ./... \
-coverpkg="./cmd/...,./internal/...,${pkgs}" -coverprofile=coverage.out

Expand Down Expand Up @@ -91,10 +92,9 @@ jobs:
with:
persist-credentials: false

- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
- uses: jdx/mise-action@8418fedb1110381a0d3ba51a7a415d7c1b884550 # v5.2.2
with:
version: 2026.9.0
install: true
version: 2026.10.17
install_args: >-
go
golangci-lint
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/cli-go-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: 0 additions & 2 deletions .github/workflows/cli-go-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: 0 additions & 2 deletions .github/workflows/cli-go-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
5 changes: 3 additions & 2 deletions .github/workflows/cli-go-tag-pkg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ on:
required: true
type: string

permissions:
contents: write
permissions: {}

jobs:
tag:
name: Create pkg tag
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
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 @@ -72,13 +72,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 @@ -204,12 +201,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
Loading
Loading