Skip to content
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
7abd16e
feat(stack): prepare slim resources on demand
jgoux Aug 18, 2026
db8411a
fix(stack): harden resource preparation seams
jgoux Aug 18, 2026
044024b
fix(stack): select one execution mode
jgoux Aug 18, 2026
f7501f4
fix(stack): own runtime selection lifecycle
jgoux Aug 18, 2026
2a1e7ee
fix(stack): harden managed lifecycle coordination
jgoux Aug 18, 2026
98ce067
fix(stack): close preparation lifecycle gaps
jgoux Aug 18, 2026
a72437f
fix(stack): preserve runtime and projection state
jgoux Aug 19, 2026
4a4e321
fix(stack): validate runtime sockets and state
jgoux Aug 19, 2026
05b8067
chore(stack): merge develop into CLI-2123
jgoux Aug 19, 2026
e837280
fix(stack): stabilize runtime integration
jgoux Aug 20, 2026
4d31f6c
fix(stack): harden native binary cache reuse
jgoux Aug 20, 2026
f5f1603
fix(stack): stabilize startup in CI
jgoux Aug 20, 2026
066c466
fix(stack): stabilize Linux Docker startup
jgoux Aug 20, 2026
ac4cb18
fix(stack): detect final Docker Postgres process
jgoux Aug 20, 2026
02699de
fix(stack): preserve Linux bind mount ownership
jgoux Aug 20, 2026
ad1ec45
fix(stack): keep managed startup request alive
jgoux Aug 20, 2026
4a9d895
Merge remote-tracking branch 'origin/develop' into juliengoux/cli-212…
jgoux Aug 20, 2026
59a2305
fix(stack): close runtime lifecycle review gaps
jgoux Aug 20, 2026
462b0d1
test(stack): narrow parallel runtime smoke
jgoux Aug 20, 2026
e390340
test(stack): focus runtime concurrency coverage
jgoux Aug 20, 2026
05d26d8
fix(stack): close final runtime review gaps
jgoux Aug 20, 2026
cbc66a7
fix(stack): make native initialization resumable
jgoux Aug 20, 2026
58ac1ee
docs(stack): require Effect-native internals
jgoux Aug 20, 2026
bab2590
fix(stack): normalize versions and validate ports
jgoux Aug 20, 2026
07ba576
refactor(stack): make allocation and config resolution Effect-native
jgoux Aug 20, 2026
c21255b
fix(stack): close interrupted allocator resources safely
jgoux Aug 20, 2026
ebb517e
fix(stack): make claim recovery interruption-safe
jgoux Aug 20, 2026
64f517e
fix(stack): serialize port claims behind sockets
jgoux Aug 20, 2026
4bd2cde
fix(stack): bracket stale port cleanup
jgoux Aug 20, 2026
f489018
fix(stack): skip occupied stale claims
jgoux Aug 20, 2026
8807918
refactor(stack): make managed identities Effect-native
jgoux Aug 20, 2026
b667724
fix(stack): serialize managed claim publication
jgoux Aug 20, 2026
4c7307f
fix(stack): recover managed publication owners
jgoux Aug 20, 2026
49e0636
fix(stack): remove unsafe publication fallback
jgoux Aug 20, 2026
4ee50d7
fix(stack): classify managed identity publication errors
jgoux Aug 20, 2026
de5abe7
fix(stack): make Git and child lifecycle Effect-native
jgoux Aug 20, 2026
d375be9
fix(stack): make transport boundaries interruption-aware
jgoux Aug 20, 2026
fb826de
fix(stack): harden node control response handling
jgoux Aug 20, 2026
b9fe93e
refactor(stack): make foreground creation Effect-native
jgoux Aug 20, 2026
9f77ba5
fix(stack): close foreground resources on interruption
jgoux Aug 20, 2026
424690c
Merge remote-tracking branch 'origin/develop' into juliengoux/cli-212…
jgoux Aug 20, 2026
0f863eb
refactor(stack): deepen port lease ownership
jgoux Aug 21, 2026
fc57472
fix(stack): harden owned port lease handoff
jgoux Aug 21, 2026
da8fa98
test(stack): synchronize supervisor integration journeys
jgoux Aug 21, 2026
b636f23
test(stack): relax supervisor stop guard
jgoux Aug 21, 2026
f09a271
fix(stack): harden native postgres startup
jgoux Aug 21, 2026
fd153f2
test(cli): align service version override expectations
jgoux Aug 21, 2026
cfe2004
docs(stack): align architecture with runtime ownership
jgoux Aug 21, 2026
38fae0f
refactor(stack): make runtime concurrency Effect-native
jgoux Aug 21, 2026
44863c7
test(stack): guard supervisor file waits
jgoux Aug 21, 2026
54099ad
refactor(stack): integrate Effect-native runtime changes
jgoux Aug 21, 2026
3af212d
fix(stack): bound resource preparation concurrency
jgoux Aug 21, 2026
ee50d86
fix(cli): classify atomic claim failures
jgoux Aug 21, 2026
c5588cd
fix(stack): preserve typed runtime failures
jgoux Aug 21, 2026
5b9b7f6
Merge branch 'develop' into juliengoux/cli-2123-stack-prepare-slim-re…
jgoux Aug 21, 2026
213f057
Merge branch 'develop' into juliengoux/cli-2123-stack-prepare-slim-re…
jgoux Aug 21, 2026
c365f4d
fix(stack): preserve port retry and version prefixes
jgoux Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions apps/cli/src/next/commands/branches/switch/switch.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,18 +145,18 @@ export const switchBranch = Effect.fn("branches.switch")(function* (opts: {
// TODO: run `supabase pull` against the new branch before restarting the stack
// so the local config reflects the branch's migrations and seed state.
// `pull` does not exist yet.
const launch = stackCheck.value.launch;
const launchConfig =
stackCheck.value.launch === undefined
? toStartStackConfig([], "auto")
launch === undefined
? toStartStackConfig([], undefined)
: withServiceVersions(
toStartStackConfig(
stackCheck.value.launch.excludedServices?.filter(
(service): service is ExcludedStackService =>
excludedStackServices.some((candidate) => candidate === service),
launch.excludedServices?.filter((service): service is ExcludedStackService =>
excludedStackServices.some((candidate) => candidate === service),
) ?? [],
stackCheck.value.launch.mode,
"mode" in launch ? launch.mode : undefined,
),
stackCheck.value.launch.versions,
launch.versions,
);
const loadedProjectConfig = yield* loadProjectConfig(projectHome.projectRoot);

Expand All @@ -166,7 +166,7 @@ export const switchBranch = Effect.fn("branches.switch")(function* (opts: {
projectDir: projectHome.projectRoot,
name: stackName,
portIntents: managedPortIntents(launchConfig, loadedProjectConfig ?? undefined),
...(stackCheck.value.launch !== undefined && { launch: stackCheck.value.launch }),
...(launch !== undefined && { launch }),
...launchConfig,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const startFullStack = Effect.fnUntraced(function* (opts: FunctionsDevStackOptio
const serviceVersionContext = yield* resolveServiceVersionContext([], undefined);
const loadedProjectConfig = yield* loadProjectConfig(projectHome.projectRoot);
const stackConfig = withServiceVersions(
toStartStackConfig([], "auto"),
toStartStackConfig([], undefined),
serviceVersionContext.runtimeVersions,
);
const stackLayer = yield* daemonLayer({
Expand All @@ -65,7 +65,6 @@ const startFullStack = Effect.fnUntraced(function* (opts: FunctionsDevStackOptio
name: opts.stack,
edgeRuntime: opts.edgeRuntime,
launch: {
mode: "auto",
versions: serviceVersionContext.pinnedBaseline,
excludedServices: [],
},
Expand Down
111 changes: 0 additions & 111 deletions apps/cli/src/next/commands/logs/logs.e2e.test.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import {
} from "../../config/service-version-resolution.ts";

describe("service version overrides", () => {
test("parses and normalizes repeated flag overrides", async () => {
test("parses repeated flag overrides as exact image tags", async () => {
await expect(
Effect.runPromise(
parseServiceVersionOverrides(["postgrest=v14.5", "mailpit=1.30.2", "auth=2.180.0"]),
),
).resolves.toEqual({
postgrest: "14.5",
mailpit: "v1.30.2",
postgrest: "v14.5",
mailpit: "1.30.2",
auth: "2.180.0",
});
});
Expand All @@ -27,8 +27,8 @@ describe("service version overrides", () => {
const candidateBaseline = {
...DEFAULT_VERSIONS,
postgres: "17.6.1.090",
postgrest: "14.5",
auth: "2.187.0",
postgrest: "v14.5",
auth: "v2.187.0",
};

const layer = Layer.mergeAll(
Expand Down Expand Up @@ -68,12 +68,12 @@ describe("service version overrides", () => {
runtimeVersions: {
...candidateBaseline,
postgres: "17.4.1.045",
auth: "2.170.0",
auth: "v2.170.0",
storage: "1.40.0",
},
activeOverrides: [
{ service: "postgres", version: "17.4.1.045", source: "flag" },
{ service: "auth", version: "2.170.0", source: "flag" },
{ service: "auth", version: "v2.170.0", source: "flag" },
{ service: "storage", version: "1.40.0", source: "local" },
],
availableUpdates: [],
Expand Down
18 changes: 11 additions & 7 deletions apps/cli/src/next/commands/start/start.command.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Effect, Layer, Context } from "effect";
import { Effect, Layer, Context, Option } from "effect";
import { loadProjectConfig } from "@supabase/config";
import {
DEFAULT_MANAGED_STACK_NAME,
Expand Down Expand Up @@ -79,14 +79,15 @@ export const serviceVersionFlag = Flag.string("service-version").pipe(

const modeFlag = Flag.choice("mode", startModes).pipe(
Flag.withDescription(
'Stack startup mode. "auto" prefers native binaries and falls back to Docker, "native" requires native-compatible services, and "docker" forces Docker for all services.',
'Stack startup mode. "native" requires native-compatible services and "docker" requires a usable Docker or Podman runtime.',
),
Flag.withDefault("auto" as StartMode),
Flag.optional,
Flag.map(Option.getOrUndefined),
);

interface StartVersionStateShape {
readonly launch: {
readonly mode: StartMode;
readonly mode?: StartMode;
readonly versions: Readonly<Record<string, string>>;
readonly excludedServices: ReadonlyArray<ExcludedStackService>;
};
Expand Down Expand Up @@ -124,7 +125,7 @@ export type StartFlags = CliCommand.Command.Config.Infer<typeof flags>;
export const startCommand = Command.make("start", flags).pipe(
Command.withDescription(
"Start the local Supabase development stack.\n\n" +
"Starts the full local Supabase stack. Use --mode auto (default) to prefer native binaries and fall back to Docker, --mode native to require native-compatible services, or --mode docker to force Docker-backed startup.\n\n" +
"Starts the full local Supabase stack. By default, a usable Docker or Podman runtime selects Docker mode; otherwise the stack uses native mode. Use --mode to require one explicitly.\n\n" +
"Named CLI stacks persist managed runtime state under the Supabase home directory. Use --exclude to skip optional services. Use --detach to run in the background.",
),
Command.withShortDescription("Start local Supabase stack"),
Expand Down Expand Up @@ -219,7 +220,7 @@ export const startCommand = Command.make("start", flags).pipe(
portDocument: portIntents,
});
const launch = {
mode: flags.mode,
...(flags.mode === undefined ? {} : { mode: flags.mode }),
versions: serviceVersionContext.pinnedBaseline,
excludedServices: flags.exclude,
...(existingSummary?.lastNotifiedUpdateFingerprint === undefined
Expand All @@ -242,12 +243,15 @@ export const startCommand = Command.make("start", flags).pipe(
cwd: runtimeInfo.cwd,
name: flags.stack,
});
if (summary.launch === undefined) {
return yield* Effect.die("Managed stack started without persisted launch settings");
}

return {
stackLayer,
startVersionState: StartVersionState.of({
launch: {
mode: flags.mode,
mode: "mode" in summary.launch ? summary.launch.mode : undefined,
versions: serviceVersionContext.pinnedBaseline,
excludedServices: flags.exclude,
},
Expand Down
70 changes: 0 additions & 70 deletions apps/cli/src/next/commands/start/start.e2e.test.ts

This file was deleted.

3 changes: 1 addition & 2 deletions apps/cli/src/next/commands/start/start.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ export const start = Effect.fnUntraced(function* (flags: StartFlags) {
yield* updateManagedLaunch({
...lifecycleInput,
launch: {
mode: launch.mode,
versions: launch.versions,
excludedServices: launch.excludedServices,
lastNotifiedUpdateFingerprint: serviceVersionContext.updateFingerprint,
Expand All @@ -68,7 +67,7 @@ export const start = Effect.fnUntraced(function* (flags: StartFlags) {
}

yield* analytics.capture("cli_stack_started", {
mode: flags.mode,
mode: launch.mode,
detach: flags.detach,
stack: flags.stack,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe("start handler", () => {
);
return start({
stack: fixture.stackName,
mode: "auto",
mode: "docker",
exclude: [],
serviceVersion: [],
detach: false,
Expand Down
Loading
Loading