Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
6d1ba06
docs(stack): document greenfield architecture
jgoux Sep 17, 2026
b0cab06
chore(stack): rebuild runtime and persistence primitives
jgoux Sep 18, 2026
e3f7d95
chore(stack): add service orchestration and network routing
jgoux Sep 18, 2026
6a52fde
chore(stack): define service recipes and Supabase composition
jgoux Sep 18, 2026
01434cd
chore(stack): replace supervisor with detached owner APIs
jgoux Sep 18, 2026
9ac6edb
test(stack): exercise complete native and docker lifecycles
jgoux Sep 18, 2026
6b1f60f
chore(stack): align catalog automation and stack path references
jgoux Sep 18, 2026
1da2d53
chore(stack): support compiled CLI process dispatch
jgoux Sep 18, 2026
e626bc0
chore(stack): add bundled pgProve tool
jgoux Sep 18, 2026
5c735ca
chore(cli): prepare typed stack integration boundaries
jgoux Sep 18, 2026
0ab6b91
chore(cli): migrate stack list to saved identities
jgoux Sep 19, 2026
487e37c
chore(cli): migrate stack stop to namespace shutdown
jgoux Sep 19, 2026
54b8e6a
chore(cli): migrate stack destroy to owned resources
jgoux Sep 19, 2026
80cc2d9
fix(stack): relaunch stopped owners with Bun fetch
jgoux Sep 19, 2026
bac6667
chore(cli): restart saved stack compositions
jgoux Sep 19, 2026
f413774
chore(cli): stream live stack service logs
jgoux Sep 19, 2026
35b898f
feat(stack): reuse stopped services across composition changes
jgoux Sep 19, 2026
a80d592
chore(stack): expose internal artifact preparation for CLI tools
jgoux Sep 19, 2026
76f1b05
chore(cli): migrate db start and local database resolution
jgoux Sep 19, 2026
d5170ed
chore(cli): observe managed stack status without launching services
jgoux Sep 19, 2026
b69ee73
chore(cli): reconcile stack start exclusions without replacing data
jgoux Sep 19, 2026
dabca01
chore(cli): prepare artifacts without configuring a composition
jgoux Sep 19, 2026
a2917f6
chore(cli): scope fresh shadow databases to their commands
jgoux Sep 19, 2026
5a0af1e
chore(cli): remove obsolete stack helper exports
jgoux Sep 19, 2026
53c50ac
chore(cli): migrate db diff to scoped stack shadows
jgoux Sep 19, 2026
6be627c
chore(cli): migrate db pull to scoped stack shadows
jgoux Sep 19, 2026
ffe92ce
test(cli): type stack startup fixtures and preserve legacy aliases
jgoux Sep 19, 2026
16be9db
test(cli): preserve the legacy pull alias after stack migration
jgoux Sep 19, 2026
45bf2c7
docs(cli): describe declarative generate stack targeting
jgoux Sep 19, 2026
df5634b
chore(cli): migrate declarative sync stack fixtures and guidance
jgoux Sep 19, 2026
231e239
chore(cli): run external PostgreSQL tools through CLI adapters
jgoux Sep 19, 2026
0fc5165
chore(cli): resolve local Storage from composition observations
jgoux Sep 19, 2026
5991834
chore(cli): migrate storage cp to current stack fixtures
jgoux Sep 19, 2026
235c360
chore(cli): migrate storage mv to current stack fixtures
jgoux Sep 19, 2026
9f08b40
chore(cli): migrate storage rm to current stack fixtures
jgoux Sep 19, 2026
dd4904a
chore(cli): migrate bucket seeding to composition Storage
jgoux Sep 19, 2026
b92c059
chore(cli): wire scoped shadows into declarative database tools
jgoux Sep 19, 2026
8dab18b
chore(cli): migrate db dump to attached catalog tools
jgoux Sep 19, 2026
64db024
chore(cli): migrate migration squash to scoped stack tools
jgoux Sep 19, 2026
b6e04f9
chore(cli): migrate test db to managed pgProve tools
jgoux Sep 19, 2026
2d4a1b4
test(cli): preserve the db test alias after stack migration
jgoux Sep 19, 2026
a1af774
docs(cli): describe current stack command behavior
jgoux Sep 19, 2026
2b5e9b8
feat(stack): reset database data while retaining instance identity
jgoux Sep 19, 2026
4f3c1fd
feat(cli): integrate db reset with managed database instances
jgoux Sep 20, 2026
e69929b
fix(cli): provide stack dependency for start bucket seeding
jgoux Sep 20, 2026
399e2dc
feat(stack): provide functions environment and database access
jgoux Sep 20, 2026
7db0bb3
feat(cli): serve functions through the experimental stack
jgoux Sep 20, 2026
5590ea4
fix(stack): preserve teardown state and release client resources
jgoux Sep 20, 2026
6e1a683
fix(cli): guard database startup and align stack lifecycle checks
jgoux Sep 20, 2026
bab1c71
docs(stack): clarify persistence and composition contracts
jgoux Sep 20, 2026
9b1a43e
fix(cli): preserve configured HTTP transport layers
jgoux Sep 20, 2026
a3d83f1
fix(cli): use postgres for migrations and shadow comparisons
jgoux Sep 20, 2026
da528c6
docs(cli): describe stack stop failure reporting
jgoux Sep 20, 2026
bf24257
chore(cli): merge develop into stack runtime branch
jgoux Sep 21, 2026
98eb574
fix(stack): wait for owner exit after shutdown
jgoux Sep 21, 2026
13ad7ff
chore(cli): merge develop and preserve stack init defaults
jgoux Sep 21, 2026
a8e8aab
fix(cli): keep stack init configuration usable
jgoux Sep 21, 2026
c348ff0
test(stack): make runtime fixtures portable across platforms
jgoux Sep 21, 2026
fb4c861
test(stack): verify idle connection remains open before shutdown
jgoux Sep 21, 2026
01a11f0
fix(stack): improve discovery output and failure diagnostics
jgoux Sep 21, 2026
5168df0
fix(stack): release registry locks when owners exit
jgoux Sep 21, 2026
44b225c
chore: merge develop into stack runtime branch
jgoux Sep 21, 2026
8b942ea
feat(stack): support service configuration forwarding
jgoux Sep 21, 2026
c77ed3b
fix(cli): forward supported stack configuration
jgoux Sep 21, 2026
a67e104
fix(stack): persist default database encryption keys
jgoux Sep 21, 2026
4e7d98e
test(stack): stabilize lifecycle fixtures across platforms
jgoux Sep 21, 2026
5dac38d
test(stack): decode compiled fixture paths before dispatch
jgoux Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 6 additions & 10 deletions .github/scripts/sync-workload-catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,32 +16,28 @@ const realCatalog = await Bun.file(CATALOG_PATH).text();

