feat: Replace per-preview Caddy sidecars with shared gateway architecture

Refactor preview deployments to use a single shared Caddy gateway container
with subdomain routing (<previewId>.localhost:<port>) instead of one Caddy
sidecar and one port per preview. Adds dev/preview modes, git worktree
support for branch checkouts, and auto-start on phase:pending_review.

- Add GatewayManager for shared Caddy lifecycle + Caddyfile generation
- Add git worktree helpers for preview mode branch checkouts
- Add dev mode: volume-mount + dev server image instead of build
- Remove per-preview Caddy sidecar and port publishing
- Use shared cw-preview-net Docker network with container name DNS
- Auto-start previews when phase enters pending_review
- Delete unused PreviewPanel.tsx
- Update all tests (40 pass), docs, events, CLI, tRPC, frontend
This commit is contained in:
Lukas May
2026-03-05 12:22:29 +01:00
parent 0ff65b0b02
commit 143aad58e8
21 changed files with 1198 additions and 721 deletions

View File

@@ -1353,8 +1353,9 @@ export function createCli(serverHandler?: (port?: number) => Promise<void>): Com
phaseId: options.phase,
});
console.log(`Preview started: ${preview.id}`);
console.log(` URL: http://localhost:${preview.port}`);
console.log(` URL: ${preview.url}`);
console.log(` Branch: ${preview.branch}`);
console.log(` Mode: ${preview.mode}`);
console.log(` Status: ${preview.status}`);
console.log(` Services: ${preview.services.map(s => `${s.name} (${s.state})`).join(', ')}`);
} catch (error) {
@@ -1394,7 +1395,7 @@ export function createCli(serverHandler?: (port?: number) => Promise<void>): Com
return;
}
for (const p of previews) {
console.log(`${p.id} http://localhost:${p.port} ${p.branch} [${p.status.toUpperCase()}]`);
console.log(`${p.id} ${p.url} ${p.branch} ${p.mode} [${p.status.toUpperCase()}]`);
}
} catch (error) {
console.error('Failed to list previews:', (error as Error).message);
@@ -1415,8 +1416,9 @@ export function createCli(serverHandler?: (port?: number) => Promise<void>): Com
return;
}
console.log(`Preview: ${preview.id}`);
console.log(` URL: http://localhost:${preview.port}`);
console.log(` URL: ${preview.url}`);
console.log(` Branch: ${preview.branch}`);
console.log(` Mode: ${preview.mode}`);
console.log(` Status: ${preview.status}`);
console.log(` Initiative: ${preview.initiativeId}`);
console.log(` Project: ${preview.projectId}`);