chore: production deploy - #6056
Conversation
supabase-cli-releaser
Bot
commented
Aug 4, 2026
- fix(cli): start secrets selinux (fix(cli): start secrets selinux #6000)
- fix(cli): reload kong after db reset (fix(cli): reload kong after db reset #6017)
- chore(deps): bump github.com/docker/go-connections from 0.7.0 to 0.8.0 in /apps/cli-go in the go-minor group across 1 directory (chore(deps): bump github.com/docker/go-connections from 0.7.0 to 0.8.0 in /apps/cli-go in the go-minor group across 1 directory #6023)
- chore(ci): bump the actions-major group with 3 updates (chore(ci): bump the actions-major group with 3 updates #6033)
- chore: sync API types from infrastructure (chore: sync API types from infrastructure #6039)
- fix(cli): use cobra mutual-exclusivity template in sso add (fix(cli): use cobra mutual-exclusivity template in sso add #5974)
- fix(cli): edge and cosmetic parity sweep from the 2026-07-24 audit (CLI-1990) (fix(cli): edge and cosmetic parity sweep from the 2026-07-24 audit (CLI-1990) #5978)
- fix(cli): match Go bundler env and deploy path anchoring (CLI-1985) (fix(cli): match Go bundler env and deploy path anchoring (CLI-1985) #6005)
- docs(cli): record intentional start --ignore-health-check divergence from Go (CLI-1987) (docs(cli): record intentional start --ignore-health-check divergence from Go (CLI-1987) #6007)
- chore(cli): apply CLI-1989 parity ruling for db push pipeline-incompatible statements (chore(cli): apply CLI-1989 parity ruling for db push pipeline-incompatible statements #6009)
- fix(stack): stage binary downloads and extract via atomic rename to avoid cross-process cache races (fix(stack): stage binary downloads and extract via atomic rename to avoid cross-process cache races #6003)
- fix(cli): reuse existing volumes (fix(cli): reuse existing volumes #6037)
- test(stack): verify postgres data survives native to docker mode transition (test(stack): verify postgres data survives native to docker mode transition #6004)
- fix(cli): order migrations by version (fix(cli): order migrations by version #6038)
- test(cli): deflake e2e image pulls (test(cli): deflake e2e image pulls #6030)
- fix(cli): restore Go gen types flag guards, bless pg-meta permissiveness (CLI-1988) (fix(cli): restore Go gen types flag guards, bless pg-meta permissiveness (CLI-1988) #6008)
- fix(cli): match Go machine-format encoder output for -o toml/yaml/json (CLI-1975) (fix(cli): match Go machine-format encoder output for -o toml/yaml/json (CLI-1975) #6002)
- fix(cli): migrate remaining StringSlice flags onto legacyStringSliceFlag builder (CLI-2005) (fix(cli): migrate remaining StringSlice flags onto legacyStringSliceFlag builder (CLI-2005) #6010)
- refactor(cli): hoist sso pflag/profile reconciliation into shared layer (CLI-1982) (refactor(cli): hoist sso pflag/profile reconciliation into shared layer (CLI-1982) #6040)
## TL;DR fixes `supabase start` failing with `EACCES on SELinux-enforcing hosts` (Fedora + rootless Podman) containers couldn't read the CLI-staged files under `supabase/.temp/start-secrets/` (Postgres's `pgsodium_root.key` first, then Kong/Supavisor secrets and edge-runtime artifacts) It was happening because of the missing SELinux relabel on those bind mounts, the files keep the workspace label, which a confined container can't read despite the file mode. So I've introduced a `Z` mount option for the three bind sites, which fixes it up: each file gets a private per-container label, sibling containers still can't read them, and user project sources are never touched. No-op without SELinux, and Docker/Podman both ignore ENOTSUP from non-labelable filesystems, so nothing currently working changes... ## refs - closes #5989 Follow-up to #5990
## **TL;DR** fixes `/auth/v1/*` (and any gateway route) returning 502 forever after `supabase db reset`, which was happening because the reset restarts auth/storage/ `realtime/pooler` but Kong's nginx keeps dialling their old cached container IPs for the life of its process. Now sorted by running an in-place `kong reload` after the satellite restarts (the same pattern `functions serve` uses), so the gateway re-resolves the moved containers while staying up the whole time skipped cleanly, when Kong is absent/stopped, loud failure instead of a silent broken gateway otherwise. ## ref: - closes #6016
…0 in /apps/cli-go in the go-minor group across 1 directory (#6023) Bumps the go-minor group with 1 update in the /apps/cli-go directory: [github.com/docker/go-connections](https://github.com/docker/go-connections). Updates `github.com/docker/go-connections` from 0.7.0 to 0.8.0 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/go-connections/commit/754f9060ef9371a6e9504a82e25bd0bce0cfe406"><code>754f906</code></a> Merge pull request <a href="https://redirect.github.com/docker/go-connections/issues/158">#158</a> from thaJeztah/no_umask</li> <li><a href="https://github.com/docker/go-connections/commit/20f47a112d2119c502530055300c3ba272fa3e17"><code>20f47a1</code></a> sockets: read somaxconn from system instead of SOMAXCONN</li> <li><a href="https://github.com/docker/go-connections/commit/e195e2a4e6e63b1ac25d4e1c2511170bdb030781"><code>e195e2a</code></a> sockets: set socket permissions without umask hack</li> <li><a href="https://github.com/docker/go-connections/commit/32c72ec777e66c7f4a391097f400ea62eff7e63f"><code>32c72ec</code></a> Merge pull request <a href="https://redirect.github.com/docker/go-connections/issues/162">#162</a> from thaJeztah/abstract_sockets</li> <li><a href="https://github.com/docker/go-connections/commit/f3526e58848fc48baf375ca42aa23d0d18dafefa"><code>f3526e5</code></a> sockets: improve abstract Unix socket handling</li> <li><a href="https://github.com/docker/go-connections/commit/fd93b41aeecfdee02fe3e7be3f8799c8842f8cef"><code>fd93b41</code></a> Merge pull request <a href="https://redirect.github.com/docker/go-connections/issues/163">#163</a> from thaJeztah/rm_log</li> <li><a href="https://github.com/docker/go-connections/commit/d0c75596e3ef03a6fb9e78befc9b18d9eed28e7e"><code>d0c7559</code></a> sockets: update more tests to use tempSocketPath utility</li> <li><a href="https://github.com/docker/go-connections/commit/7106f49a36e292e9d0cad10f1842505304254cc4"><code>7106f49</code></a> Merge pull request <a href="https://redirect.github.com/docker/go-connections/issues/161">#161</a> from thaJeztah/todone</li> <li><a href="https://github.com/docker/go-connections/commit/fa1caa79d797b5a4d622aecc371dd91c677d7e32"><code>fa1caa7</code></a> sockets: fix some remaining TODOs in Windows code</li> <li><a href="https://github.com/docker/go-connections/commit/31d55b210c6596022c9dd2a2a06093d62e086dac"><code>31d55b2</code></a> Merge pull request <a href="https://redirect.github.com/docker/go-connections/issues/160">#160</a> from thaJeztah/inmemory_context</li> <li>Additional commits viewable in <a href="https://github.com/docker/go-connections/compare/v0.7.0...v0.8.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions-major group with 3 updates: [coverallsapp/github-action](https://github.com/coverallsapp/github-action), [docker/login-action](https://github.com/docker/login-action) and [linear/linear-release-action](https://github.com/linear/linear-release-action). Updates `coverallsapp/github-action` from 2.3.7 to 2.3.8 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/coverallsapp/github-action/releases">coverallsapp/github-action's releases</a>.</em></p> <blockquote> <h2>v2.3.8</h2> <h2>What's Changed</h2> <ul> <li>README.md: Update GitHub Actions by <a href="https://github.com/cclauss"><code>@cclauss</code></a> in <a href="https://redirect.github.com/coverallsapp/github-action/pull/259">coverallsapp/github-action#259</a></li> <li>Spelling by <a href="https://github.com/jsoref"><code>@jsoref</code></a> in <a href="https://redirect.github.com/coverallsapp/github-action/pull/258">coverallsapp/github-action#258</a></li> <li>Fix macOS install for Homebrew 6.0.0 tap trust requirement by <a href="https://github.com/afinetooth"><code>@afinetooth</code></a> in <a href="https://redirect.github.com/coverallsapp/github-action/pull/265">coverallsapp/github-action#265</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/jsoref"><code>@jsoref</code></a> made their first contribution in <a href="https://redirect.github.com/coverallsapp/github-action/pull/258">coverallsapp/github-action#258</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/coverallsapp/github-action/compare/v2...v2.3.8">https://github.com/coverallsapp/github-action/compare/v2...v2.3.8</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/coverallsapp/github-action/commit/8d6379e14d29928660c4ba802d8e85393440b329"><code>8d6379e</code></a> Fix macOS install for Homebrew 6.0.0 tap trust requirement (<a href="https://redirect.github.com/coverallsapp/github-action/issues/265">#265</a>)</li> <li><a href="https://github.com/coverallsapp/github-action/commit/0a51d2e0b5417d06e4ecceb534aec87defc53926"><code>0a51d2e</code></a> Spelling (<a href="https://redirect.github.com/coverallsapp/github-action/issues/258">#258</a>)</li> <li><a href="https://github.com/coverallsapp/github-action/commit/dc7137bf2369a87af98c6f88645f0a46685e68d5"><code>dc7137b</code></a> README.md: Update GitHub Actions (<a href="https://redirect.github.com/coverallsapp/github-action/issues/259">#259</a>)</li> <li><a href="https://github.com/coverallsapp/github-action/commit/ba6dae83310bbd6d33ff77092650dc40bd444a2a"><code>ba6dae8</code></a> Revise README for clarity on integrations and support</li> <li><a href="https://github.com/coverallsapp/github-action/commit/a5a505eafd8c7e40bae6eb42aa08b5a0eff9b70b"><code>a5a505e</code></a> Update README with new sections and information</li> <li>See full diff in <a href="https://github.com/coverallsapp/github-action/compare/5cbfd81b66ca5d10c19b062c04de0199c215fb6e...8d6379e14d29928660c4ba802d8e85393440b329">compare view</a></li> </ul> </details> <br /> Updates `docker/login-action` from 4.5.1 to 4.5.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/docker/login-action/releases">docker/login-action's releases</a>.</em></p> <blockquote> <h2>v4.5.2</h2> <ul> <li>Surface Docker Hub OIDC error responses by <a href="https://github.com/crazy-max"><code>@crazy-max</code></a> in <a href="https://redirect.github.com/docker/login-action/pull/1058">docker/login-action#1058</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/docker/login-action/compare/v4.5.1...v4.5.2">https://github.com/docker/login-action/compare/v4.5.1...v4.5.2</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/docker/login-action/commit/371161bbe7024a29a25c5e19bfcbc0804fe9ad2c"><code>371161b</code></a> Merge pull request <a href="https://redirect.github.com/docker/login-action/issues/1058">#1058</a> from crazy-max/fix-dockerhub-oidc-error-handling</li> <li><a href="https://github.com/docker/login-action/commit/5dc73df38ebcfa6f96479901e253d172c3e35849"><code>5dc73df</code></a> chore: update generated content</li> <li><a href="https://github.com/docker/login-action/commit/2aa1edee0b06c23880529064a4f7d7d3d2f9bc87"><code>2aa1ede</code></a> surface Docker Hub OIDC error responses</li> <li>See full diff in <a href="https://github.com/docker/login-action/compare/abd2ef45e78c5afb21d64d4ca52ee8550d9572c7...371161bbe7024a29a25c5e19bfcbc0804fe9ad2c">compare view</a></li> </ul> </details> <br /> Updates `linear/linear-release-action` from 0.14.6 to 0.15.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/linear/linear-release-action/releases">linear/linear-release-action's releases</a>.</em></p> <blockquote> <h2>v0.15.0</h2> <h2>What's Changed</h2> <ul> <li>Release v0.15.0 by <a href="https://github.com/RomainCscn"><code>@RomainCscn</code></a> in <a href="https://redirect.github.com/linear/linear-release-action/pull/55">linear/linear-release-action#55</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/linear/linear-release-action/compare/v0.14.6...v0.15.0">https://github.com/linear/linear-release-action/compare/v0.14.6...v0.15.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/linear/linear-release-action/commit/af56a9a388625921f3757a2f988e4d7aca958377"><code>af56a9a</code></a> Release v0.15.0 (<a href="https://redirect.github.com/linear/linear-release-action/issues/55">#55</a>)</li> <li>See full diff in <a href="https://github.com/linear/linear-release-action/compare/3858a5d7892435dc63302ac76b0cdb587435caa9...af56a9a388625921f3757a2f988e4d7aca958377">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This PR was automatically created to sync API types from the infrastructure repository. Changes were detected in the generated API code after syncing with the latest spec from infrastructure. Co-authored-by: supabase-cli-releaser[bot] <246109035+supabase-cli-releaser[bot]@users.noreply.github.com>
## What changed
`sso add` emitted a hand-written mutual-exclusivity error (`only one of
--metadata-file or --metadata-url may be set`) and detected the conflict
via `Option.isSome` on parsed flag values. The Go CLI enforces this
group via cobra's `MarkFlagsMutuallyExclusive("metadata-file",
"metadata-url")` (`apps/cli-go/cmd/sso.go:164`), whose error template
is:
```
if any flags in the group [metadata-file metadata-url] are set none of the others can be; [metadata-file metadata-url] were all set
```
`sso update` was already migrated to the shared
`cobraMutuallyExclusiveErrorMessage` helper plus raw-argv
`pflag.Changed`-semantics detection (CLI-1902); `add` was never
migrated. This PR mirrors update's pattern in `add.handler.ts`:
- Byte-exact cobra template via `cobraMutuallyExclusiveErrorMessage`
(group in Go's registration order; the violating subset sorted, per
cobra's `validateExclusiveFlagGroups`).
- `hasExplicitValueFlag` raw-argv scan, so an explicit empty value
(`--metadata-file= --metadata-url x`) still trips the mutex, while a
bare `--metadata-file --metadata-url` (pflag consuming the second token
as the first flag's value) correctly does not.
- The check runs before project-ref resolution, matching cobra's
`ValidateFlagGroups`-before-`RunE` precedence.
Integration tests cover the exact-message case (byte-match), the
explicit-empty `--metadata-file=` case, the consumed-value non-violation
case, and single-flag happy paths. `SIDE_EFFECTS.md` now documents the
cobra template and `Changed` semantics.
## Review findings deliberately left open
A four-perspective review pass (architect / engineer / security / DX)
approved the change; these pre-existing, cross-cutting observations were
noted rather than fixed here:
- The mutex filter/fail orchestration is now duplicated between `sso
add` and `sso update` — a family-root helper (e.g. `sso.mutex.ts`) is a
reasonable follow-up.
- `SSO_ADD_VALUE_FLAG_NAMES` (like update's equivalent) is a
hand-maintained mirror of the command's declared value flags with no
compile-time sync guarantee.
- Telemetry flushes on a mutex violation, whereas Go's cobra fails
flag-group validation before telemetry is installed — pre-existing
divergence shared with `sso update`.
- The raw-argv scan doesn't understand global/inherited value flags or
the `-t` shorthand — documented limitation shared with `sso update`;
pflag fails `-t`'s enum validation before flag groups anyway.
- The `--domains=` explicit-empty edge on `add` (parity audit §3.10) is
a separate issue and is not addressed here.
Fixes CLI-1982
https://linear.app/supabase/issue/CLI-1982/sso-add-mutual-exclusivity-error-is-not-cobra-format
…LI-1990) (#5978) Batch sweep of the small confirmed edge/cosmetic Go-parity divergences from the 2026-07-24 audit. Every item was re-verified against `apps/cli-go` at current develop before changing anything (audit line numbers were stale); several items turned out to be already fixed or in-flight in other PRs and are listed as such. Fixes CLI-1990 — https://linear.app/supabase/issue/CLI-1990/edgecosmetic-parity-sweep-from-the-2026-07-24-audit-batchable-tail ## Item-by-item | # | Item | Status | Notes | |---|------|--------|-------| | 1 | `functions delete` line colour | **Fixed** | Aqua slug + ref, stdout-gated (`delete.go:20`) | | 2 | `functions deploy` success ref Aqua, `Bundling Function:` bold, `No Functions specified…` bold | **Fixed** | `deploy.go:70,35`, `bundle.go:30`; stdout-gated where stdout-bound | | 3 | Prune bullets ` • <bold>` | **Already fixed** | by #5947 (CLI-1974), commit `c4b45874` | | 4 | serve `supabase start is not running.` Aqua | **Deferred** | open PR #5976 modifies the same `assertLocalDbRunning` hunk in `shared/functions/serve.ts`; one-liner to do after it merges | | 5 | `encryption update-root-key` Finished line + bogus comment | **Fixed** | Aqua'd; comment claimed a nonexistent "render Aqua as plain" convention | | 6 | start rollback missing `Stopping containers...` | **Fixed** | stderr, matching Go's `DockerRemoveAll` writer on the start-failure path (`start.go:77`) | | 7 | `--debug` `Pruned …` reports | **Fixed** | `Pruned containers:/volumes:/network:` (singular network) `[a b c]` on stderr; prune stdout now collected (also removes a latent unread-pipe hazard); `LegacyDebugFlag` threaded through stop/start/rollback | | 8 | Per-retry `Retrying after Ns: <image>` banner | **Fixed** | `4s`/`8s` per Go's `2<<(i+1)` schedule (`docker.go:314`); the failed attempt's error line is played by the already-teed `docker pull` stderr | | 9 | `inspect db blocking` backtick `blocking_statement` | **Fixed** | col 2 only; col 5 (`blocked_statement`) stays bare per Go's format string (`blocking.go:56`) | | 10 | `seed buckets` mutex bracket `[local linked]` | **Fixed** | cobra keeps registration order for the group list and sorts only the "were all set" list; corrected the misleading comment in `legacy-db-target-flags.ts` (storage's `[linked local]` stays correct) | | 11 | `snippets download` 4 UUID forms + lowercase URL | **Fixed** | faithful `uuid.Parse` port incl. the braced-form `s[1:]` quirk; canonical lowercase interpolated into the URL; Go's three error branches verbatim | | 12 | `storage cp --jobs` negative rejection | **Fixed** | pflag's exact uint error (`invalid argument "-1" for "-j, --jobs" flag: strconv.ParseUint: …`), before mutex validation and without telemetry; the documented `0 → 1` clamp stays (Go's 0 deadlocks) | | 13 | `postgres-config` value coercion + `%+v` floats | **Fixed** | exact `ParseBool` case set; int64-overflow → verbatim string; pretty table renders numbers with Go's float64 `%g` (`1000000` → `1e+06`) via hoisted `legacyGoFormatFloat` (also reused by `db query`) | | 14 | init template file modes | **Fixed** | 0644/0755 pinned; the gitignore *append*-branch write is deliberately left unpinned — mode only applies at creation, and #5977 rewrites that exact line | | 15 | login fallback dir 0700→0755 | **Fixed** | Go pins the dir 0755 (`access_token.go:91`); the token file stays 0600, so no secret exposure | | 16 | `test new` 0644 | **Fixed** | + dir 0755, like Go's `utils.WriteFile` | | 17 | `inspect report` 0755/0644 | **Fixed** | | | 18 | bootstrap invalid-stored-token fast-fail | **Deferred** | not small: `resolveLegacyAccessToken` deliberately collapses invalid→`None` for many callers (sso, snippets, postgres-config, …); distinguishing invalid-vs-missing needs a shared-semantics change | | 19 | `migration new` Created line on stdin-copy failure | **Fixed** | mirrors Go's deferred `Println` (`new.go:24-28`); also stdout-gates the Bold path (CLI-1546 class) | | 20 | telemetry state-file recovery | **Fixed** | all-or-nothing decode like Go's `decodeState`; a corrupt file resets `enabled` to true and rotates identity, exactly like Go | | 21 | unlink/services ref-read error | **Fixed (services)** | unlink already matched Go; services now warns `failed to load project ref: …` on a read error and continues unlinked (TOCTOU NotFound stays silent, like Go's `ErrNotLinked` branch) | | 22 | `domains` CNAME dump byte codes | **Kept documented** | premise inaccurate: the non-reproducible part of Go's `%+v` is a runtime *pointer address* for `ValidationErrors`, not byte codes; TS's deterministic rendering is already documented in `domains.format.ts` | | 23 | sso `--domains=` explicit-empty | **Deferred** | `sso update` already matches Go (len-check drops it); the `add` fix touches `sso/add/add.handler.ts`, in-flight in open PR #5974 | | 24 | `db dump --file ""` | **Fixed** | keys off `len > 0` like Go: empty means stdout, no file open, no `Dumped schema to …` line | | 25 | network-restrictions CIDR-before-ref ordering | **Deferred, kept documented** | direction is inverted vs the issue text: TS validates CIDR *before* ref, Go resolves ref first in `PersistentPreRunE`; aligning overlaps open PR #5975 (incl. its integration test file). The `SIDE_EFFECTS.md` note frames this as intended based on an incomplete Go reading — worth revisiting after #5975 | ## Known residuals (deliberate, documented in code) - `postgres-config` digits in `(2^53, 2^63)` still lose precision on the way in (`JSON.stringify` cannot emit exact int64 tokens); Go sends exact integers there. Values beyond int64 now match Go (string fallback). - Colour TTY gating: stderr-bound colour gates on stderr's TTY (per `legacy-colors.ts`/CLI-1546 convention), whereas Go's lipgloss gates everything on stdout. Deliberate, pre-existing convention; only observable when exactly one of stdout/stderr is a TTY. - Bun's `util.styleText` currently ignores `validateStream`/`NO_COLOR` (verified on Bun 1.3.x), so under Bun piped output still carries ANSI for *all* legacy colour sites — a pre-existing runtime gap that predates this PR and deserves its own issue. - The services warning's error suffix is Effect's error text, not Go's `*PathError` bytes — the `failed to load project ref: ` prefix is the parity-bearing part. - `--jobs abc`/`3.5` still surface Effect CLI's parser error rather than pflag's; this PR scopes to negatives (the only case `Flag.integer` accepts that Go rejects). ## Review notes Four-perspective review (architect / engineer / security / DX) run pre-PR; all approve. Engineer fuzz-verified `legacyGoFormatFloat` (23k values) and `legacyParseSnippetUuid` (~8k inputs) byte-identical to Go/google-uuid. Security signed off on the 0700→0755 fallback-dir change (token file unchanged at 0600, matches Go exactly). Remaining findings were the documented residuals above.
…6005) Two `functions deploy` divergences from the pinned Go CLI (`apps/cli-go`), resolved per the CLI-1985 ruling (Colum, 2026-07-30: take each point's documented recommended option). Fixes CLI-1985 ## ⚖ Parity ruling applied ### Point 1 — `NPM_AUTH_TOKEN` is no longer forwarded into the Docker bundler (strict parity; **breaking** for private-registry users) **Decision:** remove the forwarding. The eszip bundler container now receives only `NPM_CONFIG_REGISTRY` from the host, exactly matching Go (`apps/cli-go/internal/functions/deploy/bundle.go:68-70`). **Evidence:** - The Go CLI never forwarded `NPM_AUTH_TOKEN` at any point in its history — only `NPM_CONFIG_REGISTRY` (added in `8e17f033`). - The Go-side PR proposing the token forwarding (#4933, addressing #4927) was **closed unmerged** on 2026-06-22 ("The command is now ported in TypeScript so I'm closing this PR"). - The TS-only forwarding came from #5645, which ported the unmerged #4933. CLI-1985 ruled strict parity over that TS-only addition. **User-visible change (flagging prominently):** users whose `.npmrc` expands `${NPM_AUTH_TOKEN}` for private npm registries will find `--use-docker` / `--legacy-bundle` deploys failing registry auth again (the pre-#5645 and Go CLI behavior; re-opens the CI/CD-host case of #4927). Workarounds: inline the token in `.npmrc`, or deploy via the default `--use-api` path. Per the strict-parity contract (stderr bytes included), no TS-only warning was added when the variable is set — a DX reviewer requested one and it was rejected on parity grounds; the breaking impact is documented here and in the commit message instead. **Shared-code caveat (per the ruling):** `dockerNpmEnv` lives in `apps/cli/src/shared/functions/deploy.ts` and serves **both** shells — `next/` (`functions deploy`) and `legacy/`. The removal therefore applies to the next/ shell too. The strict-parity contract only binds the legacy shell, but keeping one code path is the simplest correct design per repo policy, so next/ loses the forwarding as well — stated here explicitly. `functions serve` is unaffected (it has its own env handling, matching Go's serve which loads `supabase/functions/.env`). ### Point 2 — API-deploy upload paths re-anchored at the workdir (align to the pinned oracle; behaviour change) **Directive:** confirm the intended reference point first, then align or record. **Evidence found:** - Upstream Go **never** anchored deploy paths at the git root. The full history of `pkg/function/deploy.go` (pre- and post-monorepo move) shows `toRelPath` anchored at `os.Getwd()` since `29021998` ("convert all paths to relative for deploy", #3403), unchanged since. The Go CLI chdirs to the workdir (`internal/utils/misc.go:238`), so `os.Getwd()` ≡ the workdir. - The TS git-root anchoring came from #5755 (merged 2026-07-02), a deliberate TS-side monorepo fix closing #3467 (Go hard-fails on imports outside the workdir: `failed to read file: open ../common/index.ts`) — **not** a port of newer upstream Go behavior. There is no newer upstream Go reference to record against. **Decision (per the ruling's matrix — upstream never did this → align):** uploaded multipart file names and the server-recorded `entrypoint_path` / `import_map_path` / `static_patterns` are now anchored at the workdir with Go's exact `toRelPath` semantics (relative to `os.Getwd()`, forward slashes, `../`-relative when the file lies outside the workdir). **Scope note:** #5755's import-walk *containment boundary* (which files may be uploaded at all) is intentionally **kept** at the nearest git root. The boundary is a TS-only safeguard with no Go equivalent — Go's walker uploads any reachable import unbounded (and then hard-fails opening `..` paths through `afero.NewIOFS`, which is exactly bug #3467). Reverting the boundary would re-break #3467 and is outside CLI-1985's anchoring scope. **User-visible change:** in monorepos where the git root is an ancestor of the workdir, redeploys now record `supabase/functions/<slug>/index.ts` (matching what the Go CLI records and the dashboard shows for Go deploys) instead of `apps/myapp/supabase/functions/<slug>/index.ts`. Imports outside the workdir but inside the git root still deploy, uploading with Go-style `../`-relative names — the same name shape Go's `toRelPath` emits, so nothing new is required of the server. Non-monorepo projects (git root == workdir, the common case) are byte-for-byte unchanged. ## What changed - `apps/cli/src/shared/functions/deploy.ts` — `dockerNpmEnvNames` trimmed to `NPM_CONFIG_REGISTRY`; `deployViaApi` now threads the workdir as the path anchor through `uploadFunctionSource` / `writeSourceDeployForm` / `createSourceMetadata` while the git-root `sourceRoot` remains the containment boundary; ENOENT warn display paths follow the workdir anchor (matching Go's workdir-relative walker paths). Docker bind construction is untouched. - `apps/cli/src/legacy/commands/functions/deploy/deploy.integration.test.ts` — new regression test: workdir≠git-root monorepo deploy asserts workdir-anchored metadata, `../`-relative upload names, and the Go-parity `Uploading asset` stderr line. - `apps/cli/src/next/commands/functions/deploy/deploy.integration.test.ts` — the two git-root upload tests updated to the workdir anchoring; the npm env test now asserts `NPM_CONFIG_REGISTRY` is forwarded and `NPM_AUTH_TOKEN` is not. - `apps/cli/src/legacy/commands/functions/deploy/SIDE_EFFECTS.md` — env table states only `NPM_CONFIG_REGISTRY` is forwarded; new note documents the workdir anchoring and the TS-only git-root boundary. All four changed/added tests fail against the previous implementation and pass with this change.
…from Go (CLI-1987) (#6007) ## ⚖ Parity ruling applied (CLI-1987, Colum, 2026-07-30) **Option (b) chosen: keep the TypeScript behaviour and document the intentional divergence. Option (a) — matching Go's quirk — was rejected. No runtime behaviour changes in this PR.** Go's `start.IsUnhealthyError` (`apps/cli-go/internal/db/start/start.go:227-231`) classifies **any** `errors.Join`-shaped error as "unhealthy". That shape check accidentally also matches `ensureImagesCached`'s `errors.Join(result...)` (`apps/cli-go/internal/start/start.go:257-260`), so in Go, with `--ignore-health-check` set, a total image-pull failure — or a Docker daemon that becomes unreachable during the pre-pull — is **swallowed**: Go prints the error, skips rollback, prints `Started supabase local development setup.` + the status table + the security notice, and **exits 0** with zero containers running. Go's own comment on `IsUnhealthyError` ("Health check always returns a joinError") shows the wider match was never intended. The TS port already behaves differently — `legacyIsUnhealthyStartError` matches only `LegacyHealthCheckTimeoutError`, and the image pre-pull runs before the downgrade envelope — so the same scenario **exits 1 with no success banner and no status table**. Per the ruling, that behaviour is kept and is now documented + regression-pinned. `--ignore-health-check` downgrades health-check timeouts only. ## What changed Docs, comments, and one regression test — the runtime is untouched: - `apps/cli/src/legacy/commands/start/start.rollback.ts` — divergence record in `legacyIsUnhealthyStartError`'s doc comment, including an explicit "do not fix this by widening the match toward Go's shape check" guard, so a future parity sweep can't silently reintroduce Go's exit-0 swallow. - `apps/cli/src/legacy/commands/start/SIDE_EFFECTS.md` — the image-pull exit-code row now states the failure stays fatal even with `--ignore-health-check`, and a new "Notes" entry records the full carve-out (scenario, Go's quirk behaviour, TS behaviour, why rollback is *not* part of the divergence — nothing has been created yet in either CLI — and that the flag's Go-byte-matched help text "Ignore unhealthy services and exit 0" over-promises here). - `apps/cli/docs/go-cli-porting-status.md` — the legacy `start` entry carries the same intentional-divergence note (the table's column padding was re-flowed by `oxfmt`; the substantive change is the `start` row only). - `apps/cli/src/legacy/commands/start/start.integration.test.ts` — new test in the "image pull" block: pre-pull exhaustion under `--ignore-health-check` still fails with `LegacyImagePrepullError`, prints no `Started` banner, emits nothing on stdout (no status table), creates no container, and triggers no rollback. The daemon-unreachable trigger funnels through the same `LegacyImagePrepullError` path, so the one scenario pins both documented triggers. ## Overlap with CLI-1967 CLI-1967's doc-drift sweep also touches `start` documentation. The CLI-1987 carve-out (SIDE_EFFECTS "Notes" entry, exit-code row, porting-status `start` row, `start.rollback.ts` comment) is fully handled **here** — CLI-1967 should not re-document this divergence. ## Possible follow-up (not in scope here) Self-review flagged a DX gap that would require a runtime change, so it is deliberately not part of this docs-only ruling PR: when `--ignore-health-check` is set and the pre-pull fails, the error output never explains why the flag didn't apply (and the flag's help text says "exit 0"). A TS-only `error.suggestion` ("--ignore-health-check only downgrades health-check timeouts; image pull failures are always fatal") on that path — analogous to the existing TS-only `exec format error` suggestion — would close it. Fixes CLI-1987
…tible statements (#6009) ## What kind of change does this PR introduce? Parity-ruling record + pinned-Go oracle alignment for `db push` / `db reset` / `migration up` pipeline-incompatible statement handling. Fixes CLI-1989 ## ⚖ Parity ruling applied (Colum, 2026-07-30) The parity audit flagged that the TS migration apply (`apps/cli/src/legacy/shared/legacy-migration-apply.ts`) runs pipeline-incompatible statements (`CREATE [UNIQUE] INDEX CONCURRENTLY`, `REINDEX … CONCURRENTLY`, `VACUUM`, `ALTER SYSTEM`, `CLUSTER`) standalone outside the batch transaction, while the pinned Go reference (`apps/cli-go/pkg/migration/file.go`) had no such handling — a migration containing `CREATE INDEX CONCURRENTLY` failed under pinned Go (SQLSTATE 25001) but succeeded under TS. **Ruling:** confirm the intended upstream reference, record it, and update the pinned `apps/cli-go` to match so future audits don't re-flag this. The TS behaviour is **not** reverted. ### Confirmed provenance - **Bug:** #5139 — `db reset` fails with SQLSTATE 25001 ("CREATE INDEX CONCURRENTLY cannot be executed within a pipeline"). - **Reference design:** PR #5156 by @wucm667 — `isPipelineIncompatible` / `trimLeadingSQLComments` + flush-then-run-standalone in Go's `ExecBatch`. **Closed WITHOUT merging** on 2026-06-24: there is no merged upstream Go commit. The closing comment adopted the design directly into the TS port instead (PR-branch commit 29d3fb0, part of #5671, squash-merged to develop as b48fad6) because the Go path was being retired for the migration commands. ### TS vs. reference semantics Compared statement-for-statement against the #5156 diff: the TS classification patterns, comment/BOM trimming, flush-then-standalone execution order, final-batch history insert, and global statement-index accounting in `At statement: N` errors all match. The only deltas are regex-engine trivia (Go RE2 `\s`/`\z` vs JS `\s`/`$`) with no observable effect on valid SQL — no TS behaviour change was needed. ### What this PR does 1. **Pinned Go updated** (`chore(cli-go)` commit): the #5156 diff applies cleanly and is self-contained (`pkg/migration/file.go` + tests, additive `pkg/pgtest` simple-query mock helpers; no dependency or API churn), so it is applied **verbatim** to `apps/cli-go`. `go test ./migration/...` in `apps/cli-go/pkg` and the full main-module `go test ./...` pass; golangci-lint adds no new findings (the 5 pre-existing gosec findings in `internal/utils/*` are untouched). 2. **Provenance recorded** (`docs(cli)` commit): the provenance note in `legacy-migration-apply.ts`, the `db push` / `db reset` / `migration up` SIDE_EFFECTS.md (including the non-atomic flush-boundary semantics: a mid-file failure leaves earlier batches committed with no history row, so a re-run replays the file from the top — prefer `… IF NOT EXISTS` forms), and the `db push` / `db reset` / `migration up` rows in `docs/go-cli-porting-status.md`. 3. **Classifier test parity** (`test(cli)` commit): the TS `legacyIsPipelineIncompatible` suite claimed to mirror Go's `TestIsPipelineIncompatible` but was missing two of its negatives (string literal, leading-comment-only); those plus BOM / unterminated-comment edge cases are added. 40/40 pass. ### Shipped-sidecar behaviour note `apps/cli-go` is not just an audit-only reference — it is compiled into the shipped `supabase-go` sidecar (`build:go-sidecar` in `apps/cli/package.json`; `go build -o supabase-go` in CI). Local `db start` and local `db reset` delegate migration apply to that sidecar via the hidden `db __db-bootstrap` seam, which calls `ExecBatch` in `pkg/migration/file.go`. So the pinned-Go update in this PR also extends the #5139 `CREATE INDEX CONCURRENTLY` / pipeline-mode fix to that delegated local path: a migration with `CREATE INDEX CONCURRENTLY` previously failed under local `db start`/`db reset` with SQLSTATE 25001 and now succeeds, matching the already-working remote TS path. This is filed as `chore` because it's realigning the pinned parity oracle rather than introducing new intentional TS behaviour, but it's fair to note it arguably deserves `fix` framing given it's a real shipped runtime behaviour change on the local path, not purely an audit fix. A follow-up `docs(cli)` commit (5a7f833) adds a one-line note on `ExecBatch`'s definition recording this dual-path (remote TS + local sidecar) reach, and a note on the known `\v`/Unicode-whitespace classification delta between JS `\s` and Go's RE2 `\s` (a residual valid-SQL divergence: PostgreSQL >= 14 treats `\v` as SQL whitespace but Go RE2 `\s` doesn't match it, so e.g. `VACUUM\v(FULL)` classifies as pipeline-incompatible in TS but not under the Go oracle). Follow-up candidates (not in this PR): an error-message hint when a standalone statement fails mid-file, and a user-facing docs-site note about `CONCURRENTLY` migration best practice.
…void cross-process cache races (#6003) ## What kind of change does this PR introduce? Bug fix. ## What is the current behavior? `packages/stack/src/BinaryResolver.ts` caches downloaded native service binaries (postgres, postgrest, auth, edge-runtime) at a path that is intentionally shared across every process on the machine, so parallel `supabase start` invocations don't re-download the same binary. That sharing is correct, but there was no concurrency protection around it: - The cache-hit check was check-then-act with no lock, so two processes could both observe a cold cache for the same service+version at the same instant. - Both processes then downloaded to the **same fixed temp file path** (`_download.tar`/`_download.zip`, no per-invocation uniqueness), so concurrent writes could corrupt each other's bytes. - Extraction (`tar`/`unzip`) ran directly into the final cache directory rather than a private staging location, so an interrupted extraction (this race, a killed process, disk pressure) could leave the directory partially populated. - The cache-hit check only looked at `entries.length > 0`, so a partially-extracted, broken directory looked exactly like a valid cache hit to every future invocation — silent, persistent corruption. ## What is the new behavior? Downloads now write to a per-invocation-unique temp file, and extraction happens in a per-invocation-unique staging directory (`${cacheDir}.tmp-<uuid>`) sibling to the real cache directory instead of the cache directory itself. Once extraction, the chmod fixup, and (on macOS) ad-hoc codesign all succeed, the staging directory is atomically renamed into place as the final cache directory — so the cache directory is now only ever observable in a fully-complete state, and the existing "empty directory looks like a cache hit" bug can no longer be produced by this code path going forward. If another process already published the cache directory by the time this process tries to publish its own (i.e. it lost the race), it discards its own staging directory and resolves to the winner's cache entry instead of failing. The staging directory is also cleaned up on every failure path (download error, checksum mismatch, extraction failure, or interruption), so no `.tmp-*` directories are left behind in the cache root. Added a regression test in `BinaryResolver.unit.test.ts` that runs two concurrent `resolveWithMetadata` calls against the same service+version+assetName cache path (with mocked `HttpClient`/`ChildProcessSpawner`/`FileSystem` layers) and asserts both succeed to the same complete cache path with no stray temp artifacts left behind.
## TL;DR `supabase start` dying on Podman with `failed to create volume: ... already exists`. <br>It never happened in Go because Go called the Docker **Engine API**, <br>which is idempotent for a repeated volume name (and stays idempotent against Podman, whose Docker-compat endpoint just hands back the existing volume). After the port we shell out to the **container CLI** instead, and `podman volume create` goes through libpod rather than that compat endpoint, which rejects a repeated name outright. <br>Fixed by treating an already exists rejection as success in `legacyEnsureStartVolume`, the same way `legacyEnsureStartNetwork` right above it already does, plus unit + integration tests. ## Why it kept biting Named volumes survive `stop` unless `--no-backup`, so every `stop`/`start` cycle re-creates volumes that were kept on purpose: ``` failed to create volume: Error: volume with name supabase_db_xxx already exists: volume already exists ``` `docker volume create` is unconditionally idempotent, so only Podman hosts ever reached this branch. ## refs: * closes #6020
…sition (#6004) ## What kind of change does this PR introduce? Test only. Adds `packages/stack/tests/postgresDataPersistence.e2e.test.ts`, a new e2e test. ## What is the current behavior? `packages/stack` can run Postgres either natively as a binary process or as a Docker container, chosen by `StackConfig.mode`. Both paths mount/set `PGDATA` to the same `dataDir`, and the design intent is that a stack stopped while running natively can be restarted in Docker mode against the same `dataDir` without losing data. This had never been tested end-to-end, and there was specific reason for suspicion: the Docker entrypoint in `packages/stack/src/services/postgres.ts` execs `postgres -D /etc/postgresql -p ${port}` — a different path than the `/var/lib/postgresql/data` volume mount target — so it was unverified whether the two actually resolve to the same data inside the `supabase/postgres` image. ## What is the new behavior? The new test starts a stack in native mode, writes a marker row via `Bun.SQL` directly against Postgres, disposes the stack (explicit `dataDir`s are never auto-cleaned, per `cleanup.ts`), then starts a second stack in Docker mode against the same `dataDir` and verifies: - the first stack really ran postgres as a native process (no matching Docker container) - the second stack really ran postgres as a Docker container - the marker row written natively is still present and unchanged after the transition Ran repeatedly (including a sanity check that points the Docker stack at a *different* fresh `dataDir`, which reproducibly fails with `relation "public.persistence_marker" does not exist`, confirming the assertion has real detection power): the persistence assertion passes consistently. The `/etc/postgresql` vs `/var/lib/postgresql/data` path mismatch does not break persistence in practice — data written natively is correctly visible after switching to Docker mode against the same `dataDir`.
## TL;DR Fixing `db push` failing with `Remote migration versions not found in local migrations directory` for a version that's sitting right there on disk, which happened because local files arrive in **name** order while `schema_migrations` comes back in **version** order, and those two disagree whenever one version is a string prefix of another (`1` vs `10`, or `20260420` vs `20260420010000`): `10_b.sql` sorts before `1_a.sql` (`'0'` < `'_'`), so the two-pointer merge desynchronises and reports an already-applied version as missing. `migration up` walks the same merge, and `migration repair --status reverted` is no way out, the versions just come back as `ErrMissingRemote`... sorted now by ordering local paths by version before the walk: a new `legacySortMigrationPathsByVersion` called from both `legacyFindPendingMigrations` implementations, rather than from `legacyListLocalMigrations` where the name ordering originates that list also feeds the `pgdelta` cache hash, so reordering it there would drift the cache key. TS shell only, since that's the user-facing path today via legacy.... `--include-all` needed the same treatment: it slices the local list at `remoteCount + diff.length`, so with `diff` now version-ordered it has to index the version-ordered list too. Left name-ordered it would re-apply an already-applied migration and silently skip a pending one (`1,2,20` with `2` applied → `[1, 2]` instead of `[1, 20]`). ## Refs - Closes #6036
## **TL;DR** fixes the recurring red e2e shards (`docker: toomanyrequests: Rate exceeded`): raw `docker run`s implicit-pulled uncached images from a single registry, so one rate-limit killed the shard. Now `ensureImage()` (tests/helpers) resolves images like prod's resolver cached first, then 4s/8s-retried pulls across ECR → GHCR → Docker Hub -> at every raw-run site, timeout-bounded, daemon-aware, memoized. Verified both ways: rate-limited registries reproduce the CI failure verbatim unfixed, pass via the Hub fallback fixed.... ## ref: <details> <summary>fixes: (ss)</summary> <img width="1736" height="1296" alt="image" src="https://github.com/user-attachments/assets/6361bebf-b1b1-4e2d-b976-af9204fff080" /> </details>
…ess (CLI-1988) (#6008) ## What kind of change does this PR introduce? Go-parity fix for `supabase gen types` flag validation, implementing the CLI-1988 parity ruling. Fixes CLI-1988 ## ⚖ Parity ruling applied This issue was decision-gated; the ruling (Colum, 2026-07-30) was to take the issue's recommended option: **bless the deliberate pg-meta permissiveness, restore every undocumented Go guard byte-exactly**. ### Blessed deviation (kept, sanctioned — do not "fix" back) Non-TypeScript `--lang` (`go`/`swift`/`python`) with `--linked`, `--project-id`, or the implicit linked ref runs **pg-meta locally** against the project database (project probe → preview-branch fallback → temporary login-role credentials). The Go CLI instead hard-errors with `Unable to generate <lang> types for selected project. Try using --db-url flag instead.` (`apps/cli-go/internal/gen/types/types.go:44-46`) and never runs pg-meta for a project ref. This permissiveness is intentional: it was already recorded in `gen/types/SIDE_EFFECTS.md` and it resolves the user-filed CLI-1623 complaint. This PR strengthens the SIDE_EFFECTS.md wording to explicitly mark it as a **sanctioned intentional divergence (CLI-1988)** and records it in `docs/go-cli-porting-status.md`. ### Restored Go guards (byte-exact, verified against the compiled Go binary) These were TS divergences **not** documented as intentional, now restored to Go's exact strings, ordering, and exit code 1: - **PreRunE gate** (`cmd/gen.go:80-82`): `--postgrest-v9-compat` without `--db-url` → `--postgrest-v9-compat must used together with --db-url` (Go's "must used" typo preserved). Previously TS allowed `--local --postgrest-v9-compat` and emitted a TS-only message for ref paths. - **All four cobra mutually-exclusive flag groups** (`cmd/gen.go:153-162`) — TS previously reproduced only the first: - `local` / `linked` / `project-id` / `db-url` - `linked` / `project-id` / `postgrest-v9-compat` - `linked` / `project-id` / `query-timeout` - `linked` / `project-id` / `swift-access-control` Errors use cobra's exact format (`if any flags in the group [...] are set none of the others can be; [...] were all set`, set-flags alphabetically sorted) via the existing `shared/cli/cobra-flag-groups.ts` helpers, and the groups are validated in cobra's lexicographically-sorted group-key order, so multi-violation invocations report the same group as Go (e.g. `--db-url X --postgrest-v9-compat --project-id Y` reports the postgrest group). - **Guard ordering matches cobra's pipeline**: flag parse (invalid `--query-timeout` duration) → PreRunE (postgrest gate, positional-language guard) → mutex groups. E.g. `--local --linked --postgrest-v9-compat` now yields the PreRunE error, as Go does. - **Mutex membership mirrors pflag `Changed`**: an explicitly negated boolean (`--linked=false --project-id X`) still trips the group, matching cobra. - **Removed TS-only messages absent from Go**: `--swift-access-control can only be used with --lang swift`, `--postgrest-v9-compat can only be used with pg-meta type generation`, `--query-timeout can only be used with pg-meta type generation`, and the `Warning: --query-timeout is ignored for remote TypeScript type generation.` stderr warning. Go also allows `--swift-access-control` with any `--lang` on `--local`/`--db-url` (the value is always forwarded to pg-meta), which TS now does too. `gen types --query-timeout 20s` on the implicit linked TypeScript path now silently ignores the flag, as Go does. ### Keep-vs-restore interaction (documented, not a conflict) Restoring the `linked`/`project-id` mutex groups means the pg-meta tuning knobs (`--swift-access-control`, `--postgrest-v9-compat`, `--query-timeout`) **cannot be combined with the blessed project-ref pg-meta path** — that path always runs with pg-meta defaults (`internal` access control, one-to-one detection on, 15s timeout). This does not break the blessed permissiveness itself (`--linked --lang go` etc. still reach pg-meta); it constrains only the add-on knobs, exactly as Go's flag surface does, and `--db-url` remains the escape hatch Go's own error message recommends. No Go guard had to be left unrestored: none of them exists solely to enforce "never pg-meta on refs". One known residual precedence nuance: Go resolves the linked DB config in the root `PersistentPreRunE` *before* flag validation, so in Go an unlinked workdir or unreachable network can surface a resolution error (e.g. `Cannot find project ref…`, `IPv6 is not supported…`) *before* a mutex error. The TS handler validates flags before any resolution (consistent with all prior TS mutex ports — sso, functions, db dump), so in those degraded environments TS reports the mutex error instead. The guard strings themselves are byte-identical. ### Note on CLI-1623 CLI-1623 is stale either way: the complaint it tracks (non-TypeScript typegen unusable for hosted projects) is resolved by the blessed permissiveness that this PR pins with regression tests, so the issue no longer reflects current behavior regardless of this ruling. ## What is the new behavior? Previously-working TS-only combos now error with Go's exact text (`--local --postgrest-v9-compat`, `--linked --lang swift --swift-access-control public`, `--linked --query-timeout 30s`, …), the TS-only friendlier gate messages are gone, and the blessed `--linked/--project-id --lang go|swift|python` pg-meta path is unchanged and covered by regression tests (11 guard tests verified to fail against the previous handler, plus pins for the permissive path).
…n (CLI-1975) (#6002) ## ⚖ Parity ruling applied This issue was **decision-gated**. Colum ruled (2026-07-30) to take the issue's recommended option: **remap the `-o toml` / `-o yaml` encoders to Go field-name casing and structure — full Go parity**. The alternative (declaring the TS snake_case casing intentional) was **rejected**. The Go CLI (`apps/cli-go/`) is the byte-parity oracle: for every affected command the machine output now matches what the Go binary prints, including field-name casing, ordering, zero-value inclusion, datetime rendering, and null rendering. **User-visible change:** scripts consuming `-o toml` / `-o yaml` from the affected commands will now see Go-shaped keys (`ProjectRef` / `[[branches]]`-style PascalCase in TOML, `projectref`-style lowercased names in YAML) instead of the snake_case keys the TS CLI emitted until now — i.e. scripts written against the long-lived Go CLI work again. `-o json` values additionally carry Go's default HTML escaping (`<` `>` `&` as `\u003c`-style escapes); any JSON parser decodes these transparently. Fixes CLI-1975 ## What changed Go's `utils.EncodeOutput` hands raw Go structs to BurntSushi TOML and yaml.v3, and neither library reads `json:` tags — keys come from the Go **struct field names**. The TS legacy shell was instead re-encoding the decoded snake_case JSON. This PR closes that gap for every struct-payload command. ### New shared encoder (`legacy/shared/legacy-go-struct-output.encoders.ts`) A pure, spec-driven pair of encoders that reproduce the Go binary byte-for-byte, driven by per-payload-family **Go struct specs** (field order = Go declaration order, mirrored from `apps/cli-go/pkg/api/types.gen.go` and command-local structs): - **TOML (BurntSushi v1.6.0 semantics):** PascalCase field names, primitives before sub-tables, 2-space nested table indentation, blank line before top-level tables and every `[[array-of-tables]]` element, nil pointers/slices/maps omitted, empty decoded arrays as `key = []`, `time.Time` as native RFC3339Nano datetimes, Go float `'g'` formatting with the TOML `.0` rule, BurntSushi's exact string-escape table, and Go's runtime failure for populated `nullable.Nullable` fields. - **YAML (yaml.v3 v3.0.1 semantics):** lowercased-whole-field-name keys, explicit `null` for nil pointers, `[]`/`{}` for nil slices/maps, yaml.v3's 4-column indentation algorithm (+2 inside sequence items), its scalar-quoting resolver (old-bools, base-0 ints, floats, base-60, timestamps → double-quoted; emitter-plain-disallowed → single-quoted), block literals with chomping/indentation indicators, `map[bool]T` rendering for oapi `nullable` fields, yaml.v3's natural map-key sort, and Go `strconv.FormatFloat(_, 'g', -1, bits)` float formatting incl. float32 rounding. Every golden byte string in the unit tests was captured empirically from a scratch Go program running the repo's own `utils.EncodeOutput` with the exact library versions pinned in `apps/cli-go/go.mod`. ### Commands rewired to the spec encoders - `branches list/create/update` (shared `branches.go-payload.ts`) - `orgs list/create` (`orgs.go-payload.ts`) - `projects list` (Go's `linkedProject` embed: inlined `V1ProjectWithDatabaseResponse` fields first, `Linked` last), `projects create` (shared create core), `projects api-keys` (`-o yaml` only — Go's `-o toml|env` encode the `SUPABASE_*_KEY` env map, unchanged) - `secrets list`, `sso list/show/add/update/remove` (`sso.go-payload.ts`), `domains get/create/activate/reverify`, `ssl-enforcement get/update` (`ssl-enforcement.go-payload.ts`), `functions list` (replaces its bespoke per-command key maps), `backups list`, `snippets list`, `services`, `vanity-subdomains get/activate/check-availability` (YAML was snake_case; TOML gains Go's declaration order) Nil-vs-empty slice semantics follow each Go command: append-built lists (`branches list`, `projects list`) emit nothing for `-o toml` when empty (Go nil slice), decoded lists emit `key = []`. ### Bug-for-bug parity notes - `snippets list -o toml` now **fails** with Go's exact error (`failed to output toml: toml: cannot encode a map with non-string key type`) whenever a snippet carries a `description` — BurntSushi cannot encode `nullable.Nullable[string]` (`map[bool]string`), and the Management API always sends the key. Go fails identically. - `projects api-keys -o yaml` renders nullable fields as yaml.v3 renders `map[bool]T`: `apikey:` + indented `true: <value>` when set, `{}` when absent, `false: ""` for explicit JSON null. ### JSON HTML escaping `encodeGoJson` (`-o json`) and `encodeGoStructJsonBody` (raw-HTTP request bodies for `sso add/update`) now produce Go's `encoding/json` default escaping: `<` `>` `&` → `\u003c` `\u003e` `\u0026`, `\u0008`/`\u000c` for backspace/form feed, and escaped U+2028/U+2029 — materially visible in `sso … metadata_xml`. Both now route through the shared Go-faithful JSON walker (`legacy-go-json.ts`, which gains a compact mode); `functions list`'s bespoke post-escaper was deleted. The cli-e2e replay server compares parsed bodies, so recorded fixtures are unaffected. ### Tests & docs - New unit suite for the encoders with Go-captured golden bytes (quoting matrix, block literals, floats incl. `-0`, nullable shapes, nil/empty slices, natural key sort, hostnames nesting). - Integration tests upgraded to byte-exact assertions for branches list (toml+yaml, incl. a zero-value branch and the empty-list `-o toml` no-output case), sso show (json escape + yaml + toml), backups list (incl. `[[Backups]]`), snippets (both the Go failure and the description-absent success bytes), plus casing fixes across orgs/projects/secrets/services/ssl-enforcement/domains/vanity tests. The previously-wrong `branches list` toml assertion (`name = "feat-1"`) is now the full Go-golden document. - An explicit exempt-proof test: `branches get -o toml` (map payload) keeps its env-map keys verbatim — the struct remap must not apply to map payloads (`sso info`, `status`, `postgres-config`, `network-bans`, `branches get` are unchanged). - SIDE_EFFECTS.md parity claims updated (domains' "intentional snake_case divergence" note deleted; backups/secrets/sso output-shape descriptions now byte-accurate). ## Deliberately out of scope (pre-existing divergences, noted for the record) - `network-restrictions get/update`: Go never encodes `-o` output for these commands (it always prints three fixed `Printf` lines), so there is no Go byte oracle; the TS handlers' existing `-o json|yaml|toml|env` support is left untouched. Follow-up candidate. - `branches list -o json` with zero branches: TS emits `[]`, Go emits `null` (append-built nil slice). JSON values were out of CLI-1975's scope (HTML escaping only). - `projects list -o json`: TS sorts keys alphabetically so `linked` sorts mid-object; Go emits it last. Same out-of-scope reasoning. - `domains` `data.errors`/`data.messages` are modeled as raw JSON values; Go's generated element type marshals as an empty struct — unobservable because these arrays are empty on every reachable path (both sides emit `[]`).
…lag builder (CLI-2005) (#6010) ## What changed Follow-up to CLI-1983 (#5975), from kanadgupta's review: the seven remaining hand-rolled pflag `StringSliceVar` call sites still mapped malformed-CSV failures to a bare `err.message`, so their stderr missed pflag's `invalid argument %q for %q flag: ...` framing. All of them now route through the shared `legacyStringSliceFlag` builder (`src/legacy/shared/legacy-string-slice-flag.ts`): - `sso add --domains` - `sso update --domains` / `--add-domains` / `--remove-domains` - `postgres-config update --config` - `postgres-config delete --config` - `start --exclude` / `-x` - `status --override-name` / `--exclude` The builder gains an optional `{ alias }` parameter because `start --exclude` is the one site whose Go counterpart is a `StringSliceVarP` **with a shorthand** (`cmd/start.go:58`): pflag frames such diagnostics with both spellings — `invalid argument %q for "-x, --exclude" flag: ...` (pflag v1.0.10 `errors.go:108-117` branches on `flag.Shorthand`) — regardless of which spelling the user typed, so the alias has to be registered inside the builder for the framing to come out right. `Flag.withDefault([] as ReadonlyArray<string>)` was dropped from the migrated flag definitions: `Flag.atLeast(0)` already yields `[]` when the flag is unset (covered by the existing "defaults to an empty array when unset" unit tests), and `--help` output was verified byte-identical before/after for all six commands. ## Per-site Go parity verification Every rendered line was verified against the Go binary built from `apps/cli-go` (pflag v1.0.10 → `encoding/csv`). All seven sites' malformed-CSV stderr changes user-visibly — from the bare parse-error text to the full pflag line: | Site | Go framing | Example (Go-verified, now byte-matched by TS) | | --- | --- | --- | | `sso add --domains` | `"--domains"` | `invalid argument "a\"b" for "--domains" flag: parse error on line 1, column 2: bare " in non-quoted-field` | | `sso update --domains` | `"--domains"` | same as above | | `sso update --add-domains` | `"--add-domains"` | `invalid argument "\"x" for "--add-domains" flag: parse error on line 1, column 3: extraneous or missing " in quoted-field` | | `sso update --remove-domains` | `"--remove-domains"` | same shape as `--add-domains` | | `postgres-config update --config` | `"--config"` | `invalid argument "a\"b" for "--config" flag: parse error on line 1, column 2: bare " in non-quoted-field` | | `postgres-config delete --config` | `"--config"` | `invalid argument "\"max_connections" for "--config" flag: parse error on line 1, column 17: extraneous or missing " in quoted-field` | | `start --exclude` / `-x` | **`"-x, --exclude"`** | `invalid argument "a\"b" for "-x, --exclude" flag: parse error on line 1, column 2: bare " in non-quoted-field` | | `status --override-name` | `"--override-name"` | `invalid argument "\"api.url=FOO" for "--override-name" flag: parse error on line 1, column 13: extraneous or missing " in quoted-field` | | `status --exclude` | `"--exclude"` | `invalid argument "a\"b" for "--exclude" flag: parse error on line 1, column 2: bare " in non-quoted-field` | For `postgres-config`, the parse error also correctly precedes the `--experimental` gate (cobra parses flags before `PersistentPreRunE`), asserted in the experimental-gate integration suite. ## Multiline / blank-line semantics findings CLI-1983's parser rewrite changed `legacyParseStringSliceFlag` itself, so all seven sibling sites silently inherited the first-record-only / EOF-on-blank semantics. I verified each site against the Go binary: - **First-record-only**: `--<flag> $'a\nb"c'` raises **no** parse error in Go at any of the seven sites (pflag calls `csv.Reader.Read()` once; the malformed second line is silently dropped). Observable proof for `start`: `start -x $'a\nb"c'` warns `The following container names are not valid to exclude: a` — only the first record survives. TS matches. - **Blank-only → EOF**: `--<flag> $'\n'` fails in Go with `invalid argument "\n" for "--<flag>" flag: EOF` at every site (with the `-x, --exclude` framing on `start`). TS matches. - **No sibling site's existing tests asserted stale pre-rewrite behaviour** — they simply had no multiline/blank-only coverage at all, and their malformed-CSV tests only asserted `Exit.isFailure` without the message. This PR adds exact-message assertions per flag plus first-record-only and blank-only-EOF vectors per site. ## Test coverage added - Per-site unit tests: exact pflag-framed diagnostics (including the shorthand framing for `start`), first-record-only multiline vectors, blank-only EOF vectors. - Per-family integration tests running the whole command tree (`Command.runWith`) and asserting the exact rendered message via `normalizeCause`, mirroring the network-bans/network-restrictions prior art from CLI-1983: new `sso.string-slice-flags.integration.test.ts`, `start.string-slice-flags.integration.test.ts`, `status.string-slice-flags.integration.test.ts`, plus malformed-CSV cases in the existing `postgres-config.experimental-gate.integration.test.ts`. - `start`'s `--exclude` flag is hoisted to an exported `legacyStartExcludeFlag` (mirroring `status`/`sso` conventions) so it is unit-testable. - SIDE_EFFECTS.md for all six commands gains the parse-time failure exit-code row (mirroring CLI-1983's doc updates). - Stale comments referencing the deleted `csvStringSliceFlag` helper in `legacy-db-target-flags.ts`/`.unit.test.ts` were updated; all helper-built flag names remain hand-registered in `VALUE_CONSUMING_LONG_FLAGS`, so telemetry argv parsing is unaffected. ## Overlap note: PR #5974 Open PR #5974 (`columferry/cli-1982-...`) touches sso command files (`sso.pflag-reconcile.ts`, add/update handlers). This PR's sso changes are deliberately minimal — the flag definition blocks in `add.command.ts`/`update.command.ts`, their unit tests, one new family-level integration test file, and one SIDE_EFFECTS.md row. Whoever merges second should re-verify the sso flag definitions still route through `legacyStringSliceFlag` after conflict resolution. ## Review notes (deliberately left open) - The `--schema` slice-flag family (`gen types`, `db lint/dump/pull/diff`, `db schema declarative generate`) still uses the hand-rolled `Flag.mapTryCatch(legacyParseSchemaFlags, err => err.message)` pattern via `legacy-schema-flags.ts`. It is not in CLI-2005's scope (and several of those are `StringSliceVarP` with `-s` shorthands needing their own per-site Go verification) — candidate for a follow-up issue. - The pathological double-error case (`-o bad` plus malformed CSV in one invocation): TS surfaces the CSV parse error while Go's winner depends on argv order; both exit non-zero. Same accepted approximation as CLI-1983, already documented on the network-bans/network-restrictions flag comments. - `cli-go:lint:check` fails with 5 pre-existing gosec findings unrelated to this change (no Go files touched). Fixes CLI-2005
…er (CLI-1982) (#6040) ## What kind of change does this PR introduce? Refactor — pure move + rename, zero behavior change. ## What is the current behavior? `sso.pflag-reconcile.ts` and `sso.load-profile.ts` (added in #5974 to reconcile pflag/viper-vs-Effect-parser divergence for `--profile`/`--workdir`/bool/enum flags, and to emulate Go's `LoadProfile`) live under the sso-specific command directory and are coupled to two sso-specific error types (`LegacySsoWorkdirError`, `LegacySsoProfileError`), even though every function in them is already generic. This was flagged in [#5974's review](#5974 (comment)): the logic doesn't scale to future command families that need the same pflag-vs-Effect-parser reconciliation. ## What is the new behavior? - Moved `sso.pflag-reconcile.ts` → `apps/cli/src/legacy/shared/legacy-pflag-reconcile.ts`, and `sso.load-profile.ts` → `apps/cli/src/legacy/shared/legacy-profile-load.ts` (plus their unit tests). - Renamed every export to drop the `Sso` infix (e.g. `legacySsoResolvePflagProfile` → `legacyResolvePflagProfile`). - Replaced `LegacySsoWorkdirError`/`LegacySsoProfileError` with new generic `LegacyPflagWorkdirError`/`LegacyProfileLoadError`, deleting the two sso-specific classes from `sso.errors.ts` with no compatibility shims. - Updated `sso add`/`sso update` handlers and their tests/SIDE_EFFECTS docs to the new location. All doc comments documenting binary-verified Go-parity behavior (across many #5974 review rounds) are preserved verbatim. This is a follow-through on a review suggestion that was originally deferred to a follow-up ticket — implementing it directly instead.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 97d6a66ecd
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| // in place and only ever reclaimed later, in the publish step | ||
| // below, once a fully-staged replacement is ready to atomically | ||
| // take its place. | ||
| const isComplete = yield* fs.exists(path.join(cacheDir, CACHE_COMPLETE_MARKER)); |
There was a problem hiding this comment.
Fall back to markerless cache when downloads fail
When a user already has a cache entry written by any earlier CLI release, that directory is non-empty but lacks the new .supabase-cache-complete marker, so this check skips it and immediately enters the download path. If the user is offline or GitHub is unavailable, resolveWithMetadata now fails even though the previously working binary is still present on disk; keep markerless legacy entries as a fallback when replacement cannot be downloaded/published.
Useful? React with 👍 / 👎.
| * conflict deliberately does not match, so a real spec conflict still fails. | ||
| */ | ||
| function legacyIsVolumeAlreadyExistsError(stderr: string): boolean { | ||
| return /volume (?:with name \S+ )?already exists/iu.test(stderr); |
There was a problem hiding this comment.
Do not swallow conflicting existing volumes
When volume create returns the spec-conflict message this helper explicitly calls out (volume with name <name> already exists ... but was not created for the current specification), the leading “already exists” text still satisfies this regex. legacyEnsureStartVolume then treats that non-zero exit as success and continues start against a volume whose requested options/labels were rejected; tighten the match so only the idempotent already-exists case is swallowed.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
<!-- Before opening this PR, confirm the linked issue is open and carries the `open-for-contribution` label. PRs from external contributors that don't follow the workflow in CONTRIBUTING.md are closed automatically. @supabase members working from Linear tickets are exempt. --> ## Summary (see PR title) ## Linked issue n/a ## Checklist - [x] The PR title follows [Conventional Commits](https://www.conventionalcommits.org/) (e.g. `fix(cli): …`). - [ ] Tests added or updated for the change. - [ ] `pnpm check:all` and `pnpm test` pass for the workspace(s) I touched.
## TL;DR
Clearing the two things currently sitting on the develop→main rollup PR.
First, the failing CodeQL check: two high-severity
`incomplete-url-substring-sanitization` alerts on the sso update tests —
`startsWith("http://first.example")` would also match a lookalike host
like `first.example.evil`,
so both assertions now end with a `/` delimiter, same play as #5957
(stricter check, alert gone, meaning unchanged since every real request
carries a `/v1/...` path)...
Second, the codex note on the rollup that turned out to be real:
a cache entry written before the completion-marker change (#6003) is
non-empty but markerless, so the resolver skips it and hard-fails
offline, with the previously-working binary sitting right there on disk.
The code even preserved that entry for exactly this case, it just never
used it.
A failed download now falls back to the non-empty markerless dir
(`downloaded: false`) and still fails when there's nothing to fall back
to — strictly no worse than any pre-marker release,
which resolved from that same dir on mere existence. Existing offline
test updated to the corrected contract, plus a no-cache negative case...
## Refs
- Resolves the two open CodeQL alerts on `develop` (same situation #5957
handled)
- Follow-up to #6003, surfaced by the codex review on the rollup PR
- unblocks: #6056
<details>
<summary> fixes: (ss)</summary>
<img width="822" height="561" alt="image"
src="https://github.com/user-attachments/assets/9fb299fe-c9d1-499e-a0da-4800dce88cc8"
/>
</details>
## TL;DR Fixing the `parallelStacks.e2e.test.ts` flake that's hit CI three times now: always the same pair of `90000ms` + `60000ms` hook timeouts with nothing useful in the log. Turns out the harness could hang three ways: a stack that died cleanly never settled its promise (the exit handler only checked for non-zero), stack that wedged had no timeout at all, and if one stack failed, its healthy sibling's handle got dropped so teardown killed nothing and the leak-check spun for 60s chasing a process it couldn't reach... The spawn logic now lives in a small `spawnStandaloneStack` helper that settles on every path with the child's actual output attached, and teardown tracks children from the moment they spawn. Also fixed `terminateChildProcess` quietly burning 2×30s on an already-dead child, that alone would've recreated the afterAll timeout. Repro'd all three failure modes with stubs first, each one has a pinning test, and the real suite ran green 6 times in a row.... ## refs - Deflakes the shard-1/3 failures from the #6038 and #6004 CI runs - Pairs with #6045 which fixes the underlying startup port race properly
## TL;DR Follow-up to the design note on #6030: `tests/helpers/docker-image.ts` hand-rolled ~130 lines of the candidate/cache-check/retry algorithm that already exists as `legacyMakeDockerImageResolver`, so the two could silently drift. The helper now drives the production resolver through a real `ChildProcessSpawner`, and the one piece that couldn't move, #6030's per-candidate budget split, which stops a stalled registry starving the ECR → GHCR → Docker Hub fallbacks, is ported into the resolver as an opt-in `deadline`. One implementation of everything; nothing left to drift.... The deadline is inert in production: both callers pass one argument, every new path is gated on it, and the pre-existing resolver tests pass untouched — the only other production edit reverts #6030's export-widening of the retry constant. The helper keeps only test policy (memoization, serialized resolves, a docker-CLI probe, a wedged-daemon backstop), with unit coverage it never had... ## Refs - Follow-up to #6030 <details> <summary>basically fixes: (ss)</summary> <img width="1736" height="1296" alt="image" src="https://github.com/user-attachments/assets/6361bebf-b1b1-4e2d-b976-af9204fff080" /> </details>
## TL;DR Fixes `supabase start` failing on Podman with: `Error: workdir "/home/<user>/<project>" does not exist on container <id>` which was caused by the edge runtime container always being created with `--workdir <project root>` a path that only exists inside the container when a bind mounts something at or under it, so it's there for a project with functions and absent for one without. Docker quietly creates the missing directory, Podman rejects the container outright. Now sorted by emitting `--workdir` only when a bind actually mounts that path, with tests around both directions... No behaviour change for anyone already working: with ≥1 enabled function the flag is emitted exactly as before, on every runtime. A zero-function project simply stops getting an empty directory nothing ever read, the entrypoint is fully absolute (`--main-service=/root`).. ## refs - closes #6035 the other 2/3 reported problems are already fixed: the SELinux relabel on the pgsodium secret bind by #6000 & the volume already exists rejection by #6037
…53) (#6021) ## What changed `supabase bootstrap` delegated its migration-push step to the Go binary as a documented interim until `db push` was natively ported — that condition was met months ago (`legacyDbPush` fully covers `--include-roles`/`--include-seed`/password/linked-path). This extracts a shared `legacyDbPushCore` (used by both `bootstrap.handler.ts` and the standalone `db/push/push.handler.ts`) so bootstrap's push runs natively, matching Go's `push.Run(ctx, false, false, true, true, config, fsys)` call (`internal/bootstrap/bootstrap.go:123-127`), wrapped in the same backoff/retry policy bootstrap already uses for its api-keys and health-poll steps. Three correctness issues surfaced during implementation and review, all fixed here rather than shipped as known gaps: - **IPv4-pooler connection fallback.** The old Go-subprocess delegation got Go's dial-probe + IPv4-pooler-fallback behavior for free (the Go binary's own connection resolution ran it); a native in-process call needs its own. Extracted the probe/fallback pair out of `LegacyDbConfigResolver` into a workdir-parameterized `legacyResolveLinkedConn`, since bootstrap can't reuse the resolver directly (it keys off `LegacyCliConfig.workdir`, which is memoized before bootstrap's own mid-handler `chdir` and would resolve against the wrong directory). - **Step ordering.** Bootstrap's `config.toml` load now happens where Go has it (`bootstrap.go:99`, before link-services/health-poll/`.env`), not after — so a malformed config aborts at the same point Go does, not later. - **`db push`'s own dry-run print ordering** is unchanged by the extraction (verified against Go's actual `PersistentPreRunE` → `RunE` ordering, not just preserved by accident). Also hoisted `legacy-migration-pending.ts`/`legacy-seed-ops.ts` from `commands/db/shared/` to `legacy/shared/`, since `legacyDbPushCore` is now a cross-command-family consumer of both (per this repo's "Hoist Before You Duplicate" convention) — and the same modules will be needed again by upcoming Go-removal work in this milestone (migration squash, shadow-database provisioning). ## Why Part of the M9 "Final Cleanup — Go Removal" milestone: eliminating remaining TS→Go delegations so the bundled Go binary can eventually shrink to the one sanctioned exception (`db diff --use-pg-schema`). Fixes CLI-1953
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b6dd487a10
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| @@ -69,8 +68,8 @@ const startFullStack = Effect.fnUntraced(function* (opts: FunctionsDevStackOptio | |||
| yield* ensureProjectStateIgnored(projectHome.projectRoot); | |||
|
|
|||
| const serviceVersionContext = yield* resolveServiceVersionContext([], undefined); | |||
| const config = yield* Effect.promise(() => | |||
| resolveDaemonConfig({ | |||
| const stackLayer = yield* daemonLayer( | |||
There was a problem hiding this comment.
Stop the dev daemon when metadata setup fails
When functions dev auto-starts a stack, this forks and registers the daemon before the subsequent state read/metadata write completes. If those filesystem steps fail (for example a permission or disk error under the project state dir), the command returns an error without disposing the stackLayer or calling stopDaemon, leaving an idle daemon process, live state file, and reserved ports behind; wrap the post-fork metadata setup in cleanup just like the normal start path needs.
Useful? React with 👍 / 👎.
| const projectReq = HttpClientRequest.get( | ||
| `${cliConfig.apiUrl}/v1/projects/${opts.projectRef}`, | ||
| ).pipe(authHeader, HttpClientRequest.setHeader("User-Agent", cliConfig.userAgent)); | ||
| const apiUrl = opts.apiUrl ?? cliConfig.apiUrl; |
There was a problem hiding this comment.
Carry the reconciled profile into upgrade URLs
When opts.apiUrl is supplied for an SSO pflag-reconciled profile, the fallback project/entitlement GETs now hit the reconciled host, but the fallback billing link still uses legacyBillingUrl(cliConfig.profile, orgSlug) later in this branch. For argv where pflag consumed --profile supabase-local (or a YAML profile with its own dashboard) but the Effect config layer parsed it, Go uses the reconciled CurrentProfile for both API requests and the dashboard URL, while this can print a localhost/stale-profile upgrade URL after confirming the gate on the reconciled API host.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
This PR was automatically created to sync the generated `@supabase/api` package with the latest Management API OpenAPI document. Changes were detected in the upstream OpenAPI document exposed by `https://api.supabase.com/api/v1-json`. --------- Co-authored-by: jgoux <1443499+jgoux@users.noreply.github.com> Co-authored-by: Julien Goux <hi@jgoux.dev>
Ensures the `resolvedPath` for a function download does not leave the `basePath`. --------- Co-authored-by: Andrew Valleteau <avallete@users.noreply.github.com>
…dates (#6054) Bumps the docker-minor group with 7 updates in the /apps/cli-go/pkg/config/templates directory: | Package | From | To | | --- | --- | --- | | postgrest/postgrest | `v14.15` | `v14.16` | | supabase/studio | `2026.07.27-sha-cbb076d` | `2026.08.03-sha-022b374` | | supabase/edge-runtime | `v1.74.2` | `v1.74.3` | | supabase/gotrue | `v2.194.0` | `v2.195.0` | | supabase/realtime | `v2.120.3` | `v2.123.1` | | supabase/storage-api | `v1.67.20` | `v1.68.1` | | supabase/logflare | `1.47.1` | `1.49.2` | Updates `postgrest/postgrest` from v14.15 to v14.16 Updates `supabase/studio` from 2026.07.27-sha-cbb076d to 2026.08.03-sha-022b374 Updates `supabase/edge-runtime` from v1.74.2 to v1.74.3 Updates `supabase/gotrue` from v2.194.0 to v2.195.0 Updates `supabase/realtime` from v2.120.3 to v2.123.1 Updates `supabase/storage-api` from v1.67.20 to v1.68.1 Updates `supabase/logflare` from 1.47.1 to 1.49.2 Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Julien Goux <hi@jgoux.dev>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b3d9ea223b
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| svc.stopped = Deferred.makeUnsafe<void>(); | ||
| } | ||
| }); | ||
| yield* prepareStart(); |
There was a problem hiding this comment.
Release reserved ports when dependencies fail
With the stack's serviceStartOptions, beforeStart reserves the service's configured ports and beforeSpawn releases them only once spawning is imminent. This new call runs before dependency readiness is known; if a dependency fails or times out, the service is marked failed and the later early-return path exits without beforeSpawn or any release, leaving ports for services that never started bound until the whole stack is disposed. Reserve after dependencies succeed or release the reservation on the dependency-failure/early-return path.
Useful? React with 👍 / 👎.
| const enabled = new Set(enabledServices); | ||
| const targets = new Set<ServiceName>(); | ||
| const addWithCompanions = (target: ServiceName): void => { | ||
| if (!enabled.has(target) || targets.has(target)) return; |
There was a problem hiding this comment.
Reject activation of disabled root services
When the requested service itself is disabled in the stack config, this guard returns an empty target list. The callers then treat that empty list as success (states.every([]) is true in the fast path, and beginStartTargets has nothing to start), so startService("auth") or a lazy proxy activation on an auth-disabled stack reports success and then proxies to port 0 instead of rejecting the disabled service. Distinguish a disabled root service from disabled optional companions before returning success.
Useful? React with 👍 / 👎.
Bumps the npm-major group with 2 updates: [@swc/core](https://github.com/swc-project/swc/tree/HEAD/packages/core) and [tldts](https://github.com/remusao/tldts). Updates `@swc/core` from 1.15.46 to 1.15.47 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/swc-project/swc/blob/main/CHANGELOG.md">@swc/core's changelog</a>.</em></p> <blockquote> <h2>[1.15.47] - 2026-07-29</h2> <h3>Bug Fixes</h3> <ul> <li> <p><strong>(es)</strong> Preserve numeric property key identity (<a href="https://redirect.github.com/swc-project/swc/issues/12050">#12050</a>) (<a href="https://github.com/swc-project/swc/commit/46900a31a92bdb89de94bf9264606342ec201fd3">46900a3</a>)</p> </li> <li> <p><strong>(es/ast)</strong> Support hashing non-finite numbers (<a href="https://redirect.github.com/swc-project/swc/issues/12043">#12043</a>) (<a href="https://github.com/swc-project/swc/commit/f4b85a63e9546245782068f5a9b2b7a0991cb99c">f4b85a6</a>)</p> </li> <li> <p><strong>(es/codegen)</strong> Emit non-finite numeric literals (<a href="https://redirect.github.com/swc-project/swc/issues/12047">#12047</a>) (<a href="https://github.com/swc-project/swc/commit/883abc4b97bf73a71cf1f6717238d24603ea9eb8">883abc4</a>)</p> </li> <li> <p><strong>(es/decorators)</strong> Avoid class state leakage for nested undecorated classes (<a href="https://redirect.github.com/swc-project/swc/issues/12076">#12076</a>) (<a href="https://github.com/swc-project/swc/commit/4c9d27752e9889b989cff9f6b72118e240048a23">4c9d277</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Apply ToInt32 when folding bitwise NOT (<a href="https://redirect.github.com/swc-project/swc/issues/12058">#12058</a>) (<a href="https://github.com/swc-project/swc/commit/550e2f7881cdf2c3369a649afebd1b016485da81">550e2f7</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Avoid inexact number radix folding (<a href="https://redirect.github.com/swc-project/swc/issues/12057">#12057</a>) (<a href="https://github.com/swc-project/swc/commit/506a0ea89b929733fa2530181542942157ee24fb">506a0ea</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Preserve invalid Array lengths (<a href="https://redirect.github.com/swc-project/swc/issues/12056">#12056</a>) (<a href="https://github.com/swc-project/swc/commit/3ce9e1693ec9586ab04b4ef9776be1233708e923">3ce9e16</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Preserve non-canonical arguments access (<a href="https://redirect.github.com/swc-project/swc/issues/12052">#12052</a>) (<a href="https://github.com/swc-project/swc/commit/850230b22b6a10c025a47efaaadb6b81b5fce5e7">850230b</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Apply ToUint16 in fromCharCode (<a href="https://redirect.github.com/swc-project/swc/issues/12055">#12055</a>) (<a href="https://github.com/swc-project/swc/commit/9ae7b9239fefc9eb781093eed5cd409bc31f34ad">9ae7b92</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Index strings by UTF-16 code unit (<a href="https://redirect.github.com/swc-project/swc/issues/12054">#12054</a>) (<a href="https://github.com/swc-project/swc/commit/bc263d24d5f3630188751c85757f5f7e31f9fbc2">bc263d2</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Use numeric literals for non-finite values (<a href="https://redirect.github.com/swc-project/swc/issues/12048">#12048</a>) (<a href="https://github.com/swc-project/swc/commit/b83078644a7f0f1bbb56d6b45754ca9ed1bafc4b">b830786</a>)</p> </li> <li> <p><strong>(es/minifier)</strong> Preserve top-level declarations referenced only by direct eval (<a href="https://redirect.github.com/swc-project/swc/issues/12029">#12029</a>) (<a href="https://github.com/swc-project/swc/commit/ad0e3b49bca3a61bc8f5ac90e15dc263b9cc674c">ad0e3b4</a>)</p> </li> <li> <p><strong>(es/optimization)</strong> Preserve JSON numeric values (<a href="https://redirect.github.com/swc-project/swc/issues/12051">#12051</a>) (<a href="https://github.com/swc-project/swc/commit/667af8cacdbc58e1af3887d381184355b84d4952">667af8c</a>)</p> </li> <li> <p><strong>(es/transforms)</strong> Use numeric literals for non-finite enum values (<a href="https://redirect.github.com/swc-project/swc/issues/12049">#12049</a>) (<a href="https://github.com/swc-project/swc/commit/1e3ed5caf878cfb867a374e768ae8e8344531441">1e3ed5c</a>)</p> </li> <li> <p><strong>(es/typescript)</strong> Evaluate cooked enum templates (<a href="https://redirect.github.com/swc-project/swc/issues/12059">#12059</a>) (<a href="https://github.com/swc-project/swc/commit/49d0b0f1ac744b04bb657a7e3147ed44ba7ecdde">49d0b0f</a>)</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/swc-project/swc/commit/0febbbada006af793de3b3f1e959afe1cc21ddea"><code>0febbba</code></a> chore: Publish <code>1.15.47</code> with <code>swc_core</code> <code>v75.0.0</code></li> <li><a href="https://github.com/swc-project/swc/commit/68abe42bb66d03caa2d3a3a63a0d850cdc74c1ca"><code>68abe42</code></a> chore: Publish <code>1.15.47-nightly-20260729.1</code> with <code>swc_core</code> <code>v75.0.0</code></li> <li>See full diff in <a href="https://github.com/swc-project/swc/commits/v1.15.47/packages/core">compare view</a></li> </ul> </details> <br /> Updates `tldts` from 6.1.86 to 7.4.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/remusao/tldts/releases">tldts's releases</a>.</em></p> <blockquote> <h2>v7.4.9</h2> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts-icann</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2636">#2636</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <h2>v7.4.8</h2> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2632">#2632</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <h2>v7.4.7</h2> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2630">#2630</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <h2>v7.4.6</h2> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2626">#2626</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>:nut_and_bolt: Dependencies</h4> <ul> <li>Bump sigstore from 4.1.0 to 4.1.1 <a href="https://redirect.github.com/remusao/tldts/pull/2629">#2629</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump <code>@babel/core</code> from 7.24.7 to 7.29.7 <a href="https://redirect.github.com/remusao/tldts/pull/2618">#2618</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump form-data from 4.0.5 to 4.0.6 <a href="https://redirect.github.com/remusao/tldts/pull/2611">#2611</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump rollup from 4.61.1 to 4.62.2 <a href="https://redirect.github.com/remusao/tldts/pull/2612">#2612</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump rollup-plugin-sourcemaps2 from 0.5.7 to 0.5.8 <a href="https://redirect.github.com/remusao/tldts/pull/2619">#2619</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump typescript-eslint from 8.60.1 to 8.62.1 <a href="https://redirect.github.com/remusao/tldts/pull/2624">#2624</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump <code>@sigstore/core</code> from 3.1.0 to 3.2.1 <a href="https://redirect.github.com/remusao/tldts/pull/2625">#2625</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump <code>@sigstore/verify</code> from 3.1.0 to 3.1.1 <a href="https://redirect.github.com/remusao/tldts/pull/2628">#2628</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li><code>tldts-core</code>, <code>tldts-experimental</code>, <code>tldts-icann</code>, <code>tldts-tests</code>, <code>tldts-utils</code>, <code>tldts</code> <ul> <li>Bump <code>@types/node</code> from 25.9.1 to 26.1.0 <a href="https://redirect.github.com/remusao/tldts/pull/2627">#2627</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> </ul> </li> </ul> <h4>Authors: 2</h4> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/remusao/tldts/blob/master/CHANGELOG.md">tldts's changelog</a>.</em></p> <blockquote> <h1>v7.4.9 (Thu Jul 16 2026)</h1> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts-icann</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2636">#2636</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <hr /> <h1>v7.4.8 (Thu Jul 09 2026)</h1> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2632">#2632</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <hr /> <h1>v7.4.7 (Tue Jul 07 2026)</h1> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2630">#2630</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>Authors: 1</h4> <ul> <li>Rémi (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> <hr /> <h1>v7.4.6 (Thu Jul 02 2026)</h1> <h4>:scroll: Update Public Suffix List</h4> <ul> <li><code>tldts-experimental</code>, <code>tldts</code> <ul> <li>Update upstream public suffix list <a href="https://redirect.github.com/remusao/tldts/pull/2626">#2626</a> (<a href="https://github.com/remusao"><code>@remusao</code></a>)</li> </ul> </li> </ul> <h4>:nut_and_bolt: Dependencies</h4> <ul> <li>Bump sigstore from 4.1.0 to 4.1.1 <a href="https://redirect.github.com/remusao/tldts/pull/2629">#2629</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> <li>Bump <code>@babel/core</code> from 7.24.7 to 7.29.7 <a href="https://redirect.github.com/remusao/tldts/pull/2618">#2618</a> (<a href="https://github.com/dependabot%5Bbot%5D"><code>@dependabot[bot]</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/remusao/tldts/commit/a6a2c3b3b52a8087df57edd4599fc3705345e6da"><code>a6a2c3b</code></a> Bump version to: v7.4.9 [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/8ff61723066c58cf438b152a82edd092b9986b87"><code>8ff6172</code></a> Update CHANGELOG.md [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/dd8ccdc01a9377c9c91b2c3dde3a7c3fa9880b7b"><code>dd8ccdc</code></a> Update upstream public suffix list (<a href="https://redirect.github.com/remusao/tldts/issues/2636">#2636</a>)</li> <li><a href="https://github.com/remusao/tldts/commit/e46ca7aa952df519efae2d11dcdb4f3a817ac8e5"><code>e46ca7a</code></a> Bump version to: v7.4.8 [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/a4823cde0ae806f2feff89ce68d8895243168feb"><code>a4823cd</code></a> Update CHANGELOG.md [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/86a0a5799995ff495dfb15b00016c7314cf3454a"><code>86a0a57</code></a> Update upstream public suffix list (<a href="https://redirect.github.com/remusao/tldts/issues/2632">#2632</a>)</li> <li><a href="https://github.com/remusao/tldts/commit/c43f3f113164626a96ebbe71f8979f7c512ad382"><code>c43f3f1</code></a> Bump version to: v7.4.7 [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/22e72c3c68278bfb084c8acfaa1a830cefc9b6e0"><code>22e72c3</code></a> Update CHANGELOG.md [skip ci]</li> <li><a href="https://github.com/remusao/tldts/commit/44a567cd9ebcdb6190ff9d1996047e95bc8d938a"><code>44a567c</code></a> Update upstream public suffix list (<a href="https://redirect.github.com/remusao/tldts/issues/2630">#2630</a>)</li> <li><a href="https://github.com/remusao/tldts/commit/92ee2b31e72433487577a6c027ad7ec69aa8c8fe"><code>92ee2b3</code></a> Bump version to: v7.4.6 [skip ci]</li> <li>Additional commits viewable in <a href="https://github.com/remusao/tldts/compare/v6.1.86...v7.4.9">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for tldts since your current version.</p> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…/apps/cli-go in the go-minor group across 1 directory (#6098) Bumps the go-minor group with 1 update in the /apps/cli-go directory: [github.com/go-git/go-git/v5](https://github.com/go-git/go-git). Updates `github.com/go-git/go-git/v5` from 5.19.1 to 5.19.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/go-git/go-git/releases">github.com/go-git/go-git/v5's releases</a>.</em></p> <blockquote> <h2>v5.19.2</h2> <h2>What's Changed</h2> <ul> <li>build: Update module golang.org/x/crypto to v0.52.0 [SECURITY] (releases/v5.x) by <a href="https://github.com/go-git-renovate"><code>@go-git-renovate</code></a>[bot] in <a href="https://redirect.github.com/go-git/go-git/pull/2150">go-git/go-git#2150</a></li> <li>build: Update module github.com/go-git/go-git/v5 to v5.19.1 [SECURITY] (releases/v5.x) by <a href="https://github.com/go-git-renovate"><code>@go-git-renovate</code></a>[bot] in <a href="https://redirect.github.com/go-git/go-git/pull/2141">go-git/go-git#2141</a></li> <li>build: Update module golang.org/x/net to v0.55.0 [SECURITY] (releases/v5.x) by <a href="https://github.com/go-git-renovate"><code>@go-git-renovate</code></a>[bot] in <a href="https://redirect.github.com/go-git/go-git/pull/2152">go-git/go-git#2152</a></li> <li>git: Worktree: Add stores index entires with backslashes on Windows by <a href="https://github.com/joshblum"><code>@joshblum</code></a> in <a href="https://redirect.github.com/go-git/go-git/pull/2262">go-git/go-git#2262</a></li> <li>storage: dotgit, reject path traversal in reference names by <a href="https://github.com/pjbgf"><code>@pjbgf</code></a> in <a href="https://redirect.github.com/go-git/go-git/pull/2254">go-git/go-git#2254</a></li> <li>build: Update module golang.org/x/net to v0.56.0 [SECURITY] (releases/v5.x) by <a href="https://github.com/go-git-renovate"><code>@go-git-renovate</code></a>[bot] in <a href="https://redirect.github.com/go-git/go-git/pull/2267">go-git/go-git#2267</a></li> <li>build: Update module golang.org/x/text to v0.39.0 [SECURITY] (releases/v5.x) by <a href="https://github.com/go-git-renovate"><code>@go-git-renovate</code></a>[bot] in <a href="https://redirect.github.com/go-git/go-git/pull/2268">go-git/go-git#2268</a></li> <li>[v5] git: worktree, make the filesystem wrapper a symlink-safe boundary by <a href="https://github.com/pjbgf"><code>@pjbgf</code></a> in <a href="https://redirect.github.com/go-git/go-git/pull/2277">go-git/go-git#2277</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2">https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/go-git/go-git/commit/3eeb238da61eb9c7a324f3ee04f990ce89175642"><code>3eeb238</code></a> Merge pull request <a href="https://redirect.github.com/go-git/go-git/issues/2277">#2277</a> from go-git/checkout-v5</li> <li><a href="https://github.com/go-git/go-git/commit/008a78f2dd86f52544ddff8b8e8ddeecdf3f7aab"><code>008a78f</code></a> git: worktree, make the filesystem wrapper a symlink-safe boundary</li> <li><a href="https://github.com/go-git/go-git/commit/2263fb5f022dde90b1c2845f028d3e37e161f2b8"><code>2263fb5</code></a> Merge pull request <a href="https://redirect.github.com/go-git/go-git/issues/2268">#2268</a> from go-git/renovate/releases/v5.x-go-golang.org-x-t...</li> <li><a href="https://github.com/go-git/go-git/commit/77b76250d93ec83e2c897638d8a3847b1bfaa38d"><code>77b7625</code></a> build: Update module golang.org/x/text to v0.39.0 [SECURITY]</li> <li><a href="https://github.com/go-git/go-git/commit/85ea767be2b2281693e61afe83911e12c86d6eb7"><code>85ea767</code></a> Merge pull request <a href="https://redirect.github.com/go-git/go-git/issues/2267">#2267</a> from go-git/renovate/releases/v5.x-go-golang.org-x-n...</li> <li><a href="https://github.com/go-git/go-git/commit/198675a07b3b8f4eb8f51bf188663a13bb0d9e1a"><code>198675a</code></a> build: Update module golang.org/x/net to v0.56.0 [SECURITY]</li> <li><a href="https://github.com/go-git/go-git/commit/4a0e66d555de5f9a30c31e2df64f445f42bd01e7"><code>4a0e66d</code></a> Merge pull request <a href="https://redirect.github.com/go-git/go-git/issues/2254">#2254</a> from pjbgf/v5-dotgit-ref-name-containment</li> <li><a href="https://github.com/go-git/go-git/commit/3b306ef83bd05194a30ce820eed7ed61c3084b5f"><code>3b306ef</code></a> storage: dotgit, align reference-name safety with refname_is_safe</li> <li><a href="https://github.com/go-git/go-git/commit/f3d0cc150b39ae1dc47406a5c170464286914610"><code>f3d0cc1</code></a> storage: dotgit, reject path traversal in reference names</li> <li><a href="https://github.com/go-git/go-git/commit/979cfe9c561d3ced778c88d9cde6db3297e6ed1d"><code>979cfe9</code></a> Merge pull request <a href="https://redirect.github.com/go-git/go-git/issues/2262">#2262</a> from joshblum/joshblum/to-slash-v5</li> <li>Additional commits viewable in <a href="https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions-major group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action). Updates `github/codeql-action/init` from 4.37.3 to 4.37.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/init's releases</a>.</em></p> <blockquote> <h2>v4.37.4</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/init's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <h2>4.37.5 - 03 Aug 2026</h2> <ul> <li>Fixed a bug where a network error while streaming the download of the CodeQL bundle could terminate the <code>init</code> Action instead of falling back to downloading the bundle before extracting it. <a href="https://redirect.github.com/github/codeql-action/pull/4061">#4061</a></li> </ul> <h2>4.37.4 - 29 Jul 2026</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> <h2>4.37.3 - 22 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.37.2 - 21 Jul 2026</h2> <ul> <li>The new address format for the <code>config-file</code> input that was introduced in CodeQL Action 4.37.0 is now enabled by default. In addition to the format described there, the <code>remote=</code> prefix can now be used to explicitly indicate that the input refers to a remote file. All previous input formats continue to be accepted as well. <a href="https://redirect.github.com/github/codeql-action/pull/4023">#4023</a></li> <li>The CodeQL Action can now make use of <a href="https://docs.github.com/en/code-security/how-tos/secure-at-scale/configure-organization-security/manage-usage-and-access/giving-org-access-private-registries">configured private registries</a> in Default Setup to retrieve CodeQL configuration files from remote repositories that require authentication. This will allow customers to store their CodeQL configuration in a single repository that can then be referenced by Default Setup workflows in other repositories. We expect to roll this and other, related changes out to everyone in July. <a href="https://redirect.github.com/github/codeql-action/pull/4007">#4007</a></li> </ul> <h2>4.37.1 - 16 Jul 2026</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.20.6 and earlier. These versions of CodeQL were discontinued on 1 July 2026 alongside GitHub Enterprise Server 3.16, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3956">#3956</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.1">2.26.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4019">#4019</a></li> </ul> <h2>4.37.0 - 08 Jul 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.0">2.26.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3995">#3995</a></li> <li>In addition to the existing input format, the <code>config-file</code> input for the <code>codeql-action/init</code> step will soon support a new <code>[owner/]repo[@ref][:path]</code> format. All components except the repository name are optional. If omitted, <code>owner</code> defaults to the same owner as the repository the analysis is running for, <code>ref</code> to <code>main</code>, and <code>path</code> to <code>.github/codeql-action.yaml</code>. Support for this format ships in this version of the CodeQL Action, but will only be enabled over the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/3973">#3973</a></li> </ul> <h2>4.36.3 - 01 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.36.2 - 04 Jun 2026</h2> <ul> <li>Cache CodeQL CLI version information across Actions steps. <a href="https://redirect.github.com/github/codeql-action/pull/3943">#3943</a></li> <li>Reduce requests while waiting for analysis processing by using exponential backoff when polling SARIF processing status. <a href="https://redirect.github.com/github/codeql-action/pull/3937">#3937</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.6">2.25.6</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3948">#3948</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/f205ea1c3313d32999d8d6a48b4f6530d4437b38"><code>f205ea1</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4053">#4053</a> from github/update-v4.37.4-9130ce0f7</li> <li><a href="https://github.com/github/codeql-action/commit/e40d079dd9dd4a5c74f625cecd83867c8208aa71"><code>e40d079</code></a> Update changelog for v4.37.4</li> <li><a href="https://github.com/github/codeql-action/commit/9130ce0f733a0d17b9e1b9692c2af19be6c69dda"><code>9130ce0</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4051">#4051</a> from github/update-bundle/codeql-bundle-v2.26.2</li> <li><a href="https://github.com/github/codeql-action/commit/c62d82468641dca0f8df108ab73e2a8407ac9cf7"><code>c62d824</code></a> Add changelog note</li> <li><a href="https://github.com/github/codeql-action/commit/da0c1901011e62af9c02aae8bf5b8885b11f7741"><code>da0c190</code></a> Update default bundle to codeql-bundle-v2.26.2</li> <li><a href="https://github.com/github/codeql-action/commit/18420e3271f74589575af831a523c833acda327f"><code>18420e3</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4043">#4043</a> from github/mbg/ts/changelog</li> <li><a href="https://github.com/github/codeql-action/commit/7e8d8970f03ec5a78ab372fc0778e8e4194111a5"><code>7e8d897</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4046">#4046</a> from github/mbg/repo-prop/code-quality</li> <li><a href="https://github.com/github/codeql-action/commit/2d4c474c2ca5ea2965b9e53fabb7b67b0100016c"><code>2d4c474</code></a> Log <code>!analysisKindSupported</code> case</li> <li><a href="https://github.com/github/codeql-action/commit/98c05a17d327d7c4055fca83114434ab56baacf6"><code>98c05a1</code></a> Fix argument validation in <code>rollback-changelog.ts</code></li> <li><a href="https://github.com/github/codeql-action/commit/8289a49271cbb335d374e7e2e7a50c1576be0afe"><code>8289a49</code></a> Ignore repository property for unsupported analysis kinds</li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...f205ea1c3313d32999d8d6a48b4f6530d4437b38">compare view</a></li> </ul> </details> <br /> Updates `github/codeql-action/analyze` from 4.37.3 to 4.37.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/analyze's releases</a>.</em></p> <blockquote> <h2>v4.37.4</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/analyze's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <h2>4.37.5 - 03 Aug 2026</h2> <ul> <li>Fixed a bug where a network error while streaming the download of the CodeQL bundle could terminate the <code>init</code> Action instead of falling back to downloading the bundle before extracting it. <a href="https://redirect.github.com/github/codeql-action/pull/4061">#4061</a></li> </ul> <h2>4.37.4 - 29 Jul 2026</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> <h2>4.37.3 - 22 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.37.2 - 21 Jul 2026</h2> <ul> <li>The new address format for the <code>config-file</code> input that was introduced in CodeQL Action 4.37.0 is now enabled by default. In addition to the format described there, the <code>remote=</code> prefix can now be used to explicitly indicate that the input refers to a remote file. All previous input formats continue to be accepted as well. <a href="https://redirect.github.com/github/codeql-action/pull/4023">#4023</a></li> <li>The CodeQL Action can now make use of <a href="https://docs.github.com/en/code-security/how-tos/secure-at-scale/configure-organization-security/manage-usage-and-access/giving-org-access-private-registries">configured private registries</a> in Default Setup to retrieve CodeQL configuration files from remote repositories that require authentication. This will allow customers to store their CodeQL configuration in a single repository that can then be referenced by Default Setup workflows in other repositories. We expect to roll this and other, related changes out to everyone in July. <a href="https://redirect.github.com/github/codeql-action/pull/4007">#4007</a></li> </ul> <h2>4.37.1 - 16 Jul 2026</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.20.6 and earlier. These versions of CodeQL were discontinued on 1 July 2026 alongside GitHub Enterprise Server 3.16, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3956">#3956</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.1">2.26.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4019">#4019</a></li> </ul> <h2>4.37.0 - 08 Jul 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.0">2.26.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3995">#3995</a></li> <li>In addition to the existing input format, the <code>config-file</code> input for the <code>codeql-action/init</code> step will soon support a new <code>[owner/]repo[@ref][:path]</code> format. All components except the repository name are optional. If omitted, <code>owner</code> defaults to the same owner as the repository the analysis is running for, <code>ref</code> to <code>main</code>, and <code>path</code> to <code>.github/codeql-action.yaml</code>. Support for this format ships in this version of the CodeQL Action, but will only be enabled over the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/3973">#3973</a></li> </ul> <h2>4.36.3 - 01 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.36.2 - 04 Jun 2026</h2> <ul> <li>Cache CodeQL CLI version information across Actions steps. <a href="https://redirect.github.com/github/codeql-action/pull/3943">#3943</a></li> <li>Reduce requests while waiting for analysis processing by using exponential backoff when polling SARIF processing status. <a href="https://redirect.github.com/github/codeql-action/pull/3937">#3937</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.6">2.25.6</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3948">#3948</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/f205ea1c3313d32999d8d6a48b4f6530d4437b38"><code>f205ea1</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4053">#4053</a> from github/update-v4.37.4-9130ce0f7</li> <li><a href="https://github.com/github/codeql-action/commit/e40d079dd9dd4a5c74f625cecd83867c8208aa71"><code>e40d079</code></a> Update changelog for v4.37.4</li> <li><a href="https://github.com/github/codeql-action/commit/9130ce0f733a0d17b9e1b9692c2af19be6c69dda"><code>9130ce0</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4051">#4051</a> from github/update-bundle/codeql-bundle-v2.26.2</li> <li><a href="https://github.com/github/codeql-action/commit/c62d82468641dca0f8df108ab73e2a8407ac9cf7"><code>c62d824</code></a> Add changelog note</li> <li><a href="https://github.com/github/codeql-action/commit/da0c1901011e62af9c02aae8bf5b8885b11f7741"><code>da0c190</code></a> Update default bundle to codeql-bundle-v2.26.2</li> <li><a href="https://github.com/github/codeql-action/commit/18420e3271f74589575af831a523c833acda327f"><code>18420e3</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4043">#4043</a> from github/mbg/ts/changelog</li> <li><a href="https://github.com/github/codeql-action/commit/7e8d8970f03ec5a78ab372fc0778e8e4194111a5"><code>7e8d897</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4046">#4046</a> from github/mbg/repo-prop/code-quality</li> <li><a href="https://github.com/github/codeql-action/commit/2d4c474c2ca5ea2965b9e53fabb7b67b0100016c"><code>2d4c474</code></a> Log <code>!analysisKindSupported</code> case</li> <li><a href="https://github.com/github/codeql-action/commit/98c05a17d327d7c4055fca83114434ab56baacf6"><code>98c05a1</code></a> Fix argument validation in <code>rollback-changelog.ts</code></li> <li><a href="https://github.com/github/codeql-action/commit/8289a49271cbb335d374e7e2e7a50c1576be0afe"><code>8289a49</code></a> Ignore repository property for unsupported analysis kinds</li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...f205ea1c3313d32999d8d6a48b4f6530d4437b38">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## TL;DR fixes custom auth email templates silently reverting to GoTrue's built-in defaults after `db reset`, `functions serve` (every hot reload) and `branch switch` `kong reload` re-renders nginx.conf from Kong's default template, dropping the `:8088` email-templates server that only bring-up's `--nginx-conf` defines. Every reload now hands that template back.... Third pass on this argument: - PS: first complete one: #5906 added it to `functions serve`'s reload #5976 reverted it for Go parity ("reload reuses the prefix bring-up prepared" it doesn't) and - #6017's new `db reset` reload (fixing issue #6016's 502s) shipped bare on the same assumption. Fixing Go's call sites too removes the parity argument, so this can't be reverted on parity grounds a fourth time. #6017's DNS re-resolution is unchanged. verified 502→200 on a rotated container IP with the new argv. Broken stacks self-heal on the next reset. A template-less container (only one never created by `supabase start`, written unconditionally since the start) now fails the reload loudly, fatal in `db reset`, stderr warning in `functions serve`/`branch switch`...... <details><summary>repro / before vs after</summary> Real stack, kong's `StartedAt` never changes (container never restarted): 0. after supabase start listeners=[8000 8001 8088 8443 8444] template=custom ✓ 1. after BASELINE db reset listeners=[8000 8001 8443 8444] template=REFUSED → built-in default 2. after FIXED db reset listeners=[8000 8001 8088 8443 8444] template=custom ✓ - #6016 non-regression: warm 200 → rotate auth IP → 502 502 502 → new reload → 200, :8088 intact. </details> ## ref: - closes #6059
## TL;DR fixes db schema declarative generate printing the absolute `declarative` dir in its written-to line and its overwrite prompt which worked in GO cause it chdirs into the workdir and prints `GetDeclarativeDir()` verbatim, diverged in TS cause the handler resolves the dir against the workdir for file I/O and printed that same resolved value while the tests only asserted a message prefix: now sorted cause we switch both renders to the config-verbatim `legacyResolveDeclarativeDir` value through the shared written-line helper exactly like pull and sync already do and is tested locally across the generate sync and pull suites plus the full workspace.... ## ref: - extends #5968 ( CLI-1978 )
## TL;DR
fixes the analytics crashloop where a failed `Logflare.Release.migrate`
got silently swallowed and
Logflare booted against an unmigrated database killing
Oban on the missing `public.oban_jobs`, by chaining `migrate && start`
in the generated entrypoint
so a failed migrate now exits the container and the `unless-stopped`
restart policy
just retries until the db is ready
already broken stacks need one `supabase stop && supabase start` after
upgrading cause the new entrypoint only applies on container recreate.
diverges from go (ts only)....
<details><summary>before vs after </summary>
BEFORE (db refusing): migrate fails, app boots anyway, zombie with exit
0
AFTER (db refusing): app never boots, container exits and retries
AFTER (db appears): migrations apply (37 tables + oban), boots clean
</details>
## ref:
- closes #6088
# TL;DR fixes `supabase link --profile <name>` failing with Authorization failed for the access token and project ref pair, which was caused by the legacy config layer silently falling back to the built in supabase profile and its keyring token whenever the profile was neither a built in name nor a readable YAML profile file, and is now fixed by resolving every command through the strict Go parity loader so an unloadable profile fails with the same failed to read profile error as the Go CLI before any API call. Commands run with a stale unloadable profile file now fail until rescued, and matching Go, an explicitly passed `--profile` supabase shadows `SUPABASE_PROFILE` and the persisted file, and login persists and heals the profile file the same way... ## ref: - closes: #6091 - extends: #6040
fixes/clears: <img width="1095" height="261" alt="image" src="https://github.com/user-attachments/assets/ed707f50-8184-4455-8db5-6fbe55f1c624" /> - unblocks #6056 & avoid's warning on upcoming merges..
…mode (CLI-1959) (#6061) ## What changed Replaces the hidden Go seam `db schema declarative __catalog --mode migrations` — used by `db diff --from/--to migrations` and `db schema declarative sync`'s migrations-catalog diff source — with native TypeScript catalog export, invoking pg-delta directly via the already-shipped `legacyExportCatalogPgDelta` edge-runtime path instead of proxying through the Go binary. `baseline`/`declarative` catalog modes remain seam-backed (out of scope here — they need native shadow-provisioning primitives that are CLI-1956's territory, a separate in-progress issue). `LegacyCatalogMode` is narrowed to `"baseline" | "declarative"`, making the remaining Go-backed surface exhaustive/compile-checked. **Bundled parity fix:** the old code routed `db diff --from migrations` through the wrong Go-equivalent function — one shaped for `declarative.go`'s semantics (setup-token-folded cache key, zero-migrations→baseline reuse, a `Creating shadow database...` stderr line) — when Go's actual `db diff` path uses `explicit.go`'s `resolveMigrationsCatalogRef` (bare migration-hash cache key, no stderr line, always consults cache). This meant `db diff --from migrations` could never reuse a cache warmed by `db push`, and printed a spurious progress line. Both are fixed. The generated SQL was unaffected (a zero-migration catalog and the platform baseline are the same snapshot by Go's own logic) — this was a caching-efficiency and stderr-parity bug, not a correctness bug in the diff output. ## Why Part of the M9 "Go removal" milestone. This is the last piece of `legacy-pgdelta.seam.layer.ts`'s `exportCatalog` surface that doesn't need shadow-provisioning primitives from CLI-1956. ## Review notes Reviewed independently by go-parity-auditor, engineer-reviewer, and architect-reviewer (all approved after a follow-up commit). Findings addressed: - Added test coverage for the previously-untested dominant real-world path (`sync` with local migrations present, cache hit/miss, `--no-cache`), including the `Creating shadow database...` stderr-parity assertions — all verified load-bearing via mutation checks. - Extracted shared logic between the two new cache-key/path-resolution helpers and fixed a parameter-order inconsistency between sibling functions that could have caused a silent, permanent cache miss. - Exported `LegacyBaselineTomlConfig` (was duplicated as an inline structural type) and corrected the module header, which had gone stale (the file now also owns shadow-provisioning orchestration, not just pure cache-key derivation). Fixes CLI-1959
#6075) ## What Deletes `internal/start` (Go's `supabase start` implementation, 1,509 LOC) outright, rather than only excluding it from the bundled/release `supabase-go` binary via a build tag (the approach this PR originally took). ## Why the revised approach The original build-tag version kept `apps/cli-go/internal/start/` intact in-tree as "the migration's parity oracle," reasoning that the source might still be useful as a reference even though it doesn't ship. Re-examined under a stricter lens: keeping dead code around as a parity oracle only makes sense if it could ever again be read as a reference for porting something. It can't here — nothing in the TypeScript CLI will ever delegate to it, and nothing else Go-side that's still reachable calls into it either. That's not a parity oracle, it's dead weight, and this milestone's charter is removing Go, not archiving it. Verified both reachability paths, not just "does the bundled binary need it": 1. **Direct TS→Go delegation** — grepped the TS codebase for anything that shells out to Go's `start` command. Confirmed (per the issue's own claim) that native TS `start` talks to Docker directly and never invokes Go's `start`. The one place a stale comment suggested otherwise (`legacy-pgdelta.seam.service.ts`'s `ensureLocalDatabaseStarted` doc, which said it "starts the stack via the bundled `supabase-go start`") was checked against the actual implementation and against Go's own `cmd/db_schema_declarative.go` — both actually use `supabase-go db start` → `internal/db/start`, a separate, still-live package. The comment was simply wrong; fixed in this PR. 2. **Indirect reachability** — checked every other TS→Go delegation seam still alive in this milestone (per `docs/go-cli-porting-status.md` and Linear CLI-1970's own "expected alive set": `db diff --use-pgadmin`/`--use-pg-schema`, `db pull --experimental`, the `db branch`/`db remote`/`gen keys` proxies, `db test`, the hidden `db __db-bootstrap`/`__shadow`/`__catalog` seams) against a repo-wide `grep -rn "github.com/supabase/cli/internal/start" apps/cli-go --include="*.go"`. The **only** hit anywhere in the module was `cmd/start_full.go`'s own import — now deleted along with it. 3. `cmd/start.go`'s tag-neutral cobra registration never imported `internal/start` — it only duplicated the `excludableContainers()` helper for the flag's help text, confirming the registration is genuinely just flags/cobra wiring. 4. `internal/start`'s own tests (`start_test.go`) only import broadly-shared test infra (`apitest`, `pgtest`, `pkg/config`, etc.) that's used elsewhere too, so deleting them orphans nothing. ## What changed - Deleted `apps/cli-go/internal/start/` (source, tests, embedded templates) and the now-pointless `cmd/start_full.go`/`cmd/start_bundled.go` split. `cmd/start.go`'s `RunE` is now a single, permanent stub with the same behavior the bundled build's stub already had (same error text, same `--help`/`__complete` surface). `cmd/start_test.go` pins the stub's exact error text and the command/flag surface, since the CI job that used to verify this against a real binary is gone. - `go mod tidy` drops the entire exclusive dependency tree (docker-compose/v2, buildx, moby/buildkit, k8s client-go + friends, aws-sdk-go-v2 + friends, notary, secret-detector) — each confirmed exclusive to `internal/start` via `go mod why` before removal. `docker/cli` (and its own transitive deps) stay, correctly, because `internal/utils` has its own independent, direct import of `docker/cli/cli/command`. - Removed `cli-go-ci.yml`'s `Start` job entirely rather than rescoping it — rescoping only made sense when a "full" build with a real `internal/start` implementation still existed to run `./main start` against; once it's deleted, nothing in that job can function. Deleted the now-orphaned `apps/cli-go/e2e-test.sh` + `apps/cli-go/tests/` fixtures it alone used. Added back a lightweight `go list -deps` guard so a future accidental import of the heavy orchestration tree gets caught immediately rather than silently regrowing the binary. - Removed the now-meaningless `-tags bundled` flag from `apps/cli/scripts/build.ts` and `tools/release/local-release.ts` — there is no remaining `//go:build bundled` constraint anywhere in the module, so both files are now byte-identical to pre-milestone `develop`. - Fixed a real functional break the deletion surfaced: `shared/functions/serve-main-offline.e2e.test.ts` read `internal/start/templates/kong.yml` straight off disk at test runtime; repointed to the existing TS transcription (`LEGACY_START_KONG_YML_TEMPLATE`), verified byte-identical to the deleted Go template and passing. - Repointed stale `apps/cli-go/internal/start/...` provenance comments across the TS tree to the last commit where the file existed (`a253ccba25c21356ccd33044c4474aecb77d1ae4`), and removed a `test.todo("parity: start")` in `apps/cli-e2e` that could never be fulfilled once no Go implementation was left to diff TS's behavior against. - Updated `docs/binary-distribution.md`, `docs/go-cli-porting-status.md`, and `apps/cli/AGENTS.md` to describe `internal/start` as removed rather than excluded from the bundle. ## Measured size impact Rebuilt the simplified (single-implementation, no tags) binary with the exact release flags for every target and compared against the numbers this PR previously measured for the tagged/bundled build: | Target | Previous "after" (tagged) | This PR's build (deleted) | Delta | |---|---|---|---| | darwin/arm64 | 48,735,282 | 48,735,282 | 0 | | darwin/amd64 | 51,880,688 | 51,880,688 | 0 | | linux/arm64 | 47,448,226 | 47,448,226 | 0 | | linux/amd64 | 50,852,002 | 50,852,002 | 0 | | windows/amd64 | 51,985,408 | 51,985,408 | 0 | | windows/arm64 | 47,868,928 | 47,869,440 | +512 | Byte-for-byte identical (within noise from source-layout changes on windows/arm64). This is expected: deleting the package outright and excluding it via a build tag produce the same compiled bytes — the size win was already fully realized by the previous commit; this change is about deleting genuinely dead source, not further shrinking the binary. The full before/after-this-milestone comparison (97–103 MB → ~47–52 MB per platform, ~50% reduction) is unchanged from the original PR description. ## Review Independently reviewed by go-parity-auditor, engineer-reviewer, and architect-reviewer against the full revised diff. All three confirmed the reachability analysis holds (re-derived independently, including rebuilding and diffing the binary's `--help`/`__complete`/`completion` output against the pre-deletion build). Convergent and individual findings were fixed: `cmd/start_test.go` now isolates the shared `utils.CmdSuggestion` global and asserts the cobra/flag surface; two stale mirror-workflow comments that referenced the now-removed `Start` job were updated; a stale "validation is kept" claim in `cmd/start.go` was corrected (validation moved to the TS port); write-only package globals in `cmd/start.go` were cleaned up; a docs claim about `apps/cli-go` being unconditionally authoritative was qualified for this one exception; and a new fast-tier unit test (`cli-go-path-references.unit.test.ts`) now guards every `new URL(".../cli-go/...")` literal in the TS tree against exactly the kind of silent breakage this PR found and fixed. Linear: [CLI-1966](https://linear.app/supabase/issue/CLI-1966/cut-internalstart-from-the-bundled-go-build-42-mb-per-platform)
## What changed Ports `db test` (a hidden, Phase-0 Go-proxy command) and its `test db` alias to native TypeScript. Go registers the same `RunE` function under two cobra commands (`cmd/db.go:422-429` hidden, `cmd/test.go:17-20` visible) with byte-identical flags (`--db-url`, `--linked`, `--local` — default `true` on both). This PR mirrors that structure: hoisted the shared implementation (handler, errors, pg-prove-args, a new command-handler, and runtime layers) into `apps/cli/src/legacy/shared/legacy-test-db.*`, with both `db/test/test.command.ts` and `test/db/db.command.ts` reduced to thin registrations differing only in their `commandPath` (needed for Go-parity telemetry, since `cmd.CommandPath()` differs even though `RunE` is identical). The underlying pgTAP-enable/pg_prove-container-invocation logic itself was already natively correct from a prior PR (#5522) — this PR is primarily a rewire (removing the `db test` proxy handler), not a re-port. Confirmed via go-parity-auditor: bind-mount/workingDir derivation, network-mode switching, Bitbucket `SecurityOpt` handling, Linux-only `ExtraHosts`, and exit-code propagation (`error running container: exit N`) all already matched Go. This also resolves the audit's previously-flagged "`--local` default-true modelling caveat" — confirmed the resolved default is `true` on both entry points, matching Go exactly. **Bonus, undisclosed-until-now parity fix:** `test db`'s help text previously read "Run pgTAP tests on the local or linked database." — Go's actual `Short` (shared via `dbTestCmd.Short`) is "Tests local database with pgTAP". Both entry points now byte-match. ## Why Part of the M9 "Go removal" milestone. Removes the `LegacyGoProxy` dependency for `db test`/`test db` entirely. ## Review notes Reviewed independently by go-parity-auditor, engineer-reviewer, and architect-reviewer — all approved after a follow-up commit. The engineer-reviewer caught (via mutation testing) that one new test didn't actually exercise the real command wiring and another assertion was vacuous; both are now fixed and mutation-verified. Also fixed: two stale Go line-number references in carried-over comments, a stale doc pointer in `docs/go-cli-porting-status.md`, and single-sourced the Short/description strings between the two command registrations to prevent future drift. Fixes CLI-1962
There was a problem hiding this comment.
💡 Codex Review
cli/apps/cli/src/shared/cli/cobra-flag-groups.ts
Lines 20 to 24 in c765afc
When a value-taking deploy flag is followed by a flag-shaped token, this scan still treats that token as an explicit boolean flag instead of as the previous flag's value. For example, functions deploy hello --import-map --use-docker is parsed by pflag as --import-map having the value --use-docker (pflag documents non-boolean flags as accepting --flag x and only an unconsumed -- terminates parsing), so Go does not set use-docker; here explicitUseDocker becomes true and can switch deploy mode or override options such as --no-verify-jwt rather than matching the Go CLI request/side-effect shape. Use the pflag-aware scanner/value-flag registry for these explicit flag checks.
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| } | ||
| if (token === `--${flagName}`) { | ||
| const next = rawArgs[index + 1]; | ||
| if (next !== undefined && next !== "--") { |
There was a problem hiding this comment.
Treat -- as a consumed profile value
When --profile is followed by --, pflag treats that terminator token as the string flag value, but this guard ignores the occurrence as if the flag were missing. For invocations that route with a consumed terminator, Go tries to load the explicit profile token -- and fails before using env/default credentials, while this falls through to SUPABASE_PROFILE, the profile file, or supabase, so legacy commands can target the wrong API host or persist the wrong profile instead of matching the Go side-effect shape.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
| } | ||
| if (token === `--${flagName}`) { | ||
| const next = rawArgs[index + 1]; | ||
| if (next !== undefined && next !== "--") { |
There was a problem hiding this comment.
Treat -- as a consumed profile value
When --profile is followed by --, pflag treats that terminator token as the string flag value, but this guard ignores the occurrence as if the flag were missing. For invocations that route with a consumed terminator, Go tries to load the explicit profile token -- and fails before using env/default credentials, while this falls through to SUPABASE_PROFILE, the profile file, or supabase, so legacy commands can target the wrong API host or persist the wrong profile instead of matching the Go side-effect shape.
Useful? React with 👍 / 👎.
| if (/^[+-]?\d+$/.test(value)) { | ||
| const asBigInt = BigInt(value.replace(/^\+/, "")); | ||
| if (asBigInt >= INT64_MIN && asBigInt <= INT64_MAX) { | ||
| return Number.parseInt(value, 10); |
There was a problem hiding this comment.
Preserve int64 config values in update payloads
When a postgres-config update --config key=<digits> value is between Number.MAX_SAFE_INTEGER and Go's int64 limit, this branch still converts it to a JS Number, and putPostgresConfig later serializes that rounded value with JSON.stringify. Go's strconv.Atoi preserves the exact int64 token in the request body, so inputs such as --config max_slot_wal_keep_size=9007199254740993 now PUT 9007199254740992 instead of the user's value; keep these values as an exact/raw JSON integer or leave them out of the numeric branch.
Useful? React with 👍 / 👎.
| const relPath = path.relative(basePath, absPath); | ||
| const dest = path.join(destPath, relPath); | ||
|
|
||
| const resolvedDest = path.resolve(dest); |
There was a problem hiding this comment.
🟡 Severity: MEDIUM
path.resolve() is a lexical normalization — it does not resolve symlinks. The subsequent Deno.mkdir and Deno.writeTextFile calls (in write()) DO follow symlinks. A symlink pre-planted inside destPath or rootPath could redirect writes outside the containment boundary, bypassing this check.
Helpful? Add 👍 / 👎
💡 Fix Suggestion
Suggestion: This requires three coordinated changes to fully close the symlink-bypass attack surface, mirroring the patterns already implemented in the Go extractor at apps/cli-go/internal/functions/download/download.go:
- Add a
realPathSafehelper (aboveextractEszip) that mirrors Go'sresolveExistingPath: walk up the path to the deepest existing ancestor, resolve symlinks viaDeno.realPath()on that ancestor, then re-join the still-nonexistent suffix. A non-existing path component cannot itself be a symlink, so only the existing portion needs symlink resolution:
async function realPathSafe(p: string): Promise<string> {
let existing = p;
const suffix: string[] = [];
while (true) {
try {
await Deno.stat(existing);
break;
} catch (e) {
if (!(e instanceof Deno.errors.NotFound)) throw e;
}
const parent = path.dirname(existing);
if (parent === existing) return path.join(existing, ...suffix);
suffix.unshift(path.basename(existing));
existing = parent;
}
return path.join(await Deno.realPath(existing), ...suffix);
}-
Line 31: Replace
const resolvedRoot = path.resolve(rootPath);withconst resolvedRoot = await Deno.realPath(rootPath);—rootPathalways exists at call time, soDeno.realPathworks directly and fully resolves any symlinks in the root anchor. -
Line 43: Replace
const resolvedDest = path.resolve(dest);withconst resolvedDest = await realPathSafe(dest);— this uses the helper above to resolve symlinks in the existing portion ofdest's path. -
Lines 5-7 (
write()): Harden the write sink itself by mirroring Go'swriteFileNoFollowSymlinkpattern — write to a randomly-named temp file with exclusive creation (O_EXCLvia{ createNew: true }), then atomically rename it onto the destination.Deno.renamereplaces the directory entry (including a symlink) rather than dereferencing it, preventing a TOCTOU window between the containment check and the actual write:
async function write(p: string, content: string) {
const dir = path.dirname(p);
await Deno.mkdir(dir, { recursive: true });
const tmp = path.join(dir, `.supabase-tmp-${crypto.randomUUID()}`);
try {
await Deno.writeTextFile(tmp, content, { createNew: true });
await Deno.rename(tmp, p);
} catch (e) {
await Deno.remove(tmp).catch(() => {});
throw e;
}
}…6022) ## What changed `supabase db start` delegated its container-bootstrap step to the bundled Go binary via a hidden `db __db-bootstrap --mode start` seam. Ports this to native TS, including the `--from-backup` restore path (a distinct entrypoint variant, backup bind mount, health-check swallow, and full setup-skip gate) — which had zero Go test coverage to check against, so this was verified empirically by executing the real Go binary and diffing its container-create payload byte-for-byte against the TS output, rather than relying on reading source alone. **Avoided duplicating Go's `StartDatabase`.** Go has exactly one `StartDatabase` function, called by both `db start` and top-level `supabase start`. Rather than porting a second independent copy of that sequence (the initial draft did exactly this — caught by review before merging), extracted a shared `legacyStartDatabase` into `legacy/shared/db-bootstrap/` that both commands now call, along with the rest of the container-lifecycle/health-check/db-setup/postgres-spec machinery `supabase start` already had — hoisted per this repo's "Hoist Before You Duplicate" rule now that a second command family needs it. Also: - Hoisted the already-native `isDbRunning` probe out of the Go-proxy-named seam service (it's zero-Go-involvement, a plain `docker container inspect`) — `db start` now composes no Go delegation at all. - Removed the now-unreachable `case "start"` dispatch arm from the Go-side hidden seam (`apps/cli-go/cmd/db.go`). The real, customer-facing `db start` Go command and `StartDatabase` itself are untouched and remain the parity oracle for this port. ## Why Part of the M9 "Final Cleanup — Go Removal" milestone. ## Known follow-up (flagged, not silently dropped) - `legacyStartSetupLocalDatabase` will need `{version, noSeed, sqlPaths}` params for CLI-1955 (`db reset --local`) to reuse it for the recreate path. - The `db-bootstrap/` directory currently holds some stack-wide container generics (docker args, container lifecycle, health check, image prepull) alongside genuinely Postgres-specific code — worth a naming/split pass before more callers land. - A live test (`start.live.test.ts`) covering `--from-backup` against real Docker would add CI-repeatable confidence beyond this PR's manual verification and string-level assertions. - **This eager config-validation battery in `start.handler.ts` is a manually-maintained, field-by-field list with no exhaustiveness check against Go's `Config` struct** — every sibling fix landed in this PR so far (`auth.hook`, `auth.email.smtp`, `api.auto_expose_new_tables`, `storage.image_transformation`, `studio.api_url`, `local_smtp.enabled`/`.port`, and now `db.ssl_enforcement`/`experimental.webhooks` in this round) was Codex catching one more missing presence-backed or enum-decoded field, one review pass at a time. There's no mechanism (a codegen check, a struct-diff test against `apps/cli-go/pkg/config`) that would catch the NEXT missing field before a reviewer does — this round's audit cross-checked every top-level `Config` section, every pointer-typed (presence-gated) field, and every `UnmarshalText` enum in `apps/cli-go/pkg/config/*.go` against this battery and found no further gaps, but that's a snapshot, not a guarantee against future Go-side config additions. A follow-up worth doing on its own: either a small generator/test that walks the Go struct tags and asserts every viper-bound leaf has a corresponding eager check here, or (better, since D's `legacyReadDbToml` already runs unconditionally before this battery) moving more of these presence-gated decodes into D so they're covered once for every D caller instead of being re-added one field at a time in `db start` specifically — same shape as the `experimental.webhooks` fix in this round. ## Addressed in review - **pg-delta migrations-catalog warmup**: `legacyStartSetupLocalDatabase` now calls the already-ported `legacyTryCacheMigrationsCatalog` (the same function `db push` uses) right after migrate+seed, gated on `toml.pgDelta.enabled`/`SUPABASE_EXPERIMENTAL_PG_DELTA`, matching Go's `pgcache.TryCacheMigrationsCatalog` (`start.go:371-379`) exactly. `start.command.ts` and `db/start/start.layers.ts` now compose `legacyEdgeRuntimeScriptLayer`/`legacyPgDeltaSslProbeLayer`. - **Remote Docker daemon support**: `legacyStartContainer`'s `secretFiles` delivery (pgsodium root key, Kong/Supavisor TLS material) switched from a host bind-mount to `docker create` → `docker cp` → `docker start`, matching how Go's own `db start` delivers this secret (heredoc'd into the container's entrypoint, never a host path). Fixes `db start`/`supabase start` against a `DOCKER_HOST`/remote-context daemon.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1e4ea826cd
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| anonymous_users: legacyEnvOverrideUint( | ||
| "SUPABASE_AUTH_RATE_LIMIT_ANONYMOUS_USERS", | ||
| "auth.rate_limit.anonymous_users", | ||
| rateLimit.anonymous_users, |
There was a problem hiding this comment.
Preserve large rate-limit uint overrides
When supabase start/db start receives a SUPABASE_AUTH_RATE_LIMIT_* override above Number.MAX_SAFE_INTEGER but within Go's uint64 range, for example SUPABASE_AUTH_RATE_LIMIT_SMS_SENT=18446744073709551615, this new resolver accepts it through legacyEnvOverrideUint and returns a JS Number; gotrue.service.ts later stringifies the rounded value into GOTRUE_RATE_LIMIT_*. The Go CLI keeps the exact uint token through config loading, so the port starts GoTrue with a different value (and for max uint64, an out-of-range one) instead of matching Go behavior; keep these overrides exact as strings/BigInts or reject unsafe values before emitting container env.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
| const started = yield* Effect.gen(function* () { | ||
| const service = yield* requireKnownServiceName(name); | ||
| const runtime = yield* ensureRuntime; | ||
| yield* runtime.orchestrator.restartService(service, serviceStartOptions); |
There was a problem hiding this comment.
Restart owned companion services too
When restarting a service with owned companions, e.g. restartService("storage") or restartService("analytics"), this only restarts the public service and waits for that one target. The activation policy marks imgproxy/vector as exclusively owned by those services and stopService already stops lifecycleTargetsForService(...), so a restart leaves the companion process running with its old state/config while a stop+start cycle would replace it; restart the same lifecycle target set and wait on all targets.
Useful? React with 👍 / 👎.
## Summary Health-check failures before first readiness were not reported, and exhausted unhealthy restart budgets left services non-terminal with stale process metadata. Hook failures could also publish `Failed` while their child remained active. This change centralizes restart decisions, separates startup and liveness thresholds, and makes supervisory health termination explicit. Terminal states clear the PID, health exhaustion retains no fabricated exit code, and hook failures finalize their child before state publication. Stack services now use explicit cold-start budgets. State contracts are covered through raw orchestration, stack projection, daemon transport, and dashboard fixtures, with cold-start coverage for PostgreSQL, Edge Runtime, and Analytics. This PR is stacked on #6078, which provides the architecture documentation baseline.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 54934f4ac8
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if (result._tag === "UnhealthyRestart") { | ||
| // The previous process scope has closed, so external resources can | ||
| // be reserved safely for the duration of this restart's backoff. | ||
| yield* prepareStart(); |
There was a problem hiding this comment.
Release restart reservations if backoff is interrupted
When a service enters the restart loop, beforeStart reserves its ports here before the backoff sleep, but beforeSpawn is the only per-service release (StackLifecycleCoordinator wires beforeStart to portLease.reserve(...) and beforeSpawn to portLease.release(...)). If the service is stopped or the stack API interrupts this fiber during the sleep, spawning never happens and the reservation stays bound until full stack disposal, so later lazy starts can fail with the port still unavailable; reserve at the spawn boundary or ensure this reservation is released on interruption.
Useful? React with 👍 / 👎.
| const CREATE_INDEX_CONCURRENTLY_PATTERN = /^CREATE\s+(?:UNIQUE\s+)?INDEX\s+CONCURRENTLY(?:\s|$)/u; | ||
| const REINDEX_CONCURRENTLY_PATTERN = /^REINDEX(?:\s|\().*\sCONCURRENTLY(?:\s|$)/u; | ||
| const VACUUM_PATTERN = /^VACUUM(?:\s|\(|$)/u; |
There was a problem hiding this comment.
Split database DDL out of migration batches
When a migration first contains a statement now run standalone, such as CREATE INDEX CONCURRENTLY, and then later runs CREATE DATABASE or DROP DATABASE, those database statements are still left in the following transaction batch. PostgreSQL documents that both CREATE DATABASE and DROP DATABASE cannot execute inside a transaction block, so db push/db reset can commit the earlier standalone work and then fail before the migration-history row is inserted; include these statements in the pipeline-incompatible split too.
Useful? React with 👍 / 👎.
## Summary - establish an exhaustive static service catalog for identity, versions, artifacts, activation policy, and port ownership - move public and resolved configuration types into a focused module and isolate configuration resolution from the Promise facade - define explicit finite, infinite, and inherited readiness policies with deterministic precedence - route artifact preparation through one canonical resolution path while keeping cross-service topology explicit in the stack builder - update package documentation and version-sync tooling for the new ownership boundaries This change is stacked on #6078 and should be reviewed after it.
## Summary - Generalize detached orphan cleanup to validated, shell-free command and path actions. - Make lifecycle transition classification event-exhaustive and move ordered restart closure traversal into a pure module. - Remove confirmed dead error and log-buffer surface while documenting the supervisor entry and one-shot polling contracts. ## Why The process supervisor should remain domain-neutral and keep policy decisions independently testable without changing the lifecycle semantics established by the preceding work. Depends on #6080 and transitively on #6078.
## What changed - replaces the duplicate lifecycle coordinator tag and pass-through facade with one scoped local stack implementation that provides both the public stack and narrow activation interfaces - centralizes readiness policy enforcement across startup, activation, lifecycle operations, explicit waits, Promise calls, and daemon transport - adds typed readiness deadline failures with terminal scoped cleanup and daemon shutdown - validates readiness overrides over POST transport and documents the shared foreground/detached behavior - removes dead cleanup-query surface and uses structural Effect equality for projected state deduplication ## Why Lifecycle state previously had redundant interface layers and readiness deadlines were enforced only by the Promise adapter. Keeping policy and cleanup inside the single runtime owner makes every adapter observe the same semantics and prevents a timed-out runtime from relaunching resources after cleanup. Depends on #6081 and #6080 (and transitively #6078).
There was a problem hiding this comment.
💡 Codex Review
cli/apps/cli/src/legacy/shared/legacy-seed-ops.ts
Lines 177 to 181 in 223fa14
When db.seed.sql_paths matches a directory containing a symlinked .sql file or a symlinked subdirectory, this fs.stat follows the link and treats the target as a regular file/directory, so db push --include-seed can apply seed SQL that Go's Glob.SQLFiles skips (fs.WalkDir uses the non-followed DirEntry.Type().IsRegular() check). Use a non-following readLink/lstat-style guard like the shared legacyWalkSqlFiles helper before recursing or collecting .sql files, or directory seeds can mutate data differently from the Go CLI.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| const cliArgs = yield* Effect.serviceOption(CliArgs); | ||
| const explicitProfileFlag = Option.match(cliArgs, { | ||
| onNone: () => undefined, | ||
| onSome: ({ args }) => lastExplicitLongFlagValue(args, [], "profile"), |
There was a problem hiding this comment.
Skip value-consumed profile tokens
When a value-taking command flag precedes --profile, e.g. db pull --password --profile supabase-local, pflag consumes the raw --profile token as the password value, so the persistent profile flag is not changed and Go falls back to env/file/default. This scan has no knowledge of those consuming flags and still treats the following supabase-local as an explicit profile, so the config layer can load credentials and API URLs for a profile the Go CLI would never use for commands without later pflag reconciliation, such as db pull. Use the same pflag-aware argv scan/consumed-token handling here before resolving LegacyCliConfig.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
| // PRRT_kwDOErm0O86VlqIL; see {@link legacyResolveNetworkId}'s doc comment for why this is NOT | ||
| // the same freeze-at-package-init shape as `utils.Config.Hostname`). | ||
| const networkId = legacyResolveNetworkId( | ||
| Option.getOrUndefined(networkIdFlag), |
There was a problem hiding this comment.
Reconcile network-id before db start
When db start is invoked with a bare value-taking flag before --network-id, for example db start --from-backup --network-id custom-net, pflag consumes the raw --network-id token as the --from-backup value and leaves the persistent network flag unset, so Go attempts the restore path and uses the generated/env network. The Effect parser does not consume flag-shaped values, so this parsed networkIdFlag becomes custom-net while fromBackup is unset, causing the native path to skip the restore and start containers on a network Go would not use; derive networkId from a pflag-aware argv scan (and likewise discard consumed occurrences) before calling legacyStartDatabase.
AGENTS.md reference: apps/cli/AGENTS.md:L247-L257
Useful? React with 👍 / 👎.
…te (#6106) Bumps the go-minor group with 1 update in the /apps/cli-go directory: [google.golang.org/grpc](https://github.com/grpc/grpc-go). Bumps the go-minor group with 1 update in the /apps/cli-go/pkg directory: [google.golang.org/grpc](https://github.com/grpc/grpc-go). Updates `google.golang.org/grpc` from 1.82.1 to 1.83.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/grpc/grpc-go/releases">google.golang.org/grpc's releases</a>.</em></p> <blockquote> <h2>Release 1.83.0</h2> <h1>Security</h1> <ul> <li>server: Stop reading from connections when flooded by HTTP/2 frames to mitigate resource exhaustion. The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable <code>GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT</code>.</li> <li>xds/rbac: Support <code>Metadata</code> and <code>RequestedServerName</code> permissions matcher fields. If present in a DENY rule, previously these would be ignored and fail-open.</li> <li>xds/rbac: Fix panic when parsing unsupported fields in <code>NotRule</code>/<code>NotId</code> permissions.</li> <li>xds/rbac: Support the deprecated <code>source_ip</code> principal identifier by treating it as equivalent to <code>direct_remote_ip</code>.</li> <li>xds: Fix panic when parsing route header matchers configured with empty <code>exact_match</code>, <code>prefix_match</code>, or <code>suffix_match</code> strings. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9223">#9223</a>)</li> </ul> <h1>New Features</h1> <ul> <li>xds/googlec2p: Enable DirectPath over Interconnect support for on-premises clients via the <code>force-xds</code> target URI query parameter. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9133">#9133</a>)</li> <li>xds: Enable xDS configuration to control which fields get propagated from ORCA backend metric reports to LRS load reports. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9145">#9145</a>)</li> <li>authz: Add <code>OnPolicyUpdate</code> callback to <code>FileWatcherOptions</code> to notify when an authz policy is loaded or updated. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9142">#9142</a>) <ul> <li>Special Thanks: <a href="https://github.com/hnefatl"><code>@hnefatl</code></a></li> </ul> </li> <li>xds: Add support for the GCP Authentication HTTP Filter, which automatically fetches and attaches GCP Service Account Identity JWT tokens to outgoing RPCs. <ul> <li>This feature can be enabled by setting environment variable <code>GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER=true</code>. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9119">#9119</a>)</li> </ul> </li> <li>xds: Add support for xDS-based HTTP CONNECT proxies. <ul> <li>This feature can be enabled by setting environment variable <code>GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT=true</code>. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9151">#9151</a>)</li> </ul> </li> <li>xds: Add support for <code>contains_match</code> in route header matchers. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9223">#9223</a>)</li> </ul> <h1>Bug Fixes</h1> <ul> <li>credentials/alts: Fix panic when processing malformed frames by validating that the message frame length exceeds the message type field size. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9197">#9197</a>)</li> <li>grpc: Fix compilation on Plan 9 targets (<code>GOOS=plan9</code>), broken since v1.81.0. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9255">#9255</a>) <ul> <li>Special Thanks: <a href="https://github.com/Yusufihsangorgel"><code>@Yusufihsangorgel</code></a></li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/grpc/grpc-go/commit/4c226daff88f54441d70f710815e07b81fb162b2"><code>4c226da</code></a> Change version to 1.83.0 (<a href="https://redirect.github.com/grpc/grpc-go/issues/9228">#9228</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/c198988aa9297cb9428c7afaaee4363d0082b838"><code>c198988</code></a> Cherrypick 9223 into v1.83.x (<a href="https://redirect.github.com/grpc/grpc-go/issues/9279">#9279</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/8ce3ebf24af3c206bacf279adcf9c3a88981df68"><code>8ce3ebf</code></a> Cherrypick PR 9255 into v1.83.x (<a href="https://redirect.github.com/grpc/grpc-go/issues/9263">#9263</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/e39384978cf59c70634f900a7aa93d7483886696"><code>e393849</code></a> Cherry-pick recent changes from master (<a href="https://redirect.github.com/grpc/grpc-go/issues/9240">#9240</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/2a112a82f5c53ab3b89b5aa4a02b4195e2706879"><code>2a112a8</code></a> authz: add onPolicyUpdate callback to authz file watcher (<a href="https://redirect.github.com/grpc/grpc-go/issues/9142">#9142</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/1a80fca960d39ae4d7d6f2d9323ca2d243fd44bb"><code>1a80fca</code></a> vet: adds a check to disallow usage of regex.Compile in xDS code (<a href="https://redirect.github.com/grpc/grpc-go/issues/9216">#9216</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/26ffdb33175d6fb4e56bcb598fb1a56162397091"><code>26ffdb3</code></a> [tls] Add safety check in custom cert verification that peer cert chain is no...</li> <li><a href="https://github.com/grpc/grpc-go/commit/50139749cb5bc50dd672689549340fceac494c1b"><code>5013974</code></a> internal/grpcsync: add ScheduleAndWait to CallbackSerializer (<a href="https://redirect.github.com/grpc/grpc-go/issues/9162">#9162</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/bd58bc07c4bc552859f758594a6605b5b27cd041"><code>bd58bc0</code></a> internal/transport: increase test timeout locally in TestAccountCheckWindowSi...</li> <li><a href="https://github.com/grpc/grpc-go/commit/484f1502aea22dbf8dc54df9aff26214b9c35e1a"><code>484f150</code></a> httpfilter/extproc: add check to ensure that response trailer mode must be SE...</li> <li>Additional commits viewable in <a href="https://github.com/grpc/grpc-go/compare/v1.82.1...v1.83.0">compare view</a></li> </ul> </details> <br /> Updates `google.golang.org/grpc` from 1.82.1 to 1.83.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/grpc/grpc-go/releases">google.golang.org/grpc's releases</a>.</em></p> <blockquote> <h2>Release 1.83.0</h2> <h1>Security</h1> <ul> <li>server: Stop reading from connections when flooded by HTTP/2 frames to mitigate resource exhaustion. The default value for this limit is 100 frames, excluding DATA and HEADERS, and may be changed by setting environment variable <code>GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT</code>.</li> <li>xds/rbac: Support <code>Metadata</code> and <code>RequestedServerName</code> permissions matcher fields. If present in a DENY rule, previously these would be ignored and fail-open.</li> <li>xds/rbac: Fix panic when parsing unsupported fields in <code>NotRule</code>/<code>NotId</code> permissions.</li> <li>xds/rbac: Support the deprecated <code>source_ip</code> principal identifier by treating it as equivalent to <code>direct_remote_ip</code>.</li> <li>xds: Fix panic when parsing route header matchers configured with empty <code>exact_match</code>, <code>prefix_match</code>, or <code>suffix_match</code> strings. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9223">#9223</a>)</li> </ul> <h1>New Features</h1> <ul> <li>xds/googlec2p: Enable DirectPath over Interconnect support for on-premises clients via the <code>force-xds</code> target URI query parameter. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9133">#9133</a>)</li> <li>xds: Enable xDS configuration to control which fields get propagated from ORCA backend metric reports to LRS load reports. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9145">#9145</a>)</li> <li>authz: Add <code>OnPolicyUpdate</code> callback to <code>FileWatcherOptions</code> to notify when an authz policy is loaded or updated. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9142">#9142</a>) <ul> <li>Special Thanks: <a href="https://github.com/hnefatl"><code>@hnefatl</code></a></li> </ul> </li> <li>xds: Add support for the GCP Authentication HTTP Filter, which automatically fetches and attaches GCP Service Account Identity JWT tokens to outgoing RPCs. <ul> <li>This feature can be enabled by setting environment variable <code>GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER=true</code>. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9119">#9119</a>)</li> </ul> </li> <li>xds: Add support for xDS-based HTTP CONNECT proxies. <ul> <li>This feature can be enabled by setting environment variable <code>GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT=true</code>. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9151">#9151</a>)</li> </ul> </li> <li>xds: Add support for <code>contains_match</code> in route header matchers. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9223">#9223</a>)</li> </ul> <h1>Bug Fixes</h1> <ul> <li>credentials/alts: Fix panic when processing malformed frames by validating that the message frame length exceeds the message type field size. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9197">#9197</a>)</li> <li>grpc: Fix compilation on Plan 9 targets (<code>GOOS=plan9</code>), broken since v1.81.0. (<a href="https://redirect.github.com/grpc/grpc-go/issues/9255">#9255</a>) <ul> <li>Special Thanks: <a href="https://github.com/Yusufihsangorgel"><code>@Yusufihsangorgel</code></a></li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/grpc/grpc-go/commit/4c226daff88f54441d70f710815e07b81fb162b2"><code>4c226da</code></a> Change version to 1.83.0 (<a href="https://redirect.github.com/grpc/grpc-go/issues/9228">#9228</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/c198988aa9297cb9428c7afaaee4363d0082b838"><code>c198988</code></a> Cherrypick 9223 into v1.83.x (<a href="https://redirect.github.com/grpc/grpc-go/issues/9279">#9279</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/8ce3ebf24af3c206bacf279adcf9c3a88981df68"><code>8ce3ebf</code></a> Cherrypick PR 9255 into v1.83.x (<a href="https://redirect.github.com/grpc/grpc-go/issues/9263">#9263</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/e39384978cf59c70634f900a7aa93d7483886696"><code>e393849</code></a> Cherry-pick recent changes from master (<a href="https://redirect.github.com/grpc/grpc-go/issues/9240">#9240</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/2a112a82f5c53ab3b89b5aa4a02b4195e2706879"><code>2a112a8</code></a> authz: add onPolicyUpdate callback to authz file watcher (<a href="https://redirect.github.com/grpc/grpc-go/issues/9142">#9142</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/1a80fca960d39ae4d7d6f2d9323ca2d243fd44bb"><code>1a80fca</code></a> vet: adds a check to disallow usage of regex.Compile in xDS code (<a href="https://redirect.github.com/grpc/grpc-go/issues/9216">#9216</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/26ffdb33175d6fb4e56bcb598fb1a56162397091"><code>26ffdb3</code></a> [tls] Add safety check in custom cert verification that peer cert chain is no...</li> <li><a href="https://github.com/grpc/grpc-go/commit/50139749cb5bc50dd672689549340fceac494c1b"><code>5013974</code></a> internal/grpcsync: add ScheduleAndWait to CallbackSerializer (<a href="https://redirect.github.com/grpc/grpc-go/issues/9162">#9162</a>)</li> <li><a href="https://github.com/grpc/grpc-go/commit/bd58bc07c4bc552859f758594a6605b5b27cd041"><code>bd58bc0</code></a> internal/transport: increase test timeout locally in TestAccountCheckWindowSi...</li> <li><a href="https://github.com/grpc/grpc-go/commit/484f1502aea22dbf8dc54df9aff26214b9c35e1a"><code>484f150</code></a> httpfilter/extproc: add check to ensure that response trailer mode must be SE...</li> <li>Additional commits viewable in <a href="https://github.com/grpc/grpc-go/compare/v1.82.1...v1.83.0">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
When test db / db test receives --db-url in pflag's space-separated form with a flag-shaped value, such as test db --db-url --local or test db --db-url --, the raw scan correctly marks db-url as the selected target but this call still passes the Effect-parsed flags.dbUrl. Effect does not consume those tokens as the string value, so the resolver skips the direct-URL branch and runs against the local database instead of matching Go's parse/error path; feed the pflag-effective db-url value into the resolver here.
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| functions: `${apiUrl}/functions/v1`, | ||
| edge_runtime: `${apiUrl}/functions/v1`, | ||
| }), | ||
| ...(config.realtime === false ? {} : { realtime: `${apiUrl}/realtime/v1` }), |
There was a problem hiding this comment.
Preserve a WebSocket-capable Realtime endpoint
When callers use the advertised serviceEndpoints.realtime URL for subscriptions, it now points at the generic API proxy instead of the Realtime service port. The proxy only forwards normal HTTP requests and its Realtime route strips /realtime/v1 directly to the backend, so a client WebSocket path such as /realtime/v1/websocket is neither upgraded nor mapped to Realtime's /socket/websocket path; Realtime clients that previously used this endpoint will fail to subscribe. Keep advertising the direct Realtime port until the proxy handles the Kong-style WebSocket mapping.
Useful? React with 👍 / 👎.
| readiness.push(waitForTargets(started)); | ||
| } | ||
| yield* Effect.all(readiness, { concurrency: "unbounded", discard: true }).pipe( | ||
| (effect) => withReadinessPolicy(effect, "stack"), |
There was a problem hiding this comment.
Apply service activation budgets to lazy startup
When the next start path enables the default lazy stack with Studio/Analytics, stack.start() eagerly starts Studio's activation closure (Studio, Analytics, and Vector), but this outer wait still uses the generic 180s stack readiness policy. The service budgets added for lazy activation allow much longer cold starts (for example 554s for Analytics and 825s for Studio), so a slow but healthy Docker startup can hit this timeout, dispose the stack, and report failure before those services exhaust their own health budgets; pass a readiness budget based on the eager activation set instead of the default here.
Useful? React with 👍 / 👎.