Rip out Theia, ship P5.1 attach E2E + Justine UI work-in-progress

Theia rip-out:
- Delete app/api/theia-auth/route.ts (Traefik ForwardAuth shim)
- Delete app/api/projects/[projectId]/workspace/route.ts and
  app/api/projects/prewarm/route.ts (Cloud Run Theia provisioning)
- Delete lib/cloud-run-workspace.ts and lib/coolify-workspace.ts
- Strip provisionTheiaWorkspace + theiaWorkspaceUrl/theiaAppUuid/
  theiaError from app/api/projects/create/route.ts response
- Remove Theia callbackUrl branch in app/auth/page.tsx
- Drop "Open in Theia" button + xterm/Theia PTY copy in build/page.tsx
- Drop theiaWorkspaceUrl from deployment/page.tsx Project type
- Strip Theia IDE line + theia-code-os from advisor + agent-chat
  context strings
- Scrub Theia mention from lib/auth/workspace-auth.ts comment

P5.1 (custom apex domains + DNS):
- lib/coolify.ts + lib/opensrs.ts: nameserver normalization, OpenSRS
  XML auth, Cloud DNS plumbing
- scripts/smoke-attach-e2e.ts: full prod GCP + sandbox OpenSRS +
  prod Coolify smoke covering register/zone/A/NS/PATCH/cleanup

In-progress (Justine onboarding/build, MVP setup, agent telemetry):
- New (justine)/stories, project (home) layouts, mvp-setup, run, tasks
  routes + supporting components
- Project shell + sidebar + nav refactor for the Stackless palette
- Agent session API hardening (sessions, events, stream, approve,
  retry, stop) + atlas-chat, advisor, design-surfaces refresh
- New scripts/sync-db-url-from-coolify.mjs +
  scripts/prisma-db-push.mjs + docker-compose.local-db.yml for
  local Prisma workflows
- lib/dev-bypass.ts, lib/chat-context-refs.ts, lib/prd-sections.ts
- Misc: stories CSS, debug/prisma route, modal-theme, BuildLivePlanPanel

Made-with: Cursor
This commit is contained in:
2026-04-22 18:05:01 -07:00
parent d6c87a052e
commit 651ddf1e11
105 changed files with 7509 additions and 2319 deletions

View File

@@ -0,0 +1,21 @@
import Link from "next/link";
/** Compact nav from justine/02_signup.html — use inside [data-justine-auth] + 02-signup.css */
export function JustineAuthShell({ children }: { children: React.ReactNode }) {
return (
<>
<nav className="justine-auth-nav" aria-label="Auth">
<Link href="/" className="justine-auth-nav-brand">
<div className="justine-auth-nav-logo">
<span className="f">V</span>
</div>
<span className="justine-auth-nav-wordmark f">vibn</span>
</Link>
<span className="justine-auth-nav-aside">
New to vibn? <Link href="/">View homepage</Link>
</span>
</nav>
<div className="justine-auth-main">{children}</div>
</>
);
}

View File

@@ -7,7 +7,7 @@ import Link from "next/link";
*/
export function JustineHomePage() {
return (
<>
<div className="justine-home-page">
<section
className="hero-section"
style={{ maxWidth: 980, margin: "0 auto", padding: "88px 52px 72px" }}
@@ -513,6 +513,6 @@ export function JustineHomePage() {
<div style={{ fontSize: 12.5, color: "var(--muted)" }}>Joins 280+ non-technical founders already live</div>
</div>
</section>
</>
</div>
);
}

View File

@@ -56,7 +56,7 @@ export function JustineNav() {
<Link href="/pricing" style={{ fontSize: 14, color: "var(--muted)", textDecoration: "none" }}>
Pricing
</Link>
<Link href="/features" style={{ fontSize: 14, color: "var(--muted)", textDecoration: "none" }}>
<Link href="/stories" style={{ fontSize: 14, color: "var(--muted)", textDecoration: "none" }}>
Stories
</Link>
<span style={{ fontSize: 14, color: "var(--muted)" }}>Blog</span>
@@ -93,7 +93,7 @@ export function JustineNav() {
<Link href="/pricing" onClick={close}>
Pricing
</Link>
<Link href="/features" onClick={close}>
<Link href="/stories" onClick={close}>
Stories
</Link>
<Link href="#" onClick={(e) => { e.preventDefault(); close(); }}>

View File

@@ -1,3 +1,4 @@
export { JustineNav } from "./JustineNav";
export { JustineFooter } from "./JustineFooter";
export { JustineHomePage } from "./JustineHomePage";
export { JustineAuthShell } from "./JustineAuthShell";