/** A trimmed catalog carrying both entry shapes the script has to rewrite. */
const fixture = `const workloadCatalog = {
"database:database": native(
"database:database": definition(
"postgres",
"17.6.1.168",
"ghcr.io/supabase/cli/postgres:17.6.1.168@sha256:${"9".repeat(64)}",
"bin/supabase-postgres-start",
["bin/supabase-postgres-start"],
{
additionalReleases: {
"15.14.1.168":
"ghcr.io/supabase/cli/postgres:15.14.1.168@sha256:${"f".repeat(64)}",
},
containerAlias: "supabase-database",
},
),
"rest:rest": native(
"rest:rest": definition(
"postgrest",
"v16.2",
"ghcr.io/supabase/cli/postgrest:v16.2",
"bin/postgrest",
["bin/postgrest"],
{ containerAlias: "supabase-rest" },
),
"auth:auth": native("auth", "v2.196.0", "ghcr.io/supabase/cli/auth:v2.196.0", "bin/auth", [
"auth:auth": definition("auth", "v2.196.0", "ghcr.io/supabase/cli/auth:v2.196.0", "bin/auth", [
"bin/auth",
]),
"studio:studio": native(
"studio:studio": definition(
"studio",
"2026.09.04-sha-5a67366",
"ghcr.io/supabase/cli/studio:2026.09.04-sha-5a67366@sha256:${"c".repeat(64)}",
Expand Down Expand Up @@ -101,7 +97,7 @@ describe("planCatalogUpdate", () => {
expect(plan.previousVersion).toBe("v2.196.0");
expect(plan.target).toBe("default");
expect(plan.source).toContain(
`native("auth", "v2.197.0", "ghcr.io/supabase/cli/auth:v2.197.0@${DIGEST_A}", "bin/auth"`,
`definition("auth", "v2.197.0", "ghcr.io/supabase/cli/auth:v2.197.0@${DIGEST_A}", "bin/auth"`,
);
expect(plan.source).not.toContain("v2.196.0");
});
Expand Down Expand Up @@ -259,7 +255,7 @@ describe("against the real catalog", () => {
// Derived from the catalog, so a new workload is covered without editing this.
const services = [
...new Set(
[...realCatalog.matchAll(/native\(\s*"([a-z][a-z0-9-]*)",/g)].map(
[...realCatalog.matchAll(/definition\(\s*"([a-z][a-z0-9-]*)",/g)].map(
(match) => match[1] ?? "",
),
),
Expand Down
10 changes: 5 additions & 5 deletions .github/scripts/sync-workload-catalog.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Pins one workload in `packages/stack/src/model/WorkloadCatalog.ts` to a
* Pins one workload in `packages/stack/src/Artifacts.ts` to a
* slim-services release, driven by the same `mirror-slim-image` dispatch as the
* ECR mirror (`mirror-slim-image.yml`).
*
Expand All @@ -13,7 +13,7 @@
* service or release line is a successful no-op.
*/

export const CATALOG_PATH = "packages/stack/src/model/WorkloadCatalog.ts";
export const CATALOG_PATH = "packages/stack/src/Artifacts.ts";

/** Mirrors the payload validation in `mirror-slim-image.yml`. */
const SERVICE_PATTERN = /^[a-z][a-z0-9-]*$/;
Expand Down Expand Up @@ -70,15 +70,15 @@ export function validatePayload(input: {
}
}

/** `native("<service>", "<version>", "<image>"` — image anchored so postgres != postgrest. */
/** `definition("<service>", "<version>", "<image>"` — image anchored so postgres != postgrest. */
function defaultEntryPattern(service: string): RegExp {
const s = escapeRegExp(service);
return new RegExp(
`(native\\(\\s*"${s}",\\s*")([^"]+)("\\s*,\\s*")(${escapeRegExp(SLIM_IMAGE_PREFIX)}${s}:[^"]+)(")`,
`(definition\\(\\s*"${s}",\\s*")([^"]+)("\\s*,\\s*")(${escapeRegExp(SLIM_IMAGE_PREFIX)}${s}:[^"]+)(")`,
);
}

/** `additionalReleases` entries: `"<version>": "<image>"`. The `:` is what distinguishes them. */
/** Additional release entries: `"<version>": "<image>"`. The `:` is what distinguishes them. */
function additionalEntryPattern(service: string, version?: string): RegExp {
const s = escapeRegExp(service);
const key = version === undefined ? `[^"]+` : escapeRegExp(version);
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/github-scripts-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
pull_request:
paths:
- ".github/scripts/**"
- "packages/stack/src/Artifacts.ts"
- ".github/workflows/ai-review.yml"
- ".github/workflows/github-scripts-ci.yml"

Expand Down
19 changes: 13 additions & 6 deletions .github/workflows/sync-stack-workload-catalog.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Sync Stack Workload Catalog

# Pins `packages/stack/src/model/WorkloadCatalog.ts` to slim-services releases,
# Pins `packages/stack/src/Artifacts.ts` to slim-services releases,
# off the same `mirror-slim-image` dispatch that drives the ECR mirror.
# Dependabot owns the Dockerfile and cannot own this table: these pins carry
# image digests, which tag resolution never produces (ADR 0017).
Expand Down Expand Up @@ -69,24 +69,31 @@ jobs:
- name: Check for catalog changes
id: check
run: |
if git diff --exit-code --quiet packages/stack/src/model/WorkloadCatalog.ts; then
if git diff --exit-code --quiet packages/stack/src/Artifacts.ts; then
echo "Workload catalog is already in sync."
echo "has_changes=false" >> "$GITHUB_OUTPUT"
else
echo "Workload catalog updated."
echo "has_changes=true" >> "$GITHUB_OUTPUT"
fi

# Prove the rewritten pin compiles and passes the catalog's own tests.
# Prove the rewritten pin compiles and the affected catalog surfaces pass.
- name: Type-check stack
if: steps.check.outputs.has_changes == 'true'
run: pnpm types:check
working-directory: packages/stack

- name: Test catalog
if: steps.check.outputs.has_changes == 'true'
run: pnpm run test:unit && pnpm run test:integration
working-directory: packages/stack
run: pnpm run test:github-scripts

- name: Test affected stack preparation
if: steps.check.outputs.has_changes == 'true'
run: >-
pnpm --filter @supabase/stack test:integration:run
src/preparation/artifacts.integration.test.ts
src/preparation/slim-services.integration.test.ts
--passWithNoTests=false

- name: Generate token
if: steps.check.outputs.has_changes == 'true'
Expand All @@ -106,7 +113,7 @@ jobs:
commit-message: "chore(stack): pin ${{ github.event.client_payload.service || inputs.service }} to ${{ github.event.client_payload.version || inputs.version }}"
title: "chore(stack): pin ${{ github.event.client_payload.service || inputs.service }} to ${{ github.event.client_payload.version || inputs.version }}"
body: |
Pins `packages/stack/src/model/WorkloadCatalog.ts` to the
Pins `packages/stack/src/Artifacts.ts` to the
`${{ github.event.client_payload.service || inputs.service }}` `${{ github.event.client_payload.version || inputs.version }}`
slim-services release and its image digest.

Expand Down
30 changes: 20 additions & 10 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,12 +148,14 @@ jobs:
working-directory: packages/stack
run: >-
pnpm test:integration
src/state/ports.integration.test.ts
src/state/registry-lease.integration.test.ts
src/state/state-store.integration.test.ts
src/supervisor/host-listener.integration.test.ts
src/supervisor/ingress.integration.test.ts
src/gateway/startup-transports.integration.test.ts
src/Ports.integration.test.ts
src/State.integration.test.ts
src/State.process.integration.test.ts
src/HostProcess.integration.test.ts
src/Network.integration.test.ts
src/Proxy.integration.test.ts
src/HttpProxy.integration.test.ts
--passWithNoTests=false

test-summary:
if: |
Expand Down Expand Up @@ -238,7 +240,7 @@ jobs:
strategy:
fail-fast: false
matrix:
runtime: [native, container]
runtime: [native, docker]
steps:
- name: Checkout
uses: useblacksmith/checkout@6fd481652155169ed4d2f25ebaf97464f685175f # v1.0.0-beta
Expand All @@ -249,9 +251,17 @@ jobs:
dependency-firewall-token: ${{ secrets.DF_FIREWALL_TOKEN }}

- name: Run stack end-to-end tests
run: pnpm --filter @supabase/stack test:e2e:run
env:
SUPABASE_STACK_E2E_RUNTIME: ${{ matrix.runtime }}
run: >-
pnpm --filter @supabase/stack test:e2e:run
src/whole-stack.${{ matrix.runtime }}.e2e.test.ts
--passWithNoTests=false

- name: Run public stack end-to-end tests
if: matrix.runtime == 'native'
run: >-
pnpm --filter @supabase/stack test:e2e:run
src/public.e2e.test.ts
--passWithNoTests=false

# Summary job that gates branch protection. It preserves the original check
# name and succeeds iff every CLI shard and stack runtime succeeded.
Expand Down
Loading
Loading