Repository navigation
chore(repo): sync develop into next - #7307
supabase-cli-releaser[bot] wants to merge 3 commits into
Conversation
## Toolchain bumps - Bumps pnpm, node, bun, and mise. `mise.lock` and `pnpm-lock.yaml` are updated to match. - Updates the mise version pinned in each GitHub Actions workflow. - Drops `pnpm exec` from `bun` commands. The toolchain setup already puts bun on `PATH`, so running it through pnpm only added a process hop and a pnpm lookup. Calling bun directly removes that overhead and complexity. ## Workflow changes ### flaky-check installs bun with `oven-sh/setup-bun` Its plan and report jobs only need bun. setup-bun restores a 34 MB cache with just the bun binary. mise-action restored a 68 MB mise data directory and then ran a locked install and a listing on top, which took about twice as long on a cache hit. Every other bun-only step in the repository already uses setup-bun, so this makes them consistent. ### `jdx/mise-action` moves from v4.3.0 to v5.2.2 What we gain: - **The mise binary is verified before it runs.** A downloaded binary is checked against the release's signed manifest, and a binary restored from cache is checked against the signed release checksums. Before, a cached binary could run unchecked. - **The job's GitHub token stays inside the action.** v4 wrote it to the environment of every later step. Now only the action sees it. - **Caches rebuild every 30 days.** GitHub never evicts a cache that keeps getting hits, so a busy repository could keep the same tools for months. The default key now rolls over on a schedule. What does not change for us: every step pins a mise version, so the new release-age default does not apply, and the pinned mise ships the signed manifest the action now requires. One thing to expect: the default cache key format changed, so each mise cache misses once after this lands. The sync check job runs `mise install` in a later step. It no longer gets the token, but it fetches release metadata through mise's own relay and downloads assets directly from GitHub releases, so it never used the token. ### The shared setup action drops its custom `cache_key` The custom key hashed `mise.toml`, `mise.lock`, `.node-version`, `.bun-version`, and `package.json`. mise-action's default key already covers `mise.toml` and `mise.lock`, plus the requested tool subset, the runner image, and the mise version. The lockfile pins the node, bun, and pnpm versions the version files select, and a locked install refuses any version the lockfile does not have. So the extra hashes could not catch anything the lockfile hash misses, and the default key is strictly better. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com>
Stacked on #7285. ## Bump - `jactionlint` moves from 1.8.2 to 2.3.0 (`"2"` in mise.toml, pinned in `mise.lock`). - The config's deprecated `require-commit-hash` key becomes `rules: unpinned-uses: error`, the vendored `.repos/**` submodules are excluded, and the `missing-timeout` and `concurrency-limits` policy rules are turned off. ## Fixes, one commit per rule - **excessive-permissions**: single-job workflows grant their write scopes on the job instead of the workflow. contribution-gate grants both jobs the scopes its script needs. release-smoke-test's caller job keeps the four scopes release-shared's job tree declares. - **github-app**: the three release-notes App tokens request only the permissions their jobs use, confirmed against GitHub's REST permission tables. - **superfluous-actions**: both `softprops/action-gh-release` steps become `gh release create`, skipping when the release already exists and verifying the tag the earlier step pushed. - **pipeline-without-pipefail**, **github-env**, **artipacked**, **unused-job-output**: small mechanical fixes. ## Accepted findings, one commit per rule Each carries an inline `# jactionlint ignore=` comment with a plain-English reason: `dangerous-triggers`, `adhoc-packages`, `unverified-download`, `cache-poisoning` (run-scoped key), `unpinned-images` (smoke-test container), `bot-conditions` (the author check is already present), and `issues: write` on reopen-stale-issue. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com>
# Conflicts: # .github/workflows/cli-go-ci.yml # .github/workflows/cli-go-tag-pkg.yml # apps/cli/docs/release-process.md # mise.toml
Claude resolved the merge of
|
| File | Resolution |
|---|---|
mise.toml |
Dropped go and golangci-lint as next does, and kept develop's bump to jactionlint = "2". |
apps/cli/docs/release-process.md |
Kept develop's plain bun apps/cli/scripts/... commands and next's removal of the Go sidecar cross-compile step from the build job description. |
Deleted: .github/workflows/cli-go-ci.yml, .github/workflows/cli-go-tag-pkg.yml.
Decisions for @supabase/cli. Confirm them, or push a change to this branch:
developchanged the Go CI workflows (cli-go-ci.yml,cli-go-tag-pkg.yml) butnextdeleted them when it removed the Go CLI (ADR 0031). Keep or delete? Chose: Delete both, asnextdoes.develop's edits only maintained Go CI, which has nothing left to run against once the Go CLI is gone.
Quick checks. pnpm run check:all --continue (exit 1) failed on the merged tree.
Claude's fix. The lint:actions:check failure was a semantic conflict: next removed the Go CLI and its CI workflow (cli-go-ci.yml, per ADR 0031), but develop's sync-repair.yml still listed CI as a workflow_run trigger. I removed that entry from .github/workflows/sync-repair.yml; because it is a .github/ file, a maintainer needs to commit it as a suggestion.
Approve to fast-forward next once checks pass (workflow run).
There was a problem hiding this comment.
Workflow changes for a maintainer
Claude's edits under .github/ are not pushed, because workflows on this branch run with repository secrets. Review them, then use Commit suggestions so they run.
Apply these by hand:
diff --git a/.github/workflows/cli-go-ci.yml b/.github/workflows/cli-go-ci.yml
deleted file mode 100644
index 97ee9dc27..000000000
--- a/.github/workflows/cli-go-ci.yml
+++ /dev/null
@@ -1,137 +0,0 @@
-name: CI
-
-on:
- pull_request:
- paths:
- - apps/cli-go/**
- merge_group:
- push:
- branches:
- - develop
- paths:
- - apps/cli-go/**
-
-permissions:
- contents: read
-
-jobs:
- test:
- name: Test
- runs-on: blacksmith-8vcpu-ubuntu-2404
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- persist-credentials: false
-
- - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
- with:
- go-version-file: apps/cli-go/go.mod
- cache: true
-
- # Required by: internal/utils/credentials/keyring_test.go
- - uses: t1m0thyj/unlock-keyring@cbcf205c879ebd86add70bab3a6abfcce59a5cae # v1.2.0
- - run: |
- set -o pipefail
- pkgs=$(go list ./pkg/... | grep -Ev 'pkg/api' | paste -sd ',' -)
- go tool gotestsum -- -race -v -count=1 ./... \
- -coverpkg="./cmd/...,./internal/...,${pkgs}" -coverprofile=coverage.out
-
- # internal/start (docker-compose/v2, buildx, moby/buildkit, k8s client-go,
- # aws-sdk-go-v2, notary, secret-detector) was deleted outright as
- # unreachable (CLI-1966) -- this guards against silently reintroducing
- # that dependency tree via some other package, since nothing else checks
- # the shipped binary's size on every change.
- - name: Verify the heavy orchestration dependency tree stays out of the module
- run: |
- set -euo pipefail
- go list -deps . > /tmp/deps.txt
- ! grep -Eq \
- 'docker/compose|docker/buildx|moby/buildkit|k8s\.io/client-go|aws-sdk-go-v2' \
- /tmp/deps.txt
-
- - name: Check existing coverage cache
- id: coverage-cache
- uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
- with:
- path: apps/cli-go/coverage.out
- key: cli-go-coverage-${{ github.run_id }}-v1
- lookup-only: true
-
- - name: Save coverage cache
- if: steps.coverage-cache.outputs.cache-hit != 'true'
- uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
- with:
- path: apps/cli-go/coverage.out
- key: cli-go-coverage-${{ github.run_id }}-v1
-
- coverage:
- name: Coverage
- needs:
- - test
- runs-on: blacksmith-8vcpu-ubuntu-2404
- steps:
- - name: Restore coverage cache
- uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
- with:
- path: apps/cli-go/coverage.out
- key: cli-go-coverage-${{ github.run_id }}-v1
- fail-on-cache-miss: true
- - name: Move coverage report
- run: cp apps/cli-go/coverage.out coverage.out
- working-directory: .
- - uses: coverallsapp/github-action@8d6379e14d29928660c4ba802d8e85393440b329 # v2.3.8
- with:
- file: coverage.out
- format: golang
-
- lint:
- name: Lint
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- persist-credentials: false
-
- - uses: jdx/mise-action@8418fedb1110381a0d3ba51a7a415d7c1b884550 # v5.2.2
- with:
- version: 2026.10.17
- install_args: >-
- go
- golangci-lint
-
- - uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0
- with:
- args: --timeout 5m --verbose
- install-mode: none
- only-new-issues: true
- working-directory: apps/cli-go
-
- codegen:
- name: Codegen
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- persist-credentials: false
-
- - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
- with:
- go-version-file: apps/cli-go/go.mod
- cache: true
-
- # Regenerates from the committed api/v1-openapi.yaml snapshot, so this
- # check is hermetic: it fails only when a pull request leaves pkg/api out
- # of sync with the snapshot it was generated from. It deliberately does
- # not compare against the live upstream spec -- doing so made unrelated
- # pull requests fail together whenever staging drifted ahead of the
- # committed snapshot. That drift is the API Sync workflow's job.
- - run: go generate
- - run: |
- if ! git diff --ignore-space-at-eol --exit-code --quiet pkg; then
- echo "Detected uncommitted changes after codegen. See status below:"
- git diff
- exit 1
- fi
-defaults:
- run:
- working-directory: apps/cli-go
diff --git a/.github/workflows/cli-go-tag-pkg.yml b/.github/workflows/cli-go-tag-pkg.yml
deleted file mode 100644
index 3563c4077..000000000
--- a/.github/workflows/cli-go-tag-pkg.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: Tag pkg
-
-on:
- workflow_dispatch:
- inputs:
- version:
- description: "pkg version to tag (e.g. v1.2.2)"
- required: true
- type: string
-
-permissions: {}
-
-jobs:
- tag:
- name: Create pkg tag
- runs-on: ubuntu-latest
- permissions:
- contents: write
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- ref: develop
- fetch-depth: 0
- persist-credentials: false
-
- - name: Create and push pkg tag
- run: |
- VERSION="${INPUTS_VERSION}"
- if ! [[ "$VERSION" =~ ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]]; then
- echo "Error: version '$VERSION' does not match semver format (e.g. v1.2.2)"
- exit 1
- fi
- TAG="pkg/$VERSION"
- if git rev-parse "$TAG" >/dev/null 2>&1; then
- echo "Error: tag '$TAG' already exists"
- exit 1
- fi
- git tag "$TAG"
- git push origin "$TAG"
- env:
- INPUTS_VERSION: ${{ inputs.version }}
-defaults:
- run:
- working-directory: apps/cli-go| # jactionlint ignore=dangerous-triggers | ||
| workflow_run: | ||
| workflows: | ||
| - CI |
There was a problem hiding this comment.
| - CI |
There was a problem hiding this comment.
🤖 AI Review
Merged the three input findings into two entries. Confirmed that the merge resolution restores Go CI against a missing module. Refuted the manual-tagging finding because that workflow explicitly checks out develop, where the Go module still exists.
Findings
| Severity | Location | Category | Sources | Claim |
|---|---|---|---|---|
| 🟠 MAJOR | .github/workflows/cli-go-ci.yml:7 |
merge-resolution |
claude+codex | The merge resolution restores Go CI on next after its Go module and toolchain configuration were removed. Its unfiltered merge_group trigger runs jobs that reference the missing module, producing failed checks and potentially blocking a required merge-queue check. |
Refuted findings (kept for transparency, not posted as review comments)
.github/workflows/cli-go-tag-pkg.yml:1(merge-resolution): Restoring cli-go-tag-pkg.yml resurrects a dead manual tagging workflow because apps/cli-go no longer exists on next.
Refuted: The workflow does not run its tagging step against next's tree: checkout explicitly selects develop, where the Go module remains present. Thus the missing directory on next does not make this workflow dead. Its restoration is verified, but the claimed failure rationale is contradicted by its checkout configuration.
Stats
Claude findings: 2 · Codex findings: 1 · Confirmed: 1 · Refuted: 1 · Uncertain: 0
Models: claude-opus-5-5 + gpt-6.1-sol · Trigger: manual · Workflow run
This review runs once per PR. A maintainer can request another with a /ai-review comment.
| pull_request: | ||
| paths: | ||
| - apps/cli-go/** | ||
| merge_group: |
There was a problem hiding this comment.
🟠 MAJOR · merge-resolution · source: claude+codex
The merge resolution restores Go CI on next after its Go module and toolchain configuration were removed. Its unfiltered merge_group trigger runs jobs that reference the missing module, producing failed checks and potentially blocking a required merge-queue check.
Evidence: sync-resolution.diff:4-5 records the modify/delete conflict retaining this workflow. .github/workflows/cli-go-ci.yml:7 enables merge_group without filters; lines 28 and 119 require apps/cli-go/go.mod; lines 99-100 request go and golangci-lint; lines 105-107 disable linter installation and select apps/cli-go; line 137 defaults shell steps to that directory. The checked-out apps/ directory contains no cli-go, and mise.toml:3-5 configures only jactionlint and shellcheck.
Suggested fix: Preserve next's deletion of .github/workflows/cli-go-ci.yml when resolving the modify/delete conflict.
There was a problem hiding this comment.
🧐 this file should be deleted — looks like this comment correctly determined that but i'm not sure how to proceed. do we delete these files ourselves or is there something we should be doing so the releaser bot handles it?
Merging
developintonextconflicts. This branch starts at the tip ofdevelop(e125d0f);nextis at1b04c31.Conflicting files:
.github/workflows/cli-go-ci.yml.github/workflows/cli-go-tag-pkg.ymlapps/cli/docs/release-process.mdmise.tomlTo resolve:
git fetch origin git switch sync/develop-into-next git merge origin/next # resolve the conflicts, then commit git push origin sync/develop-into-nextApprove to fast-forward
next; do not use the merge button.