Skip to content

chore: production deploy - #6056

Open
supabase-cli-releaser[bot] wants to merge 56 commits into
mainfrom
develop
Open

chore: production deploy#6056
supabase-cli-releaser[bot] wants to merge 56 commits into
mainfrom
develop

Conversation

@supabase-cli-releaser

Copy link
Copy Markdown
Contributor

7ttp and others added 19 commits July 31, 2026 13:08
## 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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/docker/go-connections&package-manager=go_modules&previous-version=0.7.0&new-version=0.8.0)](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.
@supabase-cli-releaser
supabase-cli-releaser Bot requested a review from a team as a code owner August 4, 2026 03:10
@supabase-cli-releaser supabase-cli-releaser Bot added the do not merge Approve to apply; do not merge. label Aug 4, 2026
Comment thread apps/cli/src/legacy/commands/sso/update/update.integration.test.ts Fixed
Comment thread apps/cli/src/legacy/commands/sso/update/update.integration.test.ts Fixed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/stack/src/BinaryResolver.ts Outdated
// 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));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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.
7ttp and others added 5 commits August 4, 2026 10:11
## 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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

supabase-cli-releaser Bot and others added 3 commits August 5, 2026 16:44
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>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

dependabot Bot and others added 11 commits August 6, 2026 00:13
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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/go-git/go-git/v5&package-manager=go_modules&previous-version=5.19.1&new-version=5.19.2)](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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

const token = rawArgs[index];
if (token === undefined || token === "--") {
return false;
}
if (token === `--${flagName}` || token.startsWith(`--${flagName}=`)) {

P2 Badge Skip consumed values when scanning deploy flags

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 !== "--") {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 !== "--") {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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:

  1. Add a realPathSafe helper (above extractEszip) that mirrors Go's resolveExistingPath: walk up the path to the deepest existing ancestor, resolve symlinks via Deno.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);
}
  1. Line 31: Replace const resolvedRoot = path.resolve(rootPath); with const resolvedRoot = await Deno.realPath(rootPath);rootPath always exists at call time, so Deno.realPath works directly and fully resolves any symlinks in the root anchor.

  2. Line 43: Replace const resolvedDest = path.resolve(dest); with const resolvedDest = await realPathSafe(dest); — this uses the helper above to resolve symlinks in the existing portion of dest's path.

  3. Lines 5-7 (write()): Harden the write sink itself by mirroring Go's writeFileNoFollowSymlink pattern — write to a randomly-named temp file with exclusive creation (O_EXCL via { createNew: true }), then atomically rename it onto the destination. Deno.rename replaces 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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +1713 to +1716
anonymous_users: legacyEnvOverrideUint(
"SUPABASE_AUTH_RATE_LIMIT_ANONYMOUS_USERS",
"auth.rate_limit.anonymous_users",
rateLimit.anonymous_users,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines 49 to 51
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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

jgoux added 3 commits August 6, 2026 14:26
## 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).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

const childType = yield* fs
.stat(path.isAbsolute(childRel) ? childRel : path.join(workdir, childRel))
.pipe(
Effect.map((info) => info.type),
Effect.orElseSucceed(() => "Unknown" as const),

P2 Badge Skip symlinked seed SQL files

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"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review


P2 Badge Use pflag db-url values when testing

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` }),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do not merge Approve to apply; do not merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